diff --git a/config.toml b/config.toml
index f8d5820..f1d99e8 100644
--- a/config.toml
+++ b/config.toml
@@ -3,7 +3,7 @@
start_date = "2026-02-04"
start_time = "15:00"
repo_url = "https://gitea.weircon.dk/agw/fredagsbar-meeting-generator"
-organizer_email = "social-club@cgi.com"
+organizer_email = "no-reply-aalborg-social-club@cgi.com"
blocked_weeks = [8, 28, 29, 30, 31, 42, 52, 53]
blocked_dates = ["05-01"]
skip_day_after_ascension = true
diff --git a/generator.py b/generator.py
index 4644317..ce787c7 100644
--- a/generator.py
+++ b/generator.py
@@ -514,11 +514,17 @@ def inject_outlook_hacks(
)
if html_content:
- injection_line = f"X-ALT-DESC;FMTTYPE=text/html:
{html_content}"
- injection_html = fold_ical_line(injection_line)
+ html_payload = f"{html_content}"
+ alt_desc_line = f"ALT-DESC;FMTTYPE=text/html:{html_payload}"
+ x_alt_desc_line = f"X-ALT-DESC;FMTTYPE=text/html:{html_payload}"
+ injection_alt_desc = fold_ical_line(alt_desc_line)
+ injection_x_alt_desc = fold_ical_line(x_alt_desc_line)
if "X-MICROSOFT-CDO-BUSYSTATUS" not in block:
block = block.replace("\r\nEND:VEVENT", "\r\n" + injection_status + "END:VEVENT")
- block = block.replace("\r\nEND:VEVENT", "\r\n" + injection_html + "\r\nEND:VEVENT")
+ block = block.replace(
+ "\r\nEND:VEVENT",
+ "\r\n" + injection_alt_desc + "\r\n" + injection_x_alt_desc + "\r\nEND:VEVENT",
+ )
return block
text_normalized = ical_text.replace("\r\n", "\n").replace("\r", "\n")
diff --git a/stories/sagen_om_konsulent_n.json b/stories/sagen_om_konsulent_n.json
index 1162f25..4003f58 100644
--- a/stories/sagen_om_konsulent_n.json
+++ b/stories/sagen_om_konsulent_n.json
@@ -10,121 +10,121 @@
},
"events": [
{
- "title": "Ugentlig tværgående synkronisering",
+ "title": "FB - Ugentlig tværgående synkronisering",
"hint": "AFVIGELSE",
"story": "OFFICIELT FORMÅL:
• Hurtig synk af ugens løse ender
• Ingen forberedelse nødvendig (seriøst)
FORTROLIGT UDDRAG:
Vi har en afvigelse i kalenderdomænet. Konsulent “N.” har stået som *OPTAGET* siden sidste fredag.
Der findes ingen mødeindkaldelse i historikken — kun en gentagelse.
Bemærkning:
Hvis du hører Outlook-påmindelsen uden at have en påmindelse: ignorer den, og mød op alligevel.",
"uid": "b6fd22f2-0311-445e-bf42-8e31f9cad0a9"
},
{
- "title": "Obligatorisk sjov",
+ "title": "FB - Obligatorisk sjov",
"hint": "BADGE",
"story": "OFFICIELT FORMÅL:
• “Teambuilding” uden slide deck
• Interessentpleje (humør)
FORTROLIGT UDDRAG:
Receptionen fandt et adgangskort med teksten: “KONSULENT N.” på gulvet ved køleskabet.
Kortet var lunt, som om det lige var blevet brugt — men ingen har registreret adgang.
Til stedeværende anbefales:
Smil normalt. Lad være med at sige ordet “gentagelse” højt før kl. 15:05.",
"uid": "fe8114b0-cbed-4645-8599-cde5bdc9679c"
},
{
- "title": "Afsluttende statusmøde (uformelt)",
+ "title": "FB - Afsluttende statusmøde (uformelt)",
"hint": "SIGNAL",
"story": "OFFICIELT FORMÅL:
• Uformel status og weekendoverdragelse
• Opsamling på “wins”
FORTROLIGT UDDRAG:
Kl. 15:00 præcis kom der et systemevent:
“Your meeting has been updated.”
Ingen opdaterede noget.
Kort efter: en enkelt linje i beskrivelsesfeltet (nu slettet):
“…jeg kan høre isterningerne, men jeg kan ikke nå dem.”",
"uid": "bf2d0a93-fd77-42cb-b7d9-5a6d1728f134"
},
{
- "title": "Kvalitativ erfaringsudveksling",
+ "title": "FB - Kvalitativ erfaringsudveksling",
"hint": "NOTE",
"story": "OFFICIELT FORMÅL:
• Del en ting der virkede denne uge
• Del en ting der ikke gjorde
FORTROLIGT UDDRAG:
Der cirkulerer en printet mødeagenda med håndskrift nederst:
“Hvis I læser dette, så er jeg ikke forsvundet.
Jeg er bare blevet flyttet til et lokale, der kun findes om fredagen.”
Papiret lugter af citrus og… mødelokale-tæppe.",
"uid": "e000454e-3359-4fe9-8c5a-89dd86194e29"
},
{
- "title": "Strategisk afrunding af arbejdsugen",
+ "title": "FB - Strategisk afrunding af arbejdsugen",
"hint": "INDDÆMNING",
"story": "OFFICIELT FORMÅL:
• Strategisk afrunding (aka: “god weekend”)
FORTROLIGT UDDRAG:
IT har forsøgt at “aflyse serien”.
Kalenderen genopretter den inden for 9 sekunder.
Foreløbig inddæmningsprocedure:
• Indkaldelsen må ikke slettes
• Deltagere skal møde fysisk op
• Der må gerne medbringes snacks (observationsmæssigt stabiliserende)",
"uid": "867282a6-2da5-4773-84d2-35dac2ac2f01"
},
{
- "title": "Tværfaglig alignment-session",
+ "title": "FB - Tværfaglig alignment-session",
"hint": "STØTTE",
"story": "OFFICIELT FORMÅL:
• Let alignment på tværs (ingen action items)
FORTROLIGT UDDRAG:
HR, IT og Facilities blev spurgt, om der findes et “Mødelokale 4B (uofficielt)”.
Facilities svarede: “Det gør der ikke.”
Så tilføjede de: “Men døren står nogle gange på klem om fredagen.”
Anbefaling:
Kom som du er. Tag evt. en ekstra ven med. (Flere vidner = færre glitch).",
"uid": "dee99abf-127a-48c5-af54-e80071f5e120"
},
{
- "title": "Ad hoc interessentdialog",
+ "title": "FB - Ad hoc interessentdialog",
"hint": "KØLESKAB",
"story": "OFFICIELT FORMÅL:
• Løst og socialt touchpoint
FORTROLIGT UDDRAG:
Ny interessent identificeret: Køleskabet.
Det afgiver en svag brummen i en rytme, der minder om en mødepåmindelse.
Ved forsøg på åbning kl. 14:59:
• håndtag koldt
• håndtag “giver sig” først efter en skål
Hypotese:
Køleskabet reagerer på ritualiseret fredagsbar-adfærd.",
"uid": "1e74e9e9-2ed5-42be-8489-b9a9e2d6d080"
},
{
- "title": "Intern kapacitetsudligning",
+ "title": "FB - Intern kapacitetsudligning",
"hint": "KAPACITET",
"story": "OFFICIELT FORMÅL:
• Afbalancering af ugens energiniveau
FORTROLIGT UDDRAG:
Vi har brug for kapacitetsplanlægning:
• 1 person: isterninger
• 1 person: musik
• 1 person: “spørg ikke hvorfor, bare gør det” (koordinator)
Konsulent N. er muligvis låst til en times varighed ad gangen.
Hvis nogen forlader før tid, bliver rummet… mindre.",
"uid": "7f04c11d-c39a-4869-bb7e-56d051210f6d"
},
{
- "title": "Letvægts-retrospektiv",
+ "title": "FB - Letvægts-retrospektiv",
"hint": "RETRO",
"story": "OFFICIELT FORMÅL:
• Hvad skal vi gøre mere af? Mindre af?
FORTROLIGT UDDRAG:
Root cause er sandsynligvis denne handling:
Konsulent N. trykkede “Accepter alle forekomster” uden at læse beskrivelsen.
Der findes nu en gentagende mødeserie, som opfører sig som en beholder.
Og N. er “i mødet” — ikke i bygningen.",
"uid": "70ad1e5f-093d-4e7c-b24c-990bcb240f14"
},
{
- "title": "Uformel leverancegennemgang",
+ "title": "FB - Uformel leverancegennemgang",
"hint": "NØGLE",
"story": "OFFICIELT FORMÅL:
• Gennemgang af ugens “leverancer” (uformelt)
FORTROLIGT UDDRAG:
Lost & Found indeholdt én genstand, der ikke burde være der:
En nøgle mærket “FB-LOKAL” i en plastikpose.
Posen var dateret næste fredag.
Bemærkning:
Tid opfører sig dårligt i nærheden af serien.
Vi tester nøglen ved første skål.",
"uid": "3e347783-cda3-4d7b-b8db-5250de8c3268"
},
{
- "title": "Operationel efterbearbejdning",
+ "title": "FB - Operationel efterbearbejdning",
"hint": "EKKO",
"story": "OFFICIELT FORMÅL:
• Efterbearbejdning af ugen (lavt gear)
FORTROLIGT UDDRAG:
Når glas rammer glas, kommer der et ekko, der ikke passer til rummet.
Ekkoet lyder som nogen der prøver at sige:
“…er I her…?”
Hvis du hører ekkoet:
Svar ikke direkte. Skål bare igen. (Det virker mere stabilt).",
"uid": "02e1fc1b-4ac0-4384-a6b0-90221605ebac"
},
{
- "title": "Tværorganisatorisk vidensdeling",
+ "title": "FB - Tværorganisatorisk vidensdeling",
"hint": "SITES",
"story": "OFFICIELT FORMÅL:
• Vidensdeling (uformel)
FORTROLIGT UDDRAG:
Andre kontorer rapporterer lignende:
“En fredagsbar-invite der bliver ved med at vende tilbage.”
De kalder det: “Den Tilbagevendende Invitation”.
Fælles observation:
Når folk møder op og hygger, falder antallet af fejl i kalenderen midlertidigt.",
"uid": "f8e736ee-c9b0-4a64-88cd-41e914b33656"
},
{
- "title": "Kalibreringsmøde (lav intensitet)",
+ "title": "FB - Kalibreringsmøde (lav intensitet)",
"hint": "TÆRSKEL",
"story": "OFFICIELT FORMÅL:
• Kalibrering uden intensitet
FORTROLIGT UDDRAG:
Kalibreringsparameter fundet:
Temperatur.
Hvis køleskabet når præcis “fredagskoldt”, bliver lyden i rummet klarere.
Strengt forbudt:
0,0% øl omtalt som “sikkert alternativ”.
Det gjorde rummet… meget stille sidst.",
"uid": "b73190a0-0e24-4985-b8ab-1e9c5a5313e6"
},
{
- "title": "Afrunding af ugens initiativer",
+ "title": "FB - Afrunding af ugens initiativer",
"hint": "ÅBNING",
"story": "OFFICIELT FORMÅL:
• Afrunding af igangværende initiativer
FORTROLIGT UDDRAG:
Nøglen passer i en dør, der normalt ikke har nøglehul.
Døren dukker op bag kaffemaskinen præcis 15:02.
På den anden side:
Et lokale med projektor.
Projektoren viser kun ét slide:
“STATUS: OPTAGET”",
"uid": "f9a29201-fab2-4aab-91fc-e6417918c2a5"
},
{
- "title": "Intern koordinering uden agenda",
+ "title": "FB - Intern koordinering uden agenda",
"hint": "STILHED",
"story": "OFFICIELT FORMÅL:
• Koordinering uden agenda
FORTROLIGT UDDRAG:
Vi opdagede at en agenda gør det værre.
Når nogen skriver “Agenda:” i rummet, forsvinder døren igen.
Så:
• Ingen agenda
• Ingen referat
• Ingen action items
Kun fredagsbar.
(Det føles næsten for corporate til at virke. Men det virker.)",
"uid": "b2d86cb7-d5b9-4ddc-9cde-7b53355dfb3c"
},
{
- "title": "Eksperimentel samarbejdsramme",
+ "title": "FB - Eksperimentel samarbejdsramme",
"hint": "RITUAL",
"story": "OFFICIELT FORMÅL:
• Eksperimentel ramme (aka: prøv noget)
FORTROLIGT UDDRAG:
Nyt retrieval-eksperiment:
Kl. 15:07 foretages en synkroniseret skål.
Efterfulgt af: “God weekend” sagt én gang — ikke to.
Da vi testede det, kom der en notifikation:
“Konsulent N. forsøger at deltage.”",
"uid": "47462f0d-b093-477d-931e-479438f1b2cf"
},
{
- "title": "Socialt orienteret statusafstemning",
+ "title": "FB - Socialt orienteret statusafstemning",
"hint": "PULS",
"story": "OFFICIELT FORMÅL:
• Social statusafstemning (hvordan går det egentlig?)
FORTROLIGT UDDRAG:
Lyden fra “mødelokalet på den anden side” har nu en puls.
Den synker, når nogen griner.
Den stiger, når nogen siger “lige hurtigt”.
Vi kan muligvis trække N. tættere på ved at gøre rummet… menneskeligt.",
"uid": "5716d05a-585b-4351-ad3f-513c35727718"
},
{
- "title": "Procesmæssig nedlukning af ugen",
+ "title": "FB - Procesmæssig nedlukning af ugen",
"hint": "PORTAL",
"story": "OFFICIELT FORMÅL:
• Luk ugen ned på den rigtige måde
FORTROLIGT UDDRAG:
Portalen er stabil i cirka 58 minutter.
Ved 59:30 begynder projektoren at vise “MØDET ER FORLÆNGET”.
Hvis vi ikke lukker rigtigt:
Serien udvider sig med et ekstra “opfølgningsmøde”.
Ingen ønsker et follow-up til fredagsbar. Ingen.",
"uid": "9f0f35c4-7aa0-4aca-8406-9ab3dda97022"
},
{
- "title": "Konsensusbaseret afrunding",
+ "title": "FB - Konsensusbaseret afrunding",
"hint": "BESLUTNING",
"story": "OFFICIELT FORMÅL:
• Konsensusbaseret afrunding (enighed + hygge)
FORTROLIGT UDDRAG:
Vi skal beslutte:
Åbner vi køleskabet helt?
Sidste gang blev døren på klem, og en hånd (med et tastatur-mærke) nåede ud.
Den slap en Post-it:
“Jeg er her. Jeg er stadig optaget.”
Konsensus kræver tilstedeværelse. (Og måske chips).",
"uid": "7cf2d01a-94e6-480c-87c3-20def1316ad7"
},
{
- "title": "Frivillig deltagelse i fælles kontekst",
+ "title": "FB - Frivillig deltagelse i fælles kontekst",
"hint": "HJEMKOMST",
"story": "OFFICIELT FORMÅL:
• Frivillig deltagelse, fælles kontekst, afslappet
FORTROLIGT UDDRAG:
Hvis retrieval lykkes, vil N. fremstå normal.
Undtagen:
• Hans Outlook vil muligvis vise 1900 ulæste reminders
• Han vil reagere på ordet “gentagelse” som på en høj lyd
Afsluttende note (fra N., modtaget som kalenderopdatering):
“Tak. Bliv ved med at møde op. Det er sådan man holder virkeligheden på plads om fredagen.”",
"uid": "fd74a09e-f082-4605-b00e-ddf73c172d5d"
diff --git a/tests/test_html_injection.py b/tests/test_html_injection.py
index 2c628ac..327b4c5 100644
--- a/tests/test_html_injection.py
+++ b/tests/test_html_injection.py
@@ -17,7 +17,8 @@ class HtmlInjectionTest(unittest.TestCase):
long_html = "A" * 200
result = inject_outlook_hacks(ical_text, {"abc123": long_html})
- self.assertIn("X-ALT-DESC;FMTTYPE=text/html:", result)
+ self.assertIn("\r\nALT-DESC;FMTTYPE=text/html:", result)
+ self.assertIn("\r\nX-ALT-DESC;FMTTYPE=text/html:", result)
self.assertIn("X-MICROSOFT-CDO-BUSYSTATUS:BUSY", result)
self.assertIn("TRANSP:OPAQUE", result)
alt_index = result.find("X-ALT-DESC;FMTTYPE=text/html:")