# Release-Record 1.3.0 — Deep-Dive-Umsetzung 2026-09

Datum: 2026-09-03. Branch `feat/deep-dive-2026-09`. Version `1.3.0` in
`pyproject.toml`. Commit-Hash: siehe Merge-Commit des Pull Requests.
Ausgeliefert wird nach dem Merge durch `deploy.yml` (Nachtlauf oder
`workflow_run` nach grünem CI).

## Was sich ändert

Der Deep Dive vom 2026-09-03 hat elf Fehler, sechs Entscheidungen und
fünfzehn Marktlücken benannt. Alle sind umgesetzt. Die Spec liegt unter
`_bmad-output/specs/spec-deep-dive-2026-09/SPEC.md`.

| Bereich | Änderung | Wirkung für Nutzer |
|---|---|---|
| Installer | Rollback löscht nur Pfade mit Backup oder ohne Vorbestand (F1) | Kein Datenverlust mehr, wenn ein Backup-Schritt scheitert |
| Installer | Nur https; http nur Loopback oder `RULES_ALLOW_HTTP=1`; `curl --retry` (F8) | Kein Downgrade auf Klartext |
| Installer | Lock trägt die pid; verwaiste Locks werden zurückgeholt (F9) | Kein manuelles Löschen nach SIGKILL |
| Installer | Fehlendes Digest-Tool warnt; `RULES_REQUIRE_DIGEST=1` bricht ab (F7) | Sichtbare statt stiller Lücke |
| Installer | `--version <v>`, `.bestaiconfig.lock`, `--uninstall` (M7, M12) | Reproduzierbare Installs, sauberer Rückbau |
| Compiler | Ausgabebaum wird erst nach erfolgreichem Swap gelöscht (F3) | `public/` geht bei einem Fehler nicht verloren |
| Compiler | Depth-Vokabular an Wortgrenzen; Symlink-Ausbruch aus `sources/` blockiert; Seeds-Guard auf Pfad-Identität (F4, F5, F6) | Weniger falsche Build-Abbrüche, kein Einlesen fremder Dateien |
| Adapter | `.claude/rules/*.md` mit `paths:` für Regeln mit engen Globs (M1) | Claude Code lädt Pfadregeln deterministisch |
| Adapter | `.agents/skills -> .claude/skills` (M2) | Codex, Antigravity, Junie, Amp, OpenCode, Roo, Replit sehen die Skills |
| Adapter | `.github/instructions/*.instructions.md` mit `applyTo` (M3) | Copilot bekommt Pfadregeln |
| Adapter | Komponenten `gemini`, `qwen`, `zed`, `kiro`, `devin`, `codex` (M4) | Sechs weitere Assistenten ohne Handarbeit |
| Hooks | Router-Erinnerung als Seed für Copilot, Codex, Kiro, Gemini (M5) | Das Gate erreicht vier weitere Harnesse |
| Paket | `plugin.zip` und `marketplace.json` (M6) | Install per `claude plugin marketplace add <url>` |
| Provenienz | `*.sha256`, `sbom.cdx.json` (M8); GitHub-Attestierung vorbereitet, aber nur für öffentliche Repos verfügbar | Prüfbar mit `shasum -c`; `gh attestation verify` erst nach Veröffentlichung des Repos |
| CI | Job `skill-quality`: `skills-ref`-Validierung und Cisco-Skill-Scanner ab HIGH rot; BMAD informativ (M9, M10) | Skill-Text wird vor dem Merge geprüft |
| CI | Deploy zusätzlich nach grünem CI auf `main`; Versionsarchiv `versions/<v>/`; `force_orphan` (E6, M7) | Fixes sind nach Minuten live, nicht nach 24 Stunden |
| Tools | `bmad-method@6.11.0` gepinnt; `bump-bmad.yml` öffnet wöchentlich einen PR bei neuer Version; `uv` als Tool (E3, M14) | Kein ungepinnter Fremdcode mehr bei jedem Install |
| Repo | `_bmad/`-Laufzeit und `.claude/skills/bmad-*` nicht mehr versioniert (E4) | Eine Wahrheit: der Bootstrap installiert BMAD |
| Messung | `measure-discipline.sh --otel <datei>`; `evals/evals.json` für den Router (M11, M10) | Zweite Messquelle, Eval-Grundlage |
| Doku | `SECURITY.md`; README-Tabellen für Komponenten und Enforcement korrigiert | Bedrohungsmodell und ehrliche Enforcement-Aussagen |

