# Release-Record 1.6.0 — Autonom heißt autonom, offene Punkte gelöst

Datum: 2026-09-06. Version `1.6.0` in `pyproject.toml`. Commit-Hash:
siehe Merge-Commit des Pull Requests. Ausgeliefert nach dem Merge durch
`deploy.yml`.

## Was sich ändert

Der Owner hat zwei Dinge verlangt: die offenen Punkte aus 1.5.0 nach
bestem Handwerk lösen, und die Autonomie-Regel schärfen. "Geld, Recht,
Marke und Deploy-Ziel bleiben beim Menschen" war ihm zu schwach: Die KI
soll dafür immer die besten Vorschläge liefern, und im Vollautonom-Modus
selbst entscheiden.

| Bereich | Änderung | Wirkung für Nutzer |
|---|---|---|
| Skill `idea-to-production` | Vollautonom hält nicht mehr an. Für Geld, Recht, Marke und Deploy-Ziel kommen immer die besten Vorschläge zuerst (günstigstes lauffähiges Ziel, passende Lizenz, freier Name). Im Dialog wählt die Person, vollautonom nimmt die KI die empfohlene Option und protokolliert sie in `STATE.md`. Stopp nur bei physischer Blockade: Passwort, Zahlungsart, Unterschrift | "Komplett autonom" bedeutet: bis zum Betrieb ohne Rückfrage; jede Entscheidung steht in der Datei und lässt sich umdrehen |
| Cheat-Sheet | Geschichte, Modus-Tabelle und Grenzen sagen dasselbe | Keine widersprüchlichen Versprechen |
| Router | Von 75 auf 58 Zeilen gekürzt, ohne einen Trigger oder eine Phase zu verlieren; die Sprach-Zeile bleibt eine Immer-Zeile | 22 Zeilen Platz für künftige Phasen statt 5 |
| Bootstrap | Der Manifest-Parser schreibt bei "field missing" eine Diagnose auf stderr: Zeilen im Block, Bytes und Prüfsumme des Staging-Manifests, Arbeitsverzeichnis | Der nächste Fehlschlag nennt die Ursache selbst |
| Test | `test_cheat_sheet` prüft die neue Autonomie-Regel in Skill und Cheat-Sheet | Skill und Seite driften nicht |

## Der Flaky-Test: Ursache, Messung, Fix

**Symptom.** Zwei CI-Läufe am 2026-09-06 (34022989038 auf Python 3.14,
34023824082 auf `main`) brachen in `tests/test_bootstrap` mit "manifest
parse failed: component ... field ... missing" ab. Jeweils ein anderer
Test, jeweils ein Feld, das im Manifest steht. Beide roten Läufe
brauchten 275 bis 280 Sekunden für die Suite, grüne Läufe 418 bis 500.

**Messung.** Isoliert im Linux-Container: 0 von 50 Läufen rot. Das
ganze Bootstrap-Modul in drei parallelen Containern: 2 von 12 Läufen rot,
mit Diagnose: Block vollständig (18 Zeilen), Manifest vollständig
(42.826 Byte, gleiche Prüfsumme), trotzdem "field missing".

**Mechanismus.** Wettlauf beim Schreiben in eine Pipe. Der Parser prüfte
`printf '%s\n' "$block" | grep -q MUSTER` unter `set -o pipefail`.
`grep -q` beendet sich beim ersten Treffer und schließt die Pipe. Schreibt
`printf` danach noch, bekommt es SIGPIPE (Exit 141). Mit `pipefail` gilt
die ganze Pipeline als gescheitert, und ein vorhandenes Feld wird als
fehlend gemeldet. Auf schnellen oder belasteten Maschinen öffnet sich das
Zeitfenster; isoliert fast nie. Dieselbe Klasse: `in_list` (Komponenten-
listen), `component_required` (ein Pflicht-Baustein hätte still als
optional gelten können) und `sed | head -n 1` beim Roster.

**Fix.** Here-Strings statt Pipelines: `grep -q MUSTER <<< "$block"`.
Die Shell schreibt den Block vollständig, bevor `grep` startet; es gibt
keinen Schreiber, der SIGPIPE bekommen kann. `sed | head -n 1` wurde zu
`sed '/…/{…;p;q;}'`. Keine Toleranz wurde geweitet, kein Retry ergänzt.

**Regressionstest.** `test_component_block_larger_than_the_pipe_buffer_parses`:
ein Komponentenblock mit 4.000 Preserve-Mustern (225 KB, größer als der
Pipe-Puffer von 64 KiB) macht den Wettlauf deterministisch. Ohne den Fix
scheitert der Test immer mit "component cline field owned_dirs missing"
(aufgezeichnet vor dem Fix), mit dem Fix ist er grün.

**Messung nach dem Fix.** Dieselbe Anordnung, drei parallele Container
mit je vier Modul-Läufen: 0 von 12 rot (vorher 2 von 12). Dazu die
Regel als statischer Test: `test_no_pipeline_feeds_grep_q_under_pipefail`
lässt keine Pipeline in `grep -q` oder `head -n 1` mehr durch.

**Wo der Fehler hätte auffallen müssen.** Auf der Ebene der Shell-Regeln:
`pipefail` plus ein Leser, der früh aussteigt, ist ein bekanntes Muster.
Es fehlte eine Regel gegen `| grep -q` hinter einem mehrzeiligen Schreiber.

## Abhängigkeiten (gepinnt)

Unverändert gegenüber 1.5.0: `bmad-method@6.12.0`, `cis=v0.3.2`,
`tea=v1.24.0`, `cisco-ai-skill-scanner==2.0.14`.

## Rollback

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

1. Branch anlegen und den Stand 1.5.0 anwenden:
   ```sh
   git checkout -b rollback-1.6.0 main
   git diff --binary main a8767e8 | git apply
   git add -A && git commit -m "rollback: Stand a8767e8 (v1.5.0)"
   git push -u origin rollback-1.6.0
   ```
   Erwartete Ausgabe: `git diff --stat a8767e8 HEAD` ist leer.
2. Pull Request öffnen und mergen. Erwartete Ausgabe: das CI-Gate ist grün.
3. Der Deploy startet nach dem Merge von selbst.
4. In betroffenen Projekten den Install erneut ausführen. Der Skill
   fällt auf die 1.5.0-Regel zurück (Vollautonom stoppt wieder bei Geld,
   Recht, Marke, Deploy-Ziel).

Keine Datenmigration. Kein Reverse-Skript nötig.
