# Loop 3: Vollständiger Differenzkatalog

> **Nachträglich erstellt am 2026-08-12** aus Merge-Commits, PR-Beschreibungen,
> `loop-3-vorbefund.md` und HANDOFF-Protokoll. Felder, die sich aus diesen
> Quellen nicht rekonstruieren lassen, sind als solche markiert statt erfunden.

## Metadaten

- Datum: 2026-08-07 (Vorbefund 06.08., Schritte 1–5 am 07.08. gemergt)
- PRs und Merge-Commits: #452 `a6edeef` (Vorbefund) · #453 `5f6b3c7` · #454 `6c0bc07` · #455 `ac5199c` · #456 `2c4130f` · #457 `66880b9`
- Agent: Aria (autonome Session 06.–07.08.)
- Requirements: DIF-001…005, MAP-001…005, FOR-001, DOC-001, TST-002

## Scope

Differenzkatalog produktiv verdrahten. Der Vorbefund (#452,
`loop-3-vorbefund.md`) hatte den Umfang verschoben: der Katalog existierte
(`assignDifferenceIds`/`buildCatalog`/`buildTraceabilityIndex`), wurde aber von
keiner datenbankgespeisten UI-Aussage benutzt — `overview-run.ts` setzte
`differenceIds: []` fest. Loop 3 war damit vor allem Erstverdrahtung, nicht
Modul-Neubau.

## Implementierung (Reihenfolge wie gemergt)

1. **#453 — Katalog sprachfähig:** `formulaFindingKind` + `deltaNullReason` als
   orthogonale Pflichtfelder (nullable) an `all-differences.ts`;
   `validateTraceability` meldet `delta_reason_contradiction`.
2. **#454 — SUM-Produzent:** `differences-from-summary.ts` erzeugt
   Katalog-Sätze aus den Summary-Diffs; `buildOverviewRun` verdrahtet
   (`differenceIds` erstmals nicht-leer im DB-Pfad).
3. **#455 — fünfter Sortierschlüssel:** Fundstelle statt Anzeigetext —
   ID-Stabilität unabhängig von Übersetzungen.
4. **#456 — MFG:** `differences-from-manufacturing.ts` + Tabellen-Sichtbarkeit.
5. **#457 — scope_removed:** ersatzloser Wegfall als eigene Wirkungsart
   (Regel „a": removed + Award-Kosten≈0, Kais-Entscheid 07.08. 09:31).

`differences-from-material.ts` folgte im MAT-Block (#458-Strang, siehe
HANDOFF „MAT komplett"); Material ist heute im Katalog enthalten.

## Tests und Gates

Jeder PR: lokale Gates (typecheck, build, portability strict) + volle Suite +
separater Ist-Check vor Squash-Merge; Deploy je Merge verifiziert
(HANDOFF-Protokoll 07.08., „jeder PR: Bau → lokale Gates → volle Suite →
separater Ist-Check → Squash-Merge → Deploy verifiziert"). #457 zusätzlich mit
bestandener Mutations-Probe dokumentiert.

## Exit-Kriterien

| Kriterium | Status | Evidenz |
|---|---|---|
| jede UI-Aussage referenziert Difference IDs | erfüllt für die verdrahteten Bereiche (SUM, MFG, MAT, SBM) | `overview-run.ts` bezieht `differenceIds` aus dem Katalog (`differenceIdsByMetricKey`), nicht mehr `[]` |
| jede Difference ID besitzt ≥1 Source Reference | erfüllt | `validateTraceability` + Traceability-Tests in `all-differences.test.ts` |
| Material, Fertigung und SBM vollständig enthalten | erfüllt | Produzenten `differences-from-material.ts`, `differences-from-manufacturing.ts`, SBM-Bestand |
| deterministische ID-Stabilität mutativ getestet | erfüllt | Mutations-Proben je Schritt (PR-Beschreibungen #453–#457) |

## Bekannte Grenzen

- Fachliche Prüfung der bestehenden Tooling-/Findings-Übersetzungen ist
  Roadmap-Aufgabe geblieben (als eigene Review-Dimension geführt, HANDOFF).
- Barrel-Bypass-Befund (20 Deep-Imports vs. ADR-019 R4) ist im
  `governance/scorecard/bypass-log.md` erfasst, Sunset benannt — nicht Teil
  dieses Loops.

## Verifier-Entscheidung

Reviews liefen je PR vor dem Merge (Review-Findings vor Merge eingearbeitet,
HANDOFF-Protokoll). Ein separates Verifier-Dokument existiert nicht — Feld
nicht rekonstruierbar.

## Nächster Loop

Loop 4 (D15/D16/D17 + R-03), abgeschlossen 10.08. — siehe
`loop-4-2026-08-10.md`.