## Entscheidungen

- **M15 Spec Kit:** Version 1.0.4 ist non-interaktiv installierbar
  (`specify init --here --force --non-interactive --integration claude --script sh`).
  Es wird **nicht** verdrahtet: es schreibt eigene Skills nach
  `.claude/skills` und belastet die Vendor-Reserve des Rosters. Prüfung
  erneut, wenn Spec Kit eine Installation ohne Skill-Kopie anbietet.
- **Cursor-Hooks:** Cursors `beforeSubmitPrompt` kann laut Doku keinen
  Kontext injizieren. Ein Seed könnte nur blockieren, nie erinnern.
  Deshalb kein Cursor-Hook-Seed.
- **Provenienz-Gate:** Das Validierungs-Gate prüft die Form der
  Digest-Dateien und der SBOM sowie den Marketplace-Digest gegen
  `plugin.zip`. Es hasht nicht jedes Artefakt ein zweites Mal; die
  Digests entstehen im Compiler aus denselben Bytes, die er schreibt.
- **Catch-all-Regeln:** Regeln mit Glob `**/*` bleiben in Claude Code,
  Copilot, Kiro und Devin Skills. Als Pfadregel wären sie always-on und
  würden das Kontextbudget sprengen.

- **Deferred Work:** Alle acht Polier-Punkte vom 2026-09-01 und die
  Compiler-Aufräumpunkte C1 bis C6 sind am 2026-09-03 entschieden; sechs
  Punkte sind umgesetzt, die übrigen bleiben mit Begründung so
  (`_bmad-output/implementation-artifacts/deferred-work.md`).
- **Repo bleibt privat:** die Planungsartefakte sind Arbeitsmaterial des
  Owners. Deshalb keine GitHub-Attestierung; SBOM und Digests decken den
  Korruptionsfall.

## Abhängigkeiten (gepinnt)

| Abhängigkeit | Version | Ort |
|---|---|---|
| bmad-method (npm) | 6.11.0 | `targets.json` |
| skills-ref (PyPI) | 0.1.1 | `ci.yml` |
| cisco-ai-skill-scanner (PyPI) | 2.0.14 | `ci.yml` |
| actions/checkout | v7.0.1 (SHA-Pin) | Workflows |
| actions/setup-python | v7.0.0 (SHA-Pin) | Workflows |
| peaceiris/actions-gh-pages | v4.1.0 (SHA-Pin) | `deploy.yml` |
| Python (CI) | 3.12 | Workflows |

## Konfiguration, die der Build liest

| Schlüssel | Herkunft | Wert |
|---|---|---|
| `GITHUB_REPOSITORY` | GitHub Actions | leitet die Base-URL ab; lokal Platzhalter |
| `GITHUB_TOKEN` | GitHub Actions | Deploy auf `gh-pages`, PR im Bump-Workflow |
| `RULES_*` | Installer-Umgebung | siehe README |

## Rollback

Dauer: etwa 20 Minuten (davon 15 Minuten CI und Deploy).

Ein `git revert -m 1` des Merge-Commits scheitert an Konflikten, weil
danach weitere Commits dieselben Dateien angefasst haben (Probe
2026-09-03: 16 Konfliktdateien). Der Rollback stellt deshalb den
Baum vor dem Merge als einen neuen Commit wieder her:

