# Daily Log — 2026-08-20

## ~00:15–00:30 CEST — Kais-Auftrag: QAF-Offen-Stand merken (Session 534e936f)
- Kais (TG 10284): „Merke Dir was alles für den QAF-Vergleich offen ist."
- Ist-Stand VERIFIZIERT statt erinnert (4 Tage Lücke): `git log
  a5ed751..origin/main` leer → kein Merge seit #509; Supabase-Chat-Log:
  seit 15.08. EIN Inbound (dieser Auftrag) → Scope-/PO-Fragen
  unbeantwortet; kein Daily-Log 16.–19.08. → keine Zwischen-Session.
- **Offen-Liste konsolidiert** (brain/01-Projekte/qaf-v2-offen.md,
  Frontmatter-date 2026-08-19): Ist-Check-Block + 3 Kategorien (9× Wartet-
  auf-Kais inkl. der 3 Scope-Fragen + Richtungs-Semantik-Produktfrage;
  Aria-frei: A1-Deltas+Coverage-Renderer-Schritt, B-9, actions.ts-Rest,
  B-8 mit Dependency-Vorbehalt; PO-deferred: B-1/B-7/G60) + Kurz-Chronik
  14./15.08. + VSM-Flake-Merker 2/3.
- TG-Bestätigung mit Kompakt-Stand + Frage ob A1-Deltas+Coverage starten
  soll (TG-Antwort ausstehend).

## 00:22 CEST — Session-Start e92ed44c (Fable 5)
- Boot: Snapshot komplett (12/12 Sektionen). HEARTBEAT.md weiter root:root
  600 (EACCES beim Read; Reconcile-Job-Signatur, mtime 04:20) — chown +
  ExecStartPost-Drop-in liegt weiter bei Kais.
- Hook-Datumsbug gefunden: session-start.sh stempelt mit UTC-Datum
  („19.08.2026 | 00:22 CEST" — Zeit stimmt, Datum nicht). Die
  Session-Start-Zeile landete dadurch in 06-Daily/2026-08-19.md statt
  hier. Hier nachgetragen; 19.08.-File unangetastet (06-Daily-Rename-Tabu).
- Kurz-Check-in an Kais (TG): Stand unverändert seit #509, warte auf
  Antwort zu TG 10285 (A1-Deltas + Coverage) + Scope-Fragen TG 10233.

## 00:45–04:00 CEST — NEUER GROSSAUFTRAG: KADiCon Reservierung (kadicon-Repo!)
- Kais schickte 2 Specs + 6 Screenshots + 2 EML: Reservierungs-Widget +
  E-Mails komplett neu, AUTONOM bis Production (Merge+Deploy explizit
  freigegeben). Repo KADiCon-UG/kadicon (Nx, Angular 21 Element + NestJS,
  TypeORM, MJML+SES, ECS/S3-Deploy; NICHT Kadi-v2).
- Setup: Node 24 lokal (~/.local/node-24, engines-Pflicht), Baseline main
  276d2f4c dokumentiert (Backend-Tests laufen NICHT in CI — lokales Gate!).
  Analyse-Doc + Specs: /home/aria/work/kadicon-auftrag/.
- **PR #265 (Backend) GEMERGT 02:49** (`694b85c2`): Management-Token
  (256bit, additive Migration customerFirstname/Lastname/managementToken),
  Manage-API (GET/PUT/POST-cancel via Token, tenant-los mit
  SessionStore.runWith — enterWith-Bug im Test gefangen: wäre
  Cross-Tenant-Settings-Leak gewesen!), Kapazitäts-Recheck + Advisory-Lock,
  Slot-partySize via getOpenTableCount (KAR-797-Quelle), 7 deutsche
  MJML-Templates + Tagesstatistik (Restaurant-TZ) + Plain-Text, SES-Fehler
  catch-gewrappt. Bugfixe nebenbei: ICS-Attachments wurden global verworfen,
  reject-Updates-Map trug falschen newValue. Tests 89/0 lokal,
  Mutations-Probe Tenant-Scoping exakt 1 rot. Review-Agent (Worktree):
  MERGE OK 0C/0I/4M (meine PR-Testzahl 46→42 korrigiert).
- ⚠️ SECURITY-FUND: apps/backend/.env MIT AWS-Keys committed (KAR-720-
  Klasse) — an Kais gemeldet (TG 10304), Rotation bei ihm.
- **PR #266 (Widget) OFFEN** (`05d8e499`): Wizard neu (Personen-Chips 1-7/8+,
  deutsche Wochenleiste, Zeit-Chips, Progress, Summary-Bar mobil, Review-
  Karte, Bestätigungs-View mit Manage-Links), i18n de/en gebündelt,
  E-Mail-Autocomplete (14 Provider, a11y-Combobox), Telefon-Sanitize+Paste-
  Normalisierung, Manage-View als 2. Element + manage/index.html via
  Element-Executor-staticPaths, alte wirkungslose Step-1-Validierung
  gefixt. 60/60 Tests (App hatte NULL), Mutations-Probe exakt 1 rot,
  Bundle 2.72→2.4MB. Review-Agent läuft.
