feat: the twelve findings move to pages with a proven harvest state

Slice 4.3. Every finding is now a stolpersteine page carrying its state,
and the mapping is discharged mechanically: twelve findings in the
register's last hand-maintained revision, twelve pages naming their origin,
zero unassigned.

The states were verified against the rule text of the tags, not derived
from issue status - and that turned up two errors in my own Gate-2 mapping.
FB-06 was listed as open; the framework had actually split the combined
item and closed that half as issue 0028 in v0.1.3, whose WORKFLOW.md
carries "Name what this work made false" verbatim. FB-09 and FB-11 were
listed as open too; v0.3.0 covers them partly through the ledger and the
ladder's trace duty, so they are `partly` with the version named.

Two are `declined`: the framework considered them and will not cover them,
so they remain ours. That state exists because writing `open` for a decided
matter is the failure class this undertaking exists to clear.

The texts are not edited. They came out of git at the register's last
revision and moved unchanged; only repo-relative links were rewritten,
because inline links resolve against the file.

Also done: the duplicated half of the ADR rule is gone from the project
section - permanent exceptions have been upstream since v0.1.2 - and three
descriptions that still called the register an inbox now describe the
pages, the generated overview and the signpost.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F2Q4Ri8NGwyTZzScvKnWFM
This commit is contained in:
Thore Cimbal
2026-08-21 12:00:00 +00:00
co-authored by Claude Opus 5
parent fe5286c420
commit 9ca5ec3b6d
18 changed files with 542 additions and 18 deletions
+11 -7
View File
@@ -171,9 +171,10 @@ Ohne Lab-Zugang: dieses Repo ist als Push-Mirror unter
`in-progress` vergibt **nur sorb**; Sessions bilden ab (`waiting` mit
`wartegrund`, Erledigtes `done` mit Begründung im Issue-Commit),
sagen aber nichts zu.
- **ADR-Pflicht** bei Architektur-/Prozessentscheidungen und **jeder
dauerhaften Ausnahme von einer Regel** — eine Ausnahme nur zu
dokumentieren statt sie zu entscheiden, ist ein Fehler.
- **ADR-Pflicht** bei Architektur- und Prozessentscheidungen. Die zweite
Hälfte dieser Regel — dauerhafte Ausnahmen brauchen eine Entscheidung,
nicht nur eine Notiz — steht seit v0.1.2 im Upstream-Teil oben
(§1, *Exceptions need decisions*) und wird hier nicht wiederholt.
### Prüfungen
@@ -205,10 +206,13 @@ dadurch **sechs** AARs auf einmal, alle nachträglich geschrieben.
⚠️ Kein Werkzeug erzwingt sie. Sie hängt an der Aufmerksamkeit dessen, der ausrollt.
**Wiederkehrende Fehlerklassen und Abweichungen vom Verfahren** gehören in
[FRAMEWORK-BEFUNDE.md](FRAMEWORK-BEFUNDE.md) — die Eingangsliste für die Framework-Ernte.
Dort steht, was aus mehreren Issues und AARs als **Muster** hervorgeht, damit die nächste
neckbeard-Iteration es abdecken kann. Vor dem Vorschlagen von Optionen gehört sie zu den
**Wiederkehrende Fehlerklassen und Abweichungen vom Verfahren** bekommen je eine
Seite unter `docs/wiki/stolpersteine/` mit `status` und, wo zutreffend, `harvested_in`
(ADR-0009 des Rahmenwerks) — dort steht, was aus mehreren Issues und AARs als **Muster**
hervorgeht, damit die nächste neckbeard-Iteration es abdecken kann. ⚠️ `harvested` nur,
wenn eine **veröffentlichte** Version es abdeckt; übergeben ist nicht geerntet. Die
geclusterte Übersicht erzeugt `gen_status.py` nach [STATUS.md](STATUS.md);
[FRAMEWORK-BEFUNDE.md](FRAMEWORK-BEFUNDE.md) ist nur noch der Wegweiser dorthin. Vor dem Vorschlagen von Optionen gehört sie zu den
Dokumenten, die man gelesen hat (§4).
### Secrets & Credentials
+1 -1
View File
@@ -7,7 +7,7 @@ als Wiki-Seiten unter [docs/wiki/stolpersteine/](docs/wiki/index.md)
— eine Seite je Muster, mit Stand und, wo zutreffend, der Version,
die es abdeckt (ADR-0009 des Rahmenwerks).
**Die geclusterte Übersicht steht in [STATUS.md](STATUS.md)**, Abschnitt *Fehlerklassen*: 2 offen, 0 teilweise, 1 geerntet, 0 nicht abgedeckt.
**Die geclusterte Übersicht steht in [STATUS.md](STATUS.md)**, Abschnitt *Fehlerklassen*: 5 offen, 3 teilweise, 4 geerntet, 2 nicht abgedeckt.
Diese Datei hält keinen eigenen Bestand mehr. Sie bleibt als
Wegweiser bestehen, weil angenommene Entscheidungen auf sie
+2 -2
View File
@@ -35,8 +35,8 @@ GitLab-Issue-Template. **Alle Issues leben auf git.lab.**
| [`schema.yaml`](schema.yaml) | Frontmatter-Schema — einzige Wahrheit über den Aufbau der Artefakte |
| [`STATUS.md`](STATUS.md) | Generierte Übersicht; **nicht von Hand ändern** (`scripts/gen_status.py`) |
| `roadmap.md` | Linien, Meilenstein-Kandidaten, Kadenz — die Gruppen-Milestones halten den Stand |
| [`FRAMEWORK-BEFUNDE.md`](FRAMEWORK-BEFUNDE.md) | Wo das Verfahren nicht getragen hat — Eingangsliste für die Framework-Ernte |
| `docs/adr/` | ADRs — Pflicht bei Architektur-/Prozessentscheidungen **und dauerhaften Ausnahmen** |
| [`FRAMEWORK-BEFUNDE.md`](FRAMEWORK-BEFUNDE.md) | Erzeugter Wegweiser; die Fehlerklassen liegen als Seiten in `docs/wiki/stolpersteine/`, die Übersicht in [`STATUS.md`](STATUS.md) |
| `docs/adr/` | ADRs — Pflicht bei Architektur- und Prozessentscheidungen; für dauerhafte Ausnahmen gilt dieselbe Pflicht aus dem Upstream-Teil von [`AGENTS.md`](AGENTS.md) |
| `docs/issues/` | Das kanonische Backlog der ganzen Gruppe ([ADR-0012](docs/adr/0012-issues-im-repo-gitlab-als-spiegel.md), [ADR-0019](docs/adr/0019-komponenten-issues-adoptiert.md)) |
| `docs/design/`, `docs/aar/` | Design-Dokumente je Vorhaben; AARs zu Vorfällen und größeren Abweichungen |
| `docs/components/` | Eine Datei je Projekt der Gruppe — wer hier fehlt, wird zum Befund |
+20 -3
View File
@@ -131,17 +131,34 @@ Bedeutung der Meilensteine: siehe [roadmap.md](roadmap.md).
- [AAR — Game-Host-Anbindung: Deploy über zwei Übergaben, Ursache war nie die Firewall](docs/aar/2026-08-20-game-host-anbindung.md)
- [AAR — rohana lief voll, der ThreadNet-Web-Spiegel riss](docs/aar/2026-08-20-rohana-platte-voll-spiegel-gerissen.md)
## Fehlerklassen (5)
## Fehlerklassen (16)
### offen (2)
### offen (5)
- [Die AAR-Pflicht setzt sich ohne Werkzeug nicht durch](docs/wiki/stolpersteine/aar-pflicht-ohne-werkzeug.md)
- [Prüfungen erzeugen Befunde, die niemand beheben kann](docs/wiki/stolpersteine/befunde-die-niemand-beheben-kann.md)
- [Issues behaupten Zustände, die längst überholt sind](docs/wiki/stolpersteine/issues-behaupten-ueberholte-zustaende.md)
- [Eine Datei kann nicht maßgeblich und zugleich unveränderlich sein](docs/wiki/stolpersteine/massgeblich-aber-unveraenderlich.md)
- [Eine Quittung bezeugt Aufmerksamkeit, nicht Vollständigkeit](docs/wiki/stolpersteine/quittung-bezeugt-aufmerksamkeit.md)
### geerntet (1)
### teilweise gedeckt (3)
- [Gelesene Anweisungen werden nicht befolgt](docs/wiki/stolpersteine/gelesene-anweisungen-nicht-befolgt.md) — neckbeard v0.3.0
- [Regeln ohne maschinellen Widerspruch werden nicht befolgt](docs/wiki/stolpersteine/regeln-ohne-widerspruch.md) — neckbeard v0.3.0
- [Der Upgrade-Pfad ins Rahmenwerk war beschrieben, nie begangen](docs/wiki/stolpersteine/upgrade-pfad-nie-begangen.md) — neckbeard v0.3.1
### geerntet (4)
- [Dashboards und Prüfungen ohne Datenbeleg](docs/wiki/stolpersteine/artefakt-existiert-liefert-aber-nichts.md) — neckbeard v0.1.3
- [Dokumente werden ergänzt, aber nicht revidiert](docs/wiki/stolpersteine/dokumente-ergaenzt-nicht-revidiert.md) — neckbeard v0.1.3
- [Gesperrte Dateien werden bearbeitet](docs/wiki/stolpersteine/gesperrte-dateien-werden-bearbeitet.md) — neckbeard v0.2.0
- [„Meldet Erfolg, ist aber blind" — die häufigste Fehlerklasse dieses Projekts](docs/wiki/stolpersteine/meldet-erfolg-ist-aber-blind.md) — neckbeard v0.1.3
### vom Rahmenwerk nicht abgedeckt — bleibt unseres (2)
- [Dokumente werden angelesen, nicht durchgelesen](docs/wiki/stolpersteine/dokumente-angelesen-nicht-durchgelesen.md) — neckbeard v0.1.3
- [Werkzeuge messen unbemerkt die falsche Instanz](docs/wiki/stolpersteine/werkzeug-misst-die-falsche-instanz.md) — neckbeard v0.1.3
### ohne Ernte-Stand (2)
- [Stolpersteine aus der neckbeard-Migration (2026-08-11)](docs/wiki/stolpersteine/neckbeard-migration.md)
@@ -17,7 +17,8 @@ related:
| 2 | afaa74a | sorb | DONE | Auflage erfuellt: Regeln vollstaendig uebernommen, inhaltlicher Rest offen. Option A gewaehlt. |
| 3 | b179246 | sorb | DONE | Ausfuehrung von A angepasst (Wegweiser statt Loeschung); Enum auf Einwand um `declined` erweitert. |
| 4.1 | 0a95437 | sorb | DONE | Tracer Bullet: Schema, Generator, eine Seite. Acht Kontrollen gefahren, davon sieben absichtliche Brueche. |
| 4.2 | | sorb | DONE | Schema-Deckung als Widerspruch zum Handabgleich; zwei Befundseiten fuer die naechste Ernte. 16 Zusicherungen, sechs Brueche. |
| 4.2 | fe5286c | sorb | DONE | Schema-Deckung als Widerspruch zum Handabgleich; zwei Befundseiten fuer die naechste Ernte. 16 Zusicherungen, sechs Brueche. |
| 4.3 | | sorb | DONE | Elf Befunde umgezogen, Ernte-Stand je Seite belegt; doppelte Regel aus AGENTS.md entfernt, drei Beschreibungen nachgezogen. |
## Ladder
@@ -34,9 +35,18 @@ related:
| `apply_rules()` in `validate.py`, für die Beleg-Pflicht bei entschiedenen Ständen | vier Regeln nach demselben Muster, u. a. `waiting_requires_reason` | reused: eine fünfte Regel im selben Schalter, kein eigener Prüfer | |
| `pruefe_upstream_drift.py`, bevor ein eigener Schema-Vergleicher entsteht | prüft bereits Baselines, Zuordnung und Abgleichs-Quittung — nur nicht den Inhalt der erweiterten Dateien | reused: fünfte Prüffunktion im selben Skript samt dessen Selbsttest, kein neues Werkzeug | |
| `FRAMEWORK-BEFUNDE.md`, wohin die zwei neuen Befunde gehören | seit heute erzeugter Wegweiser ohne Bestand; Muster leben als Wiki-Seiten (ADR-0009) | built: zwei `stolpersteine`-Seiten — der erste Einsatz des neuen Mechanismus | |
| die Befundtexte, bevor sie für die Seiten neu geschrieben werden | vollständig in der Historie des Registers (`b179246`) | reused: aus git gezogen und unverändert übernommen, nur Links umgebogen — Redigieren war Gate-1-Nichtziel | |
| Ernte-Stände, bevor sie aus dem Issue-Status geschlossen werden | die Regeltexte der Tags selbst: v0.1.3 trägt zwei Regeln wörtlich, v0.2.0 `check_locked.py`, v0.3.0 Ledger und Spurenpflicht | reused: am Tag-Stand nachgeprüft statt abgeleitet — dabei fiel auf, dass Issue 0028 FB-06 abdeckt | |
## Notes
**Zwei Zuordnungen aus Gate 2 waren falsch und sind korrigiert.** FB-06 galt
dort als offen — tatsächlich hat das Rahmenwerk das Sammel-Item aufgeteilt
und die Hälfte als Issue 0028 in v0.1.3 erledigt. FB-09 und FB-11 galten als
offen; v0.3.0 deckt sie über Ledger und Spurenpflicht teilweise ab. Beides
kam nur heraus, weil die Stände am Regeltext der Tags geprüft wurden und
nicht am Issue-Status.
**Die neue Prüfung hat beim Bauen zweimal etwas über sich selbst gelernt.**
Erst brach sie den bestehenden Selbsttest, weil dessen Fixture `schema.yaml`
als Prosa schrieb — genau die unrealistische Fixture, die FB-12 für dieses
@@ -0,0 +1,41 @@
---
type: wiki-page
area: stolpersteine
status: open
---
# Die AAR-Pflicht setzt sich ohne Werkzeug nicht durch
> **Stand: offen.** Bis zum 2026-08-21 als **FB-01** im Befundregister gefuehrt, am 2026-08-20 an das Rahmenwerk uebergeben.
> **Beleg:** Issue 0020 des Rahmenwerks ist offen.
**Beschreibung.** `roadmap.md` verlangt einen AAR nach jedem Deploy mit Übergabe und nach
Incidents. Zwischen dem 17. und 20.08.2026 gab es **sechs** solche Ereignisse. Geschrieben
wurde zunächst **keiner**; alle sechs entstanden nachträglich auf Nachfrage von sorb.
**Ursachen-Einschätzung.** Nicht Nachlässigkeit, sondern eine strukturelle Asymmetrie:
Im selben Zeitraum wurde **kein einziges Mal** vergessen, was ein Werkzeug prüft —
Frontmatter (`validate.py`), `STATUS.md` (`gen_status --check`), Spiegel
(`spiegel_issues.py`), Commit-Konvention (`gruppenpruefung.py`). Der Unterschied ist, **wer
widerspricht**. Der AAR-Pflicht widerspricht niemand.
Verschärfend war: Die Regel stand nur in `roadmap.md`, nicht in `AGENTS.md` — und auf
`AGENTS.md` verweist jedes `CLAUDE.md`. Wer nur der Zeigerkette folgte, fand die Pflicht
nicht.
**Teilweise behoben 2026-08-20** (Entscheidung sorb): `AGENTS.md` trägt im Projektabschnitt
jetzt den Abschnitt „Nach Deploys und Vorfällen" mit der AAR-Pflicht und dem Verweis auf
diese Datei. ⚠️ Das schließt die Wissenslücke, **nicht** die Durchsetzungslücke — kein
Werkzeug erzwingt die Pflicht, und genau das steht dort auch ausdrücklich.
**Belege.** `docs/issues/0040-*` (Rückmeldung), sechs AARs vom 17.–20.08.
**Vorschlag für die nächste Iteration.** Entweder eine Prüfung, die geschlossene Vorfälle
und Deploy-Übergaben ohne zugehörigen AAR meldet — dafür bräuchte es ein maschinell
lesbares Merkmal „war ein Vorfall" am Issue. Oder die ehrliche Alternative: Wenn eine Regel
dauerhaft nur auf Nachfrage befolgt wird, ist zu prüfen, ob die Schwelle stimmt. Sechs
AARs in vier Tagen sind viel.
➡️ Die hier vermutete Asymmetrie ist am 2026-08-20 über den **gesamten** Regelsatz
nachgemessen worden und hat sich bestätigt: **FB-11**.
Dieser Befund bleibt als Einzelfall gültig; FB-11 trägt die Regelmäßigkeit.
@@ -0,0 +1,24 @@
---
type: wiki-page
area: stolpersteine
status: harvested
harvested_in: "neckbeard v0.1.3"
---
# Dashboards und Prüfungen ohne Datenbeleg
> **Stand: geerntet.** Bis zum 2026-08-21 als **FB-05** im Befundregister gefuehrt, am 2026-08-20 an das Rahmenwerk uebergeben.
> **Beleg:** `WORKFLOW.md` in v0.1.3 traegt die Regel *„A delivering artifact owes one real result. Where the artifact's output *is* the product — a dashboard, a report, a query — acceptance quotes one observation it actually returned.“* Issue 0024, erledigt.
**Beschreibung.** `dashboards/gameserver/pterodactyl-server.json` war **drei Monate
dauerhaft leer** — es fragte Metriken eines Exporters ab, der nie funktioniert hat.
Niemandem ist es aufgefallen. Dasselbe Muster beim ClamAV-Dashboard: Der Vorschlag im Issue
nutzte ein Label, das in dieser Loki gar nicht existiert.
**Ursachen-Einschätzung.** Ein Dashboard gilt als fertig, wenn es angelegt ist. Es gibt
keine Abnahme „liefert Daten". Ein leeres Panel sieht aus wie „gerade nichts los" und ist
von „fragt Unsinn ab" nicht zu unterscheiden.
**Vorschlag.** Abnahmekriterium für jedes neue Dashboard: Jede Query wurde gegen die
laufende Instanz geprüft und hat Daten geliefert — oder es steht dabei, warum sie
berechtigt leer ist.
@@ -0,0 +1,25 @@
---
type: wiki-page
area: stolpersteine
status: open
---
# Prüfungen erzeugen Befunde, die niemand beheben kann
> **Stand: offen.** Bis zum 2026-08-21 als **FB-03** im Befundregister gefuehrt, am 2026-08-20 an das Rahmenwerk uebergeben.
> **Beleg:** Issue 0022 des Rahmenwerks ist offen.
**Beschreibung.** Am 2026-08-18 waren alle geplanten Prüfungen dauerhaft rot (25 Befunde),
womit keine mehr etwas meldete. Behoben über den Quittungsmechanismus (ADR-0020). **Zwei
Tage später kam dieselbe Klasse zurück:** Der Upstream-Merge brachte 70.265 fremde Commits,
welche die Git-Hygiene-Prüfung bemängelte — Commits, die unserer Konvention nie folgen
konnten (ADR-0023).
**Ursachen-Einschätzung.** Beim Bau einer Prüfung wird gefragt, was sie finden **soll**,
nicht, welche Befunde sie erzeugen wird, die **niemand beheben kann**. Der
Quittungsmechanismus behandelt das Symptom gut (mit Pflichtfrist), verhindert aber nicht,
dass die nächste Prüfung dieselbe Lage erzeugt.
**Vorschlag.** Bei jeder neuen Prüfung im Voraus beantworten: *Welche Befunde wird sie
erzeugen, die strukturell nicht behebbar sind?* Wenn es welche gibt, gehört die Ausnahme in
dieselbe Änderung — nicht in eine spätere Aufräumrunde.
@@ -0,0 +1,31 @@
---
type: wiki-page
area: stolpersteine
status: declined
harvested_in: "neckbeard v0.1.3"
---
# Dokumente werden angelesen, nicht durchgelesen
> **Stand: vom Rahmenwerk nicht abgedeckt.** Bis zum 2026-08-21 als **FB-08** im Befundregister gefuehrt, am 2026-08-20 an das Rahmenwerk uebergeben.
> **Beleg:** Issue 0027 des Rahmenwerks wurde mit Begruendung abgelehnt — eine Pflichtliste „gelesener Unterlagen“ waere durch Auflisten von Dateinamen erfuellt und damit Theater. Das Muster bleibt bestehen und bleibt unseres.
**Beschreibung.** `roadmap.md` wurde am 2026-08-20 **vollständig ausgegeben** — alle 94
Zeilen — um den Aufbau für eine Ergänzung zu verstehen. Die AAR-Pflicht steht dort in
Zeile 94 und war seit dem 2026-08-12 unverändert vorhanden. Sie wurde nicht gesehen.
Anschließend wurde dieselbe Datei **bearbeitet**, ohne dass die Regel auffiel — und
sechsmal verletzt.
Dasselbe Muster mehrfach am selben Tag: Der Kommentar in der `.npmrc` sagt den
404-Fehlschlag wörtlich voraus; gelesen wurde er **nach** dem Fehlschlag. Der Kommentar in
`docker-compose.yml` erklärt, dass der Verzeichnis-Mount die Inode-Falle bereits beseitigt;
trotzdem wurde `--force-recreate` in zwei Übergaben weitergetragen.
**Ursachen-Einschätzung.** Dokumente werden als **Nachschlagewerk für die gerade
anstehende Frage** behandelt, nicht als bindender Rahmen, den man vor dem Handeln
verinnerlicht. Gelesen wird, um zu *finden* — nicht, um sich zu *binden*. Deshalb bleibt
eine Regel unsichtbar, die drei Zeilen unter der bearbeiteten Stelle steht.
**Vorschlag.** Vor einer Änderung an einer Datei: deren eigenen Kopf und die Regeln zu
ihrer Gattung vollständig lesen und im Arbeitsergebnis benennen, welche davon einschlägig
waren. Das kostet Zeilen und spart Wiederholungen.
@@ -0,0 +1,24 @@
---
type: wiki-page
area: stolpersteine
status: harvested
harvested_in: "neckbeard v0.1.3"
---
# Dokumente werden ergänzt, aber nicht revidiert
> **Stand: geerntet.** Bis zum 2026-08-21 als **FB-06** im Befundregister gefuehrt, am 2026-08-20 an das Rahmenwerk uebergeben.
> **Beleg:** `WORKFLOW.md` in v0.1.3 traegt die Regel *„Name what this work made false. Ask it explicitly — which existing statement, in which artifact, does this undertaking now contradict?“* Issue 0028, erledigt — upstream aus dem gemeinsamen Item mit FB-04 herausgeloest, weil die Abhilfen verschieden sind.
**Beschreibung.** `docs/axion1337-fork.md` beschrieb nach dem Upstream-Merge weiterhin ein
Repo ohne gemeinsamen Vorfahren. `dns-soll.md` nannte einen Absender, der so nie versandte.
`monitoring/README.md` beschrieb Targets als „antworten aktuell nicht", ohne den Grund und
nach der Umstellung mit falscher Adresse.
**Ursachen-Einschätzung.** Anhängen ist billig und fühlt sich vollständig an; das
Widerlegen einer früheren Aussage kostet Mut und Aufmerksamkeit. Beim Abschluss einer
Arbeit wird gefragt „ist es dokumentiert?", nicht „welche bestehende Aussage ist dadurch
falsch geworden?".
**Vorschlag.** Beim Abschluss einer Arbeit ausdrücklich die Gegenfrage stellen und die
Antwort in der Abnahme festhalten — auch wenn sie „keine" lautet.
@@ -0,0 +1,28 @@
---
type: wiki-page
area: stolpersteine
status: partly
harvested_in: "neckbeard v0.3.0"
---
# Gelesene Anweisungen werden nicht befolgt
> **Stand: teilweise gedeckt.** Bis zum 2026-08-21 als **FB-09** im Befundregister gefuehrt, am 2026-08-20 an das Rahmenwerk uebergeben.
> **Beleg:** v0.3.0 bringt Ledger und Leiter-Spurenpflicht und macht damit sichtbar, ob eine bekannte Regel angewandt wurde. Issue 0019 ist weiterhin offen — die Durchsetzung fehlt, nur die Beobachtbarkeit ist da.
**Beschreibung.** `AGENTS.md` Zeile 81: *„`docs/adr/` — binding; never edited, only
superseded."* Die Datei war gelesen. Trotzdem wurde ADR-0022 um einen Nachtrag ergänzt,
committet und gepusht.
**Ursachen-Einschätzung.** Zwischen „gelesen" und „angewandt" fehlt der Schritt, in dem
die eigene geplante Handlung gegen die Regel gehalten wird. Die Regel war bekannt; die
Frage *„darf ich das?"* wurde vor der Handlung nicht gestellt, sondern erst, als zufällig
die Vorlage geöffnet wurde.
⚠️ Diese Klasse ist gefährlicher als FB-08: Bei FB-08 fehlt Wissen, hier ist es vorhanden
und wird nicht abgerufen. Kein Werkzeug kann das auffangen, das nicht die Absicht kennt.
**Vorschlag.** Für die kleine Zahl **harter** Verbote (ADRs nicht editieren, nicht nach
Gitea pushen, `docs/sources/` unveränderlich, `STATUS.md` nicht von Hand) eine Prüfung, die
den Verstoß im Commit findet statt im Nachhinein — etwa ein `pre-commit`-Hook oder eine
CI-Regel, die geänderte Pfade gegen eine Sperrliste hält.
@@ -0,0 +1,48 @@
---
type: wiki-page
area: stolpersteine
status: harvested
harvested_in: "neckbeard v0.2.0"
---
# Gesperrte Dateien werden bearbeitet
> **Stand: geerntet.** Bis zum 2026-08-21 als **FB-10** im Befundregister gefuehrt, am 2026-08-20 an das Rahmenwerk uebergeben.
> **Beleg:** v0.2.0 liefert `scripts/check_locked.py`; Issue 0026 erledigt, 0029 (Verdrahtung in die Pipeline) ebenfalls. Hier tut `pruefe_sperrliste.py` dasselbe (ADR-0024, bewusst nicht uebernommen).
**Beschreibung.** Commit `6652125` veränderte die angenommene ADR-0022. Der Verstoß wurde
gepusht und erst mit `6731d2a` zurückgenommen — nicht durch eine Prüfung, sondern durch
Zufall.
**Ursachen-Einschätzung.** Es gibt keine technische Sperre. `validate.py` prüft Schema und
Verweise, nicht **Bearbeitbarkeit**. Der Schutz einer bindenden Entscheidung besteht heute
ausschließlich aus einem Satz in einer Kommentarzeile der Vorlage und einer Zeile in
`AGENTS.md`.
Zum Vergleich: `STATUS.md` trägt dieselbe Art Verbot („nicht von Hand ändern") — und wurde
kein einziges Mal verletzt, weil `gen_status.py --check` widerspricht. Derselbe Befund wie
FB-01, an anderem Gegenstand.
**Umgesetzt 2026-08-20.** `scripts/pruefe_sperrliste.py`, im `validate`-Job bei jedem
Push. Gesperrt sind `docs/sources/**` und jede ADR, die vor dem Push `status: accepted`
trug; erlaubt bleibt genau die von der Vorlage vorgeschriebene Änderung — `superseded_by`
und `status` setzen, wenn eine neue ADR ablöst.
**Beide Sperren mit Positivkontrolle belegt, nicht nur gebaut:**
| Fall | Ergebnis |
|---|---|
| Commit `6652125` (mein realer Verstoß an ADR-0022) | rot, 23 beanstandete Zeilen |
| Wegwerf-Commit an `docs/sources/…/AGENTS.md` | rot |
| sauberer Commit | grün |
| ungültiger Vergleichsbereich | rot — „ungeprüft ist nicht bestanden" |
⚠️ **Beim Bau ist mir dieselbe Klasse prompt wieder unterlaufen:** Der erste `git`-Helfer
verwandelte einen Fehlschlag in einen leeren String — ein ungültiger Bereich wurde damit zu
„keine Änderungen" und **bestand stillschweigend**. Aufgefallen nur, weil der Test gegen
den Wurzel-Commit des Repos lief, der keinen Vorgänger hat. Das ist FB-02 im Werkzeug
gegen FB-10; der Fall steht als vierte Zeile in der Tabelle oben, weil er jetzt geprüft
wird.
**Nicht abgedeckt:** generierte Dateien. `STATUS.md` bleibt durch `gen_status --check`
geschützt, andere Generate haben heute keine Entsprechung.
@@ -0,0 +1,28 @@
---
type: wiki-page
area: stolpersteine
status: open
---
# Issues behaupten Zustände, die längst überholt sind
> **Stand: offen.** Bis zum 2026-08-21 als **FB-04** im Befundregister gefuehrt, am 2026-08-20 an das Rahmenwerk uebergeben.
> **Beleg:** Issue 0023 des Rahmenwerks ist offen — die andere Haelfte des urspruenglich gemeinsamen Items wurde als 0028 herausgeloest und ist erledigt, diese nicht.
**Beschreibung.** Mehrfach an einem Tag: **#0083** nannte drei Dateien als Einzeldatei-
Mounts, die längst Verzeichnis-Mounts waren. **#0088** nannte Zahlen („13 Ingress-Regeln,
ein Egress-Vorkommen"), die nicht mehr stimmten. **#0002** führte die Firewall als Ursache,
die es nie war. **#0030** trägt im Titel „Der Restore ist nie geprobt", obwohl der
Datenbank-Restore geprobt und überwacht ist.
**Ursachen-Einschätzung.** Issues sind append-only — richtig so, git ist die Historie.
Aber **Kopf und Titel bleiben stehen**, während die Anhänge sie widerlegen. Wer ein Issue
öffnet, liest zuerst die veraltete Fassung. Es gibt keine Pflicht, einen widerlegten Befund
im Kopf zu markieren.
Praktische Folge, mehrfach beobachtet: Arbeit wird auf einer Prämisse begonnen, die
inzwischen falsch ist — und muss nach dem Nachmessen umgeplant werden.
**Vorschlag.** Ein leichtgewichtiges Mittel, etwa eine `⚠️ überholt`-Zeile direkt unter dem
Titel, sobald ein Anhang die Ausgangsdiagnose widerlegt. Oder ein Feld `letzte_messung`, das
sichtbar altert.
@@ -12,7 +12,7 @@ related: []
# „Meldet Erfolg, ist aber blind" — die häufigste Fehlerklasse dieses Projekts
> **Stand: geerntet.** Bis zum 2026-08-21 als FB-02 im Befundregister geführt,
> **Stand: geerntet.** Bis zum 2026-08-21 als **FB-02** im Befundregister geführt,
> am 2026-08-20 an das Rahmenwerk übergeben. **Beleg:** neckbeard **v0.1.3**
> trägt in `WORKFLOW.md` die Regel *„A check owes proof that it can fail. A
> slice that introduces a gate, test or check shows it going red with a
@@ -0,0 +1,104 @@
---
type: wiki-page
area: stolpersteine
status: partly
harvested_in: "neckbeard v0.3.0"
---
# Regeln ohne maschinellen Widerspruch werden nicht befolgt
> **Stand: teilweise gedeckt.** Bis zum 2026-08-21 als **FB-11** im Befundregister gefuehrt, am 2026-08-20 an das Rahmenwerk uebergeben.
> **Beleg:** v0.3.0 bringt Ledger, Leiter-Spurenpflicht und `judge.py`; ADR-0010 des Rahmenwerks verlangt seither von jeder neuen Regel eine Antwort auf *„welche Spur hinterlaesst sie?“* Das macht Regeltreue beobachtbar, nicht erzwingbar — Issue 0019 ist offen.
**Anlass.** sorb fragte am 2026-08-20: *„was ist eigentlich mit ponytail? das sollte ja
auch eigentlich im framework stehen und dir vorgegeben sein. es scheint nicht verwendet zu
werden."* Die Frage traf zu. Beim Nachmessen zeigte sich, dass ponytail nur der Punkt ist,
an dem das Muster sichtbar wurde.
**Was ponytail ist.** Die Entscheidungsleiter in `AGENTS.md` §1, Zeile 26–29:
> Before writing new code, stop at the first rung that holds: needed at all? → codebase
> already has it? → stdlib? → platform-native? → installed dependency? → one line? → only
> then: the minimum that works. **(Ladder after ponytail, MIT.)**
Sie steht in `AGENTS.md` **und** byte-gleich in der Baseline
[`docs/sources/upstream/neckbeard-v0.1.1/AGENTS.md`](../../sources/upstream/neckbeard-v0.1.1/AGENTS.md)
— also in der Datei, die in jede Session geladen wird. In den Sitzungen vom 17.–20.08.2026
wurde sie **kein einziges Mal genannt und an keiner Stelle nachweislich bestiegen.**
**Die Messung.** `AGENTS.md` §1/§3 zerfällt in zwei Sorten Regeln, und die Befolgung folgt
nicht der Regel, sondern dem Werkzeug:
| Regel | Widerspruch im Werkzeug | Befolgung |
|---|---|---|
| Frontmatter nach `schema.yaml` | `validate.py` | nie verletzt |
| `STATUS.md` nicht von Hand | `gen_status.py --check` | nie verletzt |
| Baseline byte-treu | `pruefe_upstream_drift.py` | nie verletzt |
| WIP-Limit 2, ein Meilenstein je Issue | `validate.py` / `schema.yaml` | nie verletzt |
| Tote Verweise, SHA-Zitate | `pruefe_prosa.py` | nie verletzt |
| Commit-Konvention, Identitäten | `gruppenpruefung.py` | nie verletzt |
| **ponytail-Leiter (§1)** | **keiner** | **nie angewandt** |
| **Schlussstatus `DONE`/`DONE_WITH_CONCERNS`/`NEEDS_CONTEXT`/`BLOCKED` (§1)** | **keiner** | **nie benutzt** |
| **Größenklasse S/M/L am Aufgabenbeginn (§3)** | **keiner** | **nie vorgeschlagen** |
| **„Every changed line must trace directly to the request" (§3)** | **keiner** | verletzt (Rüge sorb, 20.08.) |
| Angenommene ADRs nie editieren | keiner → seit 20.08. `pruefe_sperrliste.py` | verletzt (FB-09/FB-10) |
| AAR-Pflicht | keiner | 6× verletzt (FB-01) |
**Belege für die drei „nie"-Zeilen.**
- Die vier Pflicht-Status kommen im ganzen Repo ausschließlich in den Regeldateien selbst
vor (`AGENTS.md`, `WORKFLOW.md`, `docs/design/template.md`) und in deren
Baseline-Kopien — **in keinem einzigen Arbeitsergebnis**.
- Größenklassen: dasselbe Bild, nur Regeltext (`AGENTS.md` §3, `WORKFLOW.md`, `README.md`).
- `WORKFLOW.md` verlangt für **L** („new feature, multiple files or sessions, real
decisions") ein Design-Dokument mit Gates 1–5. In `docs/design/` liegt **genau eines**,
vom 2026-08-11 — die neckbeard-Migration selbst. Seither ohne Design-Dokument gelaufen:
der Upstream-Merge mit 70.265 Commits, Release v0.6.0, das typecheck-Tor, die
Egress-Sperre über zehn Workloads, die Game-Host-Anbindung. `PROJECT.md` gewährt nur die
**S**-Ausnahme; „M und L stoppen immer" steht dort wörtlich.
**Ursachen-Einschätzung.** Ausnahmslos jede Regel mit maschinellem Widerspruch wurde
eingehalten. Ausnahmslos jede Regel ohne einen wurde gebrochen oder ignoriert. Das ist
keine Sammlung von Einzelnachlässigkeiten, sondern ein Gefälle, dem die Arbeitsweise
folgt. **FB-01** hat den
Mechanismus an einem Gegenstand vermutet; neu ist hier, dass er über den **gesamten**
Regelsatz gilt — und dass er auch dort greift, wo Wissen und Absicht vorhanden sind
(**FB-09**).
Er erklärt zugleich, warum FB-10 funktioniert hat: nicht weil die Regel neu formuliert
wurde, sondern weil ihr seit dem 20.08. ein Skript widerspricht.
⚠️ **Der strukturelle Zusatz — und der eigentliche Grund, warum das hierher gehört:** Die
unbewachten Regeln stehen sämtlich in §1–§5, dem **byte-treuen Baseline-Teil**. Dieses
Projekt kann dort keine Durchsetzung nachrüsten, ohne `pruefe_upstream_drift.py` zu
brechen. Was hier fehlt, kann das Projekt nicht selbst beheben — es muss aus der nächsten
neckbeard-Iteration kommen.
**Warum hier kein Skript vorgeschlagen wird.** Die Leiter auf sich selbst angewandt, erste
Sprosse *„needed at all?"*: Die gebrochenen Regeln sind Urteilsregeln („ist das die
einfachste Lösung?", „welche Größenklasse?"). Ein Skript kann Urteil nicht prüfen, nur
Rituale zählen — und eine Prüfung, die Rituale zählt, erzeugt Befunde, die niemand beheben
kann (**FB-03**).
**Vorschlag für die nächste Iteration.** Zwei Ansätze, die *ohne* Urteilsprüfung
auskommen, beide berühren `AGENTS.md`/`WORKFLOW.md` und damit die Baseline — Entscheidung
sorb im Refinement:
1. **Größenklasse als Artefakt statt als Ansage.** Wenn die Klasse irgendwo im Frontmatter
landet, kann `validate.py` für L das Design-Dokument einfordern. Heute ist sie ein
Satz im Chat und damit spurlos.
2. **Die Schwelle prüfen statt die Disziplin.** Wenn Gates über Monate nur auf Nachfrage
durchlaufen werden, ist die zweite Erklärung, dass sie für diesen Betrieb zu eng
geschnitten sind. Das ist ausdrücklich keine Entlastung — aber es zu messen ist
ehrlicher, als die Regel ein weiteres Mal zu wiederholen.
**Entschieden am 2026-08-20 (sorb):** Größenklasse und Schlussstatus werden ab sofort
mitgeführt — die Verhaltensseite ist damit geklärt. ⚠️ Der Befund bleibt trotzdem `offen`:
Die Durchsetzungslücke besteht unverändert, denn genau das war schon vorher die Regel. Was
sich geändert hat, ist die Aufmerksamkeit, nicht der Mechanismus — und FB-01 zeigt, wie
lange das trägt.
Was **nicht** hilft: die Regel nochmals irgendwohin schreiben. Sie steht bereits an zwei
Stellen, und beide wurden gelesen — siehe
[„Meldet Erfolg, ist aber blind"](meldet-erfolg-ist-aber-blind.md)
für die verwandte Klasse und **FB-08**.
@@ -0,0 +1,112 @@
---
type: wiki-page
area: stolpersteine
status: partly
harvested_in: "neckbeard v0.3.1"
---
# Der Upgrade-Pfad ins Rahmenwerk war beschrieben, nie begangen
> **Stand: teilweise gedeckt.** Bis zum 2026-08-21 als **FB-12** im Befundregister gefuehrt, nie uebergeben.
> **Beleg:** Punkt 1 ist im Rahmenwerk behoben: v0.3.1 fuehrt die `vendored`-Liste und weist repo-relative Verweise im Upstream-Teil zurueck. Die Punkte 2 und 3 sind hier behoben, nicht oben — deshalb teilweise.
**Beschreibung.** Am 2026-08-21 wurde die Baseline zum ersten Mal seit der Migration
angehoben: v0.1.1 → v0.3.1, drei Minor-Stände auf einmal. Das Verfahren dafür steht in
`AGENTS.md` §5 und galt seit dem 2026-08-13 als erledigt — die entsprechende
Rahmenwerks-Frage wurde damals mit v0.1.2 geschlossen. **Beim ersten wirklichen Versuch
scheiterte es an drei Stellen:**
1. **`WORKFLOW.md` ließ sich nicht byte-genau übernehmen.** Seit neckbeard v0.1.3 verweist
es auf ADRs des Rahmenwerks selbst; seit v0.3.0 auf eine zweite. Diese Dateien gibt es
hier nicht und wird es nie geben — unsere ADRs tragen eigene Nummern und eigene Inhalte.
`validate.py` meldete zwei tote Verweise. Die Wahl war: rotes Tor oder gebrochene Kopie.
2. **`scripts/pruefe_sperrliste.py` verbot das Upgrade selbst.** `docs/sources/` ist
unveränderlich, und ein Upgrade muss dort zwingend eine neue Baseline anlegen. Die
Prüfung las `git diff --name-only` und konnte einen **Zugang** nicht von einer
**Änderung** unterscheiden: 17 gemeldete Verstöße für einen völlig korrekten Vorgang.
3. **Die drei erklärt-erweiterten Dateien mussten von Hand abgeglichen werden.**
`schema.yaml`, `scripts/validate.py` und `scripts/gen_status.py` stehen laut
`HERKUNFT.md` bewusst außerhalb des Byte-Vergleichs. Also meldet auch nichts, wenn
upstream sie ändert. Nur ein Diff `v0.1.1..v0.3.1` zeigte, dass zwei von ihnen betroffen
waren.
**Ursachen-Einschätzung.** Eine gemeinsame Wurzel: **Das Verfahren war beschrieben und nie
ausgeführt.** Drei Minor-Stände lang hat niemand die Probe gemacht, und jede der drei
Stellen ist genau die Sorte Fehler, die nur beim Ausführen sichtbar wird.
Punkt 1 ist im Rahmenwerk selbst **unsichtbar**: Dort lösen beide Verweise auf, seine
eigene Prüfung ist grün. Falsch sind sie ausschließlich in einem fremden Checkout — also
bei uns. Punkt 2 ist eine Prüfung, deren Geltungsbereich nie gegen den einen Vorgang
getestet wurde, den sie erlauben *muss*; verwandt mit **FB-02**, nur andersherum — sie
meldet nicht fälschlich Erfolg, sondern fälschlich einen Verstoß. Punkt 3 ist **FB-11** an
neuem Gegenstand: eine Pflicht ohne maschinellen Widerspruch, die genau so lange getragen
wird, wie jemand daran denkt.
⚠️ Und es ist unsere eigene Positivkontroll-Regel, nicht angewandt: Die Adoptionsfrage
wurde seinerzeit auf die *Beschreibung* eines Verfahrens hin geschlossen. Ein Verfahren,
das nur beschrieben wurde, ist eine Vermutung — dieselbe Aussage, die **FB-02** für
Prüfungen macht.
**Belege.**
| Punkt | Messung |
|---|---|
| 1 | `validate: 2 error(s)` gegen byte-genaues v0.3.0-`WORKFLOW.md`, in diesem Repo gemessen |
| 2 | `pruefe_sperrliste: 17 Verstoss/Verstoesse` für den reinen Baseline-Zugang |
| 3 | `git diff --stat v0.1.1 v0.3.1` → `validate.py` +29, `schema.yaml` +50, `gen_status.py` unverändert |
**Stand: teilweise.**
- **Punkt 1 ist im Rahmenwerk behoben** (v0.3.1): `schema.yaml` führt eine `vendored`-Liste
und eine Projektabschnitts-Marke, `validate.py` weist repo-relative Verweise im
Upstream-Teil einer vendorierten Datei zurück. Der Fix hatte prompt seinen eigenen
Folgefehler — er verbot zunächst auch die elf berechtigten Verweise in unserem
Projektabschnitt — und wurde erst dadurch richtig, dass er an unserem Repo gemessen wurde.
- **Punkt 2 ist hier behoben:** `pruefe_sperrliste.py` liest `--name-status`; Änderung und
Löschung bleiben gesperrt, nur der Zugang ist erlaubt. Vier Kontrollen belegt. Upstream
`check_locked.py` zieht dieselbe Grenze und sichert sie zu — unsere Fassung wusste es
nur nicht.
- **Punkt 3 ist behoben.**
[ADR-0024](../../adr/0024-drei-framework-dateien-erklaert-erweitert.md) trägt die
Ausnahme seit dem 2026-08-21 als Entscheidung, und `pruefe_upstream_drift.py` hat seit
demselben Tag den maschinellen Widerspruch: Hat upstream zwischen der vorigen und der
aktuellen Baseline eine erklärt-erweiterte Datei angefasst, verlangt es eine Quittung in
`ABGLEICH.tsv` der neuen Baseline. Dieselbe Prüfung stellt außerdem sicher, dass **jede**
vendorierte Datei genau einer Klasse zugeordnet ist — byte-identisch, AGENTS-Präfix,
erklärt erweitert oder bewusst nicht übernommen. Eine vendorierte Datei ohne Zuordnung
war bis dahin unsichtbar; beim Upgrade waren es prompt zwei (`check_harvest.py`,
`judge.py`).
⚠️ **Der erste Entwurf dieser Prüfung war wirkungslos** und ist es fast geblieben: Er
suchte den Dateinamen irgendwo in der Prosa der `HERKUNFT.md` — und dort steht er
*immer*, in der Inventartabelle. Aufgefallen ist es nur an einer kontrafaktischen Probe
gegen die echte Historie, nicht am Selbsttest, dessen Fixture eine unrealistisch leere
Notiz war. **Das ist FB-02 im Werkzeug gegen FB-12**, und es steht hier, weil es die
Klasse ein weiteres Mal belegt: Eine Prüfung, die man nur grün gesehen hat, ist eine
Vermutung — auch dann, wenn sie einen Selbsttest hat.
Endstand: zehn Zusicherungen, zwölf absichtliche Brüche, keine Zusicherung unbewacht.
Zwei der Brüche haben dabei zwei **untaugliche Zusicherungen** entlarvt — eine, die auf
eine Phrase prüfte, die in zwei verschiedenen Meldungen vorkommt, und eine, die schon aus
einem anderen Grund erfüllt war.
**Vorschlag für die nächste Iteration.** Zwei Dinge, beide klein:
1. **Das Upgrade als Vorgang mit Abnahme, nicht als Beschreibung.** Wer den Adoptionspfad
ändert, führt ihn einmal gegen ein zweites Repo aus und zitiert den Lauf. Das ist
dieselbe Forderung, die das Rahmenwerk seit v0.1.3 an jede Prüfung stellt — sie fehlt
ausgerechnet bei dem Verfahren, das jeden Übernehmer betrifft.
2. **Der Handabgleich braucht einen Widerspruch.** Denkbar als Prüfung, die die
erklärt-erweiterten Dateien gegen die *vorige* Baseline hält und meldet, wenn upstream
sie zwischen zwei Ständen angefasst hat. Sie kann nicht entscheiden, ob wir richtig
nachgezogen haben — aber sie kann sagen, dass es zu tun war. Das genügt: Der Fehler ist
Vergessen, nicht Falschmachen.
➡️ Verwandt mit **FB-11** (Regel ohne Widerspruch) und **FB-02** (nie rot gesehen). Neu ist
hier der Gegenstand: nicht eine Regel im Arbeitsalltag, sondern das Verfahren, mit dem wir
überhaupt an neue Regeln kommen.
*Angelegt 2026-08-20 auf Wunsch von sorb, nach einer Sitzung, in der mehrere dieser
Befunde gleichzeitig sichtbar wurden. Erstbefüllung stammt von der Seite, die die
Abweichungen verursacht hat — das ist kein Argument gegen die Befunde, aber ein Grund,
sie im Refinement gegenzulesen.*
@@ -0,0 +1,27 @@
---
type: wiki-page
area: stolpersteine
status: declined
harvested_in: "neckbeard v0.1.3"
---
# Werkzeuge messen unbemerkt die falsche Instanz
> **Stand: vom Rahmenwerk nicht abgedeckt.** Bis zum 2026-08-21 als **FB-07** im Befundregister gefuehrt, am 2026-08-20 an das Rahmenwerk uebergeben.
> **Beleg:** Issue 0025 des Rahmenwerks wurde mit Begruendung abgelehnt. Das Muster bleibt bestehen und bleibt unseres.
**Beschreibung.** Über den Entwicklungstunnel zeigen `cfgmon.lab:9090` und `:3100` auf
einen **anderen** Stack (`host=dokploy-host`); der operating-Stack ist nur aus dem
matrix-Cluster über `10.0.0.3` erreichbar. Zusätzlich wird im Lab **Port 53 abgefangen** —
eine `dig`-Anfrage an eine TEST-NET-Adresse liefert ein Ergebnis. Beides hat an einem Tag
je zwei Diagnosen ins Leere laufen lassen.
**Ursachen-Einschätzung.** Die Umgebung beantwortet Fragen, die sie nicht beantworten
kann, statt zu schweigen. Ein Werkzeug, das eine Adresse anspricht, kann nicht erkennen,
dass jemand dazwischen sitzt. Dokumentiert war das teilweise
([reference: Diagnose-Fallen](../../wiki/admin/cfgmon.md)) — aber nicht dort, wo die
Werkzeuge laufen.
**Vorschlag.** Gegenprobe als Standardbestandteil von Diagnose-Skripten, **vor** der
eigentlichen Messung. `pruefe-dns.sh` macht das seit dem 2026-08-20 vor; `pruefe-ports.sh`
seit dem 2026-08-19. Das Muster gehört in die Werkzeug-Vorlage, nicht in jedes Skript neu.
+4 -3
View File
@@ -94,9 +94,10 @@ Ablauf und Timeboxes: [verfahren/refinement.md](docs/wiki/admin/refinement.md).
- **AAR** nach jedem Deploy mit Übergabe und nach Incidents — offene Punkte daraus
werden im selben Zug zu Issues.
- **Retro light** (~monatlich, 20–30 min): Verfahren/ADRs prüfen — fasert etwas aus?
Eingangsliste dafür ist [FRAMEWORK-BEFUNDE.md](FRAMEWORK-BEFUNDE.md):
wiederkehrende Fehlerklassen und Abweichungen, die in der nächsten
neckbeard-Iteration nicht erneut passieren sollen.
Eingangsliste dafür sind die Fehlerklassen-Seiten unter
`docs/wiki/stolpersteine/` — wiederkehrende Abweichungen mit Ernte-Stand,
geclustert in [STATUS.md](STATUS.md), Wegweiser
[FRAMEWORK-BEFUNDE.md](FRAMEWORK-BEFUNDE.md).
**Der Einstieg ist erfolgt:** [Struktur-Workshop (#17)](https://git.lab/axion1337.chat/management/-/issues/17)
am 2026-08-06 — Visionen geschärft, M1–M4 angelegt, Board gesichtet, Kadenz und