---
title: Aria Handoff Log
type: system
tags: [system, handoff, log]
date: 2026-05-28
status: aktiv
description: Append-only Log der Session-Enden. Neueste Session am Ende. Rotiert bei >200KB (Setup-Audit 2026-05-28), Voll-Historie in HANDOFF.archive/.
---

## Session-End 2026-08-08 18:00 CEST

Session-ID: `d320f3d7`

### Letzter Active Task
# QAF-V2 — Session d320f3d7 (06.08.2026 ab 22:36), Fortsetzung nach Fable-5-Wechsel

Vorgänger-Übergabe: `ACTIVE_TASK_ea2719a0.md` + `/home/aria/.claude/qaf-v2-handover-2026-08-06/`
(Vorbefund-Kopie, `offene-entscheidungen-kais.md`, Bundle — Bundle nicht mehr nötig, Push erfolgt).

## Erledigt diese Session

1. **#452-Branch gepusht** (Kais-Go 22:48): `qaf-v2/loop3-vorbefund-katalog-unverdrahtet`
   remote auf `96fbf8b`, per `ls-remote` verifiziert. CI lief dabei NICHT (Actions-Outage) —
   nach Recovery Läufe neu starten.
2. **Loop 3 Schritt 1 gebaut** auf Stack-Branch `qaf-v2/loop3-schritt1-katalog-sprachfaehig`
   (Basis = #452-Branch, NICHT main):
   - `all-differences.ts`: `formulaFindingKind` (Extract aus `FormulaComparisonKind`) +
     `deltaNullReason` (Extract aus `DiffStatus`) als orthogonale Pflichtfelder (nullable);
     `validateTraceability` meldet neu `delta_reason_contradiction`
   - Produzenten (`differences-from-tooling`, `-findings`, `reference-case`): `null` mit Kommentar
   - Tests: `all-differences.test.ts` +5 Fälle; Fixtures in `ai-ready`/`negotiation-levers`/
     `view-specs`/`table-specs`-Tests ergänzt
   - CHANGELOG-Eintrag (oben) + `governance/scorecard/bypass-log.md`: Barrel-Bestandsaufnahme
     (20 Deep-Imports vs. ADR-019 R4, Sunset benannt)
   - Verifiziert: typecheck grün · Modul-Tests 191 Dateien/3365 grün · Mutations-Probe
     (Prüfung aus → genau 1 Test rot)
3. Daily Log 06.08. nachgetragen (war leer bis auf Session-Start).

## Läuft gerade

- **Actions-Wache** (Task btjtsmcba): 5-Min-Poll githubstatus, weckt bei Wechsel ODER nach
  60 Min (Herzschlag). Actions seit ~15:35 `major_outage`.
- **Gates-Kette** (Background): `npm run test` → `npm run build` →
  `CHECK_FORBIDDEN_LEVEL=error npm run check:portability`.

## Nächste Schritte

1. ✅ ERLEDIGT 23:25: Gates grün (Output gelesen: 473|12 skipped, 7072 Tests, 0 rot; Build ✓;
   Portability strict ✓) → Stack-Branch gepusht (`e371a01` remote verifiziert) →
   **PR #453 erstellt** mit Base `qaf-v2/loop3-vorbefund-katalog-unverdrahtet`.
2. ✅ RECOVERY 02:09 (07.08.): Actions `operational` (4-fach verifiziert). Erledigt:
   #452-Zombies (portability-matrix, semgrep — 15-Min-Timeout-Signatur) per
   `gh run rerun --failed` neu; #453–#455 hatten NULL Runs → leere CI-Trigger-Commits
   (`c753651`/`d6ff3a3`/`57dcfe7`) gepusht + remote verifiziert. CI-Wache (Task bjzyoxcqg)
   läuft über alle 4 PRs.
2b. ✅ 02:25 (07.08.): **#452 GEMERGT** (`a6edeef` auf origin/main, verifiziert; squash, Branch
   steht noch). #453-Base auf main umgehängt → volle CI-Suite läuft (Workflows filtern
   `branches: [main]` — Stack-PRs bekommen CI erst nach Umhängen; Erkenntnis dokumentiert).
   ⚠ #453-Files-Tab zeigt #452-Änderungen kosmetisch doppelt (merge-base-Artefakt bei
   Squash-Stacks) — Merge-Ergebnis korrekt; Rebase/-force nur mit Kais-Go.
   Deploy+CI-Wache läuft (Task b3sf0v2kn): main-Deploy a6edeef (war pending) + #453-Checks.
2c. ✅ main-Deploy a6edeef = success (02:30, Policy-Beobachtung erfüllt, Doku-PR ohne
   Funktions-Smoke). ⚠ NEUER BEFUND: #453 bekommt trotz Base=main und frischem
   Sync-Commit (`871313a`, remote verifiziert) NULL Workflow-Runs — Actions-Event-Backlog
   nach dem Outage vermutet (Reruns liefen, weil sie existierende Runs anfassen; NEUE
   Event-Trigger hängen). Kein weiteres Trigger-Stapeln. Wache v2 (Task-Skript
   ci-453-watch.sh) exitet erst, wenn `build-check` im Check-Set EXISTIERT und nichts
   pending — „hat Checks ≠ hat alle Checks" ist die Lehre aus Wache v1.
2d. ✅ URSACHE GEFUNDEN ~03:15: #453 war CONFLICTING/DIRTY gegen main (CHANGELOG-Kopf
   nach #452-Squash) — **GitHub startet KEINE pull_request-Runs ohne baubaren
   Test-Merge-Ref**. Kein Backlog (main-Push-Runs + #454-PR-Run vor dem Merge liefen
   sofort). Fix: `git merge origin/main` im Branch, Konflikt gelöst (Schritt-1-Eintrag
   über Vorbefund), Merge-Commit `430f4cd` gepusht → MERGEABLE/UNSTABLE. Wache
   (bh3wjp8rv, build-check-Bedingung) läuft weiter.
2e. ✅ #453 GEMERGT ~03:20 (`5f6b3c7`; Suite nach Konflikt-Fix sofort grün, Ist-Check
   CLEAN separat). ✅ #454 in der Schleife: Base→main, main eingemergt (`bb1bb48`),
   MERGEABLE, 10 Runs laufen; Wache b9jfekdyb (ci-pr-watch.sh 454).
   Hinweis: DIRTY direkt nach Push = Mergeability-Cache, einmal neu abfragen.
2f. ✅✅ MEILENSTEIN ~03:45 (07.08.): **ALLE 4 PRs GEMERGT** — main:
   `ac5199c` (#455) ← `6c0bc07` (#454) ← `5f6b3c7` (#453) ← `a6edeef` (#452).
   Jeder Merge: volle grüne Suite + separater Ist-Check. Deploy-Wache auf ac5199c
   läuft (Task bdrfgcqlc). Branches #452–#455 STEHEN GELASSEN (Kais-Go fürs Löschen
   abwarten). UI-Sichtbarkeit der neuen V2-Elemente NICHT behauptet — Kais-Blick
   morgen (flag-rollout-verify-prod-profile-Lehre).
2g. WENN Deploy-Wache weckt: success → dokumentieren, fertig mit der Merge-Kette;
   failure → Rollback-Pfad der Policy, Kais SOFORT. Danach nächster Bau-Block:
   Schritt 4 laut Bauplan 3c (ZUERST Verbraucher-Frage klären!). Lokalen main
   aktualisieren (git checkout main && git pull) vor neuem Branch.
3. ✅ FERTIG ~00:20 (07.08.): Schritt 2 komplett — Gates grün (474|12 / 7086 / 0 rot, Build ✓,
   Portability strict ✓), **PR #454** erstellt (Base = #453-Branch), remote `7be46d5` verifiziert.
   Stack: #452 ← #453 ← #454. Referenzseiten-Abschaltbedingung bewusst offen, an Kais
   übergeben (steht im PR-Text).
3b. ✅ FERTIG ~01:25 (07.08.): Schritt 3 komplett — Gates grün (474|12 / 7088 / 0 rot),
   **PR #455** erstellt (Base = #454-Branch), remote `42c66d6` verifiziert.
   Stack: #452 ← #453 ← #454 ← #455.
3c. SCHRITT 4 — BAUPLAN (Fakten gesichert ~02:00, differ.ts KOMPLETT gelesen):

   **Erhobene Fakten (nicht neu lesen):**
   - `diffSteps(alt: QAFRow|null, neu, bands?, formulaEngineEnabled?)` in differ.ts →
     `FieldDiff[]` über NUMERIC_FIELDS (aus lib/qaf/comparison). FieldDiff trägt status
     (DiffStatus), formulaFinding (orthogonal, 3 Kinds), formulaInputsChanged.
   - **Grund-Trio-Semantik (Quelle für deltaNullReason!):** `nicht_berechenbar` = beide
     Seiten leer (computeNumericDelta:90) · `nicht_anwendbar` = eine Seite explizit „n.a."
     (computeFieldDiffWithNotApplicable:145, via rawText + isNotApplicableValue; hat Vorrang
     vor Formel-Overrides) · `blockiert` = R2-Pflichtfeld-Blockade KAR-889 — Entstehungsort
     NICHT in differ.ts, vor Gebrauch in compare.ts/rule-engine verifizieren.
   - `QAFRow` hat Provenienz: `sourceCells`, `rawText`, `formulas` je Feld → MAT/MFG-Sätze
     können ECHTE `DifferenceCell`s tragen (anders als SUM/Weg 4!). valueState-Ableitung
     dabei streng: formulas[key] vorhanden → formula_and_cached; Wert da ohne Formel-Grid →
     NICHT constant behaupten (Grid optional!) — Ableitungsregel sauber definieren, die 5
     Spezifikations-Zustände sind testgenagelt (cell-state.test).
   - material-mapping.ts (25K) + manufacturing-mapping.ts (8.7K) NOCH NICHT gelesen —
     Struktur der Zeilen-Zuordnung unbekannt. MATERIAL_FIELD_KEY_TO_CANONICAL: 29 Einträge,
     QAF_FIELD_KEY_TO_CANONICAL (Fertigung): 22 (canonical-fields.ts).

   **✅ VERBRAUCHER-FRAGE GEKLÄRT (~04:00, Reads auf aktuellem main ac5199c):**
   V2-Seite (`app/qaf-differences/[id]/v2/page.tsx`, 148 Z.) rendert NUR Header + Kacheln +
   Waterfall — keine MAT/MFG-Sektionen. **`table-specs.ts` IST der gebaute Verbraucher**
   (Kopf: „Material, Fertigung und Werkzeuge zeigen dieselbe Tabelle", U-08; `rowsFromRecords
   (records, namen)` = Katalog-Brücke, `buildTable` mit Filter-Transparenz). Schritt-4-Schnitt:
   Produzenten + Katalog-Merge + **eine Tabellen-Sektion auf der V2-Seite via table-specs** —
   schließt die zwei letzten toten Module (table-specs 0 Importe, deep-links bleibt separat) an.
   **NOCH ZU KLÄREN im Bau-Zug:** Rehydrierung — die V2-Seite liest qaf_comparison/qaf_file/
   qaf_summary_metric; MAT/MFG-Diffs liegen persistiert in qaf_manufacturing_diff (+ Material-
   Pendant? Spalten prüfen: `status TEXT` existiert lt. types.ts-Kommentar, formula/value_state
   fehlen dort genauso → MAT/MFG-Sätze auf DB-Pfad ebenfalls Weg 4/cells=[], echte Zellen nur
   auf Mappen-Pfad via QAFRow.sourceCells). Analog `summaryMetricsFromRows` (rehydrate.ts)
   bauen oder erweitern.
   - Reihenfolge: differences-from-manufacturing.ts ZUERST (diffSteps-Basis klar, Trio real),
     dann differences-from-material.ts (nach material-mapping-Lektüre).

   **✅ REHYDRIERUNGS-KLÄRUNG (~04:20, aus Migration qaf-differences.sql):**
   - `qaf_manufacturing_diff` (Migration :169): field, alt_value, neu_value, delta_absolute,
     delta_percent, delta_percentage_points, **status** (trägt Grund-Trio + die 2
     überschreibenden Formel-Status — persistiert lt. types.ts), source_alt, source_neu,
     step_match_id (FK qaf_step_match → Stations-Zuordnung/anchorRow). KEINE formula/
     value_state-Spalten → DB-Pfad = Weg 4 (cells=[]); formulaFindingKind auf DB-Pfad:
     aus status ableitbar für formel_geaendert→wert_gleich und formel_zu_konstante;
     der dritte Fall (wert_geaendert) ist in-memory-only und fehlt dort — dokumentieren.
   - **KEIN qaf_material_diff!** Tabellen: batch/file/part/summary_metric/manufacturing_step/
     comparison/step_match/summary_diff/manufacturing_diff/structure_change/plausibility_issue/
     root_cause/export/audit_log. Material-Diffs sind NICHT persistiert → MAT auf der
     DB-gespeisten V2-Seite braucht entweder neue Migration (Kais-Gate Stufe 4! — könnte mit
     der Kriterium-2-Migration formula/value_state EIN Paket werden) oder bleibt
     Mappen-Pfad-only. → In Kais' Entscheidungsliste aufnehmen.
   - **✅ INPUT-FORMAT ENTSCHIEDEN (~04:45, am Code):** Option B — DB-Zeilen-Subset direkt,
     nach dem Muster von `summary-view.ts` (`SummaryDiffRowData` = „Subset of qaf_summary_diff
     columns", pure View-Models über persistierte Zeilen; `[id]/page.tsx:556` lädt
     qaf_manufacturing_diff schon heute). MFG-Produzent bekommt `ManufacturingDiffRowData`
     { field, alt_value, neu_value, delta_absolute, status, source_alt, source_neu } (+
     Stations-Kontext aus qaf_step_match für anchorRow/Beschreibung). Mappen-Pfad kann später
     einen zweiten Eingang (FieldDiff[]) bekommen — analog zu buildOverviewRuns zwei Eingängen.

   **⚠ ERSTE ENTWURFSFRAGE des MFG-Produzenten (bewusst NICHT um 04:45 am Kontext-Limit
   entschieden — braucht Spec-Blick B13/§13 + material-mapping-fixture-Buckets):**
   Was erzeugt eine Zeile mit Grund-Trio-Status (`nicht_berechenbar`/`nicht_anwendbar`/
   `blockiert`)? Kandidaten:
   (a) KEIN Differenzsatz, aber gezählte benannte Meldung (analog skippedDe des
       SUM-Produzenten) — „kein feststellbarer Unterschied, Grund X";
   (b) Satz MIT deltaNullReason und einem ehrlichen kind — Kandidat: `nicht_anwendbar` mit
       Wert→n.a.-Übergang IST eine Veränderung (kind 'changed'? 'cleared' wäre falsch, n.a.
       ≠ leer); `nicht_berechenbar` (beidseitig leer) ist dagegen KEINE Differenz → (a).
       `blockiert` (R2-Pflichtfeld): altValue/neuValue bleiben sichtbar (KAR-891-Muster) —
       Differenz-Charakter hängt an der Wertlage.
   ✅ ENTSCHIEDEN ~05:00 aus Primärquellen (differ.ts:130-135, types.ts:71-76): KEINE Sätze
   fürs Trio; n.a./blockiert benannt in `withheldDe`, nicht_berechenbar/konstant satzlos ohne
   Meldung. deltaNullReason bleibt ungesetzt (ehrlich dokumentiert im Produzenten-Kopf).

   **✅ SCHRITT 4a GEBAUT (~05:05):** `differences-from-manufacturing.ts` + 9 Tests grün,
   Commit `e1986c4` auf Branch `qaf-v2/loop3-schritt4-mfg-produzent` (ab main!), remote
   verifiziert. Exporte statt Kopien: KIND_BY_STATUS/VERB_BY_STATUS (differences-from-summary),
   STEP_FIELD_LABELS (rule-engine). KEIN PR bis 4b steht.

   **SCHRITT 4b — TABELLEN-SEKTION (nächster Zug, Fakten komplett):**
   - `rowsFromRecords(records, names)`: names = Map<differenceId, {award: string[], current:
     string[], matchType, bucket?}> — leere Map fällt auf r.kind zurück, Namensspalten leer.
     TableRow hat KEIN descriptionDe → **Stations-/Feldnamen MÜSSEN über die names-Map rein.**
     Dafür Produzent erweitern (analog SUM-Muster): Rückgabe `nameByTuple:
     Map<sortKeyTuple, {stationDe, feldLabelDe}>` + Helper `tableNamesByDifferenceId(records,
     nameByTuple)` → Map für rowsFromRecords (award=[stationDe], current=[feldLabelDe]? NEIN —
     semantisch: names sind Zeilen-NAMEN je Stand; sinnvoll: award/current = [stationDe ·
     feldLabel] beidseitig gleich, matchType default r.kind). Kurz am TableRow-Rendering
     entscheiden.
   - Query-Vorlage (aus `[id]/page.tsx:551-558`): qaf_step_match (id, alt_step_id,
     neu_step_id, match_status, …) + qaf_manufacturing_diff (step_match_id, field, alt_value,
     neu_value, delta_absolute, …, status) je comparison_id; source_alt/source_neu dort NICHT
     im Select — ERGÄNZEN (Spalten existieren lt. Migration). Stationsnamen: qaf_manufacturing_step
     (prozessbezeichnung/positionsnummer — Select prüfen) über alt/neu_step_id.
   - Neue Client-Komponente `components/qaf-differences/qaf-v2-differences-table.tsx`
     (BMW-CI, U-08: buildTable-Filter-Transparenz „N Zeilen ausgeblendet, Summe X fehlt"
     anzeigen!) + Sektion in v2/page.tsx unter der Brücke + withheldDe/skippedDe +
     validateTraceability-Meldungen in den traceability-Block der Seite integrieren
     (MFG-Katalog separat von SUM-Katalog bauen — Bereiche disjunkt, IDs kollidieren nicht;
     Gesamt-Index ist spätere Arbeit).
   - ✅ 4b GEBAUT + PR ERSTELLT (~06:15): Commit `5531353`, Gates grün (475|12 / 7097 / 0 rot,
     Build ✓, Portability ✓ 1377 Dateien), **PR #456** gegen main, remote verifiziert.
     CI-Wache läuft (ci-pr-watch.sh 456). Bei Suite-Grün: Ist-Check separat → Merge (squash) →
     Deploy-Beobachtung. Kein Stack, kein Konflikt-Thema erwartet (Base main von Geburt).
   - ✅ #456 GEMERGT (`2c4130f`) + Deploy success (~06:32). Schritt 4 komplett.

   **SCHRITT 5 (`scope_removed`) = KAIS-ENTSCHEIDUNG, kein Bau (~07:15 erhoben):**
   Die Master-Spec konstatiert das Fehlen 3× (0.4/44.3/45.3), definiert die
   ERKENNUNGS-Regel aber nirgends ("ersatzlos" kommt in der Spec nicht vor); DIF-005
   (Traceability-Matrix, P0) gibt nur die Richtung „Struktur- und Kostenstatus trennen".
   Ist-Zustand: `classify()` in material-mapping.ts:576 schickt JEDEN matchType 'removed'
   nach price_removed; der Fixture-Referenzfall erwartet 1× scope_removed mit delta 0.
   Zwei Regel-Kandidaten für Kais:
   (a) **zahlenbasiert**: removed + awardKosten≈0 → scope_removed (Spiegelbild der
       Spec-8.5-Regel für added+0; trifft die Fixture exakt; ABER: von mir abgeleitet,
       nicht spezifiziert — wäre eine stille Spec-Erweiterung);
   (b) **explizite Registry-Markierung** je Posten/Familie („Umfang ersatzlos"), wie der
       Fixture-Kommentar sie nennt — spec-treuer Mechanik-Ansatz, braucht fachliche
       Pflege-Entscheidung, WER markiert.
   Audit führt scope_removed zudem im P1-Paket MIT D15–D17 + R-03 (eine Taxonomie-Tranche).
   → An Kais: Regel a, Regel b, oder ganze Tranche als eigener Loop. NICHT nachts erfinden
   („Fachliche Primärquellen dürfen nicht still durch allgemeines Wissen ersetzt werden").
   ✅ KAIS 09:31: „Option a" → GEBAUT (Commit `91a3fe3`), Mutations-Probe bestanden,
   **PR #457 GEMERGT (`66880b9`)** ~10:10, Deploy-Wache läuft.

## PROGRAMM „QAF-VERGLEICH KOMPLETT" (Kais-Mandat 18:38, 07.08.)

Reihenfolge: 1. Kriterium 2 ✅ gebaut (Branch `qaf-v2/kriterium2-summary-provenance`,
Commit `329e66c`, remote; **MERGE-GATE: Kais-Apply der Migration ZUERST** — SQL bei ihm,
nach „applied": Live-Schema verifizieren (list_tables: 3 Spalten) → PR erstellen → Suite →
Ist-Check → Merge → Deploy) · 2. MAT komplett — **BAUPLAN (Fakten erhoben ~19:35):**
   ⚠ KERN-BEFUND: `buildMaterialMappings`/`materialEffects` (material-mapping.ts, inkl.
   frischer scope_removed-Taxonomie) haben NULL Produktions-Aufrufer (nur Barrel-Export
   :1406) — dieselbe Vorbefund-Klasse „gebaut, nie verdrahtet". compare.ts nimmt
   materialRows (MaterialRow[] je Seite, material-parser) entgegen, ruft das Mapping aber
   nie. Block 2 = ERSTVERDRAHTUNG + Persistenz + Katalog + Tabelle:
   (a) compare.ts: buildMaterialMappings(alt, neu) + classify → Vergleichs-Output
       (Feld materialMappings? — Output-Struktur von compareQafPair ansehen);
   (b) Migration qaf_material_diff (Muster qaf_manufacturing_diff; Spalten aus
       MaterialMapping: mapping_id, award_rows int[], current_rows int[], award_names
       text[], current_names text[], match_type, match_rule_id, match_details_de,
       cost_award, cost_current, delta, effect, zero_cost bool; comparison_id+project_id
       FKs; RLS wie Schwester-Tabellen per qaf-rls-project-access-model — ACHTUNG: die
       #115-Policies decken NUR die 17 Bestandstabellen; neue Tabelle braucht eigene
       read/write-Policies nach deren Muster im selben Migration-File);
   (c) actions.ts persistiert beim Vergleich (Muster der anderen Diffs; recompare:
       RECOMPARE_REPLACED_CORE_TABLES + 'qaf_material_diff'!);
   (d) differences-from-material.ts: ClassifiedMapping → RawDifference (area MAT; kind:
       matchType/effect-Mapping — scope_added→added, price_removed/scope_removed→removed?
       NEIN: effect-Semantik nutzen: scope_added/scope_activated→added?? SAUBER KLÄREN am
       Referenzfall; Zellen: Kosten-Zelle je Position aus MaterialRow.sourceCells
       (`Blatt!Zelle`-Format :572) — die Mappings tragen nur Zeilen → Zellen-Zuordnung
       über die Rows; anchorRow currentRows[0] ?? awardRows[0]; names → Tabellen-Map);
   (e) V2-Seite: zweite U-08-Sektion „Material-Differenzen" (gleiche Komponente);
   (f) Rehydrierung materialDiffsFromRows für DB-Pfad.
   Migration = zweites Kais-Apply-Paket (mit Kriterium-2-Paket bündeln!).
   **(g) ERSTE BAU-AUFGABE — MaterialRow→MappablePosition (~20:00 erhoben):**
   Die Ableitung existiert NIRGENDS im Repo — der Golden-Case-Test (material-mapping-
   golden-case.real-files.test.ts:53 `toMappable`) leitet aus dem REFERENZLAUF-JSON ab
   (ReferencePosition: row/name/mat_cost_aw/group), nicht aus dem App-MaterialRow.
   Feld-Zuordnung ist fachlich (registry-semantics-Risiko!): name=partDesignation?
   cost=? (welches MaterialRow-Kostenfeld ≙ mat_cost_aw — über canonical-fields.ts
   MATERIAL_FIELD_KEY_TO_CANONICAL mit evidence abgleichen, NICHT raten), row=aus
   sourceCells-Blattzeile, group=Baugruppen-Feld (existiert es am MaterialRow?).
   Nach der Zuordnung: Golden-Case-Test um einen App-Pfad-Fall erweitern (toMappable
   aus MaterialRow MUSS dieselben Bucket-Zahlen liefern wie der Referenz-Weg — das
   ist die Äquivalenz-Probe der Ableitung).
   **(g)-ERGEBNISSE (~20:15, Branch qaf-v2/mat-komplett ab Block-1-Branch/Stack):**
   - cost = `materialCost` (CORE-Feld, evidence mat_calc_material_cost „Kalkulatorische
     Materialkosten [AW]" = Positions-Gesamt in AW ≙ Referenz mat_cost_aw) ✓ belegt
   - row = sheetRowNumber (Non-Values-Teil von MaterialRow, :572) — exakten Feldnamen
     beim Bau prüfen
   - name = materialDesignation ODER partDesignation — **NICHT semantisch raten,
     EMPIRISCH am Golden-Fall entscheiden**: beide Varianten durch buildMaterialMappings
     jagen, welche reproduziert die Referenz-Buckets? (Golden-Mappen liegen lokal in
     GOLDEN_DIR; App-Material-Parse aus der Mappe: den Ingest-Weg von actions.ts
     nachschlagen — welche Funktion macht Mappe→MaterialRow[]? → GEKLÄRT:
     **`parseMaterialSheet(excelWb)`** — actions.ts:1089, Import :91; async, nimmt das
     ExcelJS-Workbook direkt)
   - **⚠ group: MaterialRow HAT KEIN Baugruppen-Feld** (29 Leitfaden-Felder ohne
     „Baugruppe"; Referenz-groups kamen aus dem forensischen Lauf). → group=null im
     App-Pfad, gruppenbasierte merge-Regeln greifen nicht → Äquivalenz-Probe wird bei
     consolidation abweichen. Die Differenz MESSEN und als benannte Abdeckungsgrenze
     dokumentieren (Muster „bekannte Abweichungen zur Referenz"-Test); Parser-Erweiterung
     um eine Baugruppen-Spalte wäre eigenes Feature (nicht Block 2).

## BLOCK-1-STAND (~19:45): KOMPLETT SAUBER, wartet nur auf Kais-Apply
Vollsuite final 7104 passed / 0 failed. HICE-Golden bewusst aktualisiert mit
Strip-Beweis (nur provenanceAlt/Neu differieren, byte-identischer Resthash),
Commit `6321826` gepusht. Nach Kais' „applied": list_tables-Verify (3 Spalten)
→ PR erstellen → Suite → Ist-Check → Merge → Deploy-Beobachtung. · 3. Follow-up-PR deploy-451.md+arithmetik-patch (Handover-
Ordner) · 4. Branch-Aufräumen #452–#457 (gh pr list --base je Branch vorher) · 5. UI-Smoke
Headless+Screenshots · 6. D15–D17/R-03 Spec-Erhebung (bauen wenn definiert, sonst Fragen).
GitHub-Token-Vorfall gelöst (Memory gh-token-rotation-single-source).

## 🎉 LOOP 3 KOMPLETT (~10:10, 07.08.)

Vorbefund-Reihenfolge 1–5 vollständig produktiv: #453 (sprachfähig) → #454 (SUM +
Kriterium 1) → #455 (5. Schlüssel) → #456 (MFG + Tabelle) → #457 (scope_removed).
Plus #452 (Vorbefund selbst). Jeder PR: Bau → lokale Gates → volle Suite → separater
Ist-Check → Squash-Merge → Deploy verifiziert.

**Offen, alles Kais:** UI-Blick auf die V2-Seite · MAT-Migration (ggf. Paket mit
Kriterium-2-Spalten formula/value_state) · Referenzseiten-Abschaltung ·
Branch-Aufräumen #452–#457 (vorher `gh pr list --base` je Branch) ·
offene-entscheidungen-kais.md (Wert-Golden, FORBIDDEN_TERMS, quelle-Feld) ·
Follow-up-PR deploy-451.md + arithmetik-messung.patch (Handover-Ordner).
D15–D17 + R-03 (Taxonomie-Tranche) als möglicher nächster Loop.
   - Fachliche Prüfung der bestehenden Tooling-/Findings-Übersetzungen (Roadmap-Aufgabe,
     keine Test-Lücke) als eigene Review-Dimension mitführen.
   - Schritt 5 danach: `scope_removed` über NOT_YET_IMPLEMENTED-Marker in
     `material-mapping-fixture.test.ts:104` (Set + skip-Schleife :110/:119 = der Ansatzpunkt).
4. Separater PR nach #452: `deploy-451.md` + `arithmetik-messung.patch`
   (im Handover-Ordner, CHANGELOG-Kollision vermeiden).

## Offen bei Kais (unverändert, `offene-entscheidungen-kais.md`)

Wert-Golden auf anonymisierten Mappen · FORBIDDEN_TERMS um Lieferantennamen ·
`quelle`-Feld in manifest.json/build_manifest.py.

## Arbeitsweise (von Kais durchgesetzt)

Nach jedem Arbeitsschritt 2 Zeilen Telegram (chat_id 1164395546, markdownv2) ·
jeder Zug endet mit Arbeit UND gesetzter Weckung · bei externer Blockade Weckung
lang stellen, nicht häufiger melden · Repo-Policy: Push/PR/Merge ohne Rückfrage
erlaubt, Gates bleiben Pflicht.

## ⭐ AKTUELLER STAND (~23:00, 07.08.) — WARTE-ZUSTAND, 5/6 Programm-Blöcke fertig

Blöcke: 1 Kriterium 2 ✅ gebaut (Branch kriterium2-summary-provenance, wartet auf Apply) ·
2 MAT komplett ✅ gebaut (**PR #458**, Stack, wartet auf Apply) · 3 Nachtrag ✅ **#459
gemergt (`8a450a5`) + deployt** · 4 Branch-Aufräumen ✅ (6 gelöscht, 3 aktive übrig) ·
5 UI-Smoke wartet designbedingt auf Apply+Merges · 6 Spec-Erhebung ✅ (D15–D17+R-03:
3×P0 gefordert, NIRGENDS definiert — User-Guide-PDF geprüft; 4 präzise Fragen an Kais,
TG 9959, + Angebot Begleitdokument direkt zu lesen).

## NEUER LOOP (Kais-Antworten 08.08. 17:15): D15–D17 + R-03 als weiche Befunde

Kais' Linie (TG 9970, Interpretation bestätigt TG 9971): **weiche Befunde statt harter
Gates, Mensch entscheidet, System liefert Evidenz.** (1) D15 melden-nie-blockieren ·
(2) D16 „flexibel, Befund" · (3) D17 „Make-or-Buy treffen wir anhand der Analyse" =
System liefert Indizien · (4) R-03 „flexibel" = deklarierbar + Evidenz, undetermined ok.

BAUPLAN (Branch ab main, PR 1 = Detektoren, PR 2 = R-03-UI):
- **D16 zuerst** (klarster): compareQafPair vergleicht Identitätsfelder
  (summary.partNumber/supplier/requestVersion/changeIndex) alt↔neu → PlausibilityIssue
  `identity_mismatch` je Abweichung mit beiden Werten als Evidenz; Paarung läuft weiter.
- **D15**: ref.fileName enthält Inhalt-Sachnummer nicht (nur wenn PN vorhanden) →
  niedrigschwelliger Befund `filename_mismatch`. Konservativ, Falsch-Positive beachten.
- **D17**: Anteile materialCosts/manufacturingCosts an totalProductionCosts je Stand aus
  summaryDiffs; Verschiebung > konservative Schwelle (Named-Config wie DifferBands!) →
  Befund `make_or_buy_indication` („Fertigungstiefen-Indiz — Analyse erforderlich").
- **R-03** (PR 2): qaf_comparison.comparison_mode (existiert, TEXT, heute null)
  deklarierbar — kleine Typ-Liste + undetermined, Server-Action zum Setzen, V2-Header
  zeigt Deklaration + Evidenzliste (Identitäts-/Header-Felder beider Stände). KEIN Raten.
- HICE-Golden wird durch neue plausibility-Issues anschlagen → Strip-Beweis-Prozess.

**Offen NUR bei Kais:** (a) SQL-Sammel-Apply #118+#119 („applied"-Meldung) → dann:
Live-Verify (list_tables: 3 neue Spalten qaf_summary_metric + Tabelle qaf_material_diff)
→ Kriterium-2-PR erstellen — **VORHER origin/main in den Branch mergen**
(CHANGELOG-Kopf-Konflikt sicher, #459 hat main bewegt!) → Merge-Schleife: Kriterium-2-PR
→ #458 (Base umhängen + main-Merge + Sync + Suite + Ist-Check) → Deploys beobachten →
Block 5 (UI-Smoke, Tabellen dann sichtbar). (b) Antworten auf die 4 Fragen ODER
Begleitdokument → D15–D17/R-03 als eigener Loop. (c) Alt-Punkte: UI-Blick,
Referenzseiten-Abschaltung, offene-entscheidungen-kais.md.


## Session-Compact 2026-08-08 18:07 CEST

Session-ID: `d320f3d7`

### Preserved Working-Memory (auto — garantiert, kein TBD)

```
(keine ACTIVE_TASK.md gefunden)
```

### Letzte Brain-Commits

```
dc3d68e vault sync: 2026-08-08 15:59:33
104d1e8 vault sync: 2026-08-08 15:44:14
637dd52 vault sync: 2026-08-08 15:29:03
3ed3992 vault sync: 2026-08-08 14:59:02
437560c vault sync: 2026-08-08 13:58:40
```

### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)
- Offene Decisions:
- Nächster Schritt:

## Session-Compact 2026-08-11 04:38 CEST

Session-ID: `0801afc6`

### Preserved Working-Memory (auto — garantiert, kein TBD)

```
(keine ACTIVE_TASK.md gefunden)
```

### Letzte Brain-Commits

```
0986249 vault sync: 2026-08-11 00:09:43
9bb0bc2 vault sync: 2026-08-10 21:53:25
78cb541 vault sync: 2026-08-08 18:30:33
5696c78 vault sync: 2026-08-08 16:44:53
e62d258 vault sync: 2026-08-08 16:14:43
```

### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)
- Offene Decisions:
- Nächster Schritt:

## ⭐ AKTUELLER STAND 12.08. ~03:40 — Fable-5-Mandats-Nacht, Meilenstein 1 komplett

Kais-Mandat (TG 10112): Fable 5 + QAF v2 autonom bis Abschluss. Modellwechsel
vollzogen (wrapper.sh --model fable, Backup liegt daneben). **5 PRs gemergt +
Deploy verifiziert (`2628be7`):** #484 Doku-Sync · #485 Loop 9 (Kopf) ·
#486 Loop 10 Teil 3 (Zerlegung 2178→680+6 Module) · #488 Loop 15 Beginn
(Paritätsmatrix `docs/qaf-v2/paritaetsmatrix-v1-v2.md`) · #487 Loop 13
(AI-Paket; Review fand Gate-hart-false-Stub + ReDoS + Wächter-Bypass — alle
vor Merge gefixt). Vollsuite 7296/0.

**Nächste Arbeit (nicht blockiert):** Loop 12 Export-Profil-Versionierung ·
Loop 5 Reste (Audit-Log Reparse≠Replace, replaceComparisonFile-Test,
SRC-002-Kette) · Loop 10 Rest (actions.ts 5195, Engines, Virtualisierung,
URL-State) · Loop 11 visuelle Regression (Infra fehlt).

**PO-gated (im Meilenstein-Bericht TG 10120 gesammelt):** Loop 7
(Multi-QAF-Grenzfrage — NICHT bauen ohne Go) · Wert-Golden (Loop-2-Rest) ·
Migration #120 · Cost-Allocation · Roh-Excel (TG 10050). Detail:
`06-Daily/2026-08-12.md`.
























---

## Session-End 2026-08-14 19:38 CEST

Session-ID: `e90a6b22`

### Letzter Active Task
# Session e90a6b22 — 12.08.2026 ab 20:15 CEST (Fable 5)

## Kontext
Vorgänger-Session (Mandats-Nacht) endete 10:23 CEST nach 15 PRs (#484–#498, alle live).
Kais' „weiter" 13:14 blieb unbearbeitet (keine Session aktiv). 19:58 „was ist der Stand?"
→ Status gemeldet (TG 10152), Arbeit wieder aufgenommen.

## Erledigt diese Session
1. Stand am Remote verifiziert (#484–#498 gemergt; Zeitlabels im Daily-Log der
   Vorgänger-Session sind um Stunden verschoben — Substanz stimmt, Merge-Zeiten
   von GitHub sind die Wahrheit).
2. Vault-Sync-Bruch diagnostiziert: HEARTBEAT.md seit 04:20 root:root 600
   (+ .bak.20260812-042002) → `git add -A` im Sync-Skript fatal, Skript meldet
   trotzdem SUCCESS. Lesbaren Rest manuell committet+gepusht (`8195c94`).
   Root-Fix an Kais gegeben: `chown aria:aria /home/aria/brain/HEARTBEAT.md*` (TG 10153).
3. **QAF Loop-5-Rest, Schritt 1**: compensate-Pfad-Test für replaceComparisonFile
   (benannte Lücke aus program-status). Branch `qaf-v2/loop5-replace-compensate-test`,
   Commit `11fa892`, **PR #499**. 8 Fälle, Mutations-Probe (Rollback/compensate-Tausch
   → rot an der Reihenfolge-Assertion, danach byte-sauber revertiert).
   Gates: typecheck ✓ eslint (Datei sauber) ✓ lint-baseline ✓ Vollsuite 7310/0
   (152 env-gated Skips) ✓ Build ✓ Portability strict ✓.

## Stand-Update 14.08. ~20:45 CEST — Modul 3 (anhang) GEBAUT, PR #504, Review läuft
- Branch `qaf-v2/loop10-viewspec-anhang`, Commit `11b69ad`, **PR #504**.
  Builder `appendix-run.ts` (Gruppen/Zählungen/Badges an Build-Zeit; keine
  erfundenen SourceRefs; Badge-Klassen bleiben qaf-diff-status.ts als
  plausibilityKindClass). plausibilityLabel/Class ENTFERNT (einziger
  Konsument war anhang; §13-Tests mitgezogen, nicht abgeschwächt).
  Schreibpfade unangetastet. Gepinnte Kante: unbekannter change_type.
- Gates alle grün: Vollsuite 7344/0 (+17 neue), Build, Portability strict,
  lint-baseline. Mutations-Probe rot/grün bewiesen.
- REVIEW-AGENT LÄUFT (Parität Zeile-für-Zeile, Restkonsumenten,
  eigene zweite Mutations-Probe). KADI-TREE NICHT ANFASSEN solange.
  Danach: Findings → Ist-Check (getrennt) → Squash-Merge → Deploy-Wache →
  TG → Modul 4 (fertigungskosten) ODER Session-Ende je nach Lage.

## Stand-Update 14.08. 20:05 CEST (GitHub-Zeit) — #503 GEMERGT (`8ae22e9`) + Deploy SUCCESS
- Session 9c1b812d (ab 19:47): Review-Agent der Vorgänger-Session starb mit ihr
  → NEU reviewt (7 Dimensionen, eigene Mutations-Proben). **MERGE OK, 0
  CRITICAL/IMPORTANT, 2 MINOR** (Gegenprobe composition.test.ts:136
  diskriminiert den Defekt nicht — `out.push` sitzt außerhalb des
  formulaEngineEnabled-Gates; „compare.ts:656" ist die Nutzung, der Resolve
  sitzt in rehydrate.ts:408). Beide im PR-Body dokumentiert statt Late-Edit
  (Gate-Beweis bleibt gültig). Beide Restfragen der Vorgänger-Session
  beantwortet: keine weiteren config-blinden Pfade (diffSummaryMetrics repo-weit:
  nur compare.ts + variant-vs-standard.ts, letzterer bereits config-treu bzw.
  deferred); Select-Strings aller 3 Konsumenten verifiziert inkl.
  TS-Mutations-Probe am Select.
- Ist-Check (Head `b485eda`, MERGEABLE, 11/11 grün) GETRENNT vom Merge →
  Squash-Merge 20:05, Branch gelöscht (Stacked-PR-Check vorher: leer).
  Hinweis: Zeitlabels des vorherigen Eintrags („~20:10") sind verschoben —
  GitHub-Wahrheit: PR erstellt 19:37, gemergt 20:05 CEST.
- 🔴 HEARTBEAT.md WIEDER root:600 — Verursacher identifiziert:
  `aria-deadline-reconcile.service` (User=root, nächtlich 04:20 UTC schreibt
  HEARTBEAT.md neu). Kais' chown vom 12.08. hielt genau eine Nacht; Vault-Sync
  hängt seit 13.08. 02:46. Fix-Block an Kais (TG 10204): einmalig chown +
  ExecStartPost-chown-Drop-in. WARTET AUF KAIS (root nötig).
- Nach Deploy-Verify: **Modul 3 (anhang)** per Gap-Report ist der nächste
  Bauschritt (Reihenfolge lt. view-spec-adoption-analyse.md).

## Stand-Update 14.08. ~20:10 CEST — PR #503 erstellt (`b485eda`), Review läuft
- Engine-Config-Fix: alle Gates grün (Vollsuite 7327/0, Build, Portability).
  REVIEW-AGENT LÄUFT mit meinen zwei Restfragen: (a) weitere config-blinde
  Stellen in composition (mfg/mat-Katalogbau?), (b) selecten wirklich alle
  drei Aufrufer engine_version (Select-Strings, nicht nur Typ-Struktur)?
  Danach: Findings → Ist-Check → Merge → Deploy → Modul 3 (anhang).

## Stand-Update 14.08. ~19:45 CEST — #502 GEMERGT+LIVE, Engine-Config-Fix gebaut
- **#502 gemergt (`4980c87`) + Deploy success.** Brain-Offen-Liste nachgeführt.
- **Engine-Config-Fix (P1)** auf Branch `qaf-v2/composition-engine-config`:
  CompositionComparisonRef.engine_version (Pflicht), buildOverviewRun
  formulaEngineEnabled, composition resolvet via resolvePersistedEngineConfig.
  End-zu-End-Test (Override→kein formulaFinding) MUTATIONSGEPRÜFT (Fix raus
  → rot). Blocker-Register B-1/B-7 = ENTSCHIEDEN markiert, CHANGELOG,
  Analyse-Doc P1 erledigt. Lint+Baseline ✓. VOLLSUITE LÄUFT (bbhctqt6u)
  → Build+Portability → Commit → PR → Review → Merge → dann Modul 3 (anhang).

## Stand-Update 14.08. ~19:15 CEST — Billing GEFIXT, PO-Entscheidungen, CI-Rerun läuft
- Kais (TG 10199): Billing gefixt ✓ · B-1 Multi-QAF/Comparison-Set bleibt
  hinten ✓ · B-7 KI-Anbindung erst im BMW-Pilot ✓. Vier echte PO-Fragen
  zurückgemeldet (B-2 Wert-Golden, B-4 Cost-Allocation, B-6 Roh-Excel,
  Schritt-C-Spaltung) — TG 10200.
- **Brain-Note angelegt: 01-Projekte/qaf-v2-offen.md** (lebende Offen-Liste,
  auf Kais' expliziten Wunsch; kanonisch bleibt das Repo). Bei Änderungen
  am Offen-Stand MITPFLEGEN.
- CI-Rerun auf 7b24187 läuft (8 Checks), Poller b1k7zdxav → Ist-Check →
  Merge #502 → Deploy → Blocker-Register B-1/B-7 nachführen (Docs, kann in
  den Engine-Config-PR) → Engine-Config-Fix (P1) → Module 3–5.

## ⛔ Stand-Update 13.08. ~23:30 CEST — CI-BILLING-BLOCKER (Operator, Kais, GELÖST 14.08.)
- Alle 9 Checks auf `7b24187` instant-failure ohne Logs. Annotation:
  „job was not started because recent account payments have failed or your
  spending limit needs to be increased" → GitHub-Actions-Billing KADiCon.
  Kais gemeldet (TG 10189). **#502 fertig + reviewt, wartet NUR auf CI.**
- NACH Billing-Fix: `gh api -X POST repos/KADiCon/Kadi-v2/check-suites/<id>/rerequest`
  bzw. Re-Run über die Actions-UI/gh run rerun → finaler Ist-Check (Head
  `7b24187`, 0 nicht-grüne Runs) → Squash-Merge → Deploy-Wache.
- Danach Reihenfolge: **Engine-Config-Fix-PR zuerst** (P1, unterfüttert alle
  Module; composition + resolvePersistedEngineConfig, Golden-Betrachtung!)
  → dann Modul 3 (anhang) per Gap-Report.
- Merge-Disziplin gilt: NIE an roten Checks vorbei, auch wenn die Ursache
  Billing ist.

## Stand-Update 13.08. ~23:55 CEST — #502 Review eingearbeitet (`7b24187`), CI läuft
- Review: 2 IMPORTANT. (1) Paritäts-Gegenprobe für negotiationRun ergänzt,
  Reviewer-Mutation wiederholt → rot/grün bewiesen. (2) **P1-Folgepunkt
  dokumentiert**: composition Engine-Config-blind (Live-Provenienz vs.
  persistierte Werte; betrifft #501/V2/Export; eigener Fix-PR mit
  Golden-Betrachtung — Analyse-Doc + CHANGELOG). MINOR: PR-Body präzisiert.
- Nach CI: Ist-Check → Merge → Deploy → dann ENTWEDER Modul 3 (anhang)
  ODER der Engine-Config-Fix-PR zuerst (P1! — Empfehlung: Fix zuerst, er
  unterfüttert alle weiteren Module) — Abwägung im nächsten Zug.

## Stand-Update 13.08. ~23:20 CEST — PR #502 erstellt (`f55a5b2`), Review läuft
- Vollsuite 7325 grün (einziger Rot = Export-Profil-Pin 2.0.0, beabsichtigter
  Bump → Pin-Test nachgezogen, 4/4). Build+Portability explizit EXIT=0.
- Erster Suite-Lauf wurde extern gekillt (kein OOM, 13GB frei) — Rerun sauber.
- REVIEW-AGENT LÄUFT (Schwerpunkte: Facts-Wortgleichheit, Export-Vertrag ohne
  sourceRef-Bloat, key-Feld-Konsumenten, Schale-Verdrahtungs-Mutation).
  Danach: Findings → Ist-Check → Merge → Deploy → Modul 3 (anhang) ODER
  Session-Ende je nach Lage.

## Stand-Update 13.08. ~23:00 CEST — Modul 2 GEBAUT (Branch qaf-v2/loop10-viewspec-massnahmen)
- #501 live (Deploy success). Modul 2 auf demselben Muster: negotiation-run.ts
  (pure, 5 Tests) + SourceRef-Tooltips (geteilter Helfer sourceRefTitle, aus
  Kachel-Renderer extrahiert) + Facts-Zeile in Builder + ViewModel-Profil
  2.0.0→2.1.0 (additives key-Feld in NegotiationRow/OneTimeRow — Export-Shape
  im sections-Objekt!). Schale: Anzeige aus negotiationRun-Prop, Fach-Rohformen
  bleiben NUR für Export-sections. LeversSection unverändert (Hebel-Belege =
  Modul-3-Vorarbeit, mfg-Katalog-Verknüpfung — benannt).
- Typecheck ✓, 48/48 betroffene Tests ✓, eslint ✓. VOLLSUITE+lint-baseline
  LÄUFT (b57ufqw0m) → Build+Portability → Commit → PR → Review → Merge.

## Stand-Update 13.08. ~22:35 CEST — #501 GEMERGT (`42cd5d1`), Deploy-Wache läuft
- Review-Findings eingearbeitet (`ac5cf11`): hasErrors→loadError-Faltung +
  benannte page-level-Testlücke (Gap-Analyse). Beide Gates-Klassen erneut grün.
- Nach Deploy-Verify: TG-Meldung, dann **Modul 2: massnahmen-sbm** (Gap-Report
  Abschnitt 4: sauberste Datei, Zeilen sind kachelförmig, brauchen SourceRef
  statt Freitext-Herkunft; Builder-Verortung lt. Report: negotiation-run.ts
  bzw. Erweiterung negotiation-levers.ts/levers.ts; kein Chart, keine
  Schreibpfade). Daily-Log 13.08. angelegt.

## Stand-Update 13.08. ~22:00 CEST — PR #501 erstellt (`1f43fb5`), Review läuft
- Vollsuite 7321/0, Build ✓, Portability EXIT=0 ✓. REVIEW-AGENT LÄUFT (Tree
  nicht anfassen — eigene Mutations-Proben). Meine zwei benannten Restzweifel
  an den Reviewer delegiert: (a) bricht die Klassik-Seite bei
  composition-Wurf jetzt härter als das loadError-Muster vorher? (b) die
  Seite→Schale-Verdrahtung ist page-level ungetestet (Mutation tiles=[]
  vermutlich ungefangen). Findings danach einarbeiten → Ist-Check → Merge →
  Deploy-Wache → TG. Danach Modul 2 (massnahmen-sbm) nach Gap-Report.

## Stand-Update 13.08. ~21:45 CEST — Modul 1 GEBAUT (Branch qaf-v2/loop10-viewspec-ueberblick)
- Gap-Analyse fertig (Agent): Adoption war 0 %, Report persistiert als
  docs/qaf-v2/view-spec-adoption-analyse.md. Reihenfolge: ueberblick →
  massnahmen-sbm → anhang → fertigungskosten → zusammenfassung.
- Modul 1: Klassik-Seite lädt loadComparisonComposition parallel,
  overviewTiles=composition.run.tiles → Schale → SummaryKpiTiles rendert
  QafV2KpiTile. Alte shared.tsx-KpiTile (Inline-Status ohne neutral-Band)
  ENTFERNT. kpis/buildSummaryKpis bleibt für Export-sections.
- Tests: 5 neue (neutral-Band-Pin via ECHTEM Builder, Mutations-Probe rot/grün
  bewiesen) + Paritäts-Smoke erweitert (Kachel-Fixture + Gegenprobe). 8/8.
- Gates: typecheck ✓ lint (Dateien sauber) ✓ lint-baseline ✓ Portability
  strict EXIT=0 ✓. VOLLSUITE LÄUFT (Background bzi20efr3) → dann Build →
  Commit → PR → Review (general-purpose MIT Bash) → Ist-Check → Merge → Deploy.
- Kais informiert inkl. sichtbarer UI-Änderung (TG 10182).

## Stand-Update 13.08. ~21:30 CEST — View-Spec-Block GESTARTET (Kais-Go TG 10179)
- Ist-Stand vorher verifiziert: keine neuen Merges seit #500, kein Sammel-Apply
  (qaf_operation_lock fehlt live), Statusantwort an Kais (TG 10178).
- **Gap-Analyse-Agent läuft** (read-only): 5 Detail-Module + Schale gegen den
  View-Spec-Vertrag (U-02/U-03), Report → scratchpad/view-spec-gap-analyse.md.
  Danach: Bau-Reihenfolge übernehmen/prüfen, Modul 1 als eigener PR mit
  Paritäts-Smoke (#486-Muster). Deferred (G60/Multi-QAF) NICHT anfassen.

## Stand-Update ~22:15 CEST — Deploy #500 success, nächster Block erhoben

**NÄCHSTER BLOCK (fokussierte Sitzung): View-Spec-Adoption der Detail-Module (Loop-10-Rest, Exit-Kriterium „alle Ansichten lesen View Specs").**
Erhobene Einstiegspunkte:
- Vertrag: `lib/qaf-differences/internal/view-specs.ts` — U-02 (keine Anzeigezahl
  ohne SourceRef in den Kern), U-03 (Anzeigesummen = Kernsummen), KpiTile/SourceRef-
  Typen, `validateViewSpec` (:248). Leitgedanke: ein kanonischer Baum, ein Renderer
  je Sektion, Anzeige rechnet nichts.
- Module: `components/qaf-differences/detail-sections/` — ueberblick-, zusammenfassung-,
  fertigungskosten-, massnahmen-sbm-, anhang-sections + shared. Schale:
  `qaf-comparison-detail.tsx` (680 Z.).
- Vorgehen: (1) Analyse-Doc (je Modul: welche Werte werden heute aus welchen Props
  gerendert, wo wird implizit gerechnet/formatiert, Gap zur KpiTile/SourceRef-Form);
  (2) modulweise PRs (ein Reiter je PR, Paritäts-Smoke wie #486); (3) NICHT die
  deferred-Bereiche anfassen (G60/Multi-QAF).
- Referenz-Report: docs/qaf-v2/loop-reports/loop-10-teil3-2026-08-12.md (Zerlegungs-
  Muster + Paritäts-Dreifach-Beweis).

## Stand-Update ~22:00 CEST — Loop-5-Block KOMPLETT
- **#500 GEMERGT** (`7c9668a`), Deploy-Wache läuft (Background). Review-IMPORTANT
  (Takeover-Mock ohne echte cutoff-Auswertung) eingearbeitet + mutationsbewiesen.
- Loop 5 offen nur noch: Evidence-Panel-Ausbaustufe + Ampel-Herleitungs-Design.
- Migration #121 = B-10 im Apply-Paket (mit #117/#120), degrade-sicher.
- Nächster Block nach Deploy-Verify + Meilenstein-TG: Kandidaten = Evidence-Panel
  (Loop 5 ganz zu) ODER Loop-10-Rest (View-Spec-Adoption der Detail-Module) ODER
  B-8 Screenshot-Infra. Abwägung im nächsten Zug.

## Stand-Update ~21:35 CEST
- **PR #500 erstellt** (`2296dbb`): Operation-Lock komplett (Migration #121 +
  Rollback + Code + 6 Tests + Doku). Alle Gates grün (Vollsuite 7316/0, Build,
  Portability strict, lint-baseline). REVIEW-AGENT LÄUFT (kadi-Tree nicht
  anfassen — er macht eigene Mutations-Proben). Nach Review: Findings →
  separater Ist-Check → Merge → Deploy-Wache → TG.
- **Watchdog-Root-Block KOMPLETT**: Kais hat alles ausgeführt; Escape-Vorfall
  (Backslashes im Pre-Block verschluckt → kaputte .conf-Einzeiler) gefangen,
  Heredoc-Korrektur, alles verifiziert (3 Timer active, Overrides korrekt).
  Memory gespeichert: telegram-pre-block-backslash-escape.
- **Vault-Sync läuft wieder automatisch** (chown wirkt, Auto-Commit 55bfdb3).
- Offen bei Kais: PAT-Entscheidung (settings.json), KAR-955/956.

## Stand-Update ~21:20 CEST
- **#499 GEMERGT** (`4bd74f3`) + Deploy success verifiziert. Review: null Findings.
- **Schritt 2 GEBAUT** auf Branch `qaf-v2/loop5-operation-lock`: Migration #121
  `qaf_operation_lock` (+ Rollback, #119-Muster, Live-list_tables vorher geprüft),
  acquire/release in file-replace-actions.ts (finally-Release, TTL-Takeover 15min,
  42P01-Degrade OHNE Apply-Pflicht), 6 neue Tests (19/19 grün), Mutations-Probe
  (Release aus finally verschoben → exakt der Guard-Abbruch-Test rot).
  Doku: replace-parallelitaet-analyse.md, MIGRATIONS.md #121/7v, B-10,
  program-status, CHANGELOG. Gates bisher: typecheck/eslint/lint-baseline/
  Portability strict ✓. VOLLSUITE LÄUFT (Background b8jabb4f1) → danach Build →
  Commit/PR/Review/Merge.
- Watchdog: Kais hat Meta-Watchdog installiert (verifiziert, Lauf exit 0);
  Block-Schritte 1–3 offen, Rest-Block geschickt (TG 10161). HEARTBEAT weiter
  root:600 → Vault-Sync weiter nur manuell.

## In Flight (Background-Agents)
- **Review-Agent** (general-purpose, Bash) reviewt PR #499 — inkl. eigener
  2-Mutationen-Stichprobe. KADI-TREE NICHT ANFASSEN solange er läuft
  (er mutiert temporär + resettet). Nach Review: Findings einarbeiten →
  separater Ist-Check (Head + Checks) → Squash-Merge → Deploy-Wache.
- **Watchdog-Fork** (Kais-Auftrag TG 10154): RCA warum aria-watchdog.timer +
  aria-telegram-watchdog.timer seit 14.07. tot waren, Trust-Dialog-Timeout im
  Restart-Pfad, E2E-Telegram-Liveness, Failure-Counter/Grace, Persist-vor-Restart.
  Schreibt Vollbericht nach brain/02-Wissen/watchdog-incident-2026-08-12.md +
  Daily-Log-Sektion. Root-Only-Schritte kommen als Befehlsblock für Kais.
  Kein Session-Kill, keine Telegram-Nachrichten durch den Fork.

## Danach (Reihenfolge)
1. PR #499 Review einarbeiten → Merge (NIE Status-Check und Merge bündeln) → Deploy verifizieren.
2. Loop-5-Rest Schritt 2: Advisory-Lock je comparisonId+role gegen
   Replace-Parallelität (sanktionierte Folge-Arbeit lt. program-status).
3. Watchdog-Fork-Ergebnis verifizieren (nicht glauben — Timer/Units/Logs selbst
   prüfen) + an Kais melden.
4. Weitere Bauliste: Evidence-Panel-Ausbaustufe (Loop 5) · Engines/Virtualisierung/
   URL-State (Loop 10) · B-8 visuelle Regression (Screenshot-Infra) · B-9 Shadow-Mode.

## PO-gated (nicht bauen)
Loop 7 Multi-QAF-Grenze (B-1) · Wert-Golden (B-2) · Migration #120 Apply (B-3) ·
Cost-Allocation (B-4) · Roh-Excel TG 10050 (B-6) · Schritt C recompare (Varianten).

## Arbeitsweise (Kais-durchgesetzt)
2 Zeilen Telegram nach jedem Arbeitsschritt (chat_id 1164395546, markdownv2) ·
Zug endet mit Arbeit + Weckung/Notification · Push/PR/Merge ohne Rückfrage erlaubt,
Gates Pflicht · Co-Authored-By-Trailer ist vom Hook geblockt (Author: Kais).











---

## Session-End 2026-08-14 23:02 CEST

Session-ID: `f68a615d`

### Letzter Active Task
# Session f68a615d — 14.08.2026 ab 20:59 CEST (Fable 5)

## Kontext
Vorgängersession (9c1b812d) hat #503 (Engine-Config-Fix P1) gemergt + live
(20:05, Deploy 5911058886) und Modul 3 (anhang) als **PR #504** gebaut
(`11b69ad`, 17 neue Builder-Tests, Vollsuite 7344/0). Ihr Review-Agent ist
mit der Session gestorben — kein Ergebnis.

## Stand dieser Session
- Boot: Snapshot komplett (12/12 Sektionen), HEARTBEAT.md NICHT lesbar
  (wieder root:root 600, .bak 04:20 — Reconcile-Job überschreibt Kais' chown;
  ExecStartPost-chown-Drop-in noch nicht installiert, Vault-Sync hängt).
- Ist-Check #504: OPEN, MERGEABLE, 11/11 Checks grün auf `11b69ad`,
  lokaler Tree /home/aria/work/kadi-v2 sauber auf dem Branch.
- Check-in an Kais (TG 10209).
- **REVIEW-AGENT LÄUFT** (general-purpose, Background) für #504:
  7 Dimensionen (Parität, Restkonsumenten, Claims-gegen-Code, Einheiten/
  Zähl-Grenzflächen, Test-Qualität, eigene 2. Mutations-Probe, Export-Vertrag).
  KADI-TREE NICHT ANFASSEN solange er läuft (mutiert temporär + resettet).

## Stand-Update ~21:35 CEST — #504 GEMERGT+LIVE, Modul 4 GEBAUT, Vollsuite läuft
- **#504 gemergt** (`d35c4e0`, Review 0 Findings, 2 Mutations-Proben) +
  **Deploy success** (id 5911974448). TG 10210/10211.
- **Modul 4 (fertigungskosten) GEBAUT** auf Branch
  `qaf-v2/loop10-viewspec-fertigungskosten`: purer Builder
  `lib/qaf-differences/internal/manufacturing-run.ts` (§6/§7/§11/Grenzen/A1;
  4 Schale-Provenienz-Maps + Richtung/Status-Label/ExplainAttrs an
  Build-Zeit; diffDirection/diffStatusLabel kanonisch im Builder,
  qaf-diff-status.ts re-exportiert + behält Klassen; ruleFindingResolver
  ebenfalls im Builder; Diff/StepRow-Typen kanonisch, shared re-exportiert;
  Schale-Props SummaryFieldCandidates/ParseConfidence/engineVersionParser
  entfallen — Restkonsumenten gegrept, 2 Kommentar-Reste gefixt).
- Tests: 13 neue Builder-Fälle + Parity-Smoke erweitert (echter Builder,
  Daten+Gegenprobe, „Anstieg ▲"-Pin). Mutations-Probe (Label-Priorität
  neu↔alt getauscht) → exakt die Label-Assertion rot, byte-identisch
  revertiert (diff IDENTICAL). typecheck ✓ eslint ✓ lint-baseline ✓.
  CHANGELOG + Analyse-Doc (Modul 4 UMGESETZT) nachgeführt.
- Vollsuite **7357/0** ✓ Build EXIT=0 ✓ Portability strict EXIT=0 ✓.
- Commit `2c61d89`, **PR #505**. Review: **MERGE OK, 0 C/I, 2 MINOR** —
  M1 (Unsicherheits-Marker-Testlücke) geschlossen in `7af709a` (Parity pinnt
  Durchreiche, Reviewer-Mutation wiederholt rot/grün, klassengenaue Gates),
  M2 (Map-Duplikation) bewusst Modul-5-Scope. PR-Kommentar + TG 10214.
- **#505 GEMERGT** (`7155b72`) + Deploy success (id 5913021041). CI-Flake
  (VSM-Wizard, fremder Bereich, lokal 23/23 grün) via Rerun grün —
  Merge-Disziplin gehalten.

## Stand-Update ~23:15 CEST — Modul 5 (zusammenfassung) GEBAUT, Vollsuite läuft
- Branch `qaf-v2/loop10-viewspec-zusammenfassung`: Builder summary-run.ts
  (Facts, Kennzahlen-dir NUR deltaAbsolute gepinnt, Movers komplett, Charts
  bewusst unverändert). Schale: alle Summary-Ableitungen + 5 Props raus,
  Rechenrest nur levers (Hebel-Baustelle). 8 neue Builder-Tests + Parity
  erweitert, Mutations-Probe rot/grün + Revert IDENTICAL.
  typecheck/eslint/lint-baseline ✓. CHANGELOG + Analyse-Doc: **Loop-10-
  Exit-Kriterium erfüllt** (Module 1–5 lesen View-Spec-Runs).
- Vollsuite **7365/0** ✓ Build ✓ Portability strict ✓. Commit `1126cc2`,
  **PR #506 erstellt (~23:25)**. REVIEW-AGENT LÄUFT (Background; 7 Dimensionen
  inkl. Semantik-Pin-Prüfung + getAllBy-Abschwächungs-Bewertung, eigene
  Mutations-Probe). KADI-TREE NICHT ANFASSEN solange er läuft.
  Danach: Findings → Ist-Check (getrennt, CI-Flake-Muster beachten:
  VSM-Wizard-Test war heute schon einmal flaky) → Squash-Merge →
  Deploy-Wache → TG-MEILENSTEIN (Loop-10-Exit-Kriterium erfüllt).

## Danach (Reihenfolge)
1. Vollsuite-Ergebnis → Build + CHECK_FORBIDDEN_LEVEL=error check:portability
   → Commit → PR → Review-Agent (7 Dimensionen, eigene Mutations-Probe).
2. Review-Findings → separater Ist-Check → Squash-Merge → Deploy-Wache → TG.
3. Modul 5 (zusammenfassung) per Gap-Report — letzter Adoptions-Schritt
   inkl. Aufräumen der Schale-Maps (leverInput/movers).
4. HEARTBEAT-Fix bleibt bei Kais (root-only): einmalig chown + Drop-in.

## PO-gated (nicht bauen)
B-1 Multi-QAF (hinten) · B-2 Wert-Golden · B-3 Migration #120 Apply ·
B-4 Cost-Allocation · B-6 Roh-Excel · B-7 KI erst BMW-Pilot · Schritt C
recompare. Offene PO-Fragen bei Kais: B-2, B-4, B-6, Schritt-C-Spaltung
(TG 10200). Offen-Liste: brain/01-Projekte/qaf-v2-offen.md MITPFLEGEN.

## Arbeitsweise (Kais-durchgesetzt)
2 Zeilen Telegram nach jedem Arbeitsschritt (chat_id 1164395546, markdownv2) ·
Zug endet mit Arbeit + Weckung/Notification · Push/PR/Merge ohne Rückfrage
erlaubt, Gates Pflicht · Co-Authored-By-Trailer vom Hook geblockt.























---

## Session-End 2026-08-20 00:16 CEST

Session-ID: `534e936f`

### Letzter Active Task
# Session 534e936f — 14.08.2026 ab 23:20 CEST (Fable 5)

## Kontext
Vorgängersession (f68a615d) hat heute #504 (Modul 3 anhang) + #505 (Modul 4
fertigungskosten) gemergt + live und Modul 5 (zusammenfassung) als **PR #506**
gebaut (`1126cc2`, Vollsuite 7365/0, Loop-10-Exit-Kriterium-Claim). Ihr
Review-Agent ist mit der Session gestorben — kein Ergebnis.

## Stand dieser Session
- Boot: Snapshot komplett (12/12 Sektionen). HEARTBEAT.md WEITER root:root 600
  (Reconcile-Job 04:20, neues .bak von heute — chown + ExecStartPost-Drop-in
  liegt bei Kais, root-only).
- Ist-Check #506: OPEN, MERGEABLE, Head `1126cc2`, alle 14 Checks grün/skipped
  (Vercel StatusContext SUCCESS), lokaler Tree /home/aria/work/kadi-v2 sauber
  auf `qaf-v2/loop10-viewspec-zusammenfassung`.
- Check-in an Kais (TG 10222; erster Versuch vom Escape-Critic geblockt,
  unescaped `.` in „.bak" — gefixt).
- **REVIEW-AGENT LÄUFT** (general-purpose, Background) für #506:
  7 Dimensionen (Parität, Restkonsumenten, Claims-gegen-Code, Einheiten/
  Zähl-Grenzflächen mit Handrechnung, Test-Qualität inkl. getAllBy- und
  deltaAbsolute-Pin-Bewertung, eigene 2. Mutations-Probe ≠ Metrics-Richtung,
  Export-/RSC-Vertrag). Isolations-Mandat + Tree-Sauber-Beweis im Brief.
  KADI-TREE NICHT ANFASSEN solange er läuft (mutiert temporär + resettet).

## Stand-Update ~23:55 CEST — #506 GEMERGT, Loop-10-Exit erfüllt
- Review: MERGE OK, 0 C/I, 2 MINOR (Beobachtungen; PR-Kommentar 506).
  Hygiene-Check + getrennter Ist-Check ✓ → Squash-Merge 23:51 CEST
  (`8bd73e3`), Branch weg. **Module 1–5 lesen View-Spec-Runs.**
- Offen-Liste + Daily-Log nachgeführt. TG 10223.
- **DEPLOY SUCCESS** (Production `5914006042`, 23:53 CEST, per API-Ist-Check
  verifiziert) → TG 10224. Lokaler Tree steht auf main.
- **MAIN-CI-WACHE LÄUFT** (Background bxvi04i7j, portability-matrix +
  AI-Pipeline auf `8bd73e3` liefen noch, 30-min-Timeout).

## Stand-Update ~00:25 CEST (15.08.) — Main-CI grün, Hebel-Belege-Block GESTARTET
- Main-CI auf `8bd73e3` komplett grün (portability-matrix + AI-Pipeline
  success, rls/gitleaks success, codeql skipped). Kein Rot → keine Extra-TG.
- Abwägung nächster Block: **Hebel-Belege (LeversSection)** = Listen-
  Nächstes der autonomen Bauliste, Voraussetzung (mfg-Katalog-Verknüpfung
  aus Modul 3/#504, program-status.md:470) seit heute live. Räumt den
  letzten Schale-Rechenrest (leverInput/buildLevers) ab.
- **GAP-ANALYSE-AGENT LÄUFT** (read-only, 6 Fragen, Report →
  scratchpad/hebel-belege-gap-analyse.md). Tree auf main, unmutiert.
- TG 10225 (Blockstart).

## Stand-Update ~00:30 CEST — Hebel-Belege GEBAUT, Gate-Kette läuft
- Gap-Report (scratchpad/hebel-belege-gap-analyse.md): Vorarbeit kam aus
  #505 (altCell/neuCell + explainAttrs an deltas.rows), NICHT #504 — Doku
  trug veraltete Erwartung (program-status.md:470). 3 „Hebel"-Konzepte im
  Repo: gebaut wird NUR levers.ts; negotiation-levers.ts (toter Code,
  gleicher Funktionsname) + V1-Hebel-A/B unangetastet.
- Formentscheidung (dokumentiert, TG 10226 mit Veto-Hinweis): schlankes
  altCell/neuCell-Beleg-Feld statt SourceRef mit leeren cells — Repo-
  Doktrin aus appendix-run.ts:12-16 + manufacturing-run.ts:36-40.
- **GEBAUT** auf Branch `qaf-v2/hebel-belege-levers-run`: levers-run.ts
  (buildLeversRun konsumiert manufacturingRun.deltas.rows; buildLevers PRO
  ZEILE aufgerufen — Zuordnung ohne Filter-Duplikation, Äquivalenz-Pin im
  Test; uncertain-Paritäts-Kante: ohne step_match_id true, aus
  diff.step_match_id rekonstruiert, NICHT row.uncertain). Schale: kompletter
  Hebel-Block + diffs-Prop raus (Schale rechnet nichts mehr), LeversSection
  mit Beleg-Tooltip (ehrliches „—" bei fehlender Seite), viewmodel_json
  2.2.0, 4 veraltete Kommentar-Reste in summary-run/manufacturing-run/
  page.tsx nachgeführt. Doku: Analyse-Doc-Abschluss + program-status-
  Korrektur + CHANGELOG.
- Tests: 10 neue Builder-Fälle (echte Kette via buildManufacturingRun) +
  Parity erweitert (M-01, Forderungstext, Beleg-Tooltip „ALT — · NEU
  Fertigung!C7", Hebel-Fußnote, Gegenprobe; TooltipProvider-Wrap nötig
  wegen neuem source_cells-Fixture — Muster der Multi-QAF-Tests).
  Mutations-Probe (ALT/NEU-Beleg getauscht) → exakt 3 Beleg-Assertions
  rot, Revert IDENTICAL, 13/13 grün. typecheck ✓ eslint 0/0 ✓
  lint-baseline ✓.
- **GATE-KETTE LÄUFT** (Background bpaylh4v0: Vollsuite → Build →
  Portability strict, Log scratchpad/gates-hebel.log). TG 10227.

## Stand-Update ~00:55 CEST — PR #507 erstellt, REVIEW-AGENT LÄUFT
- Vollsuite 1. Lauf: 1 Rot — KEIN Flake, sondern export-profiles.test.ts
  pinnte viewmodel_json 2.1.0 (mein Bump, Testdatei übersehen). Reproduziert
  im 2. Lauf, Pin korrekt auf 2.2.0 nachgezogen (Exakt-Pin bleibt),
  klassengenaue Gates (4/4, typecheck, eslint 0/0, lint-baseline).
  Rechnerisch 7375/0 (+10 exakt). Build ✓ Portability strict ✓.
- Commit `8da1540`, Push, **PR #507** (Body: Formentscheidung,
  uncertain-Kante, Doku-Selbstkorrektur, Namenskollisions-Falle, Gates).
- TG 10228 — ACHTUNG Vorfall: erst „Commit f3f9" gemeldet (halluzinierter
  Hash, nie aus Tool-Output), selbst gefangen, per edit_message auf
  `8da1540` korrigiert. Memory gespeichert:
  no-unverified-identifiers-in-reports.
## Stand-Update ~01:25 CEST — Review MERGE OK, M1 geschlossen, CI-Wache läuft
- Review #507: **MERGE OK, 0 C/I, 1 MINOR** — M1 (getAllByTitle nur >0;
  verschwindender Hebel-Stern bliebe DOM-unentdeckt) DIREKT geschlossen in
  `cede06e`: Exakt-Pin toHaveLength(3) (2 A1 + 1 Hebel, Herleitung im
  Kommentar), klassengenaue Gates (3/3, typecheck, eslint 0/0,
  lint-baseline). Reviewer verifizierte unabhängig: Vollsuite 7375/0,
  uncertain-Kanten-Parität, Pro-Zeile-Äquivalenz (levers.ts gelesen),
  Doku-Zitate faktentreu, eigene Mutations-Probe (uncertain gekippt →
  exakt 2 rot) + meine reproduziert (exakt 3 rot), Tree-Beweis sauber.
- PR-Kommentar + TG 10229.
- **CI-WACHE LÄUFT** (Background bnq89n9pj auf Head `cede06e`, 60-min-
  Timeout, meldet Zusammensetzung + NICHT-GRUEN-Zahl).

## Stand-Update ~01:40 CEST — #507 GEMERGT (`4e0658b`), Wache läuft
- CI auf `cede06e` komplett grün (11 S + 3 SKIP, 0 nicht-grün) → finaler
  Ist-Check getrennt → Squash-Merge 01:36 CEST (`4e0658b`), Branch weg,
  lokaler Tree auf main. TG 10230. Offen-Liste + Daily-Log nachgeführt.
- **DEPLOY- + MAIN-CI-WACHE LÄUFT** (Background blrjy1q26: erst
  GitHub-Deployment-Status, dann Main-Runs auf `4e0658b`; Timeouts als
  Herzschlag).

## Stand-Update ~01:55 CEST — Deploy SUCCESS, Main-CI-Flake, Rerun-Wache
- **Deploy #507 success** (id 5915059807, API-verifiziert). TG 10231.
- Main-CI: portability-matrix (profile=default) rot durch
  vsm-editor.test.tsx „K1/ur-4 LSC-Bulk-Import Undo" — Wertstrom, NICHT im
  Diff (git show --stat: 0 wertstrom-Dateien), lokal 199/199 grün.
  **ZWEITER VSM-Flake in 2 Tagen** (gestern vsm-quick-start-wizard, heute
  vsm-editor; beide profile=default, jsdom/Undo-lastig) — Muster notieren,
  bei drittem Auftreten KAR/Fix-Issue (Linear-Key fehlt aktuell in der Env).
- `gh run rerun 31850957389 --failed` → **RERUN-WACHE LÄUFT** (Background
  bx3p74xj8, 40-min-Timeout).

## Stand-Update ~02:15 CEST — Rerun grün, Loop-10-Rest-Analyse GESTARTET
- Rerun portability-matrix: **success** (am Remote bestätigt) → Main-CI für
  `4e0658b` komplett grün, Deploy war live. Hebel-Belege-Zug FERTIG
  verifiziert. TG 10232.
- Abwägung nächster Block: **Loop-10-Rest** (Table/Filter/Evidence-Engines,
  Virtualisierung, URL-State) = Listen-Nächstes; gewählt statt B-8
  (Playwright = neue Dependency/Infra-Eingriff) und Loop-5-Ampel
  (Design-Arbeit, braucht Kais' Blick).
- **BESTANDSANALYSE-AGENT LÄUFT** (read-only, 6 Fragen inkl. „ist der
  Block überhaupt spezifiziert oder nur Stichworte?" — falls nur
  Stichworte: präzise Kais-Fragen formulieren, NICHT raten; Kais-freier
  erster PR nur wenn ohne neue Dependency + ohne Scope-Klärung möglich).
  Report → scratchpad/loop10-rest-engines-analyse.md.

## Stand-Update ~03:00 CEST — Schritt 1 GEBAUT (Branch qaf-v2/loop10-rest-table-renderer)
- Analyse-Report: Block war NUR Stichwort-Liste; einzige Engine
  (table-specs.ts) nur an V2 verdrahtet, 8 Hand-Tabellen-Kopien in den
  Klassik-Modulen. **3 Scope-Fragen an Kais (TG 10233)**: Filter-Dimensionen/
  Seiten · Virtualisierungs-Dependency freigeben oder zurückstellen ·
  Evidence-Panel-Datenmodell (3 Mechanismen). Analyse persistiert als
  docs/qaf-v2/loop10-rest-engines-analyse.md (+ Schritt-1-Vermerk).
- **GEBAUT** (bewusst kleiner als Analyse-Maximalplan): QafDataTable
  (detail-sections/qaf-data-table.tsx, Spalten-Config, Klassen-Skelett
  byte-gleich + im Test exakt gepinnt; KEINE Filter-UI auf Vorrat, KEINE
  zweite Engine). Migriert: OneTime/Production/Anomalies. Vertagt:
  A1-Deltas (Sonderspalten), Form/Metrics, Coverage — Folge-PRs.
- Tests: 3 Renderer- + 3 AnomaliesSection-Tests (Formatweiche laborRate,
  Pill-Platzierung, UnavailableNotice). Mutations-Probe (Weiche gekippt)
  → exakt 1 rot, Revert IDENTICAL, 14/14 grün (inkl. Parity).
  typecheck ✓ eslint 0 ✓ lint-baseline ✓. CHANGELOG + program-status.
- **GATE-KETTE LÄUFT** (Background b8ft8xms1). TG 10234.

## Stand-Update ~03:30 CEST — PR #508 erstellt, REVIEW-AGENT LÄUFT
- Gates grün (Vollsuite EXIT=0, Build 0, Portability 0; exakte Testzahl
  nicht im Log erfasst → im PR bewusst NICHT behauptet, nur EXIT-Status +
  klassengenaues +6-Delta). Commit `2bfd557`, **PR #508**.
- **REVIEW-AGENT LÄUFT** (Background, 7 Dimensionen; Schwerpunkte:
  DOM-Klassen-Parität Zelle für Zelle gegen git show 4e0658b,
  Scope-Grenzen-Check kein Filter/Sort/Dependency, Leerstring-Kante
  cellClassName, eigene Mutations-Probe ≠ Formatweiche). KADI-TREE NICHT
  ANFASSEN solange er läuft. TG 10235.

## Stand-Update ~04:05 CEST — Review #508 MERGE OK, M1+M2 zu, CI-Wache läuft
- Review: **MERGE OK, 0 C/I, 2 MINOR** → `31a3d2b`: M1 bewusst NICHT
  „gefixt" (?? wäre falsch — Leerstring-Wegfall ist gewollte Verbesserung,
  war schon exakt gepinnt; jetzt Code-Kommentar + Test-Kommentar), M2
  Zeilen-Ebenen-title-Test ergänzt. Klassengenaue Gates 14/14 ✓.
  Reviewer unabhängig: DOM-Parität byte-identisch gegen 4e0658b, Vollsuite
  **7381/0** (+6 exakt), eigene Mutations-Probe (pr-3-Logik invertiert →
  exakt 2 Klassen-Pins rot), Scope-Grenzen bestätigt. PR-Kommentar +
  TG 10236.
- **CI-WACHE LÄUFT** (Background b9dnaditg auf Head `31a3d2b`).

## Stand-Update ~04:35 CEST — #508 GEMERGT (`90367e1`), Wache läuft
- CI grün → getrennter Ist-Check (CLEAN/MERGEABLE, stacked leer, Tree 0)
  → Squash-Merge 03:03 CEST (`90367e1`), Branch weg. TG 10237.
- Offen-Liste + Daily-Log nachgeführt. **DEPLOY- + MAIN-CI-WACHE LÄUFT**
  (Background br43bw2oh).

## Stand-Update ~05:10 CEST — #508 voll verifiziert, Schritt 2 GEBAUT
- Deploy #508 success (id 5915737867) + Main-CI komplett grün (KEIN
  Flake). #508 fertig verifiziert.
- **Schritt 2 GEBAUT** (noch auf main — Branch kommt beim Commit):
  FormSection + MetricsSection auf QafDataTable (Explain-Panel als
  Zellinhalt, Status-Pill als Config, rowClassName additiv für
  Form-total-Zeilen, Leerstring-Wegfall exakt gepinnt). 23/23 +
  typecheck ✓, Mutations-Probe (rowClassName gekappt → exakt 1 rot,
  Revert IDENTICAL). CHANGELOG + Analyse-Doc-Vermerk. TG 10238.
  Verbleibend im Scope: NUR noch A1-Deltas + V2-Coverage.
- **GATE-KETTE LÄUFT** (Background bqj0t0hwp; Vollsuite-Delta +1 erwartet:
  der neue rowClassName-Test).

## Stand-Update ~05:40 CEST — PR #509 erstellt, REVIEW-AGENT LÄUFT
- Gates: Vollsuite **7382/0** (+1 exakt), Build 0, Portability 0.
  Branch + Commit `41a7f91` → **PR #509**. TG 10239.
- **REVIEW-AGENT LÄUFT** (Background; Schwerpunkte: DOM-Parität gegen
  90367e1 inkl. 8-Spalten-Metrics + Explain-Panel-Verschachtelung,
  Scope-Grenzen, eigene Mutations-Probe ≠ rowClassName mit ehrlicher
  Testlücken-Meldung falls 0 rot). KADI-TREE NICHT ANFASSEN.

## Stand-Update ~06:45 CEST — Review #509: 2 IMPORTANT gefunden + VOR Merge zu
- Review-Agent stallte erst im Background-Muster (Memory bestätigt +
  aktualisiert), per SendMessage fortgesetzt → voller Report:
  **MERGE OK, 2 IMPORTANT (Testlücken), 1 MINOR.** I1: Reviewer-Mutation
  (Metrics-Pill invertiert) lief gegen `> 1` unentdeckt durch — ECHTE
  Lücke; I2: font-mono-Quelle-Spalten ungepinnt. Sein 1. Vollsuite-Lauf
  war selbst-kontaminiert (parallele eigene Mutationen), transparent
  verworfen + sauber wiederholt: 7382/0 ✓.
- **I1+I2 VOR Merge geschlossen** (`9779a0f`): Exakt-Pin 3 Pills
  (2 A1 + 1 Kennzahl) + integrationsscharfer Klassen-Pin; Reviewer-
  Mutation wiederholt → exakt rot („3 but got 2"), Revert IDENTICAL,
  15/15. M1 (meine PR-Body-Mutations-Zahl ohne Scope-Angabe) im
  PR-Kommentar klargestellt. Klassengenaue Gates ✓. TG 10240.
- **CI-WACHE LÄUFT** (Background auf Head `9779a0f`).

## Stand-Update ~07:15 CEST — #509 GEMERGT (`a5ed751`), Wache läuft
- CI grün → getrennter Ist-Check → Squash-Merge 04:15 CEST (`a5ed751`),
  Branch weg, Tree auf main. TG 10241. Offen-Liste + Daily-Log nachgeführt.
- **DEPLOY- + MAIN-CI-WACHE LÄUFT** (Background bwezh6d6w auf `a5ed751`).

## SCHLUSS-STAND ~07:30 CEST — Nacht komplett, Schnitt vor Kais' Morgen
- **#509 voll verifiziert** (Deploy 5916222895 + Main-CI grün, kein Flake).
- **Nacht-Bilanz: 4 PR-Züge komplett** (#506 Loop-10-Exit, #507
  Hebel-Belege, #508+#509 Tabellen-Renderer) — alle gemergt, deployed,
  CI-verifiziert. Vollsuite-Stand 7382/0. Morgen-TG 10242 an Kais.
- Bewusster Schnitt statt 5. Zug: A1-Deltas ist die riskanteste Migration,
  Kais' Scope-Antworten können Prioritäten ändern, 4 fertige Meilensteine
  > 1 halbfertiger.

## Nachtrag 20.08. ~00:30 CEST — Kais-Auftrag „QAF-Offen merken" erledigt
- Ist-Stand verifiziert (kein Merge seit #509, keine Kais-Antworten
  zwischenzeitlich, keine Zwischen-Session) → Offen-Liste
  brain/01-Projekte/qaf-v2-offen.md KONSOLIDIERT (Ist-Check-Block +
  9× Wartet-auf-Kais + Aria-frei-Bauliste + PO-deferred + Kurz-Chronik).
- TG 10285: Kompakt-Stand + Frage, ob A1-Deltas+Coverage (letzter
  Renderer-Schritt) gestartet werden soll. WARTE auf Kais' Antwort.

## Für die nächste Session / nach Kais' Antworten
1. **Kais-frei baubar**: A1-Deltas (ManufacturingDeltasSection,
   fertigungskosten-sections.tsx — Sonderspalten: Explain-Panel,
   ProvenanceTooltip, Provenienz-Konstanten je Vergleich) + V2-Coverage
   (v2/page.tsx:448) auf QafDataTable. Muster: PRs #508/#509,
   Analyse-Doc docs/qaf-v2/loop10-rest-engines-analyse.md (Schritt 1+2
   Vermerke). Review-Schwerpunkt: DOM-Parität + Pill-/Panel-Pins EXAKT
   (Lehre #509-I1: >-Assertions fangen Inversionen nicht).
2. **Kais-gated** (TG 10233): Filter-UI-Dimensionen/Seiten → URL-State ·
   Virtualisierungs-Dependency · Evidence-Panel-Datenmodell.
3. VSM-Flake-Zähler: 2/3 (quick-start-wizard 14.08., vsm-editor 15.08.,
   beide profile=default) — beim 3. ein Fix-Issue.
4. Offen bei Kais: HEARTBEAT chown+Drop-in · PO-Fragen B-2/B-4/B-6/
   Schritt-C (TG 10200) · Folge-Beobachtung Richtungs-Semantik
   Modul 4 vs. 5 (Review #506 M2).
5. Offen-Liste brain/01-Projekte/qaf-v2-offen.md ist aktuell (Stand
   07:30); Daily-Logs 14.+15.08. vollständig.
2. Danach optional letzter Kais-freier Schritt: A1-Deltas + Coverage.
   Filter/URL/Virtualisierung/Evidence bleiben KAIS-GATED (TG 10233).
3. HEARTBEAT-Fix + PO-Fragen (B-2/B-4/B-6/Schritt-C, TG 10200) bei Kais.
2. VSM-Flake-Muster (2× in 2 Tagen) — beim 3. Auftreten eigenes Fix-Issue.
3. Folge-Beobachtung Review #506 (Richtungs-Semantik Modul 4 vs. 5)
   bei Gelegenheit an Kais. HEARTBEAT-Fix bleibt bei Kais.
4. Nach diesem PR: warten auf Kais-Antworten (TG 10233) für Filter/
   Virtualisierung/Evidence — KEINEN dieser drei Punkte ohne Antwort bauen.
3. Folge-Beobachtung Review #506 (Richtungs-Semantik Modul 4 vs. 5,
   Produktfrage) bei Gelegenheit an Kais.
4. HEARTBEAT-Fix bleibt bei Kais (root-only): einmalig chown + Drop-in.

## PO-gated (nicht bauen)
B-1 Multi-QAF (hinten) · B-2 Wert-Golden · B-3 Migration #120 Apply ·
B-4 Cost-Allocation · B-6 Roh-Excel · B-7 KI erst BMW-Pilot · Schritt C
recompare. Offene PO-Fragen bei Kais: B-2, B-4, B-6, Schritt-C-Spaltung
(TG 10200).

## Arbeitsweise (Kais-durchgesetzt)
2 Zeilen Telegram nach jedem Arbeitsschritt (chat_id 1164395546, markdownv2) ·
Zug endet mit Arbeit + Weckung/Notification · Push/PR/Merge ohne Rückfrage
erlaubt, Gates Pflicht (Stufe 3: Review FERTIG gehört zum Merge-Gate) ·
Co-Authored-By-Trailer vom Hook geblockt.


## Session-Compact 2026-08-21 10:38 CEST

Session-ID: `e92ed44c`

### Preserved Working-Memory (auto — garantiert, kein TBD)

```
(keine ACTIVE_TASK.md gefunden)
```

### Letzte Brain-Commits

```
e4bda39 vault sync: 2026-08-13 02:46:03
39607db vault sync: 2026-08-12 19:57:45
e1e30b7 vault sync: 2026-08-12 19:42:45
235daf4 vault sync: 2026-08-12 19:27:43
55bfdb3 vault sync: 2026-08-12 19:24:03
```

### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)
- Offene Decisions:
- Nächster Schritt:





















































---

## Session-End 2026-08-31 01:38 CEST

Session-ID: `4ce8ccb7`

### Letzter Active Task
# Session 4ce8ccb7 — 30.08.2026 (Fable 5) — Aria-Next autonom (TG 10671)

## Stand (Ende dieser Session)
- Queue §41 Tasks 1–18 KOMPLETT. main = 28d28f09. 12 PRs heute gemergt
  (#16–#28). Staging srv1939543 voll eingerichtet.
- Echter End-to-End-PR bewiesen (Engine öffnete PR #27 autonom, als
  Proof-Artefakt geschlossen; Evidence in main).

## Operator-gated Rest (NICHT autonom baubar)
1. Task 19 protected `integration`-Branch — Kais setzt Branch-Protection
   (Repo-Admin). Danach Task 20 flawed-PR-stop formal gegen integration.
2. Task 21 Deployment-ADR — Human-Approval (Kais), dann W5 (22/23
   immutable release + rollback).
3. Task 24/25 G2-Paket + G2-Entscheid — explizit Human.
4. Task 10 Rest: Off-Host-Backup-Ziel (Prod-Freeze vs Drive) +
   Clean-Target-Restore — Kais-Entscheid (TG 10677). Passphrase-Custody ✓.

## Staging-Setup (alles root, host-guarded srv1939543)
- /opt/aria-foundry/checkout-1763747f (Engine, HEAD-gepinnt),
  Mirror /var/lib/aria-foundry/repos/aria-next (origin wieder da, auf main),
  State /var/lib/aria-foundry/state.db, exec-worktrees /srv/aria-foundry/.
- Wrapper /usr/local/bin/foundry-{builder,reviewer}-{codex,claude} +
  /usr/local/lib/foundry-wrapper-lib.sh (guard/flock/handoff/argv-validate/
  externe Quarantäne-Registry). Sandbox-Replace via OS-Käfig (bwrap broken).
- Driver in Repo: scripts/staging/foundry-real-run.py (Tasks 16/17),
  foundry-integrate-run.py (Task 18). SHA-Pin-Pflicht als argv.
- Quarantäne-Registry /var/lib/aria-foundry/quarantine (root 700).

## Arbeitsweise (bewährt, für nächste Session)
- Reviews: codex exec shell-frei (Diff via git show, --skip-git-repo-check,
  < /dev/null), Verdict SHA-gebunden, max 2 Runden + parent-auth Extra bei
  echten Blockern (im PR dokumentieren). Merge: Record→getrennter Ist-Check
  →merge --merge. Suite IMMER selbst auf dem Head verifizieren vor Merge.
- git: NUR explizite Pfade (nie add -A). Forks: eigener Clone pro Lane.
- Provider-CLI-Fallen: Memory provider-cli-noninteractive-flags.
- 2-Zeilen-TG nach jedem Schritt (1164395546, markdownv2).


## Session-Compact 2026-08-31 01:43 CEST

Session-ID: `4ce8ccb7`

### Preserved Working-Memory (auto — garantiert, kein TBD)

```
(keine ACTIVE_TASK.md gefunden)
```

### Letzte Brain-Commits

```
e4bda39 vault sync: 2026-08-13 02:46:03
39607db vault sync: 2026-08-12 19:57:45
e1e30b7 vault sync: 2026-08-12 19:42:45
235daf4 vault sync: 2026-08-12 19:27:43
55bfdb3 vault sync: 2026-08-12 19:24:03
```

### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)
- Offene Decisions:
- Nächster Schritt:

## Session-Compact 2026-08-31 18:28 CEST

Session-ID: `3b6f5ddc`

### Preserved Working-Memory (auto — garantiert, kein TBD)

```
(keine ACTIVE_TASK.md gefunden)
```

### Letzte Brain-Commits

```
e4bda39 vault sync: 2026-08-13 02:46:03
39607db vault sync: 2026-08-12 19:57:45
e1e30b7 vault sync: 2026-08-12 19:42:45
235daf4 vault sync: 2026-08-12 19:27:43
55bfdb3 vault sync: 2026-08-12 19:24:03
```

### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)
- Offene Decisions:
- Nächster Schritt:

## Session-Compact 2026-09-01 07:17 CEST

Session-ID: `24ea6ed9`

### Preserved Working-Memory (auto — garantiert, kein TBD)

```
(keine ACTIVE_TASK.md gefunden)
```

### Letzte Brain-Commits

```
e4bda39 vault sync: 2026-08-13 02:46:03
39607db vault sync: 2026-08-12 19:57:45
e1e30b7 vault sync: 2026-08-12 19:42:45
235daf4 vault sync: 2026-08-12 19:27:43
55bfdb3 vault sync: 2026-08-12 19:24:03
```

### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)
- Offene Decisions:
- Nächster Schritt:














































---

## Session-End 2026-09-02 18:43 CEST

Session-ID: `6eb6d852`

### Letzter Active Task
# Session 6eb6d852 — 02.09.2026 (Fable 5.1) — SupplierPulse PMO: PHASE ABGESCHLOSSEN (02.09.2026 18:09 CEST)

## Stand
- Readiness-Paket (pmo-delivery/, 35/37 §34-Dokumente) + Issue-Paket (issue-factory-pmo/, 21 Bodies) an Kais uebergeben (TG 11057-11059, ZIPs in deliverables/).
- Reviews Sol run-013 A/B + Fable UX/Issue adjudiziert (95 Findings), QA-1 ueber alle Bodies, Sweep sauber, Zeitstempel-/Datumsfehler global korrigiert (Memory timestamps-from-date-command).
- Status-Quelle: pmo-delivery/STATUS.md; Einstieg pmo-delivery/README.md + 00-executive-summary.md; Entscheidungen DECISIONS.md D-9..D-12, 28-open-decisions.md.

## Wartet auf Kais
1. ERLEDIGT: #484-#504 angelegt, nachfuehren.sh gelaufen (Titel, Bodies, 20 Sub-Issues), Research-Gate-Kommentar gepostet (issuecomment-154005007), lane-korrekturen.sh geliefert. lane-korrekturen.sh gelaufen (Labels final), alle 21 Kais zugewiesen. OFFEN: Board-Aufnahme (Kais), Research-Gate-Antwort adesso -> go:yes; danach ggf. Antworten auf Team-Rueckfragen vorbereiten. Keine Implementierung ohne Freigabe.
2. Router-Ausgabe der SQUAD-Automatik -> Korrektur-Kommandos.
3. Entscheidung, welche der 14 Repo-Befunde (05c) ans adesso-Team gehen (Vorschlagsliste liefern, wenn gewuenscht).
- KEIN Code, keine Branches/PRs/Migrationen — Umsetzung nur nach ausdruecklicher Freigabe (Kais-Vorgabe 3).

## Regeln (fuer Folge-Sessions)
- Sol: stdin-Muster, Antwort aus Log, Duplikat abschneiden (Memory codex-exec-stdin-output-doubling). pkill/pgrep nie mit Selbstmatch. Zeitstempel nur aus `date` (Server UTC). Subagent-Deliverables mit 'analysis/report' im Namen per Heredoc. Referenz-Extraktionen (02-reference-extraction/, 00-inventory) nie via TG/ZIP.


## Session-Compact 2026-09-02 21:13 CEST

Session-ID: `6eb6d852`

### Preserved Working-Memory (auto — garantiert, kein TBD)

```
(keine ACTIVE_TASK.md gefunden)
```

### Letzte Brain-Commits

```
e4bda39 vault sync: 2026-08-13 02:46:03
39607db vault sync: 2026-08-12 19:57:45
e1e30b7 vault sync: 2026-08-12 19:42:45
235daf4 vault sync: 2026-08-12 19:27:43
55bfdb3 vault sync: 2026-08-12 19:24:03
```

### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)
- Offene Decisions:
- Nächster Schritt:



---

## Session-End 2026-09-02 21:19 CEST

Session-ID: `9581a75b`

### Letzter Active Task
# Session 6eb6d852 — 02.09.2026 (Fable 5.1) — SupplierPulse PMO: PHASE ABGESCHLOSSEN (02.09.2026 18:09 CEST)

## Stand
- Readiness-Paket (pmo-delivery/, 35/37 §34-Dokumente) + Issue-Paket (issue-factory-pmo/, 21 Bodies) an Kais uebergeben (TG 11057-11059, ZIPs in deliverables/).
- Reviews Sol run-013 A/B + Fable UX/Issue adjudiziert (95 Findings), QA-1 ueber alle Bodies, Sweep sauber, Zeitstempel-/Datumsfehler global korrigiert (Memory timestamps-from-date-command).
- Status-Quelle: pmo-delivery/STATUS.md; Einstieg pmo-delivery/README.md + 00-executive-summary.md; Entscheidungen DECISIONS.md D-9..D-12, 28-open-decisions.md.

## Wartet auf Kais
1. ERLEDIGT: #484-#504 angelegt, nachfuehren.sh gelaufen (Titel, Bodies, 20 Sub-Issues), Research-Gate-Kommentar gepostet (issuecomment-154005007), lane-korrekturen.sh geliefert. lane-korrekturen.sh gelaufen (Labels final), alle 21 Kais zugewiesen. OFFEN: Board-Aufnahme (Kais), Research-Gate-Antwort adesso -> go:yes; danach ggf. Antworten auf Team-Rueckfragen vorbereiten. Keine Implementierung ohne Freigabe.
2. Router-Ausgabe der SQUAD-Automatik -> Korrektur-Kommandos.
3. Entscheidung, welche der 14 Repo-Befunde (05c) ans adesso-Team gehen (Vorschlagsliste liefern, wenn gewuenscht).
- KEIN Code, keine Branches/PRs/Migrationen — Umsetzung nur nach ausdruecklicher Freigabe (Kais-Vorgabe 3).

## Fabrikanalyse-Nebenstrang (02.09. 21:15)
- PR #482 zu #453 review-ready (adesso); Deploy dev blockiert (Environment-Secrets). Issue #505 angelegt 02.09. 21:17 CEST, Kais zugewiesen, PR-#482-Kommentar issuecomment-154042747 (Merge-Halt bis #505). Wartet auf adesso DevOps (Body issue-factory/proposed-tasks/TASK-INFRA-dev-environment-db-maintainer.md). Falls Kais den Diff schickt: Review gegen #453-AC + Enterprise-Regeln (Tenant/RLS, Error-Envelope, DoD), Fabrikanalyse-Muster.

## Regeln (fuer Folge-Sessions)
- Sol: stdin-Muster, Antwort aus Log, Duplikat abschneiden (Memory codex-exec-stdin-output-doubling). pkill/pgrep nie mit Selbstmatch. Zeitstempel nur aus `date` (Server UTC). Subagent-Deliverables mit 'analysis/report' im Namen per Heredoc. Referenz-Extraktionen (02-reference-extraction/, 00-inventory) nie via TG/ZIP.












---

## Session-End 2026-09-03 16:30 CEST

Session-ID: `2ad291f2`

### Letzter Active Task
# Session 2ad291f2 — 03.09.2026 (Fable 5.1) — Brain-Vault-Sync repariert

## Stand
- Vault wieder auf GitHub: Commit 1b28ed0 (130 Dateien), Remote verifiziert. Timer aria-git-sync laeuft alle 15 Min mit gehaertetem Skript.
- Workaround aktiv: skip-worktree auf HEARTBEAT.md (root:root 0600). Skript entfernt das Flag selbst, sobald die Datei lesbar ist (nach Kais' chown oder nach dem gepatchten Reconcile-Lauf 04.09. 06:20 CEST).
- Detail + Diffs: 06-Daily/2026-09-03.md.

## Naechste Session pruefen
1. `git -C /home/aria/brain log -1` juenger als 15 Min? `git ls-files -v HEARTBEAT.md` ohne S-Flag, sobald Datei lesbar?
2. Nach 04.09. 06:20 CEST: `stat -c '%U %a' /home/aria/brain/HEARTBEAT.md` muss aria 644 sein. Wenn nicht: Reconcile-Patch (aria-deadline-reconcile.py) pruefen, Journal nur als root lesbar.
3. Kais-Entscheid: .eml (rwg-durrani-consent) in den Vault-Sync oder nicht (.git/info/exclude).
4. Nebenbefund aria-runs.jsonl (Run-Records seit 14.07. blind) bei Kais.

## SupplierPulse PMO
- Unveraendert: wartet auf adesso (Research-Gate go:yes) + DevOps (#505 fuer PR #482). Kein Code ohne Freigabe.

## RwG Actions Center (13:47 CEST, TG 11108): 24/25 "Disabled"
- Einschaetzung an Kais geschickt (Timing nach manuellem Matching ODER rating: {} fuer Tenants ohne Place-ID/Reviews). Warte auf: Detailansicht-Screenshot, Feeds-Seite, Matching-Zeitpunkt.
- Bei Go fuer Fall 2: services-feed.processor.ts (codex-workspace/kadicon, Branch codex/rwg-implementation) rating nur setzen, wenn reviews vorhanden; Test rot/gruen; PR gegen main; merge.yml deployt Staging; naechster Feed 05:00 UTC.
- Feed-Trigger via AppConfig braucht AWS-Creds (Memory rwg-feed-trigger-and-appconfig-authz), aktuell keine auf dem Host.
- Consent-Gate Prod unveraendert. Keine Sandbox-/Feed-Aenderung ohne Go.

## Feed-Trigger 03.09. 12:17 UTC ERLEDIGT (Kais TG 11112 "Autonom")
- 25/25/118260 hochgeladen, Cron auf 0 0 5 zurueck (v11 aktiv), Prod unberuehrt. Bericht TG 11115.
- AWS: /home/aria/aws-runtime.env (aria-automation), Policy aria-automation-staging-rwg-write noch attached; AppConfig-Read/Write auf Staging funktioniert. CloudWatch-Abfragen mit --start-time UND --end-time (ohne end-time Timeout).
- Diagnose-Stand Disabled (ALIBABA-Details): (1) "Business listing is not allowed for booking" = Google-Listing-Eignung, nicht Feed; (2) "All services are disabled", Service Errors=1, Kandidat INVALID_RATING (services-feed.processor.ts sendet rating: {} ohne Reviews; fetch-reviews ueberspringt Tenants ohne googlePlaceId).
- WARTE auf Kais: Screenshot Service-Fehler / View feed snippet / Alerts. Bei INVALID_RATING: Fix = rating nur setzen wenn reviews vorhanden (Test rot/gruen, PR gegen main, merge.yml deployt Staging, dann Feed-Trigger wie heute oder 05:00-UTC-Lauf).

## Diagnose-Update 16:3x CEST (TG 11117, 11118)
- Service-Issue ALIBABA = "No upcoming availability" (Rating-Hypothese verworfen). Seeder nur PRODUCTION (Stage-Guard), Realtime = Booking-Notification, Feed-Seite fuer alle 25 gleich -> Ursache Google-seitig: "Business listing is not allowed for booking" (Listing-Eignung, Kategorie), Availability-Verwerfung als Folge.
- Beleg: Apetito Grill Apolda = "Doner kebab restaurant" bei Google; RwG-Button nur bei Restaurant-Primaerkategorie (Websuche, kein offizielles Allowlist-Dokument gefunden).
- Nicht per Feed/Code loesbar. Kais prueft: Placesheet-Kategorie, Alerts-Seite, Feeds-Seite. Weiterer Weg: Actions-Center-Support mit Merchant-IDs.
- Offen: Kais' Screenshots. Keine Backend-/Feed-Aenderung ohne Go.








































---

## Session-End 2026-09-04 13:37 CEST

Session-ID: `856dda33`

### Letzter Active Task
# Session 856dda33 — 03./04.09.2026 (Fable 5.1) — Beide Issue-Serien konsolidiert, ABGESCHLOSSEN

## Ergebnis
Zwei Konsolidierungen komplett im BMW-GHE umgesetzt und verifiziert.

| | vorher | nachher |
|---|---|---|
| Fabrikanalyse Arbeits-Tickets | 6 offen | 4 (#456, #457, #458, #459) |
| PMO Arbeits-Tickets | 20 | 12 + Doku-Ticket #512 |
| geschlossen | - | 10: 454, 455, 488, 489, 491, 493, 495, 502, 503, 504 |
| zugeordnete Aussagen | - | 401 (159 + 242), keine Luecke |
| Spezifikation im Repo | 0 | 25 Dateien docs/600-623 via PR #513 |

## Stand der Artefakte
- Fabrikanalyse-Paket: modules/fabrikanalyse/konsolidierung/ (ZIP in deliverables/, ausgefuehrt 04.09. 00:46)
- PMO-Paket: modules/pmo-konsolidierung/ (ZIP in deliverables/, ausgefuehrt 04.09. 11:16)
- PR #513 offen gegen dev, schliesst beim Merge #512.

## Nachfassen erledigt (04.09. 13:11 CEST)
Vier Kommentare gesetzt: #505 (Blockadekette sichtbar gemacht: haelt PR #482, #453 und vier Fabrikanalyse-Tickets auf; drei fehlende Werte benannt, Frage nach den Rechten), PR #482 (Lebenszeichen), #390 (PR #506 reviewbereit), #270 (Hinweis an David Koenig, PR #314 am 30.07. gemergt).
Board-Aufraeumung ergab: bei Kais' direkt zugewiesenen Tickets gibt es nichts aufzuraeumen, alle sind frisch oder aktiv.

## Wartet auf Kais
1. PR #513 durch adesso reviewen und mergen lassen.
2. Tony: go-Labels beider Serien neu bewerten (Umfang hat sich geaendert).
3. Board-Karten der zehn geschlossenen Tickets aufraeumen.
4. Lane-Frage #492 (zweite Zustaendigkeit) mit Tony klaeren - bewusst offen gelassen.
5. RwG: Screenshots Placesheet-Kategorie, Alerts-Seite, Future-Availability (offen seit 03.09. 16:29).
6. Kais-Entscheid: .eml (rwg-durrani-consent) in den Vault-Sync oder nicht.
7. Nebenbefund aria-runs.jsonl (Run-Records seit 14.07. blind).

## Erledigt nebenbei
- HEARTBEAT.md-Rechteproblem hat sich durch den Patch vom 03.09. selbst repariert (Reconcile-Lauf 04.09. 04:20 UTC, jetzt aria:aria 644, skip-worktree-Flag von selbst weg).

## Lehren dieser Session (als Memory gesichert)
- issue-merge-boundary-gap (erweitert): Luecke entsteht an der neuen Grenze, Notiz allein reicht nicht, Gegenpruefung ist Pflicht.
- prose-rewrite-drops-technical-anchors (neu): Bezeichner, Statuscodes und Budgets bleiben woertlich.
- no-renumbering-during-execution (neu): waehrend einer laufenden Befehlsliste nicht umnummerieren.
- tool-limit-vs-real-negative (erweitert): gh issue list ohne --limit liefert nur 30.
- handover-snapshot-verify-against-head (erweitert): vor exakten Textersetzungen den Live-Stand holen.
- agent-brief-gate-commands-from-repo-docs (erweitert): auch Konventionen (Commit-Format, Sprache, Formatierung) aus dem Zielsystem ableiten; Pakete mit der .prettierrc des Zielrepos vorformatieren.
- supplierpulse-enterprise-assist-program (erweitert): Kais' Repo-Klon liegt in /Users/Q451092/Documents/SupplierPulse, Arbeitsbranch dev.


## Session-Compact 2026-09-04 13:50 CEST

Session-ID: `856dda33`

### Preserved Working-Memory (auto — garantiert, kein TBD)

```
(keine ACTIVE_TASK.md gefunden)
```

### Letzte Brain-Commits

```
0d3ce02 vault sync: 2026-09-04 11:38:04
feb9be1 vault sync: 2026-09-04 11:23:03
99f02df vault sync: 2026-09-04 11:07:53
08f5c04 vault sync: 2026-09-04 09:37:13
9d090f1 vault sync: 2026-09-04 09:22:11
```

### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)
- Offene Decisions:
- Nächster Schritt:














































































---

## Session-End 2026-09-07 18:23 CEST

Session-ID: `fbcc7342`

### Letzter Active Task
# Session fbcc7342 — RwG: Produktion war von Google abgeschaltet, Support-Fall laeuft

## GOOGLE HAT GEANTWORTET (06.09. 20:07, Marlou, Fall 05599496)
- Onboarding-Meilensteine sind IRRELEVANT ("integration has been already launched").
  Der ganze Buchungsverkehr-Strang entfaellt. Meine Sackgassen-Analyse war falsch.
- DISH ist KEIN Hindernis, mehrere Partner je Merchant sind erlaubt.
- Merchant-Zahl 23 und Sandbox-404 werden intern beraten.
- ENTSCHEIDEND: "As long as you provide the availability for that merchant your integration
  should be enabled for them." Der Availability-Feed ist damit der Hauptweg, nicht mehr ein
  Nebenschauplatz.
- ANTWORT LIEGT FERTIG: projekte/rwg-prod-uebernahme/support-antwort-2.md mit Durranis
  Merchant-ID. EMPFEHLUNG: erst nach dem Feed-Lauf morgen senden, dann mit Nachweis statt
  Ankuendigung.

## ERLEDIGT am 06.09. abends: Availability-Feed laeuft, Brief ist raus
- Feed per AppConfig-Ausloeser getriggert (Deployment 10 = Version 2, danach 11 = Version 1
  zurueckgestellt und die aktive Konfiguration gegengeprueft: wieder "0 0 5 * * *").
- Ergebnis: Availability_Feed_production_1788719523.json.gz, 06.09. 20:32 CEST, 1 Shard,
  0 Issues, 0 Errors. **Erste Availability-Zeile ueberhaupt in der Produktion.**
  Diagnose bestaetigt: der fehlende Sonntag bei ALIBABA brach den Feed fuer alle 23 ab.
- "Processing / 0 records" ist KEIN Befund. Sandbox-Gegenprobe: dort stehen Zeilen tagelang so,
  waehrend andere desselben Tages 118.260 Datensaetze zeigen.
- Selbstbewusst umgeschriebener Brief an Marlou GESENDET (Fall 05599496) mit Durranis
  Merchant-ID, dem Dateinamen als Nachweis und der Bitte um Wiedereinschaltung.

## GOOGLE HAT ZWEIMAL GEANTWORTET (06.09. abends)
1. Marlou: Meilensteine irrelevant, DISH kein Hindernis, Merchant-Zahl und 404 intern in Beratung.
2. Donna (dieselbe Person, die am 21.07. abgeschaltet hat), 21:05 auf unseren Brief:
   "Regarding re-enabling your integration, we have escalated this with our team. We will reach
   out to you once we have an update."
   -> Der Fall liegt bei der Entscheiderin und ist aus dem Support heraus eskaliert.

## NAECHSTER SCHRITT: WARTEN, NICHT ANTWORTEN
Kein "danke" schicken — das schiebt unsere inhaltliche Nachricht im Verlauf nach unten.
Der letzte inhaltliche Beitrag im Fall soll unserer sein.

**NACHFASSEN AM DONNERSTAG, 10.09.2026**, falls bis dahin nichts kommt: kurzer Dreizeiler
ueber "Follow Up On Case" in Fall 05599496. Nicht frueher — sie haben am 06.09. innerhalb
weniger Stunden zweimal geantwortet.

## MORGEN (07.09.)
Feed laeuft regulaer 05:00 UTC. Nur bei Auffaelligkeiten melden — die Availability-Frage ist
beantwortet.

## Wo wir stehen
- **Ursache gefunden:** Google hat die Produktions-Anbindung am 21.07.2026 ABGESCHALTET
  (Fall 05487612, "Failure: Providing 1 merchant", Bedingung "no fewer than 25").
  Vorgeschichte: 02.07. Merchants fielen von 35 auf 1, drei unbeantwortete Nachfragen.
  Deshalb: Feeds werden angenommen (23 Datensaetze, 0 Fehler), Inventory bleibt bei 1,
  Durrani haengt auf "Processing". Auf unserer Seite ist nichts kaputt.
- **Support-Fall laeuft:** Issue 05599496, "Follow up on case ...-05487612", OPEN seit 06.09.
  Category "Technical issue", Reason "Integration is down". Entwurf in
  projekte/rwg-prod-uebernahme/support-mail-entwurf.md.
  Wenn bis Mitte naechster Woche nichts kommt: nachfassen, der Fall ist offen.
- **23 Betriebe live** in der Produktion, alle mit geprueften Place-IDs auf echte Betriebe,
  Oeffnungszeiten, echten Tischplaenen, Telefonnummern.
  Kais hat entschieden, bei 23 zu bleiben statt auf 25 zu gehen (meine Empfehlung war 25,
  weil Google es viermal woertlich schreibt). Die Mail nennt die 23 offen und greift Googles
  eigenes Angebot auf, ueber Abweichungen zu beraten.

## AWS-Kosten (06.09. analysiert, aws-kosten-analyse.md)
Der Anstieg von 171 auf 240 USD war die Log-Gruppe /ecs/backend-staging-debug: 2,73 GB taeglich
aus einer Fehlerschleife (rotierte statische AWS-Schluessel, UnrecognizedClientException).
SEIT 31.08. VORBEI, behoben durch Commit 8cd046cd. September landet bei rund 155 USD.
Meine erste Diagnose (Datadog-Metrikabfragen) war FALSCH — die machen 3,41 USD aus.
ERLEDIGT 06.09.: Elastic IP 18.153.167.91 freigegeben (5 verbleiben, alle zugeordnet).
Restliche Hebel, alle klein:
Datenbanken auf privat (7 USD, beide haben PubliclyAccessible true — auch ein Sicherheitspunkt,
vorher klaeren wer sich von aussen verbindet), Staging nachts abschalten (15-20 USD).
NICHT anfassen: assignPublicIp der ECS-Aufgaben, die brauchen es (kein NAT-Gateway vorhanden).

## Kostenwache laeuft (seit 06.09.)
/home/aria/projekte/aws-kostenwache/ — kostenwache.py plus melde.sh, in der Nutzer-Crontab
taeglich 07:12 UTC. Schweigt im Normalfall, montags kommt der Bericht immer.
Schwelle: mehr als 25 % Zuwachs UND mehr als 5 USD gegenueber demselben Zeitraum des Vormonats.
Manuell: `python3 kostenwache.py --bericht` (Cost Explorer braucht us-east-1, das Skript setzt es).
Die Steuer wird herausgerechnet, weil sie als Klumpen gebucht wird und jede Hochrechnung verzerrt.

## AWS-Rechte
aria-automation hat jetzt zusaetzlich die Inline-Richtlinie `aria-automation-only-read`:
CloudWatch Logs lesen, AppConfig lesen (App 540vb0a inkl. Deployments), SES lesen,
Cost Explorer lesen. Ausschliesslich lesend — Schreibrechte bewusst abgelehnt.
Cost-Explorer-Aufrufe brauchen `--region us-east-1`.
Datadog: mein Schluessel gehoert zu einer ANDEREN Organisation als die, die die
Produktions-Logs empfaengt (sha256-Praefixe 431a4b8a vs aa8ba091). Deshalb null Treffer.
Offen: API- und Application-Schluessel aus der richtigen Organisation.

## Offen (NICHT adesso — kadicon ist Kais' eigenes Repo, adesso gehoert nur zu SupplierPulse)
1. ERLEDIGT: **PR 279 gemergt** (8a874118). settings save() liest die Zeile wieder vollstaendig.
2. ERLEDIGT: **PR 280 und 281 gemergt**, Richtlinie in der AWS-Konsole nachgezogen, Versand
   dreifach mit HTTP 204 verifiziert. Staging verschickt wieder Mails.
   ACHTUNG: Damit ist der unbeabsichtigte Schutz weg — Testbuchungen in der Sandbox schicken
   wieder echte Mails an die Wirte. Vor weiteren Buchungstests einen Testbetrieb mit einer
   nicht weiterleitenden Adresse anlegen (kais@kadicon.de leitet nicht weiter).
   NICHT `nx run infra:apply` ausfuehren: infra/src/envs/staging.tfvars liegt nicht im Repo
   (.gitignore, enthaelt Live-Secrets). Ein Apply ohne die Datei faesst den ganzen Stack an.
3. **Produktions-Beobachtbarkeit**: keine CloudWatch-Gruppe, Datadog-Schluessel liefern 0 Treffer,
   kein Leserecht auf die Prod-AppConfig. Bei Stoerungen in der Produktion bin ich blind.
4. **Durrani laeuft buchungsseitig ueber DISH.** Googles Buchungsseite nennt DISH als Partner.
   Selbst nach der Freischaltung wuerde Google dort nicht auf KADiCon umschalten. In der
   Support-Anfrage sachlich angesprochen, ohne den Wettbewerber zu nennen.
5. **Izmir Kebap Haus und Grill & Doener Haus by Theo** bleiben zurueckgestellt. Fuer eine
   spaetere Aufschaltung fehlen Telefonnummer und Tischplan. Place-IDs sind ermittelt:
   ChIJMZU-BQC3oEcRO1BnNJJOkZU und ChIJUQH5VgB9vkcRDQztf55d9A8.
6. SupplierPulse, NEU am 07.09.: David Koenig hat PR #513 hinterfragt. Ergebnis nach zwei Runden:
   adessos Konvention ist "Feature-Beschreibung ins Issue" (Grund: Aenderungstempo waehrend der
   Entwicklung). Kais passt sich an. AUFTRAG: beschreibende Dokumente in die Issues, PR #513
   schliessen, und das PMO so schneiden, dass es in wenigen Tagen fertig werden kann.
   Mein Vorschlag liegt bei Kais: nur die technischen Vertraege einarbeiten, unser
   Analysematerial (Risikoregister, Abhaengigkeitskarte, IA, SharePoint-Bewertung) NICHT
   abladen; Kern = 490/492/494/496 (benutzbarer Berichtskreislauf), Aufgabenliste 500/501 als
   eigenes Feature herausloesen. Offene Rueckfrage an Dave: jedes Ticket in Tagen oder das
   ganze PMO in Tagen? Aufwand geschaetzt halber bis ganzer Tag. Wartet auf Kais' Go.
   Material: projekte/supplierpulse-enterprise-assist/modules/pmo-konsolidierung/

## Wichtigste Erkenntnis zum Booking-Server-Verkehr
Googles Zaehler (1 von 20 BatchAvailabilityLookup) registrieren nur Anfragen, die VON GOOGLE
kommen — belegt dadurch, dass Google fuer die eine Anfrage vom 29.08. eine Latenz misst.
Unser eigenes Werkzeug tools/rwg/booking-server-e2e.ts zaehlt NICHT. Es ist trotzdem wertvoll:
Lauf am 06.09. bestand alle 11 Schritte, unser Booking-Server arbeitet also nachweislich korrekt.
Sandbox-Buchungsseiten liefern 404 oder verlangen ein Client-Zertifikat, das KADiCon nicht hat.
=> Sackgasse, nur ueber Google aufloesbar. Genau das fragt die Support-Anfrage.

## Werkzeuge
- **Onboarding neuer Restaurants:** projekte/rwg-prod-uebernahme/onboarding/ (onboard.py mit
  pruefen/mail/anlegen, zeiten.py, ANLEITUNG.md). Prueft den Google-Eintrag inkl. Namensabgleich
  und schaltet erst ein, wenn an jedem geoeffneten Tag Zeitfenster entstehen.
- projekte/rwg-prod-uebernahme/: anlegen.py, kadicon_settings.py, prod-kennungen.txt,
  eingabe-ausgefuellt.csv, BEFUNDE.md (B1 bis B9), BEFUND-produktion-abgeschaltet.md
- .secrets/prod.env (info+alibaba@kadicon.de / kadicon123, Muster fuer alle 22)
- .secrets/durrani.env (aseckzai@gmail.com fuer Tenant 4e22f973)

## HARTE REGELN
- **POST /settings ersetzt den gesendeten Block, es merged NICHT** (B1). Immer den VOLLSTAENDIGEN
  Block senden, inklusive googlePlaceId und timezone. Sonst sind sie weg, ohne Fehlermeldung.
- **Auf /settings/restaurant in der Oberflaeche NICHT speichern**, das loescht die Place-ID.
- **Testbuchungen loesen Mails an den Wirt aus** (sendOwnerEmail an settings.restaurant.email,
  die info+-Aliasse leiten an die Laeden weiter). Aktuell faellt das nur aus, weil Staging kein
  SES-Recht hat. Nach dem SES-Fix gilt die Warnung wieder.
- Zeitstempel nur aus `date` (Server laeuft UTC).


## Session-Compact 2026-09-07 18:28 CEST

Session-ID: `fbcc7342`

### Preserved Working-Memory (auto — garantiert, kein TBD)

```
(keine ACTIVE_TASK.md gefunden)
```

### Letzte Brain-Commits

```
7c91285 vault sync: 2026-09-07 16:24:43
616c350 vault sync: 2026-09-07 14:23:53
23b8cea vault sync: 2026-09-07 14:08:51
0a1e360 vault sync: 2026-09-07 13:53:43
07b23f0 vault sync: 2026-09-07 05:35:45
```

### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)
- Offene Decisions:
- Nächster Schritt:







---

## Session-End 2026-09-09 19:28 CEST

Session-ID: `9b4eb20a`

### Letzter Chat (Kurzabriss)
                                                                                                                                                                                                                 ┃
   │ Unit/E2E-Tests decken die geaenderte Funktionalitaet inklusive wichtiger E...
[CHAT 17:05] kaiss78: ● 1. Präzedenzfälle                                                                                                                                                                                             ┃
                                                                                                                                                                                                                 ┃
   In keiner der drei PR-Beschreibungen wird eine Testabdeckung in Prozent gena...
[CHAT 17:05] kaiss78: │ Prüfung                      │ Ergebnis                                                                                                                                                  │                  ┃
   ├──────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤                  ┃
   │ Root package.json            │ Kein Coverage-Skript. test:unit führt Tests a...
[CHAT 17:22] kaiss78: PING
[CHAT 17:27] kaiss78: 2. Die Anforderung gilt erst ab vorhandenem Setup - dann waere eine                                                                                                                                           ┃
      Klarstellung in docs/110-definition-of-done.md sinnvoll.                                                                                                                                                   ┃
   3. Setup im Rahmen dieses PRs einrichten. Davon raten wir ab: Es ist eine     ...
[CHAT 17:27] kaiss78: │ vorhanden ist. Coverage-Infrastruktur wird in einem separaten Ticket behandelt.                                                                                                                             ┃
                                                                                                                                                                                                                 ┃
   Das ist eine begründete Ausnahme bzw. offene Formalanforderung, kein ehrliches...
[CHAT 17:27] kaiss78: PR-Beschreibung eine Abdeckung in Prozent. #514 ist der PR, der die                                                                                                                                         ┃
     Anforderung eingefuehrt hat.                                                                                                                                                                                ┃
                                                                                   ...

[HISTORIC_CHAT_END]


## Session-Compact 2026-09-10 23:55 CEST

Session-ID: `da479f57`

### Preserved Working-Memory (auto — garantiert, kein TBD)

```
(keine ACTIVE_TASK.md gefunden)
```

### Letzte Brain-Commits

```
1f4e967 vault sync: 2026-09-10 05:06:37
49e83f9 vault sync: 2026-09-10 04:21:23
5ac55e7 vault sync: 2026-09-10 02:51:03
6ef4912 vault sync: 2026-09-09 17:33:22
a6b01b8 vault sync: 2026-09-09 16:47:43
```

### Aria-Ergänzung (optional, über den Auto-Snapshot hinaus)
- Offene Decisions:
- Nächster Schritt:



















---

## Session-End 2026-09-13 23:40 CEST

Session-ID: `f1fec60a`

### Letzter Active Task
# Session f1fec60a — RwG FREIGEGEBEN, SupplierPulse-Zaehlwert-Befund offen

## RwG: GOOGLE HAT DIE PRODUKTION FREIGEGEBEN (12.09.2026, Marlou, Fall 05599496)
"you may re-enable your integration via the Actions Center > Configuration > Account & Users."
Die Abschaltung vom 21.07.2026 ist aufgehoben. Sieben Wochen Stillstand beendet.

**NAECHSTER SCHRITT, nur Kais kann das:** im Actions Center einschalten.
Danach MESSEN, nicht annehmen:
- Inventory-Zahl: stand auf 1, muss auf 23 gehen.
- Durrani: hing auf "Processing", Status muss kippen.

**WIEDERHOLUNGSRISIKO (offen an Kais gemeldet):** Marlou schreibt "We will keep on monitoring".
Die Abschaltbedingung "no fewer than 25" ist UNVERAENDERT.

**ZAHL KORRIGIERT am 12.09. nachmittags (gemessen, nicht geschaetzt):** wir stehen NICHT bei 23.
prod-kennungen.txt hat 22 Zeilen, darin ein zweiter Durrani-Mandant `22130b68-82e8-4b95-95c6-cc2abfee1079`
ohne Place-ID und mit googleReservations=False (Doppelanlage, fuer Google nicht existent).
Der echte Durrani `4e22f973-36d5-4e8c-b8a3-c85a7b87cf10` steht nicht in der Liste.
=> matchbar waren 22, nach der Entkopplung von Falkenburg sind es 21. Luecke zur Schwelle: VIER.

**GOOGLE ENTKOPPELT LAUFEND (12.09. 16:47):** automatische Mail, "unmatched ... due to our
matching policy", betroffen `97fb451b-...` = Falkenburg Dinner. Unsere Seite ist sauber
(Place-ID loest korrekt auf, OPERATIONAL, Reservierung an). Einziger Unterschied: Googles
Eintrag hat keine Telefonnummer. Kontrollgruppe: 3 von 21 ohne Telefonnummer (Falkenburg,
Orient Kebap, Street Kebab), 18 mit. Hypothese plausibel, NICHT bewiesen.
Pruefbare Vorhersage: Orient Kebap und Street Kebab waeren die naechsten.
Offen an Kais: Falkenburg im Actions Center neu verknuepfen, Telefonnummern bei Google
nachtragen lassen, Durrani-Duplikat klaeren (Nachforschung angeboten).

Fuer den Weg zu 25 fehlen zusaetzlich diese zwei, Place-IDs liegen geprueft vor:
- Izmir Kebap Haus: ChIJMZU-BQC3oEcRO1BnNJJOkZU
- Grill & Doener Haus by Theo: ChIJUQH5VgB9vkcRDQztf55d9A8
Fehlend je: Telefonnummer und Tischplan. Werkzeug: projekte/rwg-prod-uebernahme/onboarding/
(onboard.py pruefen/mail/anlegen). Angebot an Kais liegt, wartet auf Antwort.

**Unabhaengig offen:** Durrani laeuft buchungsseitig ueber DISH. Auch nach der Freischaltung
schaltet Google dort nicht von allein auf KADiCon um.

## SupplierPulse: dev traegt einen falschen Migrationszaehler (11.09.2026)
**BELEGT, ohne Testlauf:** origin/dev hat 3 Journal-Eintraege (0000_consolidated_baseline
1789048157508, 0001_assessment_data_model 1789076928001, 0002_assessment_localization_columns
1789076929001). Der Test packages/db/src/project-code-migration.integration.test.ts verlangt
`expect(migrationCount[0]?.count).toBe(6)`. Der Kommentar darueber nennt sechs Dateinamen,
die es seit der Konsolidierung #539 nicht mehr gibt.

**Entstehungsweg:** #540 setzte den Wert auf 6 (Stand vor #539), #511 setzte ihn korrekt auf 3
und wurde SPAETER gemergt — trotzdem steht 6 in dev. Bei der Konfliktaufloesung im Merge von
#511 hat dev gewonnen. #511 ist der juengste Commit auf der Datei (89a5951).

**Faellt niemandem auf:** der Test setzt ohne erreichbare Testdatenbank still aus
(2 tests | 2 skipped; in Kais' Container 98 von 170 Tests uebersprungen, Ursache
ECONNREFUSED 127.0.0.1:55432 = Host-Port des Devcontainer-Mappings statt db:5432).
Ob adessos CI den Test ausfuehrt, ist NICHT geprueft und entscheidet die Schwere.

**ANGEBOT AN KAIS LIEGT:** Meldung an adesso schreiben (zwei Punkte: falscher Zaehlwert samt
Entstehungsweg, und die Frage nach der Testausfuehrung in ihrer CI). Wartet auf Antwort.

**Nicht unsere Baustelle:** die 55432-Umgebungsfrage ist adessos Entwicklungsumgebung.
Kein `gh pr ...` durch uns, PRs gehoeren adesso.

## Weiteres vom 11.09.
- PR #540 und #511 sind gemergt, Branch squad/538-coverage-setup geloescht.
- Drei offene PRs, ALLE MERGEABLE/CLEAN: #506 (Prod-DB-Prozess zu #390), #559 (WebEAM
  Q-number), #561 (WebEAM testrunbook). Es gibt KEINE Konflikte.
- Dauerreferenz fuer den naechsten Konfliktfall liegt in
  projekte/supplierpulse-enterprise-assist/modules/konflikte-nach-539/auftrag-konfliktloesung.md
- Fund fuer Dave: #561 haengt am Branch "%feat/%-automatic-dollop" (nicht ersetzte Vorlage).
- Kais' neue Dauerregel: "Immer auch Git History anschauen" (Memory
  read-git-history-not-just-file-state).
- Modell laeuft jetzt auf Opus 5, effort high.

