Brandschutz LogoBrandschutz
my-mind GmbH · Brandschutz-Plattform
Übersicht · Plattform · Backlog · Doku
Single Source of Truth · CLAUDE.md
§ 0 · Backlog — Wahrheit, nicht Marketing

Backlog

Alles was wir vor uns haben — fein-granular, status-getaggt, transparent. Direkt aus der CLAUDE.md gerendert. Was hier steht, ist was wirklich offen ist; was hier fehlt, existiert nicht.

96
Items insgesamt
53
offen
39
erledigt
0
teilweise
4
verworfen
Disziplin-Anker

Diese Seite ist die Single Source of Truth. CLAUDE.md ist die kanonische Quelle — diese Page liest direkt daraus, ohne Override-Schicht. Wenn ein Status falsch erscheint, liegt der Fix in CLAUDE.md Zeile „Backlog — offene Aktivitäten mit Trigger", nicht im Frontend-Code. Damit existiert kein Drift-Risiko zwischen „was wir behaupten" und „was wirklich offen ist".

Regel hardcoded in Memory feedback_backlog_single_source_of_truth. Snapshot wird zur Build-Zeit erzeugt via web/scripts/build-data-snapshot.mjs.

Offen 53

Items mit Trigger oder in Pipeline. Sortiert nach B-Nummer.

B1offen

MCP `bestpractices` Namespace prüfen.

In `.mcp.json` ist `bestpractices` als Namespace-Arg gesetzt, in der ToolSearch nach Reload tauchen aber nur `bicepschema`, `deploy`, `monitor`, `wellarchitectedframework`, `group_list`, `group_resource_list`, `subscription_list` auf. Mögliche Ursachen: (a) Namespace heißt anders im aktuellen `@azure/mcp` Beta-Build; (b) `bestpractices` ist als „MCP-Server-Instructions" eingebaut (siehe MCP-Instructions-Block beim Tool-Reload — der server lädt seine bestpractices ohnehin als Instructions); (c) gibt's tatsächlich nicht. Aktion: einmal `npx -y @azure/mcp@latest server start --help` schauen oder `gh` direkt am Repo `microsoft/mcp` für die aktuellen Namespace-Namen → `.mcp.json` korrigieren falls nötig.

Trigger
nach M11 (Bicep grün)
Aufwand
5–10 min
B2offen

✅ Node.js + uv ins devcontainer (`1f8a873b`)

Node 20 + uv bootstrap fuer TS-Bot-Workstream. Original-Scope: Node.js + uv ins devcontainer aufnehmen.** Aktuell hat `.devcontainer/devcontainer.json` nur Python, gh, az als Features. Vor TS-Bot-Arbeit: `"ghcr.io/devcontainers/features/node:1": { "version": "20" }` ergänzen — sonst läuft `npx @microsoft/teams.cli` und `@azure/mcp` im Container nicht. Optional: `uv` direkt installieren statt nur `uv sync` als post-create (z.B. via `pipx` im post-create script), damit der Build-Step deterministisch ist.

Trigger
vor M10 (TS-Bot-Workstream startet)
Aufwand
15 min
B3offen

Reopen-in-Container

sobald B2 erledigt. Linux-Container fixt das cognee/litellm-Long-Path-Issue auf Windows. Beim Switch: alle laufenden Terminals + lokales `.venv/` werden überflüssig (der Container baut sein eigenes via `uv sync`).

Trigger
direkt nach B2
Aufwand
<5 min
B4offen

✅ TS-Teams-Bot Phase 1+2 (`6cbc98f2`, `bf2e4b90`)

TS Teams Bot scaffold + Adaptive-Card baseline + FastAPI orchestrator endpoint + TS bot HTTP client. Original-Scope: TS-Teams-Bot bauen als eigener Workstream.** Siehe `.claude/skills/teams-sdk/SKILL.md` Projektkontext. Bot kommt in eigenes Container-App-Resource im rg-fire neben dem Python-Orchestrator, ruft `process_pdf` über HTTP. Bicep für den TS-Container ist **nicht** Teil von M1–M11 — separat als M12+.

Trigger
nach Infra grün (M1–M11 deployt + acrfire existiert) + B2 + B3
Aufwand
mehrere Tage
B5offen

`microsoft-teams` Python-Dep aus pyproject.toml entfernen.

Aktuell drin weil das Skeleton es hatte. `app.py` ist jetzt Stub und nutzt es nicht mehr. Entfernen sobald TS-Bot-Pfad final entschieden + dokumentiert ist (kein Risiko, dass jemand Python-Bot-Code schreibt). Inkl. `uv lock` re-run.

Trigger
nach M11 + B4 begonnen
Aufwand
2 min
B6offen

`/schedule` Agent für CI-Watch.

Sobald alles grün und gepusht: einen Background-Agent einrichten, der z.B. Montags 09:00 `gh run list --limit 5` checkt und bei rotem Run einen Issue/PR-Comment hinterlässt. Verhindert Wiederholung der „14-Failures-im-blinden-Fleck"-Situation vom 2026-04-29.

Trigger
nach erstem grünem Push auf main
Aufwand
5 min
B7offen

Cognee-Smoke-Test

im Linux-Container (= Container Apps Runtime). Mit `cognee.add()` + `cognee.cognify()` einmal echtes End-to-End gegen ein Sample-Doc fahren, um vor Produktion zu validieren dass die Lazy-Import + Cognify-Pipeline tatsächlich läuft.

Trigger
nach B3 (in Container) + Cognee-API-Keys in Key Vault
Aufwand
10 min
B8offen

Bicep-spezifischer MCP-Skill

falls Microsoft einen veröffentlicht. Aktuell nutzen wir den Azure-MCP `bicepschema` Namespace; ein dedizierter Bicep-MCP wäre denkbar mit Tools wie `bicep_lint`, `bicep_decompile`, `avm_module_search`. Alle paar Wochen `npm search` oder `microsoft/mcp` Repo prüfen.

Trigger
bei Bedarf / opportunistisch
Aufwand
n/a
B9offen

`bot-service.bicep` Refactor (M10) → AVM falls Microsoft einen veröffentlicht.

Aktuell gibt es keinen `avm/res/bot-service/*` (nur `health-bot`). Wenn Microsoft einen herausbringt, lohnt sich der Switch zurück zu AVM für Konsistenz mit den anderen Modulen.

Trigger
wenn `mcr.microsoft.com/v2/bicep/avm/res/bot-service/*/tags/list` HTTP 200 liefert
Aufwand
30 min
B10offen

Composite-Action „deploy-observability" + Two-Source-Truth.