1. Branch anlegen und den alten Baum anwenden:
   ```sh
   git checkout -b rollback-1.3.0 main
   git diff --binary main 0153951 | git apply
   git add -A && git commit -m "rollback: Stand 0153951 (v1.2.0)"
   git push -u origin rollback-1.3.0
   ```
   Erwartete Ausgabe: `git diff --stat 0153951 HEAD` nennt nur die
   Memlog-Dateien der Spec. Nennt es Quellcode, ist `main` nicht der
   erwartete Stand: `git log --oneline -5` prüfen.
2. Pull Request öffnen und mergen. Erwartete Ausgabe: das CI-Gate ist
   grün. Bleibt es rot, den Lauf-Log lesen: das Test-Gate nennt die Datei.
3. Der Deploy startet nach dem Merge von selbst (`workflow_run`).
   Erwartete Ausgabe: `manifest.json` ohne `registry_version`, `public/`
   ohne `plugin.zip`. Bleibt der Lauf rot, `gh run view <id> --log-failed`.
4. In betroffenen Projekten den normalen Install erneut ausführen.
   Erwartete Ausgabe: `install complete: 144 artifact(s)`. Die neuen
   Komponenten-Dateien (`.claude/rules`, `.kiro`, `.devin`, `GEMINI.md`,
   Hook-Seeds) bleiben liegen; wer sie loswerden will, löscht sie von
   Hand, ein Uninstall lässt Seeds absichtlich stehen.

Keine Datenmigration. Kein Reverse-Skript nötig.

**Rollback-Probe:** 2026-09-03, gegen einen Worktree von `main` mit dem
Rezept oben. Schritt 1 dauerte 6 Sekunden, der Compile des alten Stands
lief grün (162 Dateien, 0 FAIL), ein Install aus dem lokal bedienten
alten Baum in ein leeres Projekt lief grün (144 Artefakte). Schritte 2
und 3 wurden nicht gegen Pages ausgeführt; sie entsprechen dem normalen
Merge-Deploy-Pfad, der an diesem Tag viermal grün lief.

## Reproduzierbarkeit

`python3 src/compile_rules.py` zweimal auf demselben Commit erzeugt
denselben Baum bis auf den Zeitstempel in `index.html`. `plugin.zip` ist
byte-identisch (feste Zeitstempel im Archiv, sortierte Namen); ein Test
pinnt das.

## Bekannte Punkte

- Der erste Deploy nach dem Merge (Lauf 33734765576) scheiterte am
  Attestierungs-Schritt: GitHub bietet Build-Provenienz privaten Repos
  nicht an. Der Schritt wurde entfernt; SBOM und Digests bleiben.
- GitHub Pages liefert keinen Pfad mit einem `.github`-Segment aus
  (404 trotz Datei im Branch und `.nojekyll`; peaceiris schließt
  `.github` zusätzlich per Default vom Publish aus). Lösung: das
  Registry-Feld `publish_rewrites` (`.github` wird als `github-dir`
  ausgeliefert); Manifest und Install behalten den echten Pfad, der
  Installer macht die Umschreibung je Download rückgängig.
- Das Archiv `versions/1.3.0/` stammte vom Deploy vor diesem Fix und
  war deshalb nicht installierbar. Der Archiv-Schritt erneuert jetzt
  das Archiv der gerade veröffentlichten Version bei jedem Deploy;
  ältere Versionen bleiben unangetastet.

- Der Global-Budget-Drop `token-efficient-commands (rtk)` bestand seit
  dem KISS-Prinzip vom 2026-09-02. Die rtk-Regel ist auf 17 Wörter
  gekürzt; die Always-on-Datei steht bei 199 von 199 Wörtern. Ein Test
  macht jeden künftigen Drop im Repo-Compile rot.
- Die Rollback-Probe lief 2026-09-03 gegen einen Worktree (siehe oben),
  nicht gegen Pages. Die nächste Probe gegen Pages ist beim nächsten
  Release fällig.
