# Programmstatus QAF-V2

Stand: 2026-08-12. **Diese Datei ist die zentrale Übersicht.** Kein Loop darf
still verschwinden oder durch ein anderes Thema ersetzt werden.

## Wie diese Datei zu lesen ist

- **Titel, Scope und Exit-Kriterien** stammen aus
  `baseline-inputs/06_Autonomous_Loop_Roadmap_v1.0.md`. Sie sind Baseline-Eingabe
  und werden hier nicht umgeschrieben; Abweichungen werden benannt.
- **Anforderungs-IDs** stammen aus der Loop-Spalte von
  `baseline-inputs/07_Requirements_Traceability_Matrix_v1.0.md`. Zwei
  Anforderungen (`DOC-001`, `TST-002`) sind dort „Loop alle" zugeordnet und
  erscheinen deshalb bei jedem Loop — das erklärt einen Teil der Zahlen.
- **Status** ist nur dort gefüllt, wo ich es belegen kann. „nicht begonnen"
  heißt: keine Arbeit, kein PR, kein Befund — nicht „geprüft und leer".
- Die Zuordnung der Loop-Nummern in der Matrix folgt nicht überall der Roadmap
  (die Matrix kennt auch „Loop 16" und „Loop 17", die Roadmap endet bei 15). Das
  ist ein bekannter Widerspruch der Baseline, hier festgehalten statt bereinigt.
  Welche Anforderungen dadurch ohne Loop bleiben, steht im Abschnitt
  „Anforderungen ohne Loop in der Roadmap".

### Welche Felder je Loop geführt werden

Gefordert waren dreizehn Felder je Loop. Geführt werden acht: Nummer, Titel,
Anforderungs-IDs, Status, Exit-Kriterien, PRs, Merge-Commits, offene Punkte.

Fünf Felder werden **bewusst nicht** als leere Zeile pro Loop geführt, sondern
dort, wo sie Inhalt haben:

- **Scope** — bei den Loops 3 bis 15 wäre er eine Umformulierung des Titels und
  der Exit-Kriterien, die beide schon wortgleich aus der Roadmap stehen. Eine
  dritte Fassung derselben Aussage erzeugt nur eine Stelle, die driften kann.
- **Abhängigkeiten** — die Roadmap ist sequenziell: jeder Loop setzt die
  vorangehenden voraus. Wo eine Abhängigkeit darüber hinausgeht, steht sie in
  den offenen Punkten des betroffenen Loops.
- **Deployment** — für „nicht begonnen" gibt es keinen Deployment-Stand. Für die
  abgeschlossenen Loops steht er beim jeweiligen Loop.
- **Deferred Scope** — G60 und Multi-QAF sind programmweit zurückgestellt, nicht
  je Loop. Die Angabe pro Loop zu wiederholen würde die Entscheidung an sechzehn
  Stellen pflegen, wo eine genügt: Abschnitt „Zurückgestellt".
- **Nächster Schritt** — steht einmal am Ende unter „Priorität nach Loop 2",
  statt sechzehnmal als Vermutung über eine noch nicht begonnene Arbeit.

Das ist eine benannte Abweichung von der Feldliste, keine Auslassung. Wer die
dreizehn Felder je Loop ausgeschrieben braucht, bekommt sie — die Angabe wäre
dann aber für dreizehn der sechzehn Loops geraten und nicht belegt.

## Übersicht

| Loop | Titel | Anf. | Status |
|---:|---|---:|---|
| 0 | Reproduzierbare Ausgangsbasis | 9 | abgeschlossen |
| 1 | Architektur- und Abhängigkeitsgraph | 4 | abgeschlossen |
| 2 | Golden Corpus und Testhärtung | 16 | **nicht abgeschlossen** |
| 3 | Vollständiger Differenzkatalog | 13 | abgeschlossen |
| 4 | Datenqualitäts- und Vergleichsklassifikation | 8 | abgeschlossen |
| 5 | Source Artifact und Reparse | 7 | teilweise umgesetzt |
| 6 | Kanonischer JSON-Vertrag | 2 | teilweise umgesetzt |
| 7 | Comparison Set für ein bis sechs QAFs | 12 | nicht begonnen |
| 8 | Capability-basierte Navigation | 18 | teilweise umgesetzt (Teil 1+2) |
| 9 | V2 Header und Aktionen | 5 | nicht begonnen |
| 10 | UI-Komponenten zerlegen | 19 | teilweise umgesetzt |
| 11 | BMW Design System | 9 | teilweise umgesetzt |
| 12 | Exporte und Präsentation | 5 | teilweise umgesetzt |
| 13 | KI- und Aria-Schicht | 5 | teilweise umgesetzt |
| 14 | Wertstromintegration | 9 | abgeschlossen |
| 15 | Migration und Abschaltung | 3 | begonnen (Paritätsmatrix) |

## Loops im Einzelnen

### Loop 0 — Reproduzierbare Ausgangsbasis

**Status:** abgeschlossen

**Anforderungen (9):** ARC-001, DET-001, DOC-001, PAR-004, PER-002, SEC-001, SEC-002, SEC-003, TST-002

**Exit-Kriterien laut Roadmap:**

- Build ist reproduzierbar oder alle Fehler sind klassifiziert.
- Tests sind ausführbar.
- HICE-Vergleich kann erzeugt werden.
- aktuelle Exporte sind archiviert.
- keine Änderung am Produktcode vor Abschluss dieses Loops.