Eigenes Repo `my-mind-apps/gh-deploy-observability/action.yml`. Misst Deploy-Dauer, pinnt Commit-Status mit `description="Xs, sha=Y, deployed-by=workflow#N"`, **kombiniert GitHub-Action-Status MIT Azure-Deployment-History** (siehe Lessons #4 — GitHub allein reicht nicht; pro-Sub-Module-Status muss aus Azure). Optional: Slack/Teams-Notification. Drei Schichten: (a) Composite Action für Workflow-Seite, (b) Claude Skill `.claude/skills/deploy-monitor/SKILL.md` mit Standard-Queries (gh + az) und Failure-Patterns, (c) optional `scripts/deploy-status.sh` für Menschen. Wiederverwendbar in zukünftigen Projekten.

Trigger
nach Infra grün und stabilem Push-Flow
Aufwand
2–3h
B11offen

Pre-Push-Hook für Bicep-MCP-Lint.

Lokales `git pre-push`-Hook das den Bicep-MCP-Server (siehe `scripts/bicep-mcp.cmd` + `.mcp.json`) gegen alle geänderten `.bicep`-Files laufen lässt. Würde SKU/MaxSize/AZ-Combinatorics-Errors erkennen bevor sie ein Deploy-Run kosten (siehe Lessons-Learned-Sektion oben). Alternative: GitHub Action `lint-infra.yml` die das auf PRs auch macht.

Trigger
nach Bicep-MCP via Session-Reload aktiv + zwei oder drei „avoidable" Deploy-Failures bestätigen den Wert
Aufwand
30 min lokal, 1h für GH Action
B12offen

✅ Teams-App-Paket „Brandschutz Bot" (App 1)

bot/appPackage/manifest.json + Container-App + AAD FIC. Original-Scope: Teams-App-Paket „Brandschutz Bot" (App 1) erstellen.** `appPackage/bot/manifest.json` + Icons. Capabilities: `bots[*]` + `composeExtensions[*]` (für Messaging Extension, siehe B13). Verweist auf bestehende AAD-App-Registration `bot-fire` (`botAppId`-Param). Distribution: Tenant-weit (alle Mitarbeiter). Sideload-zip via `appPackage/bot/build.ps1`. Skill-Vorlage: `.claude/skills/teams-sdk/references/manifest-and-copilot.md`.

Trigger
nach Bot-Service grün + bot-Container deployed
Aufwand
2-3h
B13offen

✅ Messaging Extension + M365 Copilot + Outlook channel (`9e89cc2c`)

Original-Scope: Messaging Extension (Teil von App 1) — Code-Side.** TS-Backend-Handler im Bot-Container. Drei Command-Typen relevant für Brandschutz: `query` (z.B. `@brandschutz <bma-id>` → Cosmos-Lookup → Adaptive-Card mit Geräte-Daten), `action` (Modal „PDF hochladen + extrahieren"), `link unfurling` (BSN-Dokument-Link → Preview-Card). Definition in App-1-Manifest unter `composeExtensions[*]`. Backend: neue handlers im TS-Bot (`@microsoft/teams.apps`). Skill-Referenz: `.claude/skills/teams-sdk/SKILL.md` Activity-Handlers + Sending-Messages.

Trigger
nach B4 (TS-Bot Workstream) + B12 (App-1-Paket)
Aufwand
1-2 Tage
B14offen

`deploy-teams-app.yml` Workflow für BEIDE Apps.

Eigenständiger Workflow für Teams-App-Pakete (App 1 + App 2). Args: `app: 'bot'

Trigger
'personal'`. Build manifest zip → Validierung gegen Teams-Schema → Upload zum Microsoft 365 Developer Portal. Lifecycle GETRENNT von Bot-Code-Deploy und Infra-Deploy — Manifest-Änderung erfordert oft Admin-Approval. Trigger: `workflow_dispatch` mit App-Auswahl.
Aufwand
nach B12 + B16
B15offen

ADR-0013: Zwei Teams Apps

Architektur-Entscheidung dass App 1 (Bot+ME, Tenant-weit) und App 2 (Personal Tab + Admin, restricted) als getrennte Manifeste / AAD-Registrationen / Distribution-Scopes existieren. Hintergrund: in einer App wären alle Tabs allen Bot-Usern sichtbar — wir wollen Admin-UI nur einer Power-User-Group geben. Klebstoff zwischen den Apps: gemeinsamer Daten-Layer (Cosmos/SQL/Cognee), aber komplett getrennte Backend-Container und AAD-App-Registrations.

Trigger
direkt nach Phasen-Start
Aufwand
30 min
B16offen

✅ Teams-App-Paket „Brandschutz Workspace" App 2 live (`e8319ad9`, `54321841`)

appPackage/personal/manifest.json + Icons + AAD-App-Registration. Original-Scope: Teams-App-Paket „Brandschutz Workspace" (App 2 — Personal App) erstellen.** `appPackage/personal/manifest.json` + Icons. Capabilities: `staticTabs[*]` (Personal App + Admin-Center). Eigene AAD-App-Registration nötig (`personalAppId`, NEU anzulegen — heute manuell wie `bot-fire`). Distribution: restricted via Teams-App-Setup-Policy auf Power-User-Group. `webApplicationInfo` für SSO mit dem neuen App-Registration-ID.

Trigger
nach B17 (Web-UI Container existiert)
Aufwand
2-3h
B17offen

✅ Web-UI Container Personal App live (`e8319ad9`, `54321841`)

Next.js 15 Workspace UI + Bicep + Workflow + Manifest. Original-Scope: Web-UI Container für Personal App (`app-personal-fire`).** Neuer Container im selben `cae-fire` Environment. Stack-Vorschlag: React/Next.js + Teams-SDK für SSO. Endpoints: Dashboard (Document-List, Knowledge-Graph-View), Admin-Center (Tenant-Settings, User-Management, Audit-Logs). Bicep: neuer `infra/modules/container-app-personal.bicep`, neuer Param `personalContainerImageUri` in `main.bicep`. Manifest-Tab-`contentUrl` zeigt auf den FQDN dieser Container App.

Trigger
nach Bicep-Erweiterung um 2. Container App + 2. AAD-Registration
Aufwand
mehrere Tage (Web-UI ist eigener Workstream)
B19offen

✅ Wissensgraph public in Personal App (`f4f38430`)

`web/app/graph/page.tsx` + ForceGraphView aus Bootstrap-Pipeline-Snapshot (ohne Cognee-Runtime). Original-Scope: Cognee Knowledge Graph public-deployen + URL fixieren.** Aktuell zeigt der „Im Knowledge Graph öffnen"-Button der Adaptive-Card auf einen Placeholder-Host. Real-Deploy: entweder eigene Container-App `app-graph-fire` mit Cognee's web-viewer ODER Integration in App 2 (Personal Tab, B17). Sobald Host-FQDN steht, in `bot/src/cards/extraction_result.ts` (TS-Bot) und `src/brandschutz/adaptive_cards/extraction_result.py` (Python-Stub) den Placeholder ersetzen.

Trigger
nach B7 (Cognee-Smoke) + Entscheidung B17 vs. eigener Graph-Container
Aufwand
3-5h
B20offen

TheDataMonster `ac-templating-service` integrieren

(statt inline TS-Card-Builder). [Repo](https://github.com/ARmandNext/TheDataMonster), Folder `ac-templating-service/`. Eigenständiger Azure Function Service mit `${var}`-Templating (haben Microsoft's `adaptivecards-templating@2.3.1` aufgegeben weil unzuverlässig). Bot ruft via HTTP POST `{template_id, data}` an, kriegt Card-JSON zurück, sendet an Teams. Vorteil: Card-Templates zentral pflegbar im DragonFace-Portal-Designer (Live-Preview vorhanden), kein Code-Deploy für Card-Änderungen. Heutiger Bot-Builder hat dieselbe Function-Signature damit der Swap 1-zeilig ist.

Trigger
nach B4 Phase 2 (HTTP-Path Bot↔Orchestrator) + ac-templating-service production-ready
Aufwand
4-6h
B21offen

✅ deploy-Race gefixed (`72da6010`, `0b2641cd`)

Concurrency-Group + deploy-infra liest live container images vor Bicep. Original-Scope: STRATEGIC — deploy-app vs deploy-infra Race lösen.** Beide Workflows können zeitgleich auf dieselbe Container-App-Resource zugreifen → `ContainerAppOperationInProgress`-409. Plus: deploy-infra resettet den Image-Tag, den deploy-app gerade gesetzt hat. Hat heute (2026-05-02) zum dritten Mal blockiert. **Stufenplan:** Phase 1 (30 min) — `concurrency: deploy-${{ env.RG }}` auf beiden Workflows, queue statt parallel. Phase 2 (1h) — deploy-infra liest VOR Bicep-Deploy via `az containerapp show` das aktuelle Image für jede der drei Container Apps und übergibt als Bicep-Param, sodass kein Reset mehr passiert. Phase 3 (optional) — Lifecycle-Ignore für Image in nativem Bicep, falls AVM weiter Schmerzen macht. **Volle Analyse + 5 Optionen:** Memory `project_deploy_orchestration_problem.md`. **Heute-Workaround:** Multi-File-Commits in zwei getrennten Pushes (erst Code, deploy-app abwarten, dann Infra).

Trigger
nach erstem grünen End-to-End-Push
Aufwand
1.5h für P1+P2
B23offen

Sampling-Sektion „Output-Disziplin" im Slider-Panel.

Versprochen in der LM-Studio-Adoption-Mapping-Tabelle, nicht implementiert: Annahmen-Penalty (Aktiv-Schalter + Slider 1.0-2.0), Citation-Required (Toggle), Sektionen-Vollständigkeit-erzwingen (Toggle), Min-Konfidenz-pro-Topic-Slider, Stop-Phrasen-Input. Diese Knobs steuern *Output-Disziplin* statt *Argument-Posture*.

Trigger
nach B22
Aufwand
2h
B25offen

Live-Konfidenz-Indikator

beim Dirty-State. LM-Studio zeigt „Token count: N/A" oben — bei uns Pendant: Live-Schätzung welches Konfidenz-Profil + Coverage-Erwartung diese Slider-Kombi ungefähr produzieren wird, basierend auf historischen Run-Stats. Heuristik genügt (Korrelations-Map argumentations_schaerfe → erwartete Citations etc.).

Trigger
nach 5+ historischen Runs vorhanden
Aufwand
2h
B28offen

Re-Submit-Pattern bei Dialog-❌-ungeklärt.

Final-Verdict KONDITIONAL hatte E-07 als ❌ ungeklärt (Hörsaal-2.RW). Workflow-Lücke: wenn der Bauherr Daten nachliefert, gibt es keine UI/Skript-Pfad für „Re-Submit mit Nachweisen → Dialog läuft erneut nur für die ❌-Punkte".

Trigger
nach erstem Re-Submit-Bedarf
Aufwand
2h
B30offen

Phase-2B: Web-trigger Re-Run-Button.

Im Slider-Panel-UI ist „Re-Run-Button triggert serverseitig" als Versprechen drin (Phase-2B-Hint), aber keine Server-Action im Repo. Implementation: `web/app/api/runs/start/route.ts` Server-Action → spawnt `python scripts/run_pair_eval.py --variant <id>` → Redirect auf neue `/runs/<id>` URL → Progress-Stream via SSE.

Trigger
nach Phase 1+2 stabil
Aufwand
2-3h
B31offen

✅ /runs/compare Vergleichs-Ansicht live (`ae82cb85`)

Original-Scope: Phase-3: Vergleichs-Ansicht zweier Runs.** `/runs/compare?a=<id>&b=<id>` mit Side-by-Side Section-Inhalten, synchronisiertem Scroll, Coverage-Diff, Konfidenz-Delta-Heatmap.

Trigger
nach B30 + min. 3 Variants verglichen
Aufwand
3h
B34offen

pair_002 Page-Index-Audit.

Discovery 2026-05-06 morgens: pair_002_geburtig_scharoun-theater.yaml hat `pdf_seiten_aufgabe: [8, 9]` und `pdf_seiten_kontext: [10, 12]`. Konvention im Repo (siehe pair_001 + run_pair_001_eval.py-Verwendung) ist **0-indexed Python-Listen-Indizes** als YAML-Werte. Damit liest `[8, 9]` System-Pages i=8, i=9 = human-Pages 9-10 — aber System-Page 9 (human-Page 10) ist die Erleichterungs-Tabelle, also Teil der **Lösung**, nicht Aufgabe. Korrekt wäre vermutlich `pdf_seiten_aufgabe: [7, 8]` für human-Pages 8-9 (Artikel-Header + erste Beschreibungs-Seite). Vor erstem pair_002-Run zu auditieren. Nicht autonom gefixt weil User-Call.

Trigger
vor erstem pair_002 Eval-Run
Aufwand
15 min Audit + Fix
B36offen

OpenAI Enterprise Account + Cost-Tracking im Workspace

Realtime ist teuerste API, Cost-Transparenz pro Agent/Customer/Run Pflicht. (1) Enterprise-Account (höhere Rate Limits, SLA, DPA, EU-Endpoints). (2) Usage-API-Integration im Admin-Dashboard mit Aufrissebenen Gesamt/Agent/Customer/Run + Forecast. (3) Cost-Guards (Per-Konversation-Limit, Per-Tag-Limit, Anomaly-Alert). Memory `project_openai_enterprise_cost_tracking.md`.

Trigger
vor erstem zahlenden Kunden, spätestens vor Live-Demo gegen Prospect
Aufwand
1-2 Tage gesamt
B38offen

Webhook-Bridge Brandschutz ↔ Ducky

Bi-direktionaler Status-Sync zwischen Ducky (Phase 0-1 Akquise) und Brandschutz-Plattform (Phase 2-10 Delivery). Ducky→Brandschutz: `opportunity.stage_changed` mit Account-Daten + Beziehungs-Historie + Trigger-Pfad + Score → Brandschutz öffnet Projekt. Brandschutz→Ducky: `project.lifecycle_changed` mit Konzept-Status, Sign-off, Value-Realized → Ducky aktualisiert Account. Memory `project_ducky_brandschutz_independence_principle.md`.

Trigger
nach Ducky-Webhook-API stabilisiert + B40 (Schema) steht
Aufwand
~1 Woche
B39offen

Brandschutz-eigener GTM-Setup-Layer (Sechs-Block-Schema)

Vollständige GTM-Setup-Konfiguration analog Ducky-Pattern, aber in Brandschutz-Codebasis (Ducky kann nicht gesplittet werden, eigenständiges Produkt). Sechs Blocks: Company Profile + Offers + ICP Profiles + Buyer Personas + Committee Roles (Brandschutz-spezifisch: Bauherr/Architekt/Generalplaner/Statiker/TGA/PrüfSV/Bauamt/Denkmalbehörde/Versicherer) + Triggers + Score Models. Trigger-DSL user-konfigurierbar. Memory `project_ducky_brandschutz_independence_principle.md` + `project_e2e_process_and_phase_zero.md`.

Trigger
nach Expert-Validierung E2E + Companion-Status geklärt (M-1 könnte Phase 0 abdecken)
Aufwand
~6-8 Wochen
B40offen

Webhook-Schema-Standardisierung

Gemeinsames Event-Schema zwischen Brandschutz-Plattform und Ducky (+ später Paul, Agentic OS). Eigener Repo / Docs-Pfad mit JSON-Schema-Definitionen für `opportunity.stage_changed`, `project.lifecycle_changed`, `account.captured`, etc. Versioniert, beide Produkte pinnen Schema-Version. Memory `project_ducky_brandschutz_independence_principle.md` Sektion „Integration-Surface".

Trigger
parallel zu B38
Aufwand
~3 Tage
B42offen

Mobile-Foto-Capture-Capability für Bot

Senior macht Foto vor Ort mit Smartphone → schickt an Brandschutz-Bot in Teams → Vision-Klassifikation (Gemini multimodal) + Geo-Match aus EXIF + Projekt-Matcher (Beziehungs-Heuristik) → Adaptive Card mit „Zu Projekt X hinzufügen / Neues Projekt anlegen". Zwischen-Stufe zwischen Plan-PDF und AR-Brille (Manifest These 07 / Boundary-Erweiterung). Bauteile: Image-Attachment-Handler + Vision-Call + Geo-EXIF-Reader + Project-Matcher + Adaptive-Card-Buttons. Drei 30-Min-Smoke-Tests offen (Teams-Mobile-Foto-Pfad, EXIF-Pass-Through, Push-Reliability). Memory `project_mobile_foto_capture_capability.md`.

Trigger
nach Bot-Reviv + Phase 2 (LLM-Layer)
Aufwand
2-3 Tage (Phase 1: Foto→Klassifikation→Projekt-Matcher)
B44offen

Vektor-PDF-Vor-Extraktion mit pymupdf/pdfplumber

Heute liest Gemini multimodal die Plan-PDFs als Bilder. Verliert dabei: Vektor-Text mit Koordinaten, Linien-Geometrie, Layer-Namen, präzise Maße. Wenn PDF aus CAD exportiert (häufig bei Architekten-Plänen), ist die Vektor-Schicht erhalten. `pymupdf` + `pdfplumber` extrahieren: (a) Text mit (x,y)-Position pro Page, (b) Vektor-Pfade als Linien-Listen, (c) Layer-Names wenn erhalten. Output fließt ZUSÄTZLICH zur Gemini-Bilder-Beschreibung in den Konzept-Generator. Massive Verbesserung der Phase-2-Plan-Extraktions-Genauigkeit ohne neue Modelle.

Trigger
nach Korea-Benchmark-Analyse (eventuell ähnliche Tools dort schon evaluiert)
Aufwand
1-2 Tage
B45offen

Construction-Drawing-Skill-Recherche

Anthropic + Microsoft + akademische Welt haben spezialisierte Modelle/Skills für Construction-Drawings. Recherche-Sprint: (1) Anthropic Skill-Library nach Construction/Architecture/CAD-Skills durchsuchen, (2) Azure AI Foundry CAD-spezifische Modelle evaluieren, (3) akademische Modelle (CADBert o.ä.) sichten. Eval-Kriterium: messbare Verbesserung der pair_001/pair_002-Plan-Extraktion gegenüber Gemini-Default. Ergebnis: Empfehlung welcher Stack für Phase 2 zukunftsfest ist, plus B-Item-Vorschlag für Integration.

Trigger
nach B44 (eigene Vektor-Vor-Extraktion als Baseline)
Aufwand
1 Tag Recherche + 1 Tag Eval
B53offen

KB Sprint 2.4 Teil 2

DIN-Lizenz beschaffen (~€450 für alle 3 Teile, oder €~150 pro Teil einzeln). Beschaffung über Beuth-Verlag (User-Aktion, keine API). User-Freigabe €500 deckt Kosten ab. Sobald lizenziert: parser identisch zu B50-Pipeline.

Trigger
User-Beschaffung steht aus
Aufwand
1 Tag wenn lizenziert
B54offen

Hessisches Straßengesetz (HStrG)

letzter Failure aus B51+B52-Retry. starweb.hessen.de blockt selbst Bright Data, kein freier Volltext-Mirror gefunden. Lösungspfad geht über B55-Beck-Online-Modul (löst HStrG + viele Edge-Cases gleichzeitig).

Trigger
nach B55 (Beck-Online lizenziert)
Aufwand
30 Min wenn Quelle vorhanden
B55offen

KB Sprint 3

nach Stefan-Call integrieren. Block kombiniert Pflicht-Normen + Hoch-Wert-Richtlinien + Subscription-Hebel. **User-Aktion:** Bestellungen bei Beuth-Verlag, VdS, vfdb, Beck-Online sind außerhalb meiner API-Reichweite — brauchen Konto-Accounts + Kreditkarte/Rechnung. Sobald lizenziert: PDFs in `private/ebooks/` → bestehende E-Book-Pipeline (Memory `project_ebook_ingest_pipeline.md`) zieht das in Cognee. **Bündel-Empfehlung:** · · **Block A — Pflicht-Normen einmalig ~€3.000:** · • VOB Teil A/B/C (Beuth, ~€450) — ersetzt B53 · • DIN 4102 Sammlung (Beuth-Bundle, ~€1.500-2.000) — Brandverhalten Baustoffe · • DIN 18009-1/2 (~€200) — Brandschutzingenieurwesen · • DIN EN 13501-1/2 (~€280) — EU-Klassifikation · • DIN 14675 (~€180) — BMA-Planung · • DIN 18230 (~€140) — Industriebau rechnerisch · · **Block B — Hoch-Wert-Richtlinien ~€800:** · • VdS 2095 + 2046 + 2010 (~€260) — Versicherer-Standards BMA/Sprinkler/Risiko · • vfdb-Mitgliedschaft €150/Jahr — inkl. TB 01/02/03 (TB 04-01 schon ingestiert) · • VDI 6019 Bl 1+2 (~€200) — Rauchgas-Strömung · • DIN VDE 0833-1/-2/-4 (~€300) — Sicherheits-/Alarm-Anlagen · · **Block C — Subscription-Hebel ~€60-150/Monat (Empfehlung #1):** · • Beck-Online Modul „Öffentliches Baurecht" — löst B54 (HStrG) sofort + Kommentare zu allen 17 LBOs/Bundesgesetzen + alle Hessen-Quellen. 4-Wochen-Test gratis verfügbar. · · **Block D — Optional Fachbücher ~€700:** · • Brandschutzatlas (Mayr/Battran, ~€350 E-Book mit Updates) · • Brandschutzkonzepte (Mehl/Czepuck, ~€140) · • Bechert Sonderbauten (~€180) · · **Empfehlung NICHT zu kaufen:** Juris Premium (€300/M, 80% Overlap zu Beck-Online), WEKA Brandschutz (inhaltlich nichts Neues), Einzel-Kommentare pro Bundesland (zu fragmentiert). · · **ROI-Begründung:** Im Sinne `feedback_argumentations_tiefe_statt_pragmatik.md` — mehr Normen-Wissen = bessere Argumentation. Stefan-Käufer-Niveau erwartet Volltext-Zugriff auf DIN-Pflicht-Normen + Beck-Online-Kommentare.

Trigger
nach Stefan-Call
Aufwand
User-Bestellung 1-2h + Ingest ~4h
B56offen

Per-§-Chunking + Cognee-Embedding der KB-Sprint-2-PDFs

Cognee-A/B-Test 2026-05-17 hat Wert bewiesen (11+ §-Granular-Cross-Refs gefunden die Hardcoded-Map nicht hat). Heute sind Bundesgesetze/LBOs/VV TB/Fachrecht als **Wurzel-Nodes mit 280-Char-Preview** im Graph. Echtes Zitieren auf Paragraph-Ebene braucht: (a) pro PDF Regex-basierten §-Splitter (heterogen pro Quelle — BauGB strukturiert anders als LBO Sachsen), (b) §-Chunk-Objekte mit `gesetz_id + paragraph + absatz + satz + volltext + page_ref`, (c) Vector-Embedding via Cognee in persistent Backend (Vorbedingung: B7/B19 muss erledigt sein). Geschätzt ~4000-5000 §-Chunks insgesamt. Sub-Splits: **B56a Lokales Chunking** (kein Cognee nötig, Output als JSONL pro Quelle nach `.swarm/runs/chunks_<sprint>/`) und **B56b Cognee-Embedding** (lokal mit SQLite-on-Files-persistent oder Lab nach B63). Cognee-Cost-Schätzung nach Sprint-A-Run: ~$3-8 für Voll-Korpus (166 Quellen + Patterns), nicht $50.

Trigger
B56a: jetzt verfügbar; B56b: jetzt verfügbar (Cognee validiert)
Aufwand
B56a: 1-2 Tage, B56b: ½ Tag + ~$8 Embedding-Cost
B57offen

✅ RAG-Layer live (`0dd8a409` Cohere ReRank v3.5, `804ff16b` Embedding-Backfill 99.98%)

Original-Scope: RAG-Layer im Konzept-Generator — Vor jedem LLM-Call: Cognee-Query nach Top-N (z.B. 8-12) relevanten §-Chunks zur User-Aufgabe, dann als zusätzlicher Context-Block in den System-Prompt. Schema v0.3.0 `EvidenceItem` hat schon das Citation-Anchor-Feld — wir füllen es. Effekt: Konzept-Output zitiert nicht mehr „nach MBO" sondern „nach MBO § 14 Abs. 3 Satz 2: <Volltext-Auszug>". Voraussetzung: B56b muss durch sein.

Trigger
nach B56b
Aufwand
1-2 Tage
B58offen

Konflikt-Detektor MBO ↔ LBO ↔ VV TB

Pre-Pass vor Konzept-Generierung: für jedes relevante MBO-§ semantische Ähnlichkeitssuche im jeweiligen LBO-Land + dann Divergenz-Score (z.B. via Cosine + LLM-Verifikation „ist das eine Konkretisierung, Verschärfung oder Widerspruch?"). Output: Konflikt-Liste die als zusätzlicher Context vor Konzept-Generierung mitläuft. Damit erkennt der Generator dass z.B. „MBO § 14 erlaubt X, LBO Sachsen § 16 erlaubt X nur mit Sprinkler ab Geschoss 3". Voraussetzung: B56b.

Trigger
nach B56b
Aufwand
2-3 Tage
B59offen

Multi-Agent-Argumentation mit aktivem Judge

Heute: 1 Generator + PrüfSV-Schatten (5-Round-Dialog). Echtes Abwägen braucht 3 Rollen: **Generator** (Konzept-Vorschlag) + **Gegen-Argumentant** (sucht aktiv Widersprüche aus B58-Konflikt-Liste + alternative Auslegungen) + **Judge** (wägt mit `JudgeScore`-Formel aus Schema v0.3.0: 30% Schutzziel-Tiefe / 20% Quellen-Decken / 15% Begründungs-Solidität / 15% Konflikt-Behandlung / 10% Citation-Genauigkeit / 10% Konfidenz-Realismus). Pentarchy-Pattern aus Memory `project_virtuelle_fachplaner_firma.md`. Audit-Trail-Viewer (`/runs/[id]`) erweitert um Judge-Section mit beiden Argumentations-Linien + Judge-Verdict.

Trigger
nach B57+B58
Aufwand
3-5 Tage
B60offen

Sprint 2.6 Cleanup

Aus `feuvo_ingest_20260517T*`: failed BY/HH/HE/NI (no PDF hits / Bot-Defense), plus quality-fragwürdig BW/SL/SH/TH (SerpAPI lieferte Sammel-Dokumente statt spezifische FeuVO — z.B. BW = 400-Seiten-Jahresausgabe statt 8-Seiten-FeuVO). Beck-Online-Modul (B55 Block C) würde das alles in einem Schritt lösen.

Trigger
nach B55 (Beck-Online verfügbar)
Aufwand
1-2 h
B61offen

⛔ VERWORFEN

Ursprünglich geplante Wiederbeschaffung via Beck-Online/DIBt supersedet durch KB-Sprint 2+3 (B47/B48/B99l gruen). Original-Scope: 18 Leichen wiederbeschaffen — am 2026-05-17 entfernt weil falsche Quelle: 6 FeuVO (BW/NI IWO-Infoblätter, SL/SH VV TB, ST Genehmigungsbeschluss, TH Erläuterungsdokument), 4 VV TB-Auszüge (BB/NW/ST + bund-mvv-tb Bauregelliste), 8 Fachrecht-Auszüge (siehe `scripts/kb_ingest/remove_leichen.py` für detaillierte Begründungen). Wiederbeschaffung: Beck-Online (B55-C) löst die meisten, DIBt-Direktabonnement (B55-B) löst das MVV-TB-Master-Problem.

Trigger
nach B55 (Beck-Online + DIBt lizenziert)
Aufwand
je 5-15 min pro Item nach Lizenz
B62offen

Monthly-Lizenzierte-Sourcen-Roadmap als Verbesserungs-Plan

Systematisch dokumentieren welche aktuell fehlenden oder durch Leichen kompromittierten Quellen-Klassen durch welche monatliche Subscription geheilt werden: Beck-Online (Baurecht-Modul, ~€60-150/M) löst ~12 Leichen + alle 64 Fachrecht-Lücken + Hessen-Block, DIBt-Direktabo löst MVV-TB-Master + alle 16 echten VV TB, Beuth-Norm-Ticker (~€50/M) für DIN-Updates, vfdb-Mitgliedschaft (€150/Jahr) für TB-01/02/03. Output: kurzes Memo mit ROI pro Sub.

Trigger
bald, vor Stefan-Demo
Aufwand
2-3 h
B63offen

Lab-Cognee-Config-Update: text-embedding-004 → gemini-embedding-001

Lab-Container `app-fire-lab` hat noch das deprecated Embedding-Modell. Lokaler Sprint A 2026-05-17 hat das gefixt + verifiziert. Bicep-Update für Lab-KV + Lab-Container-Restart nötig.

Trigger
jetzt, vor erstem Lab-Cognee-Run
Aufwand
15 min Bicep + 5 min Deploy
B64offen

Frontend-CI für `web/` (Next.js Build + TypeScript-Check)

Heutiger `ci.yml` ist Python-fokussiert (`src/**`, `tests/**`, `pyproject.toml`, `uv.lock`, `Dockerfile`). Die Next.js-Web-App unter `web/` hat heute **keine PR-CI** — PRs die `web/**`, `web/package.json`, `web/tsconfig.json` ändern gehen ohne Build-Validation durch. PR #19 (Chart-Foundation) wurde am 2026-06-06 ohne Frontend-CI gemerged — nur lokaler `npx tsc --noEmit` war die Verifikation. Mit wachsendem Frontend (Slice 2+ Page-Migration der `--mm-*`-Tokens, Slice 3 Brandschutz-Charts, Slice 4-5 Server-Side + License-Page) steigt das Risiko von Build-Brüchen die erst beim `deploy-personal`-Workflow auffliegen — also zu spät. **Lösung:** neuer Workflow `.github/workflows/ci-web.yml` analog zum bestehenden `ci.yml`, mit Trigger auf `web/**` + `.github/workflows/ci-web.yml`, Jobs: (a) `npm ci`, (b) `npx tsc --noEmit` für strikten Type-Check, (c) `npm run build` (Next-Build fängt 95% der Type/Build/Layout-Errors). Branch-Protection-Required-Status-Checks anschließend um die neuen Job-Namen erweitern sobald grün laufen — analog dual-swarm-Pattern (siehe deren `ci.yml` web-Job). **2026-06-22 Symptom-Mitigation:** `ci.yml`-paths-Filter um `web/**` erweitert (Commit a754b3b in PR #35) damit Required-Status-Checks auf web-only-PRs nicht blocken. B64 bleibt offen für eigentliche Frontend-CI (Next-Build + tsc).

Trigger
**vor Slice 3** (Brandschutz-Charts gehen produktiv-Pfad → Stefan-Demo) — früher ist akzeptables Risiko, ab dann zu groß
Aufwand
1-2 h (Workflow schreiben + initial-Run + BP-Update)
B66offen

LegalChunk V1.3 Schema-Erweiterung

Trigger: Schul-Bau-Domain-Analyse 2026-06-21. Drei neue chunk_type-Literale: `forschungsempfehlung` (BDA + Uni-Forschung), `feuerwehr_empfehlung` (AGBF + vfdb), `unfallversicherung_vorschrift` (DGUV). Plus neues optionales chunk-level Metadata-Feld `overlay_set: list[str]` damit Phase-0-Project-Classifier (Memory `project_phase_0_project_classifier_overlay_detection`) nur passende Patterns ziehen kann. **Backwards-compatible Migration**. Volldetails in Memory `project_legal_chunk_v1_3_planned_extension`.

Trigger
nach ACP-MVP + nach erstem realen Public-Sector-Pair-Ingest
Aufwand
~1 Tag (Schema + Tests + Migration-Script + Docs)
B68offen

B67-Phase-2 Overlay-Retry + 15 weitere Land-SchulBauR

3 von 10 B67-Quellen müssen mit anderem Approach nachgezogen werden. **SchulBauR NRW** (recht.nrw.de liefert HTML statt PDF — braucht HTML-Extraktion oder manuell-PDF-Discovery). **AGBF-Empfehlungen Schulbau 2015** (SerpAPI lieferte fälschlich BDA-Schulbau-Studie — braucht alternative URL oder agbf.de-direkt-Crawl). **DGUV Vorschrift 81 "Schulen"** (SerpAPI lieferte Buchverlag-Inhaltsverzeichnis — braucht dguv.de-direkt-Crawl). Plus: SchulBauR-Richtlinien der weiteren 15 Bundesländer (heute nur HH ingestiert) als eigene Iteration.

Trigger
bald nach B67-Phase-1 — bewusst transparent statt vorzutäuschen es sei vollständig
Aufwand
2-3h für die 3 Retry-Quellen + 1-2 Tage für die 15 weiteren SchulBauR-Länder
B69offen

Phase-B-Restart: TED-Tender-Pair-Extraktion via Playwright-MCP

Phase A (Source-Landscape) ist abgeschlossen (`docs/research/public-tender-eu-sovereign-source-landscape-2026-06-21.md`). Phase-B-Live-Extraktion via WebFetch wurde 2026-06-22 abgebrochen weil TED + DE-Portale JavaScript-rendered sind + Cloudflare-403-blocken (siehe `docs/research/phase-b-tooling-gap-findings-2026-06-22.md`). **Anti-Phantasterei-konform: keine Tender-IDs fabriziert.** Restart-Plan: Playwright-MCP-Pilot (TED-Search-Result-Page rendern + scrapen) → 10-20 CPV-71317100-Hits → 3-5 Gold-Pairs mit dokumentiertem Outcome → YAML-Pair-Files in `data/training-pairs/`. Empfehlung Option A (Playwright) primär, Option B (TED-API eForms 3.0) sekundär. **EU-Sovereign-konform.**

Trigger
nach kurzer Playwright-MCP-Verifikation
Aufwand
~1 Personentag für 3-5 Gold-Pairs
B222offen

✅ Data-Explorer Library + Live-Notebook live (`52a2d7e3`)

4 Sub-Module (vault/registry/chunks/encoding) + Notebook. Original-Scope: **🎯 Data-Explorer Library + Live-Notebook (Anti-Ad-hoc-Bash, Encoding-First-Class) — NEU 2026-08-26** — User-Sparring-Discovery: bei jeder Content-Review wiederholen sich die gleichen Ad-hoc-Analysen (Blob-Inventar, Registry-Aggregation, Chunk-Sample, Encoding-Check). Statt jedes Mal Bash: reusable Python-Package `src/brandschutz/data_explorer/` mit 4 Sub-Modulen: (a) `vault.py` — Pagination-safe Blob-Inventar via az CLI (OneDrive-venv-safe, azure-storage-blob-SDK bricht mit FileLocks), (b) `registry.py` — pdf-registry-signed.yaml-Loader + Publisher-Aggregation, (c) `chunks.py` — JSONL-Streaming + Sample + Stats, (d) `encoding.py` — **First-Class Encoding-Health-Check** (U+FFFD, double-encoded UTF-8, mojibake, `§/Umlaut`-Presence — motiviert durch EZBK-Ingest-Regression 2026-08-26 mit 2393 kaputten Chunks). Plus `notebooks/vault_content_explorer.ipynb` mit 6 Sections. Präzisiert HARDCODED `feedback_console_utf8_pflicht` als struktureller Check statt reine Regel. **Skaliert 3 Fliegen:** (1) Aufgabe erledigen, (2) reusable, (3) nachvollziehbar (Sparringspartner-Style), **Bonus:** B220-Backfill nutzt data_explorer.vault + registry direkt. **Cross-Ref:** [`docs/architecture/b222-data-explorer-live-notebook.md`](docs/architecture/b222-data-explorer-live-notebook.md).

Trigger
✅ 2026-08-26 (Foundation-Commit pending Push)
Aufwand
2h
B234offen

✅ Secret-Scanner Baustein v0.1.0 (Sprint-1 Dogfood + V2-Vertical-Foundation)

Autopilot-Session: erster kleiner Baustein aus V2-Agent-Security-Kandidaten-Liste umgesetzt. Regex-Registry mit 14 vendor-kuratierten Patterns (AWS/Azure/GitHub/Anthropic/OpenAI/Google/Slack/JWT/PEM/BasicAuth/Generic-Assignment) + Shannon-Entropy + Charset-Diversity + False-Positive-Filter (Placeholder-Wörter). Package `src/brandschutz/secret_scanner/` mit 5 Modulen: `models` (Finding + Provenance-Chain + Anti-Klartext-Guard im Pydantic-Model — Redacted-Text MUSS Maske haben), `entropy` (Shannon + Charset-Class-Diversity kombiniert), `detectors` (Regex-Registry + Semver-Version + Remediation-Hint), `scanner` (File-Walker mit gitignore-artigen Skips + Line-DoS-Schutz + UTF-8-safe Streaming). Plus CLI `scripts/security/secret_scan.py` + 21 Test-Assertions in `tests/test_secret_scanner.py`. **Anti-Abkürzung angewandt:** nicht 3 Regex-Patterns hingeklatscht — Provenance-Chain, SHA-256-Dedup ohne Klartext, State-Machine-fähiger Reifegrad-Anschluss (B188-kompatibel). **Dogfood-Bereit:** `python scripts/security/secret_scan.py --dedupe --severity high` — Erwartete-Zero-Findings auf unserem Repo. **V2-Wiederverwendbar:** Same Detector-Registry für V3-SA-Governance + Managed-Service. **Nicht-im-Scope v0.1** (Follow-up-Sprints, dokumentiert): SSH-Multi-Line-Keys, SaaS-API-Keys (Stripe/SendGrid), Slack-DM-Scan, PixelRAG-Screenshot-Scan (Wiederverwendung B225), Git-History-Scan, CI-Baseline-Freeze. **Cross-Ref:** [`docs/architecture/b234-secret-scanner-baustein.md`](docs/architecture/b234-secret-scanner-baustein.md), [[project_agent_security_vertical_unabhaengig]] V2-Vertical, [[feedback_never_secrets_in_chat]].

Trigger
✅ 2026-08-27 MVP
Aufwand
3h Autopilot-Session
B235offen

✅ Service-Account-Inventory Baustein v0.1.0 (Sprint-2 V3-Vertical-Foundation)

Autopilot-Session Sprint-2 nach Secret-Scanner (B234). Azure-Machine-Identities-Discovery via az CLI + Microsoft Graph. Pydantic-Model mit Reifegrad-State-Machine (DISCOVERED → ATTESTED → IDLE_30D → IDLE_90D → SUSPICIOUS → DEPROVISIONED) analog B188. **Transition-History als Append-only-Audit-Trail** (Compliance-Grade). Classify-Regel: `has_secrets AND no_signin_30d → SUSPICIOUS` (der Umair-Case operationalisiert). **Dogfood-Run auf my-mind-default-Tenant:** 40 records (30 SPs + 10 User-Managed-Identities), 1 SUSPICIOUS (mcp-cognee-fire mit heute-erstelltem Client-Secret ohne Sign-In-Historie), 39 IDLE_30D. Detection-Logik hat SOFORT funktioniert. **Nicht-im-Scope v0.1** (dokumentiert): AWS/GCP/GitHub-Apps Cross-Cloud (V3-Vertical), Actual-Deprovisioning-Automation, HR-Diff, First-Party-Microsoft-App-Filter, Ownership-Chain-Reconstruction, CI-Integration. **Cross-Ref:** [`docs/architecture/b235-sa-inventory-baustein.md`](docs/architecture/b235-sa-inventory-baustein.md), [[project_service_account_governance_vertical_3]] V3-Vertical Managed-Service, B234 (komplementär: Secrets in Files vs. Secrets in Cloud-Identities), B188 (State-Machine wiederverwendet).

Trigger
✅ 2026-08-27 MVP
Aufwand
2h Autopilot-Session
B236offen

✅ Coding-Agent-Inventory Baustein v0.1.0 (Sprint-3 V2-Layer-3-Foundation)

Autopilot-Session Sprint-3 nach B234 (Files-Secret-Scan) + B235 (Cloud-Identity-Scan). Baustein operationalisiert User-Killer-Frage-Zitat 2026-08-26: *"Willst du dass Copilot deinen kompletten Code kennt inkl. aller Vulnerabilities?"*. Detection-Logik: Enterprise-App-Name-Match gegen Vendor-Katalog (17 Namen: GitHub Copilot, Cursor, Cody, Continue, TabbyML, Anthropic, Codeium, Tabnine, Windsurf, Phind etc.) + Risky-OAuth-Scope-Filter (14 Patterns: Files.Read.All, Sites.Read.All, Code.Read, repo, read:org, Mail.Read etc.) + Reifegrad-State (DISCOVERED / LICENSED_ACTIVE / SUSPICIOUS / REVOKED). **Dogfood-Erst-Run auf my-mind-default:** 0 Coding-Agent-Enterprise-Apps → HARDCODED-Regel [[feedback_coding_agent_anthropic_only_gpt_chat_only]] STRUKTURELL BELEGT. Sales-Story-Value: *"Zeig mir dein Coding-Agent-Enterprise-App-Inventar"* — die meisten Firmen können's nicht, wir können + die 0 ist Foundation-Beleg unserer Governance-Story. **19 Tests, 0 failed.** **Nicht-im-Scope v0.1**: GitHub-Copilot-Seats (braucht GitHub-PAT), Endpoint-Config-Scan (Cursor/Continue/Cody), Local-LLM-Positiv-Detection (Ollama), Retention-Attestation-Automation, Copilot-Chat-Log-Scan. **Cross-Ref:** [`docs/architecture/b236-coding-agent-inventory-baustein.md`](docs/architecture/b236-coding-agent-inventory-baustein.md), [[project_agent_security_vertical_unabhaengig]] Layer 3, [[project_normiq_pillars_konkurrenz_gap]] 5-Min-Discovery-Sequence-Antwort-Baustein.

Trigger
✅ 2026-08-27 MVP
Aufwand
1.5h Autopilot
B237offen

✅ Data-State-Observability MVP v0.1.0 (Portal-Page + FastAPI + Cron)

Getriggert durch User-Sorge *"was mir sorgen macht ist die data ingestion — ist wirklich alles im system?"*. Vertikale Slice: Backend-Collector (`src/brandschutz/data_state/`, klassifiziert Registry-Einträge in 7 CoverageStatus-Werte anhand `last_extracted_at` + `n_chunks_extracted` + `status`-Feld) → JSON-Snapshot (`data/data_state/latest.json`) → FastAPI-Endpoints (`GET /api/data-state` + `GET /api/data-state/health` mit 26h-Staleness-Alert) → Next.js Portal-Page (`/platform/data-state`, Server-Component, Aggregat-Karten oben, sortierte Full-Table mittig, Status-Legende unten, --good/--warning/--bad-Farbcodierung) → HeaderNav-Link *"Datenstand"* zwischen *Plattform* und *FAQ* → GHA-Cron daily 04:15 UTC + on-push bei Registry-Änderungen + workflow_dispatch (Auto-Commit bei Diff). **12 Tests grün** (`tests/test_data_state_collector.py`, bypass conftest via `--noconftest` bis Gemini-import-Chain fixed ist). **Live-Truth-Moment** aus dem MVP-Run: 825 Sources deklariert, aber nur **4 extracted** (davon 3 nur chunks=1 Header-Stub), **759 storage_present ohne Chunker-Run**, 59 registry_only. User-Ground-Truth *"1 Band drin"* strukturell bestätigt — Foundation ist im MVP nahe Null. **Bewusst NICHT in v0.1** (Follow-up B237.1-.5): Azure-Blob-HEAD-Verify, Azure-Search-Live-Count, Cognee-Node-Count, Diff-View gestern-vs-heute, Push-Alert-bei-Regression. **Anti-Lipservice-Belege:** 6 HARDCODED-Anker referenziert (`no_content_without_verification`, `no_lipservice_in_commits`, `live_log_first_before_prompt_iteration`, `foundation_error_free_no_duplicates`, `own_platform_first`, `structured_outputs_and_observability_from_day_one`). **Cross-Ref:** [`docs/architecture/b237-data-state-observability.md`](docs/architecture/b237-data-state-observability.md), Registry-Konvention `docs/architecture/buchscan-multi-provenance-convention.md`, verwandter Live-Coverage-Report `scripts/quality/verify_content_coverage.py`.

Trigger
✅ 2026-08-27 MVP live
Aufwand
2h

Erledigt 39

Was schon steht. Wird nicht gelöscht — History als Belegquelle.

B18erledigt

Cosmos-Zombies aufräumen.

✅ erledigt 2026-05-01 12:49 UTC. Beide `Failed`-State-Cosmos-Accounts via `az cosmosdb delete` entfernt — die ursprüngliche „warte 48h"-Regel war übervorsichtig (galt nur falls man die Namen wiederverwenden will). Erkenntnis: bei renamten Resources die Failed-State-Stubs sofort löschen, nicht warten.

Trigger
erledigt
Aufwand
2 min
B24erledigt

Save Preset As

Im Slider-Panel ist „Save Preset As..."-Feature nur Placeholder. Lean-MVP: localStorage; richtig: POST an Server-Action der einen neuen Eintrag in `data/run-configs/variants.json` schreibt + commit-fähig. Dropdown muss neue Custom-Variants automatisch laden.

Trigger
nach B23
Aufwand
1.5h
B26erledigt

Reviewer-Notes / Conversation-Notes

als zusätzlicher Input-Kanal. Bauherr-spezifische Anforderungen die NICHT im PDF stehen (Budget-Constraints, Zeit-Druck, frühere Abweichungs-Genehmigungen, Behörden-Kontakte) sollen als zusätzlicher Text-Input neben dem PDF an den Agent gehen. Pendant zu LM-Studio's „Conversation Notes". Implementation: neues Feld in pair YAML + Übergabe an System-Prompt.

Trigger
nach B22
Aufwand
1h
B27erledigt

„Enable PrüfSV-Schatten" Toggle

im Slider-Panel. Pendant zu LM-Studio „Enable Thinking" Toggle. Wenn an: nach Konzept-Generierung läuft automatisch der 5-Round-Dialog; wenn aus: nur Eval-Run. Aktuell sind das zwei getrennte Skripte ohne Workflow-Kopplung.

Trigger
nach B22
Aufwand
1h
B29erledigt

Synonym-Lexikon nach `data/ontology/synonyms.json` extrahieren.

`SYNONYME` ist hardcoded in `scripts/build_run_trace.py`. Andere Pipelines (Cognee-Inspector, Schwarm-Score-Heuristik, Coverage-Matrix) nutzen das gleiche Lexikon mit eigenen Hardcodes — Inkonsistenz droht. Single-Source-of-Truth-Datei + Loader-Helper.

Trigger
bei nächstem Synonym-Bedarf
Aufwand
1h
B32erledigt

DISZIPLIN-REGEL: keine Phase-X-Promises in Commits/UI ohne Backlog-Eintrag.

Memory `feedback_no_lipservice_in_commits.md` HARDCODED. Alle „TODO"/„Phase 2 wird X machen"/„Coming soon"-Marker im Code, Commit-Text oder UI brauchen GLEICHZEITIG einen B-Eintrag in dieser Tabelle. Sonst rotten die Versprechen und der User entdeckt sie später („du hattest sachen ausgelassen"). User-Quote 2026-05-05: *„Ich gehe davon aus, dass es drin ist und bin nachher massiv enttäuscht, das darf niemals passieren."*

Trigger
sofort aktiv
Aufwand
0 (Regel)
B33erledigt

Dialog-Skript nach scripts/ promoten

mit `--konzept`-Argument-Support. Aktuell lebt `.scratch/run_pair_001_dialog.py` (gitignored, nur lokal). Für Reproduzierbarkeit + Team-Use als `scripts/run_pair_dialog.py` produktiv machen, auch generisch für beliebige pair-IDs (nicht nur pair_001).

Trigger
bei nächster Dialog-Iteration (z.B. zweites Pärchen morgen)
Aufwand
30 min
B35erledigt

Voice-Layer POC (Phase A+B+C)

Realtime API über `/agents/[id]` mit erster Persona PrüfSV-Schatten. Phase A: Next.js API-Route `/api/realtime-session` als TS-Port von `realtime-session.js` aus my-mind-apps/3DViewer (~50 Zeilen + KV-Ref für `openai-realtime-api-key`). Phase B: React-Component `<VoiceChat agentId={...} />` mit WebRTC-Logic 1:1 portiert (RTCPeerConnection, DataChannel, SDP-Exchange, Transcript-Render). Phase C: `/agents/[id]/page.tsx` mit Persona-Composition (DISC + bio + System-Prompt + Voice `ash`). Memory `reference_3dviewer_voice_playground_arch.md` + `project_agents_conversational_persistent.md`.

Trigger
nach OpenAI-Key in KV vorhanden (User-Aktion)
Aufwand
~4h
B46erledigt

KB Sprint 2.1

BauGB + BauNVO + GEG + ROG + BNatSchG. Quelle: gesetze-im-internet.de (BMJV). Pipeline: direct fetch → pdfplumber → graph-snapshot.json + .swarm/runs/. Damit Konzept-Generator auf Gesetz-Ebene argumentieren kann.

Trigger
erledigt 2026-05-16
Aufwand
~30 Min
B47erledigt

KB Sprint 2.2

alle 16 LBOs. Pipeline: SerpAPI-Discovery + Mirror-Fallback (feuertrutz, ingkh, weise-software). Cross-Edges: jede LBO → MBO + Bundesgesetze.

Trigger
erledigt 2026-05-16
Aufwand
~1 h
B48erledigt

KB Sprint 2.3

Muster-Verwaltungsvorschrift Technische Baubestimmungen (DIBt) + 16 landesspezifische VV TB. Cross-Edges: VV TB Land → MVV TB Bund + jeweilige LBO. Bot-Defense bei BE/HH/HE über nullbarriere.de-Mirror umgangen.

Trigger
erledigt 2026-05-16
Aufwand
~1 h
B50erledigt

KB Sprint 2.4

VgV via gesetze-im-internet. **VOB Teil A/B/C noch offen** (DIN-Lizenz ~€450 — eigenes Backlog-Item B53 mit User-Approval-Trigger).

Trigger
VgV erledigt 2026-05-16, VOB als B53 verschoben
Aufwand
30 Min
B51erledigt

KB Sprint 2.5

64 Landesgesetze. Pipeline wie B47. 6 Hessen-lastige Failures (4 Hessen-Quellen, plus DSchG/StrG Niedersachsen, plus WG Berlin) — Bot-Defense auf wirtschaft.hessen.de auch via Bright Data. Retry-Iteration via Mirror = B52.

Trigger
erledigt 2026-05-16
Aufwand
~15 Min Laufzeit
B52erledigt

KB Sprint 2 Cleanup

(a) Skripte aus `.scratch/` nach `scripts/kb_ingest/` mit README. (b) 6 Failures aus B51 via Mirror-Quellen.

Trigger
erledigt 2026-05-17
Aufwand
~1 h
B65erledigt

LegalChunk Schema V1.2 (Google-Collab V1 + Axel-Collab V1.2)

Foundation für B56 + Ingest-Konzept. Schema implementiert in `src/brandschutz/swarm/schemas/v0_4_0/legal_chunk.py` + 48 Tests grün. 5 neue chunk_type-Literale für case_law + tender + scanned_book. `hierarchy_path: list[str]` als polymorphic-Breadcrumbs. License-Tier als Pflicht-Feld. Plus Ingest-Konzept-Doku in `docs/architecture/ingest-concept-rechtsprechung-und-tender.md`.

Trigger
erledigt 2026-06-08 — Code lebt auf Branch `feat/legal-chunk-v1-2-ingest-concept` / PR #23, awaiting Final-Merge nach main
Aufwand
~5 h
B67erledigt

Brandschutzleitfaden Bund + Federal-/Schul-Overlay-Quellen ingestieren

Sub-Sprint für 2.7 Public-Sector-Overlay-Ingest. Brandschutzleitfaden Bund (`public/GesetzgeberQuellen/`) + AGBF-Empfehlungen + DGUV-Vorschriften + ArbStättV + ASR + BDA-Forschungs-Empfehlung Schulbau + Handout Brandschutzconsult Kolb + SchulBauR-Richtlinien der Länder. **B67-Phase-1 erledigt 2026-06-22** (run `overlay_ingest_20260622T013333Z`): 7/10 Overlay-Quellen ingestiert (248 Seiten Content, 22 Cross-Edges) — BDA Schulbau 2017 / Handout Kolb / Bauprüfdienst HH / AGBF Brandlasten 2024 / DGUV R 100-001 / ASR A2.2 / ASR A2.3. Brandschutzleitfaden Bund war bereits in KB-Sprint ingestiert. 3 Quellen mit Quality-Issues identifiziert → B68 Retry-Sprint.

Trigger
nach Phase-A-Recherche-Sprint
Aufwand
~1 Arbeitstag (Pipeline existierte bereits)
B74erledigt

✅ Licensed-Book-Ingest (EZBK 6/6 Baende + Atlas 6a ingested, ~5.1GB PDFs)

erledigt vor 2026-07-30 (User-Bestellung + buchscan-Rueckkunft + Ingest). B97-Audit-Confirmation: **EZBK BauGB-Kommentar Band I-VI komplett ingested** als 12'209 Chunks (2200 + 1910 + 1658 + 1846 + 2713 + 1882 in `.swarm/runs/chunks_din_vds_2026-07/ezbk_band_*.jsonl`), PDFs in `.scratch/ezbk/` (5.1GB). **Brandschutzatlas Kapitel 6a ingested** — voller 686MB PDF vorhanden, Chunker existiert (Golden Sample 30/30 GREEN), aber nur Kap. 6a als jsonl. **B74b: Restliche Atlas-Kapitel ingesten** als eigene Iteration (~30 Kapitel, ~1000 Seiten). Ehrliche Sichtbarkeit: EZBK Iteration 1 ist Seiten-Chunk (1 Chunk/Seite mit §-Anker) — Iteration 2 mit Multi-Column-Layout + Author-Attribution + Randnummern-Granularitaet ist B94. Ursprüngliche Bestellnr BE-16781122-XX, AB-11220683-XX. **Strategischer Hebel erreicht:** Veredelungs-Schicht die Beck/juris als €60-300/M-Subscription verkaufen ist ab jetzt on-premises.

Trigger
erledigt vor 2026-07-30
Aufwand
Ingest ~1 Woche fuer alle 6 EZBK-Baende
B84erledigt

✅ Phase 1+2 Temporal-Metadata in allen 6 B96-Chunkern

erledigt 2026-07-30. Schema V1.4 hatte Temporal-Felder (`start_date`, `change_date`, `end_date`, `effective_date`, `version_label`, `supersedes_chunk_id`, `change_type`) bereits deklariert, aber Chunker haben sie nie befuellt. Diese Session: (1) `_build_chunk_dict()` in `base.py` um 7 optionale Temporal-kwargs erweitert, (2) neuer Helper `parse_german_date()` fuer alle DE-Datums-Formate (17/18 Unit-Tests GREEN inkl. NBSP + Jaenner + Maerz-Fallback), (3) alle 6 B96-Chunker (Bund/BY/SN/BB/HB/NI) befuellen `start_date`+`change_date`+`effective_date`+`version_label` aus Portal-Metadata. Bund holt Ausfertigung+Neugefasst-Datum aus BJNR*-Volltext-Fetch (extra HTTP-Request in Phase 1.5). Golden Samples aller 6 Portale um `temporal_metadata`-Assertions erweitert, alle GREEN (13-18 matches pro Sample). **B84b (Migration existing 1777 Nodes) + B84c (bestehende Chunker LBauO NRW/Atlas/EZBK/juris-SPA umstellen) als naechste Iterationen.**

Trigger
Phase 1+2 erledigt 2026-07-30
Aufwand
2 Tage Schema-Update in Chunkern
B89erledigt

✅ Extractor-B Verkuendungsblatt NRW + Batch-Skalierung

erledigt 2026-07-30. Discovery 2026-07-29 bei Golden-Sample-#1-Design: die Fussnoten-Bloecke der LBauO NRW konsolidierten Fassung enthalten Hyperlinks auf recht.nrw.de-Verkuendungsblatt-Seiten. **Backlog-Assumption "Playwright-Pflicht" widerlegt** — recht.nrw.de rendert server-side, Cookie-Popup blockt nicht, urllib+regex reicht. Container-Apps-tauglich ohne Browser-Runtime. **Ergebnis:** VerkuendungsblattNrwChunker (Commit 00838de) mit 3 chunk_types (amendment_gesetz_header/paragraph/inkrafttreten), Golden Sample #2 fuer 2021-s822 → 15/15 GREEN auf ersten Versuch. **Skalierung** (Commit dieser Iteration): `batch_ingest_verkuendungsblatt.py` Production-Grade Batch-Runner mit Rate-Limit + Retry + JSONL-Persist + Failed-URL-Log; PDF-Pattern-Erweiterung um 3 Storage-Layouts (`/system/files/pdf/`, `/system/files/GV_Archiv/`, `/system/files/VB_PDF/`); Batch-Run gegen alle 12 URLs aus LBauO NRW: 12/12 Success, 12/12 PDFs downloaded, 167 Chunks, 93 unique changed_paragraphs. **Cross-Ref-Kette geschlossen:** Extractor-A LBauO §88 → amendment_history_urls → Extractor-B GV. NRW. 2021 S. 822 → 46 Aenderungs-§§.

Trigger
erledigt 2026-07-30
Aufwand
erledigt in 1 Session
B96erledigt

✅ 6 verbliebende Landesrecht-Portale (BY, BB, SN, NI, HB, Bund)

erledigt 2026-07-30 in Post-Compact-Session. Commits `9919d38` (Bund/BY/SN/BB) + Commit-2 (Bremen/NI). Alle 6 mit menschverifizierten Golden Samples: **Bund BMJV** (10/10, BauGB via `/bbaug/__N.html`, urllib+iso-8859-1) · **Bayern** (14/14, BayBO via 2-Ebenen-Discovery Root→G_n→Art_x, "Art." statt "§") · **Sachsen** (11/11, SaechsBO Single-Page-Delivery mit `id="pN"` Split-Markern) · **Brandenburg** (10/10, BbgBO mit ssl.CERT_NONE + `<a name="N">` Fragment-Anker) · **Bremen** (8/8, BremLBO via Meta-Detail-Template + `<a name="jlr-BauOBR2024pP{N}">`) · **NI VORIS MVP** (10/10, NBauO Root+Metadata via Playwright — §-Level als B96b). Framework-Erweiterungen: Schema V1.5 mit 14 neuen chunk_type Literals (bund/bayern/sachsen/bb/hb/ni Prefixe), verify_golden_samples.py mit 6 neuen Verifier-Funktionen, nightly_watch.py mit 6 neuen Web-Samples. **Endstand: 16/16 Bundeslaender + Bund + LBauO NRW + Handbuch Brandschutzatlas + EZBK = 20 Web-Golden-Samples aktiv.**

Trigger
erledigt 2026-07-30
Aufwand
~6h Post-Compact-Sprint
B126erledigt

✅ Encoding-Sanitizer Defense-in-Depth (B76c-Followup 2026-08-07)

User-Direktive nach VdS-PDF-TOC-Mojibake-Fund: "wir hatten das mehrfach, wie können wir verhindern dass das nicht wieder vorkommt". 4 von 5 Defense-in-Depth-Schichten live (commit `b2f45a2`): **Schicht 1** zentraler `_sanitize_encoding()` in `chunkers/base.py` (16 Chunker profitieren automatisch, VdsPublikationChunker-Override explizit gefixt). **Schicht 2** Pre-Upload-Gate in `upload_vds_publikation_chunks.py` (HARD-FAIL Batch bei Mojibake, kein silent-pass). **Schicht 3** Unit-Tests `tests/test_encoding_sanitizer.py` (17/17 GREEN, deckt FFFD-Rekonstruktion + citation-recursion + E2E ab). **Schicht 4** Weekly-GitHub-Action `.github/workflows/nightly-encoding-audit.yml` mit Auto-Issue-Create bei >2%-Threshold-Breach + `scripts/quality/nightly_encoding_audit.py`. **Schicht 5** `encoding_status`-Field im Chunker-Manifest (passed/repaired/failed). **Live-Index-Baseline vor Sprint:** 67'753 Chunks 100% clean (User 98%-Anspruch übertroffen). **Nach Sprint:** 67'943 Chunks, 4 KEEP-VdS-Docs mit 194 sauberen Chunks + Umlaute korrekt in Labels. **Verhindert:** neue Chunker-Iterationen (B76d vfdb, B76e VVTB-JSON, B94 EZBK-Iter2, B119 PixelRAG) produzieren still Mojibake unbemerkt. Cross-Ref: `feedback_unsere_verantwortung_zero_schwaeche` (Lane B duldet null Schwäche), B99s (heilt via Sanitizer beim nächsten Landesgesetz-Re-Ingest), `project_stefan_foith_demo_konstellation` (Datenintegrität als Demo-Voraussetzung).

Trigger
erledigt 2026-08-07
Aufwand
~4h Sprint
B128erledigt

✅ 448 VdS Files fresh-chunked mit VdsPublikationChunker@1.0

erledigt 2026-08-07 Nacht (commit `eb9080d`). Ursprünglich als Backlog dokumentiert weil originaler VdS-Extract-Run unvollständig war (nur 208/632). Sprint-Nacht Full-Rebuild alle 632 VdS via rechunk_signed.py in 3 Splits (150+150+148). Endstand: 21'976 chunks VdsPublikationChunker@1.0 im Live-Index.

Trigger
erledigt 2026-08-07
Aufwand
~1h
B129erledigt

✅ 10 vfdb Files fresh-chunked mit VfdbPublikationChunker@1.0

erledigt 2026-08-07 (commit `eb9080d`). Ursprüngliche 10 NO_CHUNKS_FILE aus vfdb-Batch. Full-Rebuild alle 34 vfdb → 779 chunks. chunker_version jetzt VfdbPublikationChunker@1.0 (nicht mehr generic VdsPublikationChunker-Alias).

Trigger
erledigt 2026-08-07
Aufwand
30min
B130erledigt

✅ Brandschutzatlas Kap 6a fresh-chunked mit HandbuchAtlasChunker@1.0

erledigt 2026-08-07 (commit `eb9080d`). 97 chunks im Live-Index. Der Rest der Atlas-Kapitel (30+ Kapitel, ~1000 Seiten) noch NICHT ingested — siehe B74b (Backlog steht noch).

Trigger
erledigt 2026-08-07 (nur Kap 6a)
Aufwand
30min
B131erledigt

✅ din_4102_5 versioned Split mit fresh chunks pro Version

erledigt 2026-08-07 (commit `eb9080d`). Vorher: 1977-09 und 1990-05 teilten dieselbe legacy-JSONL (24 chunks x2). Jetzt: fresh-chunked separat per PDF, 24 + 22 = 46 unique chunks mit unterschiedlichen sig_chunked. Beide versioned IDs haben jetzt echte Content-Uniqueness.

Trigger
erledigt 2026-08-07
Aufwand
5min
B132erledigt

✅ VOB Gesamtausgabe fresh-chunked mit VobGesamtausgabeChunker@1.0

erledigt 2026-08-07 (commit `eb9080d`). VOB-PDF manuell in pdf-registry-signed hinzugefügt (source_id=vob_gesamtausgabe_2019, SHA 541ec6fe8e33). VobGesamtausgabeChunker auto-dispatched via is_vob_gesamtausgabe(). Ergebnis: 10'314 chunks mit Teil-A/B/C-Hierarchy + 88 ATVs erkannt. 10'000 preserved-web zombies überschrieben.

Trigger
erledigt 2026-08-07
Aufwand
30min
B140erledigt

✅ Chart-Creator-Foundation (Phase 1+2 done 2026-08-11)

MY-MIND Data Visualizer als Brandschutz-native Chart-Foundation etabliert. **Phase 1** (`web/lib/charts/`, Commit `cd6d428`): 17 React-Wrapper um @antv/gpt-vis (Bar/Column/Line/Area/Pie/Scatter/Radar/Funnel/Treemap/Sankey/WordCloud/Histogram/DualAxes/Waterfall/Boxplot/Liquid/Venn), einheitliche API mit `--mm-*`-Token-Theming + Theme-Auto-Switch + CHART_TYPES-Registry als Single-Source-of-Truth. **Phase 2** (`web/app/charts/`, Commit `2adabdc`): User-facing Chart-Creator-Page unter `/charts` mit 3-Column-Layout (Type-Tiles + Common-Config / Data-Import JSON+CSV+Drag-Drop+Sample-Load / Live-Preview + PNG/SVG-Export + Copy-JSON). **Phase 3** (Docs, dieser Commit): `docs/architecture/chart-creator-mvp-2026-08-11.md` mit Architektur + Roadmap. **Independence-Principle konform**: internal Wrapper statt external mm-chart-ssr-Service. **Roadmap Phase 4-6**: Chart-spezifische Config-Options, Cloud-Persist mit Share-Link, Voice→Chart in Personas (B117-analog), Foundation-Coverage-Charts (Live-Dashboard), Konzept-PDF-Chart-Export (B43). **Cross-Ref**: Memory `project_ducky_brandschutz_independence_principle`, Journal `journal/2026-06-24-voice-layer-tagessession.md`.

Trigger
erledigt 2026-08-11
Aufwand
Phase 1+2 gesamt ~6h
B141erledigt

🔴 Retriever-Wissensmatrix-Fix (2026-08-14 done, push-pending)

CRITICAL BUG-FIX: der Hybrid-Retriever (`web/lib/ai-search-hybrid.ts`) lud die 11 wissensmatrix_*-Felder aus dem AI-Search-Index NICHT. Damit hatte Sonnet keinen Zugriff auf 44'237 Layer-2-enriched Chunks trotz $60+ Haiku-Investment. **Sweep über alle Retrieval-Pfade** (5 Commits): (1) `ai-search-hybrid.ts` AiSearchDoc erweitert + select-Array + Hit-Mapping mit strukturierter Wissensmatrix, (2) `wissensgraph-search.ts` SearchHit-Type mit WissensmatrixFields, (3) `anthropic-agent-turn.ts` neue `buildWissensmatrixContext()`-Fn + Persona-Prompt WISSENSMATRIX-Sektion, (4) `cohere-rerank.ts` Prefix-Injection im Rerank-Doc-Text, (5) `agent-turn/route.ts` OpenAI-Path RetrievalHit + formatRetrievalContext WISSENSMATRIX-Block, (6) `wissensgraph-search-server.ts` + Snapshot-Client explizit `wissensmatrix: null`, (7) `agent-personas.ts` SHARED_CONVENTIONS neue WISSENSMATRIX-Sektion mit 5 Nutzungs-Regeln. **Plus** neues Extract-Skript `scripts/vector/extract_layer3_edges.py`: 25'582 Layer-3-Edges als JSONL für Cognee-Ingest (87% mit Kompensations-Bedingung, 95% cross-linked). Commits `2e0cd50` + `269618a` + `b25fa20` + `6cebc0e` + `3b927e7`. Iter-F Berghoff-Retest freigegeben nach Deploy.

Trigger
2026-08-14 done
Aufwand
~5h Sprint
B156erledigt

✅ Blue-Green Reindex Phase 1+2 done (2026-08-17)

Phase 1 vormittags: LandesgesetzParentChildChunker gebaut + 30 Sources refresh (3005 chunks, median 1200-1800 chars, tiny <10%). Phase 2 Nacht (nach Live-Log-Debug-Sprint): Blue-Index-Query-Fixes (`original_id`/`label`/`chunk_type_group`/`hierarchy_root` konditional aus select, `search.in`-Filter-Syntax `'val1,val2'` statt `'val1','val2'`). Wissensmatrix-Enrichment 99.93% ($7.06 Haiku). `hyb=40` statt `hyb=0`, Blue-Chunks landen im chunk-cache, LLM sieht vollständigen Volltext. **Phase 3 offen:** Alias-Switch `legal-chunks-v1` → `legal-index-v2-blue` als Prod-Default nach A/B-Retest Cycle-12 (B154) grün. Cross-Ref: Journal `docs/journal/2026-08-17-b167-sidebar-live.md`.

Trigger
Phase 1+2 done 2026-08-17
Aufwand
~10h Sprint
B166erledigt

✅ Post-Extraction Middleware live + 2026-08-17-Iter-2 (Marker-Injection im echten Rendering-Pfad)

Cycle-14-Post-Extraction (`expandQuotesInPlaintext` in `verbatim-span-resolver.ts`) ist gebaut und live, ABER Live-Log-Diagnose 2026-08-17 hat entlarvt: der schöne Blockquote-Output kommt NICHT von dieser Middleware (`extracted_quotes=0` im Log) sondern vom Cycle-13-Legacy-Pfad (`resolveVerbatimSpans` mit `verbatim_citations`-Structured-Output). Deshalb Iter-2: `[chunk:CHUNK_ID]`-Marker wird jetzt im Legacy-Pfad in `anthropic-agent-turn.ts` (Zeile ~587) nach jedem successful-resolved Blockquote injiziert — Frontend rendert Badge → Sidebar öffnet. Die Middleware bleibt als Fallback für Free-Form-Zitate (wenn Sonnet doch mal Anführungszeichen statt verbatim_citations nutzt). **Sub-Cleanups (B166b/c):** Debug-Console-Logs raus + `verbatim_citations` `start_phrase`/`end_phrase`-Matching für Abs 1 + Abs 2 schärfen.

Trigger
done 2026-08-17
Aufwand
~1h Iter-2
B167erledigt

✅ Sidebar-Redesign LIVE (Google-Cycle-14 Enterprise-UX-Pattern, 2026-08-17)

MVP komplett gebaut + deployed + live-getestet mit § 27f LBO BW. **Files:** `web/app/api/chunk-v2/[chunkId]/route.ts` (Azure-AI-Search-direct Endpoint mit Blue-Schema-Kompat), `web/app/components/ChunkSidebar.tsx` + `ChunkSidebar.css` (parseChunkReferences + ChunkBadge + Slide-in Panel mit ESC + Backdrop-Close), `TextChat.tsx`-Integration (Badge-Parser + activeChunkId-State), Marker-Injection in `anthropic-agent-turn.ts` (siehe B166). Sidebar liefert deterministisch aus Blue-Index: Volltext + Meta (Quelle/§/Ebene/Pfad) + Wissensmatrix (Leitsatz + Tatbestand + Auslegungs-Regel + Ausnahme + Verknuepft + Confidence). **Screenshot-Beweis:** § 27f komplett mit bisher immer "abgeschnittener" Ausnahmen-Klausel. Cross-Ref: Journal 2026-08-17, `project_google_sparring_cycle_14_post_extraction_resolver`.

Trigger
erledigt 2026-08-17
Aufwand
~4h Frontend + 2h Backend + 2h Fix-Iterationen
B171erledigt

✅ Phase 1 LIVE + verifiziert

Foundation-Match zum Artifact-Prototype ([claude.ai/code/artifact/6efc7040](https://claude.ai/code/artifact/6efc7040-2d5c-4a2f-b721-99dee084a05b)) in NORMIQ live: Persona-Prompt SHARED_CONVENTIONS mit KRITISCHE-OUTPUT-REGELN-Sektion oben + Stary/Unger-Kanten-Grammatik, `MermaidBlock.tsx` Renderer, `parseMermaidBlocks()` Regex-Parser, TextChat dreistufig (Mermaid → Chunk-Refs → Markdown), `react-markdown` + `remark-gfm` fuer Tables + Bold + Blockquote + Listen, preprocessMarkdown-Cleanup fuer juristische Norm-Nummerierungen. **8 Commits `1365072`…`61c8c92`.** **Live-Test 3 HAMMER-Queries verifiziert:** (1) Volltext-Frage: baseline stabil + keine Mermaid (korrekt); (2) Hierarchie-Frage: 12-Node Concept Map mit selbst-erfundenem Lavendel-Node-Type + exakte Kanten-Grammatik; (3) Laender-Vergleich BW/HE/HH: Multi-Land-Kaskade als 3 parallele Saeulen mit Emoji-Marker (⚡/🔄/⚖️) fuer juristischen Kern-Delta selbst-emergent — 100% Volltext-Rate. **Chunk-Badges 3-5 pro Antwort** (vorher 1). **App-Crash-Fix `602ee90` mehrfach verifiziert** (5 Sidebar-Klicks stabil). Phase 2 als B173 (React Flow mit Node-Klick-Wiring). Phase 3 als B123-abhaengig (Cognee-Graph-Query). Cross-Ref: Journal 2026-08-18 Nachmittags-Sektion.

Trigger
erledigt 2026-08-18
Aufwand
~4h Sprint (5 Deploys, 8 Commits, $0 Compute)
B175erledigt

✅ Concept-Map Fullscreen-Modal LIVE (2026-08-18 Nachmittags-Extend)

`MermaidBlock.tsx` mit `isFullscreen`-State + eigener `MermaidFullscreen`-Component (fixed Modal 92vw/92vh, Backdrop, ESC + Close-X, Body-Scroll-Lock, animierter Scale-In). Klick auf `.mermaid-block` (cursor: zoom-in) oeffnet. `svg.pointer-events: none` sorgt dafuer dass Klick immer den Container trifft. Dark-Mode-Varianten.

Trigger
erledigt 2026-08-18
Aufwand
~25 min
B176erledigt

✅ Markdown-Absatz-Spacing kompakter LIVE (2026-08-18 Nachmittags-Extend)

TextChat.css alle `.vc-bubble-markdown`-Elemente kompaktiert: `p` 12→6px, `h1-h4` 20/8→12/4px, `ul/ol` 8/12→4/6px, `li` 4→2px, `blockquote` 12→8px margin + 8/16→6/14px padding + `blockquote p` 8→4px, `pre` 12→8px margin + 12/16→10/14px padding, `table` 16→10px, `hr` 20→12px. Rein visuell, keine Substanz.

Trigger
erledigt 2026-08-18
Aufwand
~10 min
B177erledigt

✅ ChunkSidebar Preprocess LIVE (2026-08-18 Nachmittags-Extend)

`preprocessMarkdown()` in neue shared lib `web/lib/preprocess-markdown.ts` extrahiert (aus TextChat.tsx), wird jetzt sowohl im Chat als auch in der Sidebar `<pre class="chunk-sidebar-content">` auf `data.content` angewendet. Regex-Cleanup collapse `1.\nText → 1. Text` fuer juristische Nummerierungen. Sidebar hat jetzt identisch sauberes Rendering wie der Chat.

Trigger
erledigt 2026-08-18
Aufwand
~5 min
B178erledigt

✅ Persistenter Denk-Indikator LIVE (User+Axel-Feedback 2026-08-18 Nachmittags)

User-Report: „die denkanzeige muss unten zu chat, nach der ersten frage ist das im chat schon verschwunden und dann schicke ich eine message ab und weiss nicht ob irgendetwas passiert". Fix: neue `.tc-status-bar` direkt ueber dem Input-Row (immer sichtbar), zeigt State-Dot + `{agentName} arbeitet…` + Hint „sucht Wissensgraph, prueft Volltext, formuliert Antwort". Sending-State: pulsierender Dot + blaue Border. Idle-State: gruener Dot + „Bereit fuer deine naechste Frage" (nach erstem Turn). Error-State: roter Dot. Header-Anzeige oben bleibt zusaetzlich. Dark-Mode ready.

Trigger
erledigt 2026-08-18
Aufwand
~30 min
B179erledigt

✅ Volltext-Chip klickbar → Source-Popup LIVE (User-Feedback 2026-08-18 Nachmittags)

User-Anforderung: „wenn ich auf 'Volltext im Zugriff' clicke, ein Popup: Genau welches buch / source / welche seite etc. und dann der gesamte text". MVP-Umsetzung (ohne Backend-Change): neue `KonfidenzChip.tsx` Component ersetzt inline Chip-Rendering im TextChat. Bei `zugriffs_status='volltext'` wird der Chip als Button gerendert (dashed Border + Chunk-Count-Badge). Klick oeffnet Popup-Modal mit: Aussage + Konfidenz-Badge (farb-kodiert stark/plausibel/schwach/spekulativ) + Branchen-Basis + Liste aller `[chunk:XXX]`-Refs aus dem Turn-Text als klickbare Buttons. Jeder Chunk-Klick oeffnet die deterministische Sidebar mit Volltext + Werk + Ausgabe + Seite + Wissensmatrix aus dem Blue-Index. Popup mit ESC + Backdrop-Close, Scale-In-Animation, Dark-Mode. Foundation-Investment (`KonfidenzChip`) traegt spaeter auch VoiceChat wenn dort analog eingebaut. **B179+ Iteration:** Popup zeigt jetzt `§ 3 LBO BW` + Pfad-Hint statt raw UUID via neue `lib/humanize-source-id.ts` + parallel `/api/chunk-v2` Meta-Fetch on-popup-open. **B177+ Regex-Fix**: `preprocessMarkdown` matched jetzt auch Kleinbuchstaben-Fortsetzung (`1.\nin Wohnungen`), negative-Lookahead schuetzt vor Merge zwischen List-Items. **Zukunfts-Erweiterung:** Backend koennte `KonfidenzAusweisung.source_chunk_ids: string[]` liefern, damit Popup nur die tatsaechlich referenzierten Chunks pro Aussage zeigt statt alle Turn-Chunks.

Trigger
erledigt 2026-08-18 (Basis + Iter B179+/B177+)
Aufwand
~40 min + ~30 min Iter
B183erledigt

✅ Scroll-Fix bei AI-Antwort

User-Report: „wenn die antwort von markus kommt, springt der immer zum ende der nachricht, das ist bloed weil ich als erstes komplett zum nachrichten anfang hochscrollen muss". Root-Cause: `transcriptRef.scrollTop = scrollHeight` bei jedem Turn — bei User-Prompt korrekt, bei AI-Antwort falsch (User verpasst Antwort-Anfang). **Fix in TextChat.tsx**: Ref `lastAiBubbleRef` auf die letzte AI-Bubble im Map, useEffect unterscheidet Turn-Typ. USER-Turn: scroll ans Ende. AI-Turn: `scrollIntoView({block: 'start', behavior: 'smooth'})` auf die neue Bubble via `requestAnimationFrame`. `scrollMarginTop: 8px` gibt der Bubble atmen. Jetzt landet der Nachrichten-Anfang oben im Viewport, User kann direkt lesen.

Trigger
erledigt 2026-08-18
Aufwand
~15 min
B198erledigt

✅ Gulli-Kanon als Agentic-OS Pattern-Library-Layer

Antonio Gullis *Agentic Design Patterns* (Springer 2026, 21 Kap + 7 Appx, ex-Google-Autor, [github.com/evoiz/Agentic-Design-Patterns](https://github.com/evoiz/Agentic-Design-Patterns)) aufgenommen als 4. Cross-Cutting-Layer der Agentic-OS-Vision. Sprint-Kickoff-Ritual definiert: bei jedem Sprint Gulli-Kapitel-Check + Notebook-Referenz-Impl-Scan (Anti-NIH-Test). ~70% unserer Wave-2+3-Sprints landen auf einem Gulli-Kapitel. Memory-Files: `reference_gulli_agentic_patterns.md` (Kap-für-Kap-Mapping) + `project_agentic_os_gulli_pattern_library.md` (Cross-Cutting-Layer-Konzept). Cross-Ref: TL;DR 2026-08-25 Abend.

Trigger
✅ 2026-08-25
Aufwand
Discovery + Memory-Aufnahme + CLAUDE.md-TL;DR

Verworfen 4

Bewusst nicht weiterverfolgt. Begründung im Item-Text.

B41verworfen

~~**`@my-mind/gtm-core` Library-Extraktion aus Ducky.** Verworfen 2026-05-13

~~**`@my-mind/gtm-core` Library-Extraktion aus Ducky.** Verworfen 2026-05-13 — Ducky ist eigenständiges Produkt, kann nicht gesplittet werden. Jeder Produkt baut Setup-Layer selbst, Pattern wird über Doku/Memory geteilt. Stattdessen Companion als erstes echtes Komponenten-Element (M-1).~~

Trigger
Aufwand
B49verworfen

~~**Nachbarrecht 16 Länder**

~~**Nachbarrecht 16 Länder** — verworfen 2026-05-16, User-Direktive: „Nachbarrecht uninteressant".~~

Trigger
Aufwand
B161verworfen

⛔ VERWORFEN (Google-Cycle-13-Verdikt): verbatim_citations-Field ist Sackgasse

Cycle-13-Diagnose: "Beseitigt Escaping-Konflikt, zwingt Sonnet aber weiterhin zu Free-Form-Transkription. Symptom A auf 96%, Symptom B (Multi-Chunk-Fabrication) bleibt. Verschwendet 2-3 Tage in deterministische Sackgasse." Ersetzt durch **B164 Span-Based Citation** (Phrase-Pointer + Middleware). Diese Zeile bleibt als Backlog-Grabstein damit klar ist warum wir den naiven Weg NICHT gehen.

Trigger
Aufwand
0
B164verworfen

🔻 ZURUECKGESTUFT (Google-Cycle-14-Verdikt): [[QUOTE:N]]-Marker-Pattern ist fragiles Anti-Pattern

Cycle-13-Diagnose war "eleganter Span-Based-Pattern", in der Praxis aber wirkungslos: Sonnet ignoriert Prompt-Constraints, halluziniert chunk_ids, verwendet keine Marker. Cycle-14-Analyse: [[QUOTE:N]] zwingt LLM in Syntax-Compiler-Rolle (Marker im Text + Sync mit JSON-Array-Index) — sobald Reasoning-Faden verloren, Indizes falsch. Ersetzt durch B166 Post-Extraction Resolver. Tool-Schema `verbatim_citations` bleibt aber als Legacy-Fallback im Code (falls Sonnet doch mal emittiert). Diese Zeile bleibt als Backlog-Grabstein damit klar ist warum wir den Marker-Weg NICHT gehen.

Trigger
⛔ zurueckgestuft
Aufwand
0

Diese Page wird zur Build-Zeit aus CLAUDE.md generiert. Stand dieses Render-Vorgangs: 2026-08-31.

Quelle: CLAUDE.md Sektion „Backlog — offene Aktivitäten mit Trigger". Parser: web/lib/data.ts Funktion getBacklogItems().