docs: design doc Gate 2 (architecture) with ADR-0011 and ADR-0012

Two-way harvest as mandated by the Session-1 handoff: failure patterns
of both approaches tabled with the mechanism that closes each, all
seven neckbeard gaps dispositioned (plus two new ones found this
session), and the old approach's proven value folded into the target
architecture. Two directional decisions filed as proposed ADRs: issues
live in-repo with GitLab as a deterministically mirrored view (0011),
group rules canonical here with pointer components and a checkable
components artifact (0012). Migration map, check architecture split
offline/runtime, constraints, upstream feedback candidates.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Thore Cimbal
2026-08-11 20:45:18 +02:00
co-authored by Claude Fable 5
parent 2daadb8ba6
commit 6b8869f160
3 changed files with 339 additions and 1 deletions
@@ -0,0 +1,88 @@
---
type: adr
id: "0011"
status: proposed
date: 2026-08-11
supersedes: null
superseded_by: null
related:
- "docs/design/2026-08-11-neckbeard-migration.md"
- "decisions/0002-issues-und-management-ins-lab.md"
- "decisions/0005-pm-framework-kanban.md"
---
# ADR-0011: Issues leben im Repo; GitLab wird deterministisch bespiegelt
## Kontext
Die Gruppe führt 111 Issues auf git.lab, davon 71 offen; die Disziplin ist
belegt intakt (F-014: 71/71 mit genau einem Meilenstein, 71/71 mit
Priorität, WIP-Limit gehalten). Neckbeards ADR-0002 macht In-Repo-Issues
zum Default und vertagt die Spiegel-Option C. Der Feldtest zeigt beides:
Die Forge erzwingt sichtbar, was Prosa nicht hält (F-001, F-017 —
Dokumente widersprechen dem Board), und Host-Sessions ohne Lab-Zugang
können GitLab-Issues gar nicht lesen, wohl aber den Gitea-Mirror dieses
Repos. Der alte Grundsatz „Alles Offene ist ein Issue" (altes ADR-0005)
scheiterte nur dort, wo Arbeitspunkte in `hosts/`-Markdown lebten (F-004)
— am zweiten Backlog, nicht am Board.
## Optionen
**A: GitLab bleibt kanonisch, Repo hält nur einen Export.** Tagesablauf
unverändert, Board bleibt Arbeitsfläche. Aber: dauerhafte Ausnahme von
neckbeards ADR-0002 (nach eigener Regel ADR-pflichtig), Issues bleiben
für Host-Sessions unsichtbar und für Agenten nur per API erreichbar, und
die Klasse „Prosa widerspricht Board" (F-001) bleibt strukturell offen —
generierte Dokumente hingen an einem Netzzugriff.
**B: Reine In-Repo-Issues, GitLab-Issues geschlossen.** Sauberste
neckbeard-Form. Aber: das Gruppenboard verliert den Management-Scope,
Meilenstein-Ansichten werden unvollständig, das Refinement liest zwei
Systeme — genau die belegte Disziplin (F-014) würde ihres Werkzeugs
beraubt. Der Report warnt ausdrücklich: nicht per Board-Löschung
migrieren.
**C: Repo kanonisch, GitLab als generierter Spiegel.** Die Issue-Wahrheit
liegt als `docs/issues/NNNN-slug.md` im Repo (grepbar, offline, über den
Gitea-Mirror überall lesbar); ein deterministisches Skript spiegelt
Titel, Status, Meilenstein, Priorität und Fälligkeit nach GitLab, damit
Board-, Meilenstein- und Label-Ansichten weiterarbeiten. Eine
Drift-Prüfung meldet Abweichungen zwischen Board und Repo rot.
## Entscheidung
**Option C, beschränkt auf den Management-Scope.**
- `docs/issues/` wird kanonisch für die Issues des management-Projekts.
Die offenen management-Issues werden aus dem GitLab-Stand importiert
und behalten ihre Nummern (GitLab-iid = Datei-id; keine dritte
Nummernwelt). Alt-IDs wie `CFGMON-01` bleiben im Titel.
- Das Schema trägt die belegten Pflichten: `milestone` (Pflicht, M1M5)
und `priority` (Pflicht, high/medium/low), dazu `due` (Datum statt
„bald"), optional `host`/`area`. Der Status-Enum wird um die
Board-Spalten erweitert (`next`, `waiting` mit benanntem Grund); das
WIP-Limit (max. 2 in-progress) wird eine Validator-Regel.
- Der Spiegel ist **ein** deterministisches Skript (Repo → GitLab),
Standard `--dry-run`; echte Läufe stößt sorb an. Board-Handgriffe
bleiben erlaubt, sind aber nicht kanonisch: Was nicht nachgezogen
wird, meldet die Drift-Prüfung. Die Zusage-Spalten (`next`,
`in-progress`) vergibt weiterhin nur sorb — Prozessregel, nicht
Mechanik.
- **Komponenten-Tracker bleiben unangetastet** (gitops 60 Issues usw.),
bis die jeweilige Komponente selbst adoptiert; das wird als
Folge-Issues angelegt. Bis dahin gilt für Komponenten-Issues GitLab
als Wahrheit — ausgewiesen, nicht verschwiegen.
## Konsequenzen
- Statusänderung = Commit; `git log` ersetzt die Issue-Chronik. STATUS.md
und Roadmap-Zahlen werden generiert statt behauptet (F-001-Klasse
geschlossen).
- Host-Sessions lesen den vollständigen Management-Backlog erstmals von
überall (Gitea-Mirror des Repos).
- GitLab-seitige Änderungen ohne Nachzug sind ab jetzt ein Befund, kein
stiller Zustand — die Drift-Prüfung übernimmt die Alarmfunktion der
roten Pipeline.
- Das geschlossene GitLab-Altbestand-Archiv (40 geschlossene Issues)
wird nicht importiert; es bleibt als Historie auf git.lab, erreichbar
über die bestehenden Verweise.
@@ -0,0 +1,85 @@
---
type: adr
id: "0012"
status: proposed
date: 2026-08-11
supersedes: null
superseded_by: null
related:
- "docs/design/2026-08-11-neckbeard-migration.md"
- "decisions/0001-gitlab-kanonisch-push-mirror.md"
---
# ADR-0012: Gruppenregeln kanonisch im management-Repo, Komponenten zeigen und werden geprüft
## Kontext
Fünf Komponenten-Repos und dieses Repo teilen ein Regelwerk. Neckbeards
ADR-0001 löst „ein Repo, viele Harnesse", nicht „viele Repos, ein
Regelwerk" — die schärfste Lücke des Feldtests. Der alte Ansatz war
bereits Pointer-basiert („Projekt-Repos haben eigene CLAUDE.mds", die
Arbeitsgrundlage liegt im management-Repo, über den Gitea-Mirror von
überall lesbar) und scheiterte nicht am Mechanismus, sondern an der
Anwendung: 4 von 5 Komponenten haben schlicht keine Pointer-Datei
(F-011), und nichts prüfte das. Zusätzlich tragen fünf Komponenten vier
Namensschemata, ohne dass ein Artefakt den kanonischen Slug festhält
(F-008) — diese Session musste die Slugs erfragen.
## Optionen
**A: Regelkopien in jede Komponente stempeln** (generiert, mit
Quell-SHA; Prüfskript vergleicht). Funktioniert offline im
Komponenten-Checkout. Aber: sechs Kopien derselben Regeln sind genau die
Drift-Maschine, die ADR-0001 upstream verwirft — der Stempel macht Drift
erkennbar, nicht unmöglich, und jeder Regeländerung folgt ein
Sechs-Repo-Commit-Zug.
**B: Git-Submodule/Subtree eines Regel-Repos.** Mechanisch streng, aber:
koppelt jeden Komponenten-Clone an Lab-Erreichbarkeit, ist in Obsidian
und Forge-Ansichten sperrig, und die Gruppe hat mit Submodules keinerlei
Praxis — Reibung ohne belegten Bedarf.
**C: Pointer + deterministische Prüfung.** Die Gruppenregeln stehen
genau einmal, im AGENTS.md dieses Repos (das gespiegelt und damit
überall lesbar ist). Jede Komponente trägt nur Projektspezifika plus
einen Pointer auf die Gruppenregeln (git.lab-Pfad und Mirror-URL). Neu
gegenüber dem alten Ansatz ist der prüfende Teil: ein Artefakt benennt
die Gruppe, ein Skript prüft die Anwendung.
## Entscheidung
**Option C.**
- **Kanonisch:** die Gruppenregeln leben als ausgewiesener Abschnitt im
`AGENTS.md` dieses Repos. `CLAUDE.md` wird Ein-Zeilen-Pointer
(neckbeard ADR-0001).
- **Komponenten-Artefakt:** `docs/components/<slug>.md` (neuer
Schema-Typ) deklariert je Repo den kanonischen Slug, Anzeigenamen,
Mirror-Pfad und die Phase (`active` / `staged` / `external`) — damit
ist F-008 maschinenlesbar beantwortet und die bewusst gestaffelte
Dormanz von `thread-net-git`/`threadnet-operating` (F-009-Addendum)
erstmals repräsentierbar statt nur mündlich.
- **Prüfung, zweigeteilt:** offline prüft `validate.py` die
Komponenten-Artefakte wie jedes andere Artefakt; in der Lab-CI prüft
die Stillstandsprüfungs-Familie (a) dass jede deklarierte Komponente
die Pointer-Datei tatsächlich trägt (schließt F-011) und (b) dass die
**zur Laufzeit gelesene** Gruppenliste und `docs/components/`
deckungsgleich sind — die Projektliste bleibt bewusst ungehärtet im
Code (Retro-Lehre: eine gepflegte Liste ist die Stelle, an der ein
neues Repo jahrelang durchrutscht); neu auftauchende Repos werden
Befund statt Lücke.
- **Rollout** der Pointer-Dateien in die fünf Komponenten ist nicht Teil
dieser Undertaking: fünf Folge-Issues, eines je Komponente.
## Konsequenzen
- Regeländerung = ein Commit in einem Repo; Komponenten folgen per
Verweis, nicht per Kopie.
- Eine Komponente ohne Pointer ist ab dem Rollout ein roter
CI-Befund, kein stiller Zustand über Wochen (F-011-Klasse).
- Die Slug-Unregelmäßigkeiten selbst (`thread-net-git`,
CamelCase-`ThreadNet-Web`) werden hier **nicht** bereinigt — ein
Rename fasst Forge-Zustand an und wird eigenes Issue mit eigener
Abwägung; das Artefakt dokumentiert bis dahin den Ist-Stand.
- Host-Sessions ohne Lab finden Regeln und Gruppenliste über den
Gitea-Mirror; der Pointer nennt beide Wege.