**PRs und Merge-Commits:** `ca84d35` (#425)

**Abnahme:** Loop-0/1-Abschluss im Aria-Operating-Pack

**Offene Punkte:** —

---

### Loop 1 — Architektur- und Abhängigkeitsgraph

**Status:** abgeschlossen

**Anforderungen (4):** ARC-002, CAP-001, DOC-001, TST-002

**Exit-Kriterien laut Roadmap:**

- Jeder fachliche Output ist bis zur Quelle zurückverfolgbar.
- Jeder Vergleichsmodus ist vollständig dokumentiert.
- alle hart codierten Gates sind katalogisiert.
- `actions.ts` Verantwortlichkeiten sind vollständig aufgeteilt dokumentiert.

**PRs und Merge-Commits:** `ca84d35` (#425)

**Abnahme:** gemeinsam mit Loop 0 abgeschlossen

**Offene Punkte:** —

---

### Loop 2 — Golden Corpus und Testhärtung

**Status:** **nicht abgeschlossen**

**Anforderungen (16):** DOC-001, FOR-001, PAR-001, PAR-002, PAR-003, PAR-004, REC-001, REC-002, REC-003, REC-004, SEC-001, SEC-002, SEC-003, TST-001, TST-002, TST-004

**Exit-Kriterien laut Roadmap:**

- keine Kernabnahme ist env-gated.
- jede unterstützte QAF-Familie besitzt mindestens eine reale anonymisierte Fixture.
- HICE-Ergebnis ist Golden Test.
- zwei identische Läufe erzeugen denselben Hash.

**PRs und Merge-Commits:** #426 `2fe68b9` · #427 `2d5fdf8` · #428 `caeb0ad` · #430 `c478f3a` · #432 `b18bffb` · #435 `7b2429a` · #436 `1bc576b` · #437 `ccbeae8` · #438 `410b4bf` · #439 `3450664` · #440 `6f3d4ff` · #441 `b8d4b87`

Nicht enthalten und warum: #429 (Autonomie-Policy, kein Loop-2-Inhalt) · #431, #433, #434 (ohne Merge geschlossen, durch spätere PRs ersetzt).

**Abnahme:** Messwerte in `loop-2-abnahmestand.md`: von vier Exit-Kriterien **zwei erfüllt** (Fixture je Familie durch #441, Hash-Determinismus), eines teilweise (HICE strukturell, kein Wert-Golden), eines nicht (Kernabnahme env-gated)

**Offene Punkte:** 170 Tests in 48 Dateien laufen in keinem CI-Workflow, davon **75 in 23 Dateien** ohne Begründung (Stand 06.08.; war 80 in 24, bewegt durch `#450` und die Umstellung von `blank-template-negative-anchor`). Der Weg über Fixture-Umstellung ist damit ausgeschöpft: umstellbar ist genau, was *Repräsentanten* sucht, nicht was eine *Menge* behauptet — Einzelmessung aller Kandidaten in `triage-env-gated-tests.md`. Der Rest hängt am Paar-Korpus und damit an der offenen Produktentscheidung (`testinventar.md`)

---

### Loop 3 — Vollständiger Differenzkatalog

**Status:** abgeschlossen (07.08.2026; Nachtrag hier 12.08. — der Eintrag
stand fälschlich auf „nicht begonnen", während #452–#457 längst gemergt waren.
Report: `loop-reports/loop-3-2026-08-07.md`)

**Anforderungen (13):** DIF-001, DIF-002, DIF-003, DIF-004, DIF-005, DOC-001, FOR-001, MAP-001, MAP-002, MAP-003, MAP-004, MAP-005, TST-002

**Exit-Kriterien laut Roadmap:**

- jede UI-Aussage referenziert Difference IDs.
- jede Difference ID besitzt mindestens eine Source Reference.
- Material, Fertigung und SBM sind vollständig enthalten.
- deterministische ID-Stabilität ist mutativ getestet.

**Vor dem Bauen lesen: `loop-3-vorbefund.md`** (06.08.2026, gemessen gegen
`d76672b`). Kurzfassung, weil sie den Umfang verschiebt:

- **Loop 3 ist vor allem Verdrahtung, nicht „zwei Module bauen".**
  `overview-run.ts:121` und `:180` setzen `differenceIds: []` **fest**; der
  Katalog (`assignDifferenceIds`/`buildCatalog`/`buildTraceabilityIndex`) kommt
  außerhalb seiner Datei nur in Tests vor, der Barrel hat 182 Export-Anweisungen
  (1048 Symbole) und keinen Verweis darauf. **Exit-Kriterium 1 ist heute von
  keiner datenbankgespeisten UI-Aussage erfüllt**, und damit auch die nicht
  verhandelbare Regel „jede quantitative Aussage benötigt Difference IDs und
  Source References" nicht. Ausnahme, und zwar eine nützliche:
  `app/qaf-differences/referenz/page.tsx` **zeigt** IDs, aber ausdrücklich mit
  erfundenen Beispieldaten — sie ist die Vorlage für die Verdrahtung, nicht der
  Gegenbeweis.
- Die Lücke erzeugt kein Signal: leere Listen sind typkorrekt, alle Tests bleiben
  grün. Wer Kriterium 1 prüft, muss nach einer **nicht-leeren** Liste im
  datenbankgespeisten Pfad suchen.
- **Die Barrel-Umgehung ist größer als eine Stelle:** 20 Produktionsdateien
  importieren aus `qaf-differences/internal/`, 32 über den Barrel. ADR-019 Regel 4
  verbietet das („no deep imports"), `eslint.config.mjs` hat keine Zone dafür, und
  das Bypass-Log führt keinen Eintrag. Vor dem Verdrahten zu klären.
- **Exit-Kriterium 4** ist heute unkritisch (16 Sätze, 16 verschiedene
  Sortierschlüssel, null Kollisionen) — wird aber mit den zwei neuen Produzenten
  real, weil Material und Fertigung mehrere Sätze je Zeile erzeugen. Also
  Entwurfsanforderung, nicht Altlast.
- Empfohlene Reihenfolge weicht von der Roadmap ab: erst einen **SUM**-Produzenten
  bauen und in `buildOverviewRun` einsetzen, dann den fünften Sortierschlüssel,
  **dann** die zwei Module. Grund: `buildKpiTiles` wird bereits aufgerufen
  (`overview-run.ts:231`), bekommt aber `[]` als Katalog — und der einzige
  vorhandene Produzent erzeugt `area: 'SBM'`, während die Kacheln den SUM-Bereich
  zeigen. Für SUM gibt es außerhalb der Referenz-Beispieldaten keinen Produzenten.

**PRs und Merge-Commits:** #452 `a6edeef` (Vorbefund) · #453 `5f6b3c7`
(Katalog sprachfähig) · #454 `6c0bc07` (SUM-Produzent + Verdrahtung) ·
#455 `ac5199c` (fünfter Sortierschlüssel) · #456 `2c4130f` (MFG) ·
#457 `66880b9` (scope_removed, Kais-Entscheid „Regel a" 07.08.)

**Offene Punkte:** fachliche Prüfung der bestehenden Tooling-/Findings-
Übersetzungen als eigene Review-Dimension (Roadmap-Aufgabe, keine Test-Lücke) ·
Barrel-Bypass-Befund im `governance/scorecard/bypass-log.md` (ADR-019 R4,
Sunset benannt)

---

### Loop 4 — Datenqualitäts- und Vergleichsklassifikation

**Status:** abgeschlossen (10.08.2026)

**Anforderungen (8):** CLS-003, DIF-005, DOC-001, DQ-015, DQ-016, DQ-017, FOR-002, TST-002

**Exit-Kriterien laut Roadmap:**

- kein produktiver Vergleich bleibt ohne begründeten Vergleichstyp. ✔ (R-03:
  Deklaration + Evidenzliste; nie deklariert = sichtbar „Vergleichsart nicht
  bestimmt" mit Reviewstatus, siehe unten — das System rät nie, PO-Linie 08.08.)
- unbestimmte Einordnung hat einen sichtbaren Reviewstatus. ✔ („Einordnung
  ausstehend"-Status in der Vergleichsart-Sektion; Kopf-Ampel wird aus den
  persistierten Identitäts-Befunden ABGELEITET statt hart „ungeprüft" —
  `deriveComparability`, jede Stufe mit Begründung)
- neue Regeln besitzen Positiv-, Negativ-, Mutations- und Gegenproben. ✔
  (D15/D16/D17: Modultests + je Mutations-Probe, PR #461; Ampel-Ableitung:
  Positiv/Negativ/Gegenprobe im Test, Mutations-Probe dokumentiert im PR)

**Abweichung zur Baseline-RTM (Stand 03.08.):** Die RTM listet DQ-015/016/017
und CLS-003 als „Fehlt" — sie wurden am 08.08. als D15/D16/D17 (#461) und
R-03 (#462) umgesetzt; FOR-002 deckt die Formel-Engine (`formel_zu_konstante`,
KAR-900), DIF-005 der `scope_removed`-Zweig (Loop 3 Schritt 5, #457). Die
Baseline wird konventionsgemäß nicht umgeschrieben; dieser Absatz ist die
Benennung.

**PRs und Merge-Commits:** #461 (`8d9a04b`), #462 (`c17e2ac`), #463
(`eb5fc3c`, Evidenzliste bilingual — Kais-Befund 10.08.), Abschluss-PR #465
(`b7bc974`, Ampel-Ableitung + Reviewstatus). Report:
`loop-reports/loop-4-2026-08-10.md`

**Offene Punkte:** D15-Frequenz am lebenden Objekt beurteilen (PO);
Migration #120 operator-applied ausstehend (entspannt, Seite degradiert ehrlich)

---

### Loop 5 — Source Artifact und Reparse

**Status:** teilweise umgesetzt (11.08.2026 — Quellen-Verknüpfung + Zugriff + Reparse-Flow)

**Umgesetzt (Teil 1):** `qaf_file.storage_key` wird bei jedem Ingest
geschrieben (die Bytes lagen seit KAR-840 unauffindbar im Bucket);
signierte Lese-URL nach RLS-Check (`createQafSourceDownloadUrl`,
Register-Eintrag); V2-Seite zeigt Download bzw. die explizite
„Originalquelle nicht hinterlegt"-Aussage — „Originaldateien werden nie
überschrieben" ✔ (UUID-Pfade je Upload) und „fehlende Legacyquelle wird
explizit angezeigt" ✔.

**Umgesetzt (Teil 2, 11.08.):** Reparse-Flow „Neu einlesen (aktueller
Parser)" je Stand auf der V2-Seite (`reparseComparisonFile`): die
Originaldatei wird bucket-kopiert (eigener UUID-Pfad — das Original wird
in keinem Ausgang beschrieben oder entfernt: per Code-Trace verifiziert
[copy liest nur, jedes remove zielt auf die Kopie]; der Test beweist es
für den frühen Abbruch des inneren replace, der compensate-Fall ist
durch Konstruktion abgedeckt) und
die Kopie durch den bestehenden `replaceComparisonFile`-Pfad geführt —
Parse vor jedem DB-Schreiben, Guards, Override-Carry-Forward,
insert-first-Rollback und `refreshPlausibility:true` geerbt statt
dupliziert. Nur Summary-Paarvergleiche (G60/Multi-QAF deferred, Gate in
Action UND UI). Exit-Kriterium „jeder neue Vergleich kann aus der
Originaldatei reproduziert werden" damit real erfüllbar; Reparse liefert
frische Zell-Provenienz → mehr kanonische Facts (Loop 6 Etappe 2a).

**SRC-002-Kette sichtbar seit 12.08.:** die U-08-Tabellen zeigen je Zeile
Rolle→Blatt!Zelle→Formel→Wertzustand aus dem Katalog (`src-002-analyse.md`;
Evidence-Panel als Ausbaustufe benannt). **Bewusst offen:** Legacy-Markierung
(Roadmap-Aufgabe Legacy-Datensätze migrieren/markieren).

**Anforderungen (7):** DOC-001, PAR-006, PAR-007, SRC-001, SRC-002, TST-002, UI-007

**Exit-Kriterien laut Roadmap:**

- jeder neue Vergleich kann aus der Originaldatei reproduziert werden.
- Formeln, Blattnamen und Zellzustände sind vollständig erreichbar.
- Originaldateien werden nie überschrieben.
- fehlende Legacyquelle wird explizit angezeigt.

**PRs und Merge-Commits:** #467 (`6723620`, Teil 1) · #475 (`26d5a9e`,
Teil 2 Reparse) · #476 (`da97c01`, KAR-899-Präzisierung). Report:
`loop-reports/loop-5-2026-08-11.md`

**Offene Punkte:** Evidence-Panel-Ausbaustufe (SRC-002-Kette sichtbar, s. o.) · Legacy-Markierung erledigt 12.08. (benannte Einschränkungs-Markierung in der Quellen-Sektion) ·
benannter Bestands-Befund (11.08., Loop-5-Analyse; 11.08. präzisiert):
`recompareComparison` stempelt bei jedem Aufruf die aktuelle
configVersion, die drei Pins-/Swap-UI-Aufrufe persistieren die
Plausibility-Zeilen aber bewusst NICHT — das ist KAR-899-Design
(dokumentiert am Options-Typ: die Issues sind nicht matching-abhängig
und aus der last-write-wins qaf_part-Zeile nicht korrekt re-derivierbar;
`refreshPlausibility:true` an diesen Stellen wäre also eine
VERFÄLSCHUNG, kein Fix). Der reale Rest-Drift: ein Pin-Recompare auf
einem Alt-Lauf (vor 1.5.0) hebt den configVersion-Stempel, den die
V2-Ampel als `identityChecksComplete` liest, obwohl dessen D16-Zeilen
nie persistiert wurden — sauberer Fix wäre, die Ampel-Herleitung nicht
allein am Stempel festzumachen (Design-Arbeit, kein Flag-Flip; Reparse
über den Replace-Pfad ist der korrekte Weg, einen Alt-Lauf wirklich auf
1.5.0-Zeilen-Stand zu heben) · akzeptiertes, geerbtes Parallelitäts-Risiko (11.08.,
Silent-Failure-Review): `replaceComparisonFile` patcht die Datei-Zeiger
last-write-wins ohne Compare-and-Swap — zwei gleichzeitige
Replace/Reparse-Aufrufe derselben Rolle (zwei Tabs/Nutzer) können
Zeiger und abgeleitete Zeilen verschränken; der Ein-Klick-Reparse senkt
die Hürde dafür. Mitigation erledigt 12.08. abends (Operation-Lock je
comparisonId+role über die Lock-Tabelle `qaf_operation_lock`, Migration
#121; TTL-Takeover, Release im finally, ehrlicher Degrade bis zum Apply —
`replace-parallelitaet-analyse.md`; wirksam nach Apply, Blocker-Register
B-10) · `replaceComparisonFile`-Testlücke geschlossen 12.08. abends
(#499: compensate-Pfad-Test, 8 Fälle inkl. mutationsgeprüftem
Zeiger-Rollback; Lock-Verhalten mit 6 weiteren Fällen im selben File) ·
Audit-Log-Unterscheidung Reparse/Replace erledigt 12.08.
(`auditAction: 'reparse_file'`, additiv, kein DB-Constraint betroffen)

---

### Loop 6 — Kanonischer JSON-Vertrag

**Status:** teilweise umgesetzt (11.08.2026 — Etappe 1a [schema-valider
Vertrag als pures Modul mit ajv-Validierung gegen das Original-Schema],
1b [klickbarer Export, Seite und Export aus einer Quelle], 2a
[Entity/Fact-Graph: part-Entities je Dokument, SUM-Facts mit
Zell-Provenienz aus qaf_summary_metric, same_part_as-Relationship,
difference.base/comparison_fact_ids, entity_graph_integrity-Selbstcheck;
Seiten ohne sheet-Provenienz withheld gezählt statt erfunden] und 3
[eine Lade+Katalog-Komposition für V2-Seite und Export
(composition.ts) — Parität strukturell statt Abgleich;
Fehlersemantiken beider Aufrufer erhalten; Klassik-ViewModel bleibt bis
Loop 15]. Offen: 2b [MFG-/MAT-Facts — die Diff-Tabellen führen keine
sheet-Spalte, DB-Lücke], mapping_groups [Cross-Dokument-Identität,
grenzt an deferred Multi-QAF], „Seite liest analysis_areas" [erst
sinnvoll, wenn mehr als 6/24 Areas befüllt sind]. Bekannter
Baseline-Widerspruch: die RTM ordnet JSN-001–003 Loop 8 zu, der
Roadmap-Text Loop 6 — hier nach Roadmap gebaut, Abweichung benannt statt
bereinigt.)

**Anforderungen (2):** DOC-001, TST-002

**Exit-Kriterien laut Roadmap:**

- Export ist schema-valide.
- derselbe Input erzeugt denselben Content Hash.
- UI und Präsentation können aus demselben JSON lesen.
- kein Bereich wird still ausgelassen.
- `analysis_status` ist nur dann `complete`, wenn alle Pflichtbereiche einen zulässigen Zustand besitzen.

**PRs und Merge-Commits:** #468 (`6333929`, Etappe 1a) · #469 (`025880e`,
Etappe 1b) · #474 (`1ccdd97`, Etappe 2a) · #477 (`00c80a6`, Etappe 3).
Report: `loop-reports/loop-6-2026-08-11.md`

**Offene Punkte:** Etappe 2b (MFG-/MAT-Facts nach DB-Erweiterung) · mapping_groups · „Seite liest analysis_areas" (erst ab >6/24 befüllten Bereichen sinnvoll) · Klassik-ViewModel-Ablösung (Loop-15-Territorium, Paritätsregel)

---

### Loop 7 — Comparison Set für ein bis sechs QAFs

**Status:** nicht begonnen

**Anforderungen (12):** DOC-001, MAP-001, MAP-002, MAP-003, MAP-006, MUL-001, MUL-002, MUL-003, MUL-004, MUL-005, PER-002, TST-002

**Exit-Kriterien laut Roadmap:**

- Vergleich mit ein bis sechs Dateien.
- keine 15 unabhängig gepflegten Mappings bei sechs Dateien.
- Baselinewechsel ändert keine Extraktion.
- Zeitreihe und Paarvergleich stimmen rechnerisch überein.
- Konflikte sind sichtbar und reviewbar.

**PRs und Merge-Commits:** keine

**Offene Punkte:** noch nicht erhoben

---

### Loop 8 — Capability-basierte Navigation

**Status:** teilweise umgesetzt (11.08.2026 — Teil 1 Coverage-Sicht + Teil 2
Hauptreiter; siehe unten)

**Umgesetzt (Teil 1, #466):** Abdeckungs-Sektion auf der V2-Seite aus dem beim
Ingest persistierten Capability-Stand (KAR-959, erstmals gelesen) — „nicht
berechnete Bereiche sind in Coverage sichtbar" ✔ und „QAF-Nutzer erkennen
ihre Excel-Terminologie wieder" ✔ (Modul→DE-Namen-Map, coverage-view.ts);
„kein leerer Hauptreiter" ist auf der Scroll-Seite durch die benannten
Leerzustände jeder Sektion abgedeckt.

**Umgesetzt (Teil 2, #480, 11.08.):** Hauptreiter in QAF-Terminologie auf der
normalen QAF (`PRIMARY_AREAS` in `qaf-primary-navigation.ts`, `visibleAreas`
aus der Capability-Matrix — die seit KAR-959/P2 persistiert wurde und bis
dahin toter Datenbestand war), Deep-Links `?bereich=`, 14-Sektionen-Langseite
als Kompatibilitätsansicht („Alle Sektionen"). Report:
`loop-reports/loop-8-2026-08-11.md`. **Bewusst offen:** Reiter „Technischer
Nachweis" + echte Aufspaltung von „Zusatzmodule" (brauchen Capability-Modul
oder fachliche Zuordnung — nicht erfunden); eigene Detailsichten für
Material/Logistik/Rohstoffrisiken/Zusatzmodule → Loop 10 (View Adapter).

**Anforderungen (18):** DET-003, DET-004, DOC-001, EXP-003, JSN-001, JSN-002, JSN-003, MAP-004, MAP-006, PAR-005, PAR-007, REC-001, REC-002, REC-003, REC-004, SRC-002, TST-002, TST-004

**Exit-Kriterien laut Roadmap:**

- jede QAF ist navigierbar.
- kein leerer Hauptreiter überlädt die UI.
- nicht berechnete Bereiche sind in Coverage sichtbar.
- QAF-Nutzer erkennen ihre Excel-Terminologie wieder.

**PRs und Merge-Commits:** #466 (`be58b4b`, Teil 1) · #480 (`2681c8d`, Teil 2)

**Offene Punkte:** siehe „Bewusst offen" oben; zusätzlich aus dem Report:
Realdatei-Tests der Capability-Schicht liegen dicht am 240s-Timeout
(reproduzierbar rot unter paralleler Last, isoliert grün)

---

### Loop 9 — V2 Header und Aktionen

**Status:** nicht begonnen

**Anforderungen (5):** CAP-001, DET-001, DOC-001, TST-002, UI-001

**Exit-Kriterien laut Roadmap:**

- keine überladene Buttonreihe.
- Kontext, Status und Dateien sind auf einen Blick verständlich.
- alle bisherigen Aktionen bleiben erreichbar.

**PRs und Merge-Commits:** keine

**Offene Punkte:** noch nicht erhoben

---

### Loop 10 — UI-Komponenten zerlegen

**Status:** teilweise umgesetzt (12.08.2026 — Teil 3: Detail-Ansicht in
View-Module je Hauptreiter zerlegt [2178 → 680 Zeilen Schale + 6 Module,
Paritäts-Smoke mit Gegenprobe]; Report:
`loop-reports/loop-10-teil3-2026-08-12.md`. Davor 11.08.2026 — Teile 1+2: die einzige echte
Geldrechnung aus dem Client [`?? 0` zählte nicht-berechenbare Positionen als
Null mit — jetzt `total: null` + benannte Übergänge] und sechs
„presentational" ausgenommene Regel-Funktionen testbar gemacht [teuerste:
Rot/Grün nach Günstigkeit via `HIGHER_IS_BETTER_FIELDS`], Äquivalenz gegen
`main` normalisiert nachgewiesen. Report:
`loop-reports/loop-10-teil1-2-2026-08-11.md` — hält ausdrücklich fest, was
offen bleibt: Zerlegung `qaf-comparison-detail.tsx` [2178 Z.] + `actions.ts`
[5195 Z.], View Adapter je fachlichem Reiter, gemeinsame
Evidence/Table/Filter/Empty-Engines, Virtualisierung, URL-State.
`qaf-multi-qaf-detail.tsx` steht in der Roadmap-Liste, ist aber
`deferred_by_product_owner` und bleibt unberührt.)

**Anforderungen (19):** ACC-001, ACC-002, ARC-003, DOC-001, EXP-004, MAP-005, MUL-003, MUL-004, MUL-005, PER-001, TST-002, TST-003, UI-001, UI-002, UI-003, UI-004, UI-005, UI-006, UI-007

**Exit-Kriterien laut Roadmap:**

- keine zentrale Detailkomponente über vereinbartem Größenlimit.
- alle Ansichten lesen View Specs.
- keine fachliche Berechnung im Client.
- Tabellen bleiben bei großen QAFs interaktiv.

**PRs und Merge-Commits:** #481 (`c0390e4`, Teil 1) · #482 (`aea2f46`,
Teil 2) · #483 (`96b2681`, Loop-Report)

**Offene Punkte:** actions.ts-Zerlegung begonnen (12.08., Schnitt 1:
Meta-Familie → `comparison-meta-actions.ts`; Schnitt 2:
Quelle/Kanonisch → `canonical-source-actions.ts` + Pfad-Shape-Helfer;
Schnitt 3: Override-Familie → `field-mapping-override-actions.ts`;
Schnitt 4: Summary-XLSX-Export → `xlsx-export-actions.ts`; Schnitt 5 =
Plan-Schritt A: Ingest-Kern (1406 Z.) → `ingest-core.ts` [keine
'use server'-Datei, hash-identisch]; Schritt B: Replace/Reparse →
`file-replace-actions.ts`, 2373 Zeilen verbleiben; Rest dort: Upload-Targets/
Batch-Analyze, Recompare/Varianten, deferred-Exporte) · View-Spec-Adoption der
Detail-Module BEGONNEN 13.08. (Gap-Analyse: Adoption war 0 %, die Module
laufen auf dem Parallelpfad summary-view/qaf-diff-status mit rohen DB-Zeilen;
Modul 1 Überblick-Kacheln umgestellt auf `buildOverviewRun`-Tiles über die
geteilte Komposition + `QafV2KpiTile`-Renderer, bewusste Semantik-Angleichung
[neutral-Band] im CHANGELOG benannt; Modul 2 Verhandlung+Einmalzahlungen
13.08. abends: `negotiation-run.ts`-Builder mit SourceRef-Belegen +
Quellen-Tooltips, Facts-Zeile aus der Schale in den Builder, ViewModel-Profil
2.1.0; Hebel-Belege UMGESETZT 15.08. [`levers-run.ts` auf den
A1-Zeilen-Specs aus `manufacturing-run.ts` — die hier früher erwartete
„mfg-Katalog-Verknüpfung als Modul-3-Vorarbeit" hat sich so nicht
materialisiert: Modul 3 lieferte bewusst keine SourceRefs, die nutzbare
Zell-Provenienz (altCell/neuCell) kam mit Modul 4/#505; Beleg-Form
altCell/neuCell statt SourceRef-Attrappe, ViewModel-Profil 2.2.0];
Reihenfolge war: anhang → fertigungskosten → zusammenfassung,
Bau-Grundlage: `view-spec-adoption-analyse.md`) ·
gemeinsame Table/Filter/Evidence-Engines ·
Virtualisierung · URL-State für Filter [Bestandsanalyse 15.08.:
`loop10-rest-engines-analyse.md` — Block war nur Stichwort-Liste; Schritt 1
(gemeinsamer Tabellen-Renderer `QafDataTable`, 3 Sektionen migriert)
umgesetzt; Filter-UI-Scope + Virtualisierungs-Dependency + Evidence-Panel-
Datenmodell als 3 konkrete PO-Fragen an Kais gestellt, TG 10233]

---

### Loop 11 — BMW Design System

**Status:** teilweise umgesetzt (11.08.2026 — Token-Audit als Gate
`check:design-tokens` in der Portability-Kette [lose CSS-Vars und
abweichende Fallback-Hex schlagen fehl]; `font-display` war app-weit eine
tote Klasse und ist als Utility definiert — Headings tragen erstmals
wirklich TN Condensed Pro; V2-Überschriften auf Sentence Case [BMW-002];
Waterfall-Richtungs-Töne als dokumentierte Token Light+Dark statt loser
Fallback-Hex. **Bewusst offen:** visuelle Regression Desktop/Tablet/Mobil
[TST-003 — keine Vorarbeit im Repo] und der app-weite Sentence-Case-Sweep
außerhalb des V2-Scopes.)

**Anforderungen (9):** ACC-001, ACC-003, BMW-001, BMW-002, BMW-003, BMW-004, DOC-001, TST-002, TST-003

**Exit-Kriterien laut Roadmap:**

- Token-Audit besteht.
- keine verbotenen Farben oder Fonts.
- keine unzulässigen Rundungen oder Schatten.
- visuelle Regression für Desktop, Tablet und Mobil.

**PRs und Merge-Commits:** #470 (`9463f4b`, Teil 1). Report:
`loop-reports/loop-11-teil1-2026-08-11.md`

**Offene Punkte:** visuelle Regression Desktop/Tablet/Mobil (TST-003) ·
app-weiter Sentence-Case-Sweep (außerhalb V2-Scope) · Zoom-Verbot
`app/layout.tsx` (ganze App, eigener PR)

---

### Loop 12 — Exporte und Präsentation

**Status:** teilweise umgesetzt (11.08.2026 — presentation_package im
kanonischen Export befüllt [Referenz-Integrität testbewiesen] + PPTX-Knopf
auf der V2-Seite als reine Wiedergabe-Kette über den bestehenden Renderer
[keine Exportvariante rechnet selbst; Zahlen wörtlich aus dem kanonischen
JSON; jede Zeile mit Referenz-Kennung]. **Bewusst offen:** Versionierung
der übrigen Exportprofile [ViewModel-JSON/Excel/Copilot tragen eigene,
nicht vereinheitlichte Versionsfelder] und deren Angleichung an den
kanonischen Vertrag [Loop-6-Etappe 3].)

**Anforderungen (5):** ARC-002, ARC-003, ARC-004, DOC-001, TST-002

**Exit-Kriterien laut Roadmap:**

- keine Exportvariante rechnet selbst.
- alle Zahlen stimmen mit dem kanonischen JSON überein.
- Exportprofile sind versioniert.
- Presentation Package referenziert Difference IDs.

**PRs und Merge-Commits:** #471 (`b24e101`, presentation_package) · #472
(`fc07315`, PPTX-Wiedergabe). Report: `loop-reports/loop-12-2026-08-11.md`

**Offene Punkte:** — (Export-Profil-Versionierung erledigt 12.08.:
EIN Register `export-profiles.ts` [7 Profile, Semver], Stempel in
ViewModel-JSON [`export_profile`-Feld], XLSX [Workbook-Property + README-
Zeile], Copilot MD/DOCX [Kopfzeile]; kanonisch/PPTX/AI trugen ihn schon)

---

### Loop 13 — KI- und Aria-Schicht

**Status:** teilweise umgesetzt (12.08.2026 — deterministische Grenzfläche:
AI-Paket aus dem kanonischen Export mit hartem safe_to_summarize-Gate
[Verweigerung nennt Gründe], versionierter System-Prompt [1.0.0],
Antwort-Wächter `validateAiSummary` [Zahl ohne Fakt → abgelehnt; Entwarnung
bei not_computed → abgelehnt], PII-Probe, V2-Knopf. Report:
`loop-reports/loop-13-2026-08-12.md`. **Bewusst offen:** der Live-Modell-
Aufruf selbst + UI-Anzeige einer Zusammenfassung — Kosten-/Produkt-
entscheidung des Operators; die Grenzfläche macht ihn zum dünnen Adapter.)

**Anforderungen (5):** DOC-001, EXP-001, EXP-002, EXP-004, TST-002

**Exit-Kriterien laut Roadmap:**

- KI kann keine Zahl erzeugen, die nicht als Fact vorliegt.
- jede quantitative Aussage referenziert Fakten.
- nicht berechnete Bereiche werden nicht als "keine Auffälligkeit" beschrieben.

**PRs und Merge-Commits:** Branch `qaf-v2/loop13-ki-schicht` (PR-Nummer/SHA im PR)

**Offene Punkte:** Live-Modell-Aufruf + UI-Anzeige (Operator-Entscheidung,
siehe Statusblock) · ai_ready.sections-Angleichung im Vertrag (Schema-Arbeit)

---

### Loop 14 — Wertstromintegration

**Status:** abgeschlossen (2026-08-11)

**Anforderungen (9):** AI-001, AI-002, DET-002, DOC-001, EXP-003, JSN-004, JSN-005, TST-002, UI-008

> **RTM-Abweichung (dokumentiert, nicht umgedeutet):** keine dieser 9 IDs
> zeigt in der Traceability-Matrix auf die Wertstrom-Brücke — fünf führen
> ai-ready/presentation_package als Evidenz (abgedeckt durch Loop 6/12),
> EXP-003 die Export-Module, UI-008 die V5-Referenz, DOC-001/TST-002 sind
> generisch; die inhaltlich passende VSM-001 hängt in der Matrix an Loop 15.
> Details und Belege: `loop-reports/loop-14-2026-08-11.md`.

**Exit-Kriterien laut Roadmap:**

- Übernahme ist nachvollziehbar. ✅ (qafSource/fieldStatus-Provenienz, atomare RPC, Idempotenz-Tests)
- Original-QAF bleibt unverändert. ✅ (RPC schreibt nur value_stream_maps + value_stream_imports; kein Rückschreibpfad im Modul)
- Wertstromänderung überschreibt keine QAF-Fakten. ✅ (Import-Snapshot getrennt vom Live-Stand; Brücke strukturell einseitig)
- Vergleichsstand ist jederzeit sichtbar. ✅ (Sync/Reimport im Editor; V2-Einstieg in Klassik-Parität mit diesem Loop nachgerüstet)

Substrat: die Brücke selbst (QVS P1–P7; P1–P5 = KAR-970–974, Flag-on P7 =
KAR-976) war vor dem Loop-Programm gebaut und ist seit 2026-07-18 flag-on produktiv
(`lib/qaf-value-stream/README.md`). Loop 14 = Verifikation + Schließen der
V2-Sichtbarkeits-Lücke + formaler Nachweis, kein Neubau.

**PRs und Merge-Commits:** #473 (`eb10f17`, V2-Wertstrom-Einstieg +
Exit-Kriterien-Nachweis)

**Offene Punkte:** VSM-001-Paritätsnachweis formal in Loop 15; visuelle Regression (TST-003) als Loop-11-Rest geführt

---

### Loop 15 — Migration und Abschaltung

**Status:** begonnen (12.08.2026 — Funktionsparitätsmatrix V1↔V2 als
Pflichtstand erstellt [`paritaetsmatrix-v1-v2.md`]: 14 V1-Sektionen + Kopf-
Aktionen + Exporte je mit V2-Stand belegt, Abschaltkriterien D1–D5 definiert,
MIG-001 damit erstellt und MIG-002-Ist-Stand [Koexistenz statt Flag, Revert-
Rollback] dokumentiert. **Offen:** Shadow-Mode-Mechanik, Rollback-TEST,
Golden-Akzeptanz [hängt an der Wert-Golden-Produktentscheidung], die
„fehlt"-Zeilen der Matrix [bauen oder PO-Streichung].)

**Anforderungen (3):** DOC-001, TST-002, VSM-001

**Exit-Kriterien laut Roadmap:**

- alle Pflichtfunktionen paritätisch.
- Golden Outputs akzeptiert.
- kein kritischer Funktionsverlust.
- Rollback getestet.
- V1 erst danach read-only setzen und später entfernen.

**PRs und Merge-Commits:** keine

**Offene Punkte:** noch nicht erhoben

---

## Anforderungen ohne Loop in der Roadmap

Die Matrix ordnet vier Anforderungen Loop-Nummern zu, die die Roadmap nicht
kennt (16 und 17). Zwei davon haben über eine zweite Nummer trotzdem ein
Zuhause: `PER-002` („Loop 0/7/16") steht bei Loop 0 und 7, `ARC-001`
(„Loop 17", zusätzlich Loop 0) bei Loop 0.

Für zwei bleibt nach dieser Zuordnung **kein Loop übrig**:

| ID | Bereich | Anforderung | Ist-Stand laut Matrix | Nächster Schritt laut Matrix |
|---|---|---|---|---|
| `MIG-001` | Migration | V1-Paritätsmatrix | Fehlt/teilweise | erstellen |
| `MIG-002` | Migration | Feature Flags und Rollback | Unbekannt | implementieren |

Inhaltlich gehören beide zu Loop 15 (Migration und Abschaltung). Sie werden
hier aber **nicht** stillschweigend dorthin geschoben: die Loop-Zuordnung ist
Teil der Baseline, und diese Übersicht schreibt die Baseline nicht um. Der
Widerspruch ist eine Entscheidung für den Product Owner und steht als solche
in `docs/migration/aws-readiness/README.md` unter den offenen Punkten.

Ohne diesen Abschnitt wären es zwei von 83 Anforderungen, die in einem
Dokument fehlen, dessen Zweck es ist, dass nichts still verschwindet. Gefunden
hat das ein unabhängiges Review, nicht die eigene Durchsicht.

---

## Zurückgestellt

**G60 und Multi-QAF** sind `deferred_by_product_owner` (Entscheidung
2026-08-04). Sie werden nicht erweitert, nicht refactort, nicht als neue
Fixture-Familie aufgebaut, nicht als Exit-Kriterium verwendet und nicht zum
Schwerpunkt der Roadmap gemacht. Bestehende Funktionen dürfen durch andere
Änderungen nicht beschädigt werden. Details in `deferred-scope.md`.

**Cost-Allocation** ist eine vierte reale Familie mit eigenem Test und eigener
technischer Klassifikation (`familie-cost-allocation.md`). Die Scope-Einordnung
gehört dem Product Owner und ist offen.

## Verpflichtende Folgevorhaben

### `real_pair_reference_corpus`

Festgelegt am 2026-08-05. Umfasst: reale anonymisierte QAF-**Paare**,
deterministische Referenz-Antwortschlüssel, erwartete Difference IDs, erwartete
Reconciliation, erwartete Kennzahlen, kontrollierte Mutationen, fachliche
Abnahme der Referenzantworten.

Anlass: **48 Tests in neun Suiten** hängen an einem Referenz-Antwortschlüssel
und sind mit den vier Einzelfixtures nicht erreichbar. (Die früher genannten
„54 in 10" waren zu hoch: `overview-run-golden-case` prüft innere Konsistenz
ohne Referenz.)

> **Der Weg ist nicht mehr offen, wie er hier stand.** Bis zum 05.08.2026 hieß
> es an dieser Stelle: „ausdrücklich freigegeben, autonom zu beginnen, ohne
> erneute Rückfrage." Der Machbarkeitsbefund vom 06.08.
> (`real-pair-reference-corpus-vorbefund.md`) hat den naheliegenden Weg
> **widerlegt** — vier unabhängige Blocker, darunter: der Rechenschritt für
> arithmetisch konsistente Mappen existiert nicht, und der Anonymisierer ersetzt
> positionsbasiert und ist damit für Paare untauglich.
>
> Offen ist jetzt eine **Produktentscheidung**: ob ein Wert-Golden auf
> anonymisierten Mappen überhaupt das Ziel ist. Vier Alternativen stehen im
> Befund. Wer hier weiterarbeitet, liest ihn zuerst — sonst baut er gegen einen
> bereits dokumentierten Blocker.

Offene fachliche Frage, die dabei zu lösen ist: wie ein Antwortschlüssel für
**anonymisierte** Zahlen aussieht. Ein Wert-Golden über erwartete Beträge kann
mit anonymisierten Daten nicht existieren; siehe `loop-2-abnahmestand.md` zum
HICE-Kriterium.

## Priorität nach Loop 2

Festgelegt am 2026-08-05, in dieser Reihenfolge: deterministischer
Vergleichskern · kanonisches Datenmodell · vollständiger Differenzkatalog ·
Provenienz · Reconciliation · Vergleich von bis zu sechs QAFs · UI/UX ·
JSON-Export · Performance · Migration Readiness · AI-ready-Erklärungsschicht ·
finale Regression und Release-Abnahme.

Datenablage-Optimierungen nur, wenn sie für Funktion, Datenintegrität,
Sicherheit, Testbarkeit, Portabilität oder die spätere Migration nötig sind —
siehe `../migration/aws-readiness/` und die Einordnung
`transitional_persistence_implementation` gegen `portable_product_core`.
