feat(issues): adopt the component trackers — one backlog, one numbering (ADR-0019)

ADR-0012 made docs/issues/ canonical for the management scope only and left
gitops, ThreadNet-Web and threadnet-call on GitLab "until the component adopts".
That split produced exactly what it invited: two numbering worlds where
management#20 and gitops#20 are different issues, drift nobody had to answer for
(gitops#61 carried no milestone since 2026-08-11), and component backlogs that
host sessions without lab access cannot read at all.

The 46 open component issues are now files 0056-0101. The file id is the
group-wide identifier; provenance lives in the frontmatter (new field `projekt`
plus gitlab_iid) and in the filename, so "gitops#61" still finds 0091. Bodies are
copied verbatim; comments and history stay on GitLab, as with the 2026-08-11
management import.

Both scripts learned the second dimension: spiegel_issues.py routes each file to
its origin project, reopens issues that are open in the repo but closed on the
board, and writes the new iid back after creating one; gruppenpruefung.py checks
drift across all four trackers instead of management alone. What the mirror
cannot decide stays a finding, not a silent state.

Two things needed a hand, both recorded in the files: gitops#61 had no milestone
(M1 - it is a live account-takeover path) and carried two area labels where the
schema holds one. The Gitea migration footers in the imported bodies point at
decommissioned trackers; their links are removed, the provenance sentence stays.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Thore Cimbal
2026-08-18 12:00:00 +00:00
co-authored by Claude Opus 5
parent 5ec4aa702e
commit a1def8666e
52 changed files with 1789 additions and 44 deletions
@@ -0,0 +1,70 @@
---
type: adr
id: "0019"
status: accepted
date: 2026-08-18
supersedes: null
superseded_by: null
related:
- "docs/adr/0012-issues-im-repo-gitlab-als-spiegel.md"
- "docs/adr/0013-gruppenregeln-kanonisch-mit-pruefung.md"
---
# ADR-0019: Komponenten-Issues in docs/issues/ adoptiert — eine Nummernwelt für die Gruppe
## Kontext
ADR-0012 machte `docs/issues/` kanonisch, **beschränkt auf den
Management-Scope**, und ließ die Komponenten-Tracker (gitops,
ThreadNet-Web, threadnet-call) ausdrücklich auf GitLab als Wahrheit —
„bis die jeweilige Komponente selbst adoptiert". Der Zustand seither:
zwei Issue-Welten mit getrennten Nummernkreisen (management#20
gitops#20), Drift zwischen Board und Repo an mehreren Stellen
(Beispiel: gitops#61 monatelang ohne Meilenstein, geschlossene
Board-Issues zu offenen Dateien), und Host-Sessions ohne Lab-Zugang
sehen die Komponenten-Backlogs gar nicht. sorb hat am 2026-08-18 die
Adoption angeordnet: ein Backlog, eindeutige Bezeichner, Drift beenden.
## Entscheidung
**Die offenen Issues der Komponenten-Tracker werden in `docs/issues/`
adoptiert; es gibt ab jetzt genau eine kanonische Nummernwelt.**
- Jedes adoptierte Issue bekommt die nächste freie Datei-Nummer
(0056 ff.); die Datei-ID ist der eindeutige Bezeichner der Gruppe.
Die Herkunft steht im Frontmatter (`projekt` + `gitlab_iid`) und im
Dateinamen (`0091-gitops-61-…`); ADR-0012s Gleichung „GitLab-iid =
Datei-id" gilt nur noch für den Management-Altbestand 00010032 —
über mehrere Projekte ist sie nicht kollisionsfrei zu halten.
- Übernommen werden Titel, Beschreibung (wortgleich), Status
(Board-Labels `status:*`), Meilenstein, Priorität, Fälligkeit und
eine `area`; Kommentare und Verlauf bleiben auf GitLab (wie beim
Management-Import). Geschlossene GitLab-Issues bleiben Historie und
werden nicht importiert.
- Die GitLab-Projekt-Tracker werden zur **bespiegelten Ansicht** wie
zuvor schon das management-Projekt: `spiegel_issues.py` routet
jede Datei über ihr `projekt`-Feld ins Herkunftsprojekt, kann
geschlossene Issues zu offenen Dateien wieder öffnen, und
`gruppenpruefung.py` prüft die Drift über alle adoptierten Projekte.
Board-, Meilenstein- und Label-Ansichten arbeiten unverändert weiter
— der Grund, aus dem ADR-0012 Option C gewählt hat, bleibt erhalten.
- Neue Issues entstehen ab jetzt **immer** als Datei; das `projekt`-Feld
bestimmt, in welchem Tracker der Spiegel sie anlegt (fehlt es:
management). Ein GitLab-seitig neu angelegtes Issue ohne Datei ist
ein Befund der Gruppenprüfung („zweites Backlog"), kein stiller
Zustand.
- Werkzeug: `verfahren/issue-adoption/adoptiere.py` (deterministisch,
idempotent, Dry-Run-Default) hat die 46 offenen Komponenten-Issues
als 00560101 übernommen.
## Konsequenzen
- Ein Backlog, ein Nummernkreis, eine Drift-Prüfung; `STATUS.md` zeigt
erstmals die ganze Gruppe. Host-Sessions lesen alle Backlogs über den
Gitea-Mirror dieses Repos.
- Die Schwelle „Komponente adoptiert selbst" aus ADR-0012 ist damit für
gitops, ThreadNet-Web und threadnet-call genommen; thread-net-git,
threadnet-operating und notfallhandbuch hatten keine offenen Issues
und adoptieren bei Bedarf durch Aufnahme in die `projekt`-Enum.
- Querbezüge in Prosa nennen künftig die Datei-ID; alte Bezeichner wie
„gitops#61" bleiben über Frontmatter und Dateinamen auffindbar.