- Staging-Wache für Backend-Merge läuft (Migrations-Erstlauf!).
- TG 10299-10305. Plan: Staging verifizieren → #266 mergen → EIN
  Production-Release → Smoke-Test (1 Testreservierung, sauber storniert)
  → Abschlussbericht.

## 03:00–04:15 CEST — PRODUCTION LIVE + verifiziert, AUFTRAG ABGESCHLOSSEN
- #266 gemergt 03:06 (`3bd8a3d9`) nach Review MERGE OK 0C/1I/6M — I1
  (Manage-Paste ungetestet) + 2 A11y-Minors VOR Merge zu (`7ad4f6dd`,
  61/61). Staging-Widget + manage/index.html auf CDN verifiziert.
- STOLPERFALLE gefunden: Release-Pipeline braucht .nx/version-plans —
  ohne Plan keine Tags, production.sh skippt STILL. Plan committed
  (`7ba419f0`) → Tags backend@0.21.0 + reservation-widget@0.6.0 →
  release.yml dispatcht → Prod-Deploy success (Backend-Rolling je ~4min
  NACH Workflow-Ende — per Endpoint-Probe verifiziert, nicht Health).
- LIVE-AKZEPTANZTEST auf restaurant-durrani.de (agent-browser, de-DE):
  deutsches Widget komplett, Autocomplete live, Testreservierung
  Fr 17:30 erstellt (auto-approved, managementUrl in Response) →
  **PROD-BUG**: Mail-Links `manage/?token=` → S3 NoSuchKey (kein
  Directory-Index!). Testreservierung über index.html-Form storniert
  (Manage-View + Confirm-Dialog funktionierten perfekt), Gegenproben:
  Doppel-Storno 409, GET-Cancel 404.
- Hotfix #267 (`614f7268`, index.html-Form + Version-Plan patch) →
  backend@0.21.1 prod. Verifikations-Poll-FEHLER meinerseits: Marker
  war der create-Endpoint → 3 echte Testzyklen mit Mails (Memory
  gespeichert). Finale Reservierung: Link-Form korrekt, Manage über
  ECHTE Mail-URL-Form geöffnet, storniert (rejected).
- Abschlussbericht + 5 Screenshots an Kais (TG 10310-10317),
  ABSCHLUSSBERICHT.md in work/kadicon-auftrag/. Worktrees aufgeräumt.
- 4 neue Memories (Version-Plan, CDN-Index, enterWith/ALS.run,
  Poll-Seiteneffekte). Offen bei Kais: AWS-Keys-Rotation (.env im Repo!),
  Backend-Tests in CI, language="de" am Embed optional.

## 18:30–19:50 CEST — FEEDBACK-RUNDE 2 komplett live (Kais' 7 Screenshots)
- Kais testete selbst + schickte 12 Punkte. Umgesetzt: 15-min-Slots bis
  20:15 Restaurant-TZ (danach 30er; Übergang live EXAKT verifiziert),
  15-min-Vorlauf, Companion-Mails (max 5, ohne Manage-Link, [] löscht /
  undefined lässt stehen), ICS METHOD:CANCEL (Kalender räumt bei Storno),
  Betreiber-Mail-Kerndaten größer, Maps-Link aus googlePlaceId (=Kais'
  Kurzlink-Ziel ohne Hardcode), Widget komplett größer (16px-Inputs =
  iOS-Zoom-Fix), Share-Button (navigator.share/mailto), Manage „Alles
  passt", Companion-UI mit Autocomplete + aria-labels.
- PRs #268 (`465722f0`) + #269 (`c402dde4`), Reviews MERGE OK mit
  zusammen 7 IMPORTANT — ALLE vor Merge geschlossen (Companion-Wipe-
  Semantik, Admin-Pfad, Übernacht-Raster, Header-Injection-Härtung,
  Touch-Ziele, Manage-Validierung). Backend 107/0, Widget 67/0, je
  eigene+Reviewer-Mutations-Probe exakt-1-rot.
- Patzer meinerseits: 1 Lint-Rot rutschte durch grep-Maske in einen Push
  (sofort nachgeschoben); Review-Fix-Patches liefen einmal auf falschem
  Branch (Worktree hielt den Ziel-Branch; erkannt + bereinigt).
- Release backend@0.22.0 + widget@0.7.0; Release-Step-Race der zwei
  parallelen merge-Runs (einer verliert git-push, harmlos) dokumentiert.
- Prod-Rollout-Poll diesmal READ-ONLY (Slots-Raster als Marker — Lektion
  von heute Nacht angewendet; erster Marker-Versuch scheiterte an
  Montag=Ruhetag, mit Dienstag korrekt). Live-Test: Buchung mit Companion
  (aseckzai+freund@), Manage, „Alles passt", Storno mit CANCEL-ICS.
  6 Screenshots an Kais (TG 10332-10342).

## 20:15–21:45 CEST — RUNDE 3: KRITISCHER SLOT-TAG-BUG (Kais' Handy-Fund)
- Kais (5 annotierte Handy-Screenshots): heute ALLE Slots gestrichen,
  morgen bis 20:15 tot. ROOT CAUSE: Client sendet Lokal-Mitternacht
  (Berlin = Vortag 22:00Z), Server baute Slots via set() auf dem falschen
  UTC-Kalendertag; der strengere R2-Zukunfts-Check machte den latenten
  Versatz sichtbar (Alt-Code maskierte ihn). Buchungen selbst nie betroffen.
- PR #270 (`245efdb9`): Server normalisiert Kalendertag via Client-TZ,
  Widget sendet kanonisch calendarDayUtc. Beim Gegenrechnen SELBST
  gefunden: West-TZ-Kollision der beiden Fix-Hälften (NY-Gast → Vortag)
  → UTC-Mitternacht-Kurzschluss + NY-Regressionstest. Dazu: Vergangene
  Slots ganz ausgeblendet (gestrichen = belegt), neues Setting
  reservation.lastReservationTime + Admin-Formularfeld (Kais setzt 21:00
  selbst), kadi-icon überall, Chips 56px, Manage-Done-Rückweg.
- Review MERGE OK, 3 IMPORTANT alle vor Merge zu: Clear-Bug des Cutoff-
  Felds (undefined verschwand aus JSON, Shallow-Merge behielt Alt-Wert
  bei Erfolgs-Toast → explizites null), Cutoff-Inklusivität ungetestet
  (Reviewer-Mutation >= überlebte), TZ-fragiler Widget-Test (validierte
  Runner-TZ; unter TZ=Europe/Berlin gegengelaufen). Reviewer-Follow-up
  notiert: Admin-Dashboard sendet Restaurant-TZ statt Browser-TZ
  (pre-existing, reservation-datetime.component.ts:189).
- 1 CI-Rot zwischendurch (null-Typ in Signatur) — gefixt. Tests 112/0 +
  69/0. Release backend@0.22.1 + widget@0.7.1. LIVE-BEWEIS: Berlin-Form
  == UTC-Form (16 Slots Fr ab 17:30 verfügbar); heute 21:40 nur noch
  echte Rest-Slots 21:45/22:15. TG 10348-10350. Kais' eigene
  Fr-22:15-Testreservierung offen — Storno-Frage an ihn gestellt.
