analysis: complete the systematic claim verification; add F-017 and ADR-0010 draft

verify_claims.py gives all 813 claim rows a mechanical disposition;
the 28 flags were adjudicated by hand (REPORT.md appendix). Two survived
as genuine drift (F-017): a closed issue still described as open in
shared/lab-netzwerk.md, and a 'pending' decision block in hosts/cfgmon.md
whose premise the same file records as executed.

Also: narrow the vendored-path filter (it silently dropped 7 tracked
icon files and produced false path-miss flags), record the confirmed
canonical author identity in F-003, verify the Gitea#48->GitLab#46
numbering shift by title in F-005, and add the ADR-0010 draft under
analysis/drafts/ for the human to git-mv into decisions/.

Branch renamed to Neckbeard-v0.1.1-analyse-1 per the human.
This commit is contained in:
Thore Cimbal
2026-08-10 12:00:00 +00:00
parent ccf83da515
commit e68b295249
13 changed files with 1265 additions and 13 deletions
+32 -9
View File
@@ -7,9 +7,9 @@ neckbeard-based management system in a **new branch**, starting fresh from this
| | |
|---|---|
| Analysis branch | `analysis/neckbeard-fieldtest`, branched from `main` at `2f012a6` |
| Commits | `f6a9b9f` scope · `b8b8531` inventory · `959bf88` SHA + timestamps · `eaa00f0` findings · this file |
| Deliverables | [SCOPE.md](SCOPE.md) · [REPORT.md](REPORT.md) · [findings/](findings/) (F-001…F-016) · [data/](data/) · [scripts/](scripts/) |
| Analysis branch | `Neckbeard-v0.1.1-analyse-1`, branched from `main` at `2f012a6` (renamed from `analysis/neckbeard-fieldtest` at session close, per the human) |
| Commits | `git log main..` on this branch lists them: scope, inventory, SHA/timestamps, findings, report/handoff, reach correction, verification pass |
| Deliverables | [SCOPE.md](SCOPE.md) · [REPORT.md](REPORT.md) · [findings/](findings/) (F-001…F-017) · [data/](data/) · [scripts/](scripts/) |
| Read first | REPORT.md executive summary, then the pattern → mechanism → implication table |
| Neckbeard reference | `v0.1.1` @ `823a08cac6b03a47d7e2f661200a49ac6e09d38d`, `main`, clean |
@@ -19,7 +19,7 @@ Nothing outside `analysis/` was modified on this branch. `main` is untouched.
```bash
git clone https://git.lab/axion1337.chat/management.git
cd management && git checkout analysis/neckbeard-fieldtest
cd management && git checkout Neckbeard-v0.1.1-analyse-1
bash analysis/scripts/run_all.sh
```
@@ -79,9 +79,30 @@ The human confirmed their own working copy points at canonical git.lab, not the
itself makes every commit look non-anonymised.
8. **Link statuses stayed at the three mandated values**; the nuance moved into a `kind`
column rather than inventing a fourth status.
9. **The claim sweep was completed inside Session 1**, after the human asked whether
pulling it forward would break the two-session split. It does not: verifying claims is
Phase-2 analysis work; only designing/fixing belongs to Session 2. Result: F-017 and
the REPORT appendix.
10. **ADR-0010 exists as a draft under [drafts/](drafts/)**, not under `decisions/`
the human decided it is filed in the old scheme, but this session must not create
files outside `analysis/`; placing it is one `git mv` by the human. Deliberately in
German, matching the old scheme it belongs to (a stated deviation from this
session's English-artifacts rule).
11. **Session-close corrections by the human**, both binding for Session 2: the Gitea
mirror is **private to the owner**, not public (reach of F-002/F-003 rewritten —
the exposure is prospective, via a possible future git.lab→GitHub push); canonical
author identity is `Thore Cimbal <cfx@riot.8shield.net>` (F-003 addendum).
## Where Session 2 should start
**Standing directive from the human (session close):** before applying anything, work
through the failures of *both* approaches — the drift this report found in the
management approach *and* the seven neckbeard gaps it exposed — and where the old
approach carries value that fits neckbeard's philosophy (candidates are the four
works-well findings, the milestone/priority evidence in F-014, the mirror-topology
prose in F-013), fold that value into neckbeard rather than discarding it. Adoption
comes after that two-way harvest, not before.
The pattern → mechanism → implication table in REPORT.md is the input. Two things gate
everything else:
@@ -98,11 +119,13 @@ migration is size L, so `WORKFLOW.md` Gates 15 with a design doc in `docs/des
In descending order of how much they could mislead Session 2.
1. **Claim extraction is trigger-based, not semantic.** `claims.tsv` holds 813 candidate
lines matched by regex patterns, biased toward recall. I verified the claims the
mandatory checks and the findings required — not all 813. A claim that is false but
matched no trigger, or matched one and was not among the ones I chased, is not in this
report. This is the largest hole in the analysis.
1. **The claim sweep is complete mechanically, not semantically.** Every one of the 813
rows now has a disposition (REPORT appendix), and all 28 mechanical failures were
adjudicated by hand. What remains open is honest but real: 360 rows carry no
mechanically checkable token — their truth is prose about hosts, procedures and
history that only a human or a live system can judge. And extraction itself is still
trigger-based: a false sentence containing no path, issue, ID, date, count or
status word was never in `claims.tsv` to begin with.
2. **`git ls-remote` against `rohana.axion1337.de/sorb/<name>` is how I concluded
`game-operating` has no mirror** (F-007). That rests on the naming convention holding,
which I verified for six repos but cannot prove for the seventh. The contradiction
+22
View File
@@ -77,6 +77,7 @@ The declaration and the application live in different places, and nothing compar
| [F-007](findings/F-007-mirror-scope-claims-contradict-each-other.md) | Mirror count stated as five and six on the same day; `game-operating` claimed mirrored, is not | Gap in the availability guarantee the two-host topology exists for |
| [F-005](findings/F-005-dead-gitea-tracker-still-referenced.md) | Live doc routes to the tracker three docs declare dead, under an ambiguous number | A high-priority open decision is reachable only through a retired system |
| [F-010](findings/F-010-stand-labels-lag-their-own-commits.md) | Hand-written "Stand" labels older than their own file's last commit | Trains readers to distrust current content; gives no signal when content really is stale |
| [F-017](findings/F-017-prose-asserts-states-already-resolved.md) | Prose asserts states the tracker already resolved: a closed issue called open, a "pending" decision whose premise was executed 60 lines earlier | Sentences a reader would act on; found only by the systematic claim sweep |
### Pattern C — Two backlogs, one rule
@@ -144,6 +145,27 @@ Listed only, not filed as issues in the neckbeard repo — that is a separate ac
---
## Appendix — the systematic claim verification
`analysis/scripts/verify_claims.py` gave every one of the 813 extracted claim rows a
mechanical disposition (`analysis/data/claims_verification.tsv`): **205 checked-ok**
(a path, issue reference or state assertion verified against tree or tracker),
**207 informational** (tokens classed as runtime/net/image/forge references — correctly
outside the analysed trees), **360 prose-or-runtime** (no mechanically checkable token;
their semantic truth remains unchecked, stated as a limit, not passed silently),
**13 in code blocks**, **28 flagged** for hand adjudication.
The 28 flags resolve as: **10** references into out-of-scope repos (homelab/wiki,
wiki-bookstack, vendor, the retired gitops wiki) — consistent with their own context;
**7** host/runtime artifacts that correctly are not in any tree (`lab.conf`,
`runner-data/`, an untracked `.npmrc` the doc itself calls untracked, npm tarball
contents); **3** historically removed files whose removal the surrounding text records;
**2** enumerations of a hypothetical revert, not claims; **1** tokenizer artifact
(`text/html`); **3** bare/ambiguous issue references; **2** genuine drift → **F-017**.
Bonus verification: all of `roadmap.md`'s gitops references (#25, #45, #46, #47, #48,
#49) match their GitLab titles — post-migration references are consistently
GitLab-numbered, strengthening F-014.
## Open questions for the human
1. **Where do the 71 open issues go?** ADR-0002 Option C (repo canonical, mirrored to
+1 -1
View File
@@ -16,7 +16,7 @@ session) or `[inferred]` (derived, not verified).
| Management branch / cleanliness | `main`, clean worktree | `git status --porcelain` empty `[observed]` |
| Management origin | `https://git.lab/axion1337.chat/management.git`**canonical git.lab, not the Gitea mirror** | `git remote -v` `[observed]` |
| Management commits / span | 86 commits, 2026-07-30 … 2026-08-09 | `git rev-list --count`, `git log --date=short` `[observed]` |
| Analysis branch | `analysis/neckbeard-fieldtest`, branched from `main` | `git checkout -b` `[observed]` |
| Analysis branch | `Neckbeard-v0.1.1-analyse-1`, branched from `main` (created as `analysis/neckbeard-fieldtest`, renamed at session close per the human) | `git checkout -b`, `git branch -m` `[observed]` |
The reference standard for every "neckbeard mechanism" field in Phase 2
findings is neckbeard `v0.1.1` as pinned above (per ADR-0006).
+814
View File
@@ -0,0 +1,814 @@
path line status checks flags hint claim_text
.gitlab/issue_templates/Deploy-Übergabe.md 14 prose-or-runtime Beispiel: axion1337.chat/threadnet-operating @ main, b6007c5 -->
.gitlab/issue_templates/Deploy-Übergabe.md 67 prose-or-runtime historical-wording Datensammlung und Zustellung getrennt scharf zu schalten ist fast immer
.gitlab/issue_templates/Deploy-Übergabe.md 75 prose-or-runtime ## Bewusst offen gelassen
CLAUDE.md 1 prose-or-runtime # CLAUDE.md — übergreifende Arbeitskonventionen (kanonisch)
CLAUDE.md 4 prose-or-runtime Gruppe (axion1337.chat-Stack, ThreadNet-Repos, CFGMON/threadnet-operating,
CLAUDE.md 6 prose-or-runtime ESS-/Flux-Details in „ThreadNet Server Suite" = `axion1337.chat-gitops`) — bei
CLAUDE.md 10 informational runtime-path:https://rohana.axion1337.de/sorb/management > Push-Mirror unter `https://rohana.axion1337.de/sorb/management` von überall
CLAUDE.md 11 prose-or-runtime > **lesbar** — dort diese Datei und die ADRs nachschlagen. Nur pushen ist tabu.
CLAUDE.md 18 prose-or-runtime ## Projektrealitäten (Stand 2026-08-01)
CLAUDE.md 20 prose-or-runtime **Das Lab ist die Quelle der Wahrheit** ([ADR-0002](decisions/0002-issues-und-management-ins-lab.md)):
CLAUDE.md 22 informational runtime-path:git.lab/axion1337.chat/* - Kanonische Repos liegen auf `git.lab/axion1337.chat/*` (nur im Lab/VPN
CLAUDE.md 23 prose-or-runtime auflösbar). Gitea/rohana wird per **Push-Mirror** beliefert und bleibt
CLAUDE.md 24 prose-or-runtime Flux-Source, Container-/npm-Registry und Release-Download
CLAUDE.md 25 prose-or-runtime ([ADR-0001](decisions/0001-gitlab-kanonisch-push-mirror.md)).
CLAUDE.md 27 prose-or-runtime liegen die *Baupläne*, auf Gitea eine Kopie, die der Cluster **ohne verfügbares
CLAUDE.md 34 prose-or-runtime - **Nie direkt zu Gitea pushen** (gespiegelte Repos) — der Mirror überschreibt
CLAUDE.md 36 prose-or-runtime - **Gespiegelt wird nur die Gruppe `axion1337.chat`** (die fünf Produkt-Repos und
CLAUDE.md 37 prose-or-runtime `management`). Die Gruppe **`homelab`** (`docs`, `wiki`, `wiki-bookstack`) hat
CLAUDE.md 43 checked-ok path-ok:verfahren/aar/@management(dir) `verfahren/aar/` (dieses Repo ist gespiegelt), nicht nur in die READMEs der
CLAUDE.md 45 prose-or-runtime - Landet doch ein Commit auf Gitea (z. B. aus einer Host-Session ohne Lab-Route):
CLAUDE.md 48 prose-or-runtime von Gitea ziehen, `git am` (erhält Autorschaft), Push über git.lab.
CLAUDE.md 49 prose-or-runtime historical-wording - **Issues leben auf git.lab.** Die alten Gitea-Issues sind geschlossen und
CLAUDE.md 51 prose-or-runtime historical-wording (Gitea zählte PRs mit; z. B. Gitea#48 → GitLab#46) — alte „gitops#N"-Verweise
CLAUDE.md 52 prose-or-runtime meinen die Gitea-Nummer; verbindlich ist der Migrations-Fußtext im Issue.
CLAUDE.md 54 prose-or-runtime TURN-Rotations-CronJob schreibt weiter nach Gitea, weil er im Cluster läuft und
CLAUDE.md 56 prose-or-runtime **Die Rotation nicht von Hand nachziehen und den PR nie auf Gitea mergen** —
CLAUDE.md 57 prose-or-runtime das erledigt seit 2026-08-02 der geplante CI-Job `canonize_rotation` im
CLAUDE.md 58 prose-or-runtime gitops-Repo täglich von git.lab aus. Scheitert er, bleibt die Pipeline rot;
CLAUDE.md 62 prose-or-runtime Das gitops-Wiki liegt seit 2026-08-02 auf git.lab (*Wiki*-Reiter im Projekt);
CLAUDE.md 63 checked-ok path-ok:docs/@ThreadNet-Web(dir),axion1337.chat-gitops(dir),threadnet-call(dir) ⚠️ der `wiki`-**Branch** im gitops-Repo ist ein überholter Mai-Abzug von `docs/`
CLAUDE.md 65 informational forge-repo:homelab/wiki **axionwiki.lab** ([`homelab/wiki`](https://git.lab/homelab/wiki), Docusaurus) —
CLAUDE.md 72 prose-or-runtime - **Alles Offene ist ein Issue** — host-/infra-Scope hier im management-Projekt
CLAUDE.md 73 informational image-ref:host:;id-ok:CFGMON-01 historical-wording (`host:`-Labels, alte IDs wie `CFGMON-01` bleiben im Titel), Projekt-Scope im
CLAUDE.md 74 checked-ok path-ok:hosts/@management(dir);path-ok:shared/@ThreadNet-Web(dir),management(dir) jeweiligen Projekt. Kein neues Backlog-Markdown anlegen; `hosts/`/`shared/`
CLAUDE.md 90 prose-or-runtime - **Der Titel trägt keine Priorität.** Präfixe wie `[HIGH]`/`[MEDIUM]`/`[LOW]`
CLAUDE.md 92 informational id-ok:CFGMON-01 historical-wording Alte Kennungen wie `CFGMON-01` bleiben, die benennen den Gegenstand, nicht die
CLAUDE.md 94 prose-or-runtime ⚠️ Der Grund ist keine Ästhetik: Aus der Gitea-Migration trugen 34 Issues ein
CLAUDE.md 97 prose-or-runtime über dieselbe Sache sind schlimmer als eine unvollständige. Bereinigt 2026-08-06.
CLAUDE.md 101 prose-or-runtime einzahlt**. Ein Issue ohne Meilenstein taucht in keiner Roadmap-Ansicht auf und
CLAUDE.md 112 informational runtime-path:~/.config/gitlab-lab/token `~/.config/gitlab-lab/token`) oder maskierte CI-Variablen.
CLAUDE.md 116 prose-or-runtime ## Commit-Konventionen (seit 2026-08-07)
CLAUDE.md 136 prose-or-runtime historical-wording 📎 Die Umstellung der Alt-Historie am 2026-08-07 hat 251 Commits neue SHAs
CLAUDE.md 138 checked-ok path-ok:shared/commit-zuordnung-2026-08-07.md@management [`shared/commit-zuordnung-2026-08-07.md`](shared/commit-zuordnung-2026-08-07.md)
CLAUDE.md 146 prose-or-runtime öffentlichen Gitea-Spiegel. Wer daraus wirklich keine Muster ableitbar haben
CLAUDE.md 151 prose-or-runtime - **Aussagen mit Quelle:** Verifiziert (Messung/Konsole) klar von Vermutung
CLAUDE.md 158 prose-or-runtime „fertig" heißt verifiziert.
README.md 1 prose-or-runtime # management
README.md 8 prose-or-runtime historical-wording *(Bis 2026-08-01 hieß dieses Repo `Backlogs` und führte offene Punkte als
README.md 11 prose-or-runtime ## Repo-Topologie (seit 2026-08-01)
README.md 13 informational runtime-path:git.lab;forge-repo:axion1337.chat/management **Kanonisch lebt dieses Repo auf `git.lab`** (`axion1337.chat/management`, nur im
README.md 15 prose-or-runtime [ADR-0002](decisions/0002-issues-und-management-ins-lab.md)).
README.md 16 informational runtime-path:rohana.axion1337.de/sorb/management `rohana.axion1337.de/sorb/management` ist ein **Push-Mirror**: git.lab
README.md 17 prose-or-runtime überschreibt ihn bei jedem Push per Force. Deshalb **nie direkt zu Gitea
README.md 18 prose-or-runtime pushen** — solche Commits gehen beim nächsten Mirror-Lauf verloren (Rettung:
README.md 19 prose-or-runtime `.patch` von Gitea ziehen + `git am`, siehe
README.md 22 prose-or-runtime historical-wording **Keine Ausnahmen mehr.** Die **Deploy-Übergabe-Issues** liefen bis 2026-08-02 auf
README.md 23 informational runtime-path:git.lab dem Gitea-Tracker, weil Hosts außerhalb des Labs `git.lab` nicht erreichten. Mit dem
README.md 25 prose-or-runtime Grund entfallen — bei eingeschaltetem Tunnel erreicht CFGMON git.lab. Sie sind
README.md 26 informational id-ok:LABNET-03 umgezogen (LABNET-03), der Gitea-Tracker ist leer, die Vorlage liegt als
README.md 33 checked-ok path-ok:CLAUDE.md@axion1337.chat-gitops,management | [`CLAUDE.md`](CLAUDE.md) | **Kanonische Arbeitskonventionen für alle Agenten-Sessions** (Topologie, Framework, Secrets, Karpathy-Guidelines) |
README.md 34 checked-ok path-ok:vision/@management(dir) | `vision/` | Eine Vision je Linie: Community (axion1337.chat), Tool (ThreadNet), Plattform (Homelab) |
README.md 35 checked-ok path-ok:roadmap.md@management historical-wording | `roadmap.md` | Linien, Meilenstein-Kandidaten, Kadenz — GitLab-Milestones halten den Stand |
README.md 36 checked-ok path-ok:decisions/@management(dir) | `decisions/` | ADRs — Pflicht bei Architekturentscheidungen **und dauerhaften Ausnahmen** |
README.md 37 checked-ok path-ok:verfahren/@management(dir) | `verfahren/` | Wie wir arbeiten: [Deploy-Übergabe/DoD](verfahren/deploy-uebergabe.md), [Refinement & Retro](verfahren/refinement.md), [AARs](verfahren/aar/), Werkzeuge |
README.md 38 checked-ok path-ok:hosts/@management(dir);path-ok:shared/@ThreadNet-Web(dir),management(dir) | `hosts/`, `shared/` | **Bestand + Historie** je Host/Thema — u. a. [Branding](shared/branding.md) (Marke, Paletten, wo welches Theme eingestellt ist); offene Punkte sind Issues |
README.md 43 informational forge-repo:homelab/wiki [`homelab/wiki`](https://git.lab/homelab/wiki)). **Geändert wird immer hier, nie dort.**
README.md 48 informational image-ref:host:;id-ok:CFGMON-01 historical-wording `host:`-Labels; die alten IDs wie `CFGMON-01` bleiben im Titel) bzw. in den
README.md 64 informational id-ok:CFGMON-01;id-ok:ZONE-01 **IDs** (`CFGMON-01`, `ZONE-01`, …) werden **nie wiederverwendet**; sie leben in
README.md 72 prose-or-runtime **Erledigtes und Verworfenes** bleibt sichtbar: Issues werden geschlossen (nicht
README.md 78 prose-or-runtime Konfiguration lebt in den Projekt-Repos (z. B. `threadnet-operating` für den
decisions/0001-gitlab-kanonisch-push-mirror.md 1 prose-or-runtime # 0001 — git.lab ist kanonisch, Gitea wird per Push-Mirror beliefert
decisions/0001-gitlab-kanonisch-push-mirror.md 8 prose-or-runtime 3,7-GiB-Host) und Gitea Actions zeigte mehrere echte Bugs. Das Homelab-GitLab
decisions/0001-gitlab-kanonisch-push-mirror.md 14 informational runtime-path:git.lab/axion1337.chat/* `git.lab/axion1337.chat/*` ist die kanonische Heimat aller Repos; Gitea/rohana
decisions/0001-gitlab-kanonisch-push-mirror.md 15 prose-or-runtime wird über Push-Mirrors beliefert und bleibt Flux-Source, Container-Registry,
decisions/0001-gitlab-kanonisch-push-mirror.md 16 prose-or-runtime npm-Registry und Release-Download. **Direkte Pushes zu Gitea sind für gespiegelte
decisions/0001-gitlab-kanonisch-push-mirror.md 17 prose-or-runtime Repos verboten** — der Mirror überschreibt divergenten Stand per Force.
decisions/0001-gitlab-kanonisch-push-mirror.md 22 prose-or-runtime - Commits, die doch auf Gitea landen (z. B. Cluster-CronJobs ohne Lab-Route),
decisions/0001-gitlab-kanonisch-push-mirror.md 23 checked-ok path-ok:verfahren/deploy-uebergabe.md@management brauchen das Kanonisierungs-Verfahren (`verfahren/deploy-uebergabe.md`):
decisions/0001-gitlab-kanonisch-push-mirror.md 24 prose-or-runtime `.patch` ziehen, `git am`, Push über git.lab. Zweimal live gebraucht.
decisions/0001-gitlab-kanonisch-push-mirror.md 29 informational id-no-issue:CFGMON-10 - CFGMON-CI aufrüsten (Swap/Limits): strukturell zu klein, verworfen mit CFGMON-10.
decisions/0002-issues-und-management-ins-lab.md 1 prose-or-runtime # 0002 — Issues und Management-Repo ziehen ins Lab („das Lab ist die Quelle der Wahrheit")
decisions/0002-issues-und-management-ins-lab.md 8 prose-or-runtime weiter auf Gitea — zwei Wahrheiten, driftgefährdet. Erreichbarkeits-Blocker
decisions/0002-issues-und-management-ins-lab.md 9 informational id-ok:LABNET-01 LABNET-01 (WireGuard-Roadwarrior) wurde am 2026-08-01 gelöst.
decisions/0002-issues-und-management-ins-lab.md 13 prose-or-runtime Alle Projekt-Issues leben auf git.lab (62 migriert, Gitea-Issues geschlossen mit
decisions/0002-issues-und-management-ins-lab.md 14 informational forge-repo:axion1337.chat/management Verweis); das Backlogs-Repo zieht als `axion1337.chat/management` ins Lab
decisions/0002-issues-und-management-ins-lab.md 15 informational forge-repo:sorb/management (Push-Mirror → `sorb/management` auf Gitea). Das Lab ist die Quelle der Wahrheit.
decisions/0002-issues-und-management-ins-lab.md 19 prose-or-runtime - ⚠️ gitops-Issue-Nummern haben sich verschoben (Gitea zählte PRs mit); die
decisions/0002-issues-und-management-ins-lab.md 21 prose-or-runtime - ~~**Befristete Ausnahme:** Deploy-Übergabe-Issues laufen auf dem Gitea-Tracker
decisions/0002-issues-und-management-ins-lab.md 22 informational forge-repo:sorb/management von `sorb/management`, weil CFGMON git.lab (noch) nicht erreicht.~~
decisions/0002-issues-und-management-ins-lab.md 23 checked-ok issue-ok:management#13(closed);id-ok:LABNET-03 ✅ **Zurückgebaut am 2026-08-02** (LABNET-03, [#13](https://git.lab/axion1337.chat/management/-/issues/13)):
decisions/0002-issues-und-management-ins-lab.md 25 checked-ok issue-ok:management#25(opened) sind nach git.lab gewandert ([#25](https://git.lab/axion1337.chat/management/-/issues/25),
decisions/0002-issues-und-management-ins-lab.md 26 checked-ok issue-ok:management#26(closed) [#26](https://git.lab/axion1337.chat/management/-/issues/26)), der Gitea-Tracker ist
decisions/0002-issues-und-management-ins-lab.md 27 checked-ok path-ok:.gitlab/issue_templates/@management(dir) leer, die Vorlage liegt als `.gitlab/issue_templates/`. **Damit gilt diese ADR
decisions/0002-issues-und-management-ins-lab.md 29 checked-ok path-ok:README.md@ThreadNet-Web,axion1337.chat-gitops,management historical-wording Ausnahmen (siehe `README.md`) — dass sie befristet war und die Frist gehalten hat,
decisions/0002-issues-und-management-ins-lab.md 31 prose-or-runtime - Releases bleiben auf Gitea (öffentlicher Download-Pfad), ebenso das gitops-Wiki.
decisions/0002-issues-und-management-ins-lab.md 35 prose-or-runtime - Issues auf Gitea belassen: dauerhafte Doppelführung, Roadmap/Boards unmöglich.
decisions/0003-cve-meldeweg-aggregiert.md 8 checked-ok path-ok:verfahren/aar/@management(dir);issue-ok:axion1337.chat-gitops#51(opened) Nachrichten und musste stummgeschaltet werden (gitops#51, AAR in `verfahren/aar/`).
decisions/0003-cve-meldeweg-aggregiert.md 9 informational id-no-issue:CFGMON-13 historical-wording Gleichzeitig war entschieden (CFGMON-13), Release-/Security-Meldungen von
decisions/0004-site-to-site-vpn-hetzner-lab.md 3 checked-ok issue-ok:management#12(closed);issue-ok:management#12(closed) **Status:** akzeptiert (umgesetzt und abgenommen 2026-08-01, Testreihe 17 in [management#12](https://git.lab/axion1337.chat/management/-/issues/12)) · **Datum:** 2026-08-01 · **Entscheider:** sorb
decisions/0004-site-to-site-vpn-hetzner-lab.md 14 informational net-ref:10.0.0.0/24;net-ref:10.58.73.0/24 historical-wording Hetzner-Projektnetz `10.0.0.0/24` mit dem Lab-VLAN `10.58.73.0/24`. Der An/Aus-Schalter
decisions/0004-site-to-site-vpn-hetzner-lab.md 27 informational net-ref:178.25.213.70 | **UDM** | zweiter WG-**Server** „Matrix", UDP **51841**, Tunnelnetz **10.58.75.0/24**, „Alternate Address for Clients" = `178.25.213.70` |
decisions/0004-site-to-site-vpn-hetzner-lab.md 28 informational net-ref:10.58.75.2;net-ref:10.0.0.0/24 | **Client „Hetzner"** | `10.58.75.2`, **Networks Behind Client = `10.0.0.0/24`** |
decisions/0004-site-to-site-vpn-hetzner-lab.md 29 informational runtime-path:~lab;net-ref:10.58.73.1 | **CFGMON** | WG-**Client/Initiator**, dauerhaft aktiv (`enable`) + `PersistentKeepalive 25`; AllowedIPs nur `10.58.73.0/24, 10.58.75.1/32`; Split-DNS nur `~lab` → `10.58.73.1`; `ip_forward` + iptabl
decisions/0004-site-to-site-vpn-hetzner-lab.md 30 informational net-ref:192.168.178.20 | **Fritzbox** | Portfreigabe UDP **51841** → `192.168.178.20` |
decisions/0004-site-to-site-vpn-hetzner-lab.md 31 informational net-ref:10.0.0.0/8 | **Hetzner** | Netz-Range auf **`10.0.0.0/8`** erweitert, Route `10.58.73.0/24 → 10.0.0.3` — damit erreichen alle Server im Netz das Lab **ohne eigene Konfiguration** |
decisions/0004-site-to-site-vpn-hetzner-lab.md 32 informational net-ref:10.58.75.0/24;net-ref:10.0.0.0/24;image-ref:10.58.73.17:443;image-ref:10.58.73.1:53 | **UniFi-Firewall** | Trennung vom Roadwarrior über **Quell-/Ziel-IP** (`10.58.75.0/24` + `10.0.0.0/24`), nicht über eine eigene Zone: erlaubt sind nur `10.58.73.17:443` (git.lab/Registry) und `10.58
decisions/0004-site-to-site-vpn-hetzner-lab.md 36 checked-ok issue-ok:management#13(closed);id-ok:LABNET-03 - ✅ **Eingelöst am 2026-08-02 (LABNET-03, [#13](https://git.lab/axion1337.chat/management/-/issues/13)):**
decisions/0004-site-to-site-vpn-hetzner-lab.md 37 prose-or-runtime Übergabe-Issues können nicht nur umziehen — sie sind umgezogen
decisions/0004-site-to-site-vpn-hetzner-lab.md 38 checked-ok issue-ok:management#25(opened) ([#25](https://git.lab/axion1337.chat/management/-/issues/25),
decisions/0004-site-to-site-vpn-hetzner-lab.md 39 checked-ok issue-ok:management#26(closed) [#26](https://git.lab/axion1337.chat/management/-/issues/26)), der Gitea-Tracker ist
decisions/0004-site-to-site-vpn-hetzner-lab.md 40 prose-or-runtime leer, die Vorlage liegt als GitLab-Issue-Template, und die Ausnahme aus ADR-0002 ist
decisions/0004-site-to-site-vpn-hetzner-lab.md 50 prose-or-runtime Gitea-PR-Ausnahme bleibt bewusst bestehen.
decisions/0004-site-to-site-vpn-hetzner-lab.md 54 prose-or-runtime historical-wording Job läuft im Lab und erreicht Gitea öffentlich. Das war der eigentliche Grund für
decisions/0004-site-to-site-vpn-hetzner-lab.md 56 informational id-ok:GAME-01 - game.axion1337.de profitiert erst nach Aufnahme in den vSwitch (GAME-01).
decisions/0005-pm-framework-kanban.md 1 prose-or-runtime # 0005 — Projektmanagement: Kanban-Rückgrat mit leichten Scrum-Elementen
decisions/0005-pm-framework-kanban.md 22 checked-ok path-ok:vision/@management(dir) | Product Goal / Vision | `vision/` (eine Datei je Linie) |
decisions/0005-pm-framework-kanban.md 24 checked-ok path-ok:verfahren/aar/@management(dir) | Review/Retro | AARs (`verfahren/aar/`) nach Deploys/Incidents |
decisions/0005-pm-framework-kanban.md 25 checked-ok path-ok:verfahren/deploy-uebergabe.md@management | Definition of Done | Deploy-Übergabe-Verfahren (`verfahren/deploy-uebergabe.md`) |
decisions/0005-pm-framework-kanban.md 26 checked-ok path-ok:roadmap.md@management | Roadmap/Meilensteine | Gruppen-Milestones + `roadmap.md` (CE: keine Epics/Roadmap-View) |
decisions/0005-pm-framework-kanban.md 27 checked-ok path-ok:decisions/@management(dir) | Entscheidungen | ADRs in `decisions/` |
decisions/0005-pm-framework-kanban.md 32 informational forge-repo:axion1337.chat/management - Das Backlogs-Repo wird zum Management-Repo `axion1337.chat/management`;
decisions/0005-pm-framework-kanban.md 33 checked-ok path-ok:hosts/@management(dir);path-ok:shared/@ThreadNet-Web(dir),management(dir);image-ref:host: offene Punkte aus `hosts/`/`shared/` sind Issues mit `host:`-Labels,
decisions/0006-wikis-konsolidieren-docusaurus.md 9 prose-or-runtime historical-wording 1. **Gitea-Wiki-Repo** `…gitops.wiki.git` — 15 Seiten, gepflegt bis 2026-07-31.
decisions/0006-wikis-konsolidieren-docusaurus.md 10 prose-or-runtime Vom Push-Mirror **nicht** erfasst: ein Wiki ist ein eigenes Repo, kein Branch.
decisions/0006-wikis-konsolidieren-docusaurus.md 11 prose-or-runtime 2. **`wiki`-Branch im gitops-Repo** — Stand 2026-05-14, mitgezogen, weil der Mirror
decisions/0006-wikis-konsolidieren-docusaurus.md 12 checked-ok path-ok:docs/@ThreadNet-Web(dir),axion1337.chat-gitops(dir),threadnet-call(dir) historical-wording alle Branches trägt. Inhalt: ein damaliger Abzug von `docs/`, kein gepflegtes Wiki.
decisions/0006-wikis-konsolidieren-docusaurus.md 13 checked-ok path-ok:docs/@ThreadNet-Web(dir),axion1337.chat-gitops(dir),threadnet-call(dir) 3. **`docs/` im main-Branch** — die eigentliche, laufend gepflegte Repo-Doku.
decisions/0006-wikis-konsolidieren-docusaurus.md 15 prose-or-runtime historical-wording Dazu waren die GitLab-Wikis aller Projekte **leer**, und die Wiki-Inhalte enthielten
decisions/0006-wikis-konsolidieren-docusaurus.md 17 prose-or-runtime historical-wording 2026-08-01 entfernt; Issues „in Gitea", obwohl migriert).
decisions/0006-wikis-konsolidieren-docusaurus.md 23 prose-or-runtime „direkt-zu-Gitea"-Ausnahme aus [ADR-0001](0001-gitlab-kanonisch-push-mirror.md).
decisions/0006-wikis-konsolidieren-docusaurus.md 26 informational forge-repo:homelab/wiki [`homelab/wiki`](https://git.lab/homelab/wiki) baut mit Docusaurus eine Seite unter
decisions/0006-wikis-konsolidieren-docusaurus.md 28 informational forge-repo:homelab/docs historical-wording Homelab (`homelab/docs`), Arbeitsweise (`management`). Die Inhalte werden beim Bau
decisions/0006-wikis-konsolidieren-docusaurus.md 33 FLAG path-miss:content/ path-miss:content/ - **Änderungen gehören ins Quell-Repo**, nie ins Wiki-Repo — was dort in `content/`
decisions/0006-wikis-konsolidieren-docusaurus.md 43 prose-or-runtime `.md` wird als CommonMark statt MDX geparst.
decisions/0006-wikis-konsolidieren-docusaurus.md 44 prose-or-runtime - **Der `wiki`-Branch im gitops-Repo ist überholt.** Er bleibt vorerst als Historie
decisions/0006-wikis-konsolidieren-docusaurus.md 47 checked-ok issue-ok:management#19(opened) ([Issue #19](https://git.lab/axion1337.chat/management/-/issues/19)).
decisions/0006-wikis-konsolidieren-docusaurus.md 51 prose-or-runtime - **Alles in ein Repo verschmelzen:** Die Quellen haben unterschiedliche Leser und
decisions/0006-wikis-konsolidieren-docusaurus.md 53 prose-or-runtime - **Wiki auf Gitea belassen:** widerspricht ADR-0002 und hielt eine Ausnahme am
decisions/0007-wiki-oberflaeche-docusaurus-vs-bookstack.md 3 checked-ok issue-ok:management#20(opened) **Status:** vorgeschlagen (Entscheidung offen → [Issue #20](https://git.lab/axion1337.chat/management/-/issues/20)) · **Datum:** 2026-08-02 · **Entscheider:** sorb
decisions/0007-wiki-oberflaeche-docusaurus-vs-bookstack.md 8 informational runtime-path:axionwiki.lab Docusaurus als Lesefläche gebaut — läuft seit 2026-08-02 unter `axionwiki.lab`.
decisions/0007-wiki-oberflaeche-docusaurus-vs-bookstack.md 42 prose-or-runtime Wahrheit neben git.lab — genau das, was [ADR-0002](0002-issues-und-management-ins-lab.md)
decisions/0007-wiki-oberflaeche-docusaurus-vs-bookstack.md 52 informational id-ok:CFGMON-09 Datenbank ohne Sicherung ist eine Zeitbombe (vgl. CFGMON-09, wo genau das seit
decisions/0007-wiki-oberflaeche-docusaurus-vs-bookstack.md 53 prose-or-runtime 2026-07-30 offen ist).
decisions/0007-wiki-oberflaeche-docusaurus-vs-bookstack.md 54 FLAG path-miss:import/ path-miss:import/ - **Ein Einweg-Import zum Befüllen, aber keine Synchronisation** (`import/` im
decisions/0007-wiki-oberflaeche-docusaurus-vs-bookstack.md 56 FLAG path-miss:provision.py path-miss:provision.py vergleichen, deshalb legt `provision.py` dieselben drei Bereiche an wie das
decisions/0008-agenten-sessions-root-aequivalent.md 3 checked-ok issue-ok:management#17(closed) **Status:** akzeptiert · **Datum:** 2026-08-06 (Struktur-Workshop [#17](https://git.lab/axion1337.chat/management/-/issues/17)) · **Entscheider:** sorb
decisions/0008-agenten-sessions-root-aequivalent.md 9 informational id-ok:LABNET-02 LABNET-02-Nacht lief deshalb über die **docker-Gruppenmitgliedschaft** des Kontos
decisions/0008-agenten-sessions-root-aequivalent.md 24 checked-ok issue-ok:management#14(opened) [#14](https://git.lab/axion1337.chat/management/-/issues/14).
decisions/0008-agenten-sessions-root-aequivalent.md 46 informational id-ok:LABNET-02 ohne diese Entscheidung wäre LABNET-02 gar nicht durchführbar gewesen.
decisions/0008-agenten-sessions-root-aequivalent.md 50 prose-or-runtime AAR-Pflicht und „alles Offene wird ein Issue" auf diesem Host besonders zählen —
decisions/0008-agenten-sessions-root-aequivalent.md 55 prose-or-runtime Kommt einer dazu, wird diese ADR abgelöst.
decisions/0008-agenten-sessions-root-aequivalent.md 57 prose-or-runtime ## Offen, bewusst nicht vor der Entscheidung geklärt
decisions/0008-agenten-sessions-root-aequivalent.md 66 checked-ok issue-ok:management#14(opened) historical-wording nächsten Host-Session, festgehalten in #14.
decisions/0008-agenten-sessions-root-aequivalent.md 80 checked-ok path-ok:hosts/cfgmon.md@management und nicht bloß ein Absatz in `hosts/cfgmon.md`.
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 5 prose-or-runtime > Nachgetragen am 2026-08-09 in der [Retro](../verfahren/retro/2026-08-09.md). Die
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 13 prose-or-runtime öffentlichem Gitea-Spiegel heißt das: Jeder, der die Repos liest, kann ablesen, an
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 23 prose-or-runtime **Regel ab 2026-08-07**, gültig für alle Repos der Gruppe `axion1337.chat` und die
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 29 prose-or-runtime **Rückwirkend angewandt am 2026-08-09** auf **251 Commits** — alles aus dieser
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 34 prose-or-runtime | gitops | 117 von 264 | ab 2026-07-27 |
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 35 prose-or-runtime | management | 78 von 78 | vollständig |
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 36 prose-or-runtime | ThreadNet-Web | 47 von 50 | ab 2026-07-28 |
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 37 prose-or-runtime | threadnet-call | 9 von 9 | vollständig |
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 39 prose-or-runtime Dabei wurden 17 Tags mit umgezogen und die Autoren-Identitäten vereinheitlicht —
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 54 checked-ok path-ok:shared/commit-zuordnung-2026-08-07.md@management [`shared/commit-zuordnung-2026-08-07.md`](../shared/commit-zuordnung-2026-08-07.md).
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 61 prose-or-runtime wieder aktiv.
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 66 prose-or-runtime liegen im selben GitLab und teilweise auf dem öffentlichen Spiegel — und sind
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 72 prose-or-runtime Das Force-Push der umgezogenen Tags hat in ThreadNet-Web **drei Release-Pipelines
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 74 informational tag-ok:v0.4.0 `v0.4.0` aus altem Quellcode gegen heutige Basis-Images neu gebaut und
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 77 checked-ok issue-ok:ThreadNet-Web#14(closed) ThreadNet-Web#14; die Sperre ist seit `3cb43f5` scharf.
decisions/0009-commit-konventionen-und-historien-anonymisierung.md 86 prose-or-runtime angefasst (`Scrublord@Mac.Bad`, 135 Commits aus der Zeit vor dieser
decisions/README.md 6 prose-or-runtime auf `abgelöst durch NNNN` gesetzt.
decisions/README.md 13 prose-or-runtime git.lab-Cutover 2026-08-01: die „Übergabe-Issues bleiben auf Gitea"-Ausnahme
decisions/template.md 3 prose-or-runtime **Status:** vorgeschlagen | akzeptiert | abgelöst durch NNNN · **Datum:** JJJJ-MM-TT · **Entscheider:** sorb
hosts/cfgmon.md 3 prose-or-runtime Monitoring-Stack, Gitea und der Reverse Proxy für alles Öffentliche.
hosts/cfgmon.md 8 prose-or-runtime | **OS** | Ubuntu 24.04.4 LTS |
hosts/cfgmon.md 9 informational net-ref:188.245.193.243 | **IPv4** | `188.245.193.243` |
hosts/cfgmon.md 11 informational net-ref:10.0.0.3;net-ref:10.0.0.2 | **Privat** | `10.0.0.3` (`enp7s0`, Hetzner-Netz — dort liegt auch k3s auf `10.0.0.2`) |
hosts/cfgmon.md 12 informational runtime-path:rohana.axion1337.de | **DNS** | `rohana.axion1337.de` → Gitea, `selendis.axion1337.de` → Grafana |
hosts/cfgmon.md 19 checked-ok image-ref:prom/prometheus:v3.3.1;forge-repo:sorb/threadnet-operating;path-ok:monitoring/@axion1337.chat-gitops(dir),threadnet-operating(dir) | prometheus | `prom/prometheus:v3.3.1` | `monitoring` | `sorb/threadnet-operating`, `monitoring/` |
hosts/cfgmon.md 20 informational image-ref:grafana/loki:3.7.1 | loki | `grafana/loki:3.7.1` | `monitoring` | dito |
hosts/cfgmon.md 21 informational image-ref:grafana/grafana:12.0.0 | grafana | `grafana/grafana:12.0.0` | `monitoring` | dito |
hosts/cfgmon.md 22 informational image-ref:grafana/alloy:v1.16.0 | alloy | `grafana/alloy:v1.16.0` | `monitoring` | dito |
hosts/cfgmon.md 23 informational image-ref:prom/node-exporter:v1.9.1 | node-exporter | `prom/node-exporter:v1.9.1` | `monitoring` | dito |
hosts/cfgmon.md 24 informational image-ref:traefik:v3.7.9;forge-repo:sorb/thread-net-git;id-no-issue:CFGMON-02 | traefik | `traefik:v3.7.9` | `thread-net-git` | `sorb/thread-net-git`, seit 2026-07-30 in `main` (siehe [CFGMON-02](#cfgmon-02--traefik-gitea-cadvisor-und-runner-unter-iac-gebracht--erledigt-2026-07
hosts/cfgmon.md 25 informational image-ref:gitea/gitea:1.27.0;image-ref::latest historical-wording | gitea | `gitea/gitea:1.27.0` | `thread-net-git` | dito, gepinnt (war `:latest`) |
hosts/cfgmon.md 26 informational runtime-path:gcr.io/cadvisor/cadvisor:v0.49.1;image-ref::latest historical-wording | cadvisor | `gcr.io/cadvisor/cadvisor:v0.49.1` | `thread-net-git` | dito, gepinnt (war `:latest`) |
hosts/cfgmon.md 27 informational image-ref:gitea/act_runner:0.6.1;id-no-issue:CFGMON-02 | runner | `gitea/act_runner:0.6.1` | `thread-net-git` | dito, Container `gitea-runner`, siehe CFGMON-02 |
hosts/cfgmon.md 28 informational image-ref:portainer/agent:2.27.5 | portainer_agent | `portainer/agent:2.27.5` | — | standalone, kein Compose |
hosts/cfgmon.md 32 informational image-ref:10.0.0.2:9100 (`10.0.0.2:9100`), `pterodactyl_host_node` und `gameserver_cadvisor`
hosts/cfgmon.md 33 informational net-ref:157.90.155.206 (beide `157.90.155.206`, siehe [game](game.md)).
hosts/cfgmon.md 38 prose-or-runtime historical-wording [management-Projekt](https://git.lab/axion1337.chat/management/-/issues); die IDs bleiben in den Issue-Titeln erhalten.
hosts/cfgmon.md 41 checked-ok issue-ok:management#7(opened);id-ok:CFGMON-01 - [CFGMON-01 — Zertifikatserneuerung braucht offene Ports (zeitkritisch ab 2026-09-28)](https://git.lab/axion1337.chat/management/-/issues/7)
hosts/cfgmon.md 42 checked-ok issue-ok:management#8(opened);id-ok:CFGMON-03 - [CFGMON-03 — Prometheus-Remote-Write/Loki öffentlich ohne Auth (Weg A, nachgelagerte Prüfung)](https://git.lab/axion1337.chat/management/-/issues/8)
hosts/cfgmon.md 43 checked-ok issue-ok:management#9(opened);id-ok:CFGMON-04 - [CFGMON-04 — Grafana-Admin-Credentials aus `.env` gelten nicht für die API](https://git.lab/axion1337.chat/management/-/issues/9)
hosts/cfgmon.md 44 checked-ok issue-ok:management#10(opened);id-ok:CFGMON-09 - [CFGMON-09 — Gitea-Backups off-host (⚠️ Backup-Cron deaktiviert)](https://git.lab/axion1337.chat/management/-/issues/10)
hosts/cfgmon.md 46 informational id-no-issue:CFGMON-11 ## CFGMON-11 — Gitea-CI-Rückbau nach GitLab-Umzug
hosts/cfgmon.md 48 prose-or-runtime **Status:** erledigt (2026-07-31 spätabends) — bis auf einen kosmetischen Handgriff:
hosts/cfgmon.md 49 prose-or-runtime auf CFGMON `cd /opt/thread-net-git && git checkout main && git pull` (Checkout parkt
hosts/cfgmon.md 52 informational runtime-path:/opt/threadnet-operating **Dazu neu (2026-08-01 ~05:00):** Auch `/opt/threadnet-operating` braucht einmal
hosts/cfgmon.md 53 prose-or-runtime `git fetch && git reset --hard origin/main` — der State-Persistenz-Commit wurde
hosts/cfgmon.md 54 prose-or-runtime dort direkt nach Gitea gepusht (dfe04c4a), vom Mirror überschrieben, vom Mac aus
hosts/cfgmon.md 55 prose-or-runtime per Patch gerettet und kanonisch als `6ffab68` neu aufgelegt (inhaltsgleich,
hosts/cfgmon.md 58 prose-or-runtime **Erledigt (2026-08-01, autonom):**
hosts/cfgmon.md 59 prose-or-runtime - Actions-Toggles deaktiviert: `ThreadNet-Web`, `threadnet-call`, `axion1337.chat-gitops`
hosts/cfgmon.md 60 checked-ok path-ok:.github/workflows/@threadnet-call(dir) historical-wording - `ThreadNet-Web`: alle `.github/workflows/`-Dateien entfernt (Commit `a876758`)
hosts/cfgmon.md 61 FLAG path-miss:.gitea/workflows/ path-miss:.gitea/workflows/ historical-wording - gitops: Verifikations-Job nach GitLab portiert + `.gitea/workflows/` entfernt
hosts/cfgmon.md 62 FLAG path-miss:milestone-release.yml path-miss:milestone-release.yml (Commit `5e46a24`, Pipeline grün, Mirror→Gitea verifiziert; `milestone-release.yml`
hosts/cfgmon.md 63 FLAG issue-miss:management#33 issue-miss:management#33 historical-wording war toter Code, siehe #33). Flux unberührt.
hosts/cfgmon.md 64 checked-ok path-ok:.env.example@threadnet-call,threadnet-operating historical-wording - `thread-net-git`: Runner-Service/Config/`.env.example` per Commit `d904734` entfernt
hosts/cfgmon.md 65 prose-or-runtime (auf git.lab; Mirror trägt nach Gitea) — **noch nicht deployt**, siehe unten.
hosts/cfgmon.md 66 informational package-ref:@sorb/threadnet-call-embedded - Registry-Entscheidung npm final (Evidenz: `@sorb/threadnet-call-embedded` ist
hosts/cfgmon.md 67 checked-ok path-ok:apps/web@ThreadNet-Web(dir) pnpm-Dependency von `apps/web`, Lockfile pinnt Tarball-URL auf rohana): **bleibt Gitea**.
hosts/cfgmon.md 70 prose-or-runtime 1. ~~`thread-net-git`-Stand deployen~~ **erledigt (2026-07-31 spätabends, via
hosts/cfgmon.md 71 FLAG path-miss:runner-data/ path-miss:runner-data/ historical-wording CFGMON-Session)**: Runner-Container/Netz/`runner-data/`/`.env`-Zeile entfernt,
hosts/cfgmon.md 72 prose-or-runtime historical-wording `builder-1` aus der Gitea-Admin-UI gelöscht, Actions-Registrierungstoken rotiert.
hosts/cfgmon.md 75 checked-ok issue-ok:thread-net-git#1(closed) Mac→git.lab→Mirror (`15c8f2d`), Hergang in thread-net-git#1 (geschlossen).
hosts/cfgmon.md 77 prose-or-runtime historical-wording getippte Token (`a89bfb…`) war der Gitea-**Actions-Runner-Registrierungstoken**
hosts/cfgmon.md 82 prose-or-runtime 3. ~~Token-Rotation b~~ **erledigt (2026-07-31 abends)**: Generalschlüssel
hosts/cfgmon.md 87 informational runtime-path:~/.config/gitea-rohana/token `~/.config/gitea-rohana/token` auf dem Mac), `claude-push` (write:repository,
hosts/cfgmon.md 88 informational runtime-path:~/.config/gitea-rohana/push-token `~/.config/gitea-rohana/push-token`). Erster CI-Publish `0.19.2-threadnet.6`
hosts/cfgmon.md 89 checked-ok issue-ok:threadnet-call#1(closed) historical-wording verifiziert → threadnet-call#1 geschlossen. Alle Klartext-Reste entfernt
hosts/cfgmon.md 94 informational runtime-path:git.lab/axion1337.chat (`git.lab/axion1337.chat`, Gruppe mit importierten Projekten angelegt; die Domain ist
hosts/cfgmon.md 97 prose-or-runtime pausieren). Der am 2026-07-30 auf Gitea-Seite aufgebaute CI-Unterbau wird damit teilweise
hosts/cfgmon.md 102 prose-or-runtime - **Actions-Toggle** `has_actions` bei `ThreadNet-Web` (am 2026-07-30 per API aktiviert)
hosts/cfgmon.md 103 prose-or-runtime wieder deaktivieren, ebenso bei `threadnet-call` (stoppt die fehlschlagende
hosts/cfgmon.md 105 checked-ok path-ok:.github/workflows/@threadnet-call(dir) - **`.github/workflows/` in `ThreadNet-Web`** (der kuratierte 6-Dateien-Satz) — wird durch
hosts/cfgmon.md 106 checked-ok path-ok:.gitlab-ci.yml@ThreadNet-Web,axion1337.chat-gitops,management `.gitlab-ci.yml` ersetzt. Die Erkenntnisse aus den Läufen vom 2026-07-30 mitnehmen:
hosts/cfgmon.md 110 prose-or-runtime - **Geerbte Upstream-Workflows in `threadnet-call`** (build/publish/test/translations/
hosts/cfgmon.md 113 FLAG path-miss:runner-data/.runner path-miss:runner-data/.runner der Gitea-Admin-UI deregistrieren und `runner-data/.runner` auf dem Host entfernen.
hosts/cfgmon.md 114 FLAG path-miss:embedded/web/.npmrc path-miss:embedded/web/.npmrc - **Token: npm-Token in `threadnet-call`s untracked `embedded/web/.npmrc`** (Klartext im
hosts/cfgmon.md 121 prose-or-runtime - **Runner-Service in `thread-net-git` ganz entfernen?** Hängt daran, ob das gitops-Repo
hosts/cfgmon.md 122 FLAG path-miss:deploy-on-push.yml path-miss:deploy-on-push.yml seinen leichten `deploy-on-push.yml` (YAML-Validierung/Notification, läuft sauber)
hosts/cfgmon.md 124 FLAG path-miss:runner/config.yaml path-miss:runner/config.yaml Revert-Commit in `thread-net-git`: Compose-Service `runner`, `runner/config.yaml`,
hosts/cfgmon.md 125 FLAG path-ok:.env.example@threadnet-call,threadnet-operating;path-miss:runner-data/ path-miss:runner-data/ `.env.example` (RUNNER_TOKEN), Cache-Port-Bindung 8088, `runner-data/`.
hosts/cfgmon.md 126 informational package-ref:@sorb/threadnet-call-embedded - **Registry-Ziel für `@sorb/threadnet-call-embedded`**: bleibt die Gitea-npm-Registry
hosts/cfgmon.md 128 prose-or-runtime GitLab-Package-Registry (dann läuft die Gitea-Package-Seite leer).
hosts/cfgmon.md 129 prose-or-runtime - **Container-Images bleiben in der rohana-Registry** (Flux/k8s pullt von dort — spricht
hosts/cfgmon.md 131 prose-or-runtime **neuen** Deploy-/Push-Token für die rohana-Registry (Neuanlage, kein Rückbau).
hosts/cfgmon.md 135 prose-or-runtime Gitea selbst, gitops-Repo als Flux-Source, Issues/Wiki/dieses Repo, der
hosts/cfgmon.md 136 informational id-ok:CFGMON-09 API-Token für Issue-Verwaltung, das Gitea-Backup-Script (CFGMON-09).
hosts/cfgmon.md 139 prose-or-runtime umgezogen — [ADR-0002](../decisions/0002-issues-und-management-ins-lab.md) —,
hosts/cfgmon.md 140 prose-or-runtime das Repo dabei von `Backlogs` zu `management` umgewidmet
hosts/cfgmon.md 142 prose-or-runtime den damaligen Rückbau der Gitea-CI, nicht auf Dauer.)*
hosts/cfgmon.md 145 checked-ok issue-ok:ThreadNet-Web#2(closed) [ThreadNet-Web#2](https://rohana.axion1337.de/sorb/ThreadNet-Web/issues/2),
hosts/cfgmon.md 146 checked-ok issue-ok:threadnet-call#1(closed) [threadnet-call#1](https://rohana.axion1337.de/sorb/threadnet-call/issues/1).
hosts/cfgmon.md 148 prose-or-runtime **Nächster Schritt:** die drei manuellen Schritte oben, dann → erledigt.
hosts/cfgmon.md 150 informational id-no-issue:CFGMON-13 ## CFGMON-13 — Absender-Design für Release-/CVE-Meldungen: eigener Bot?
hosts/cfgmon.md 154 checked-ok issue-ok:axion1337.chat-gitops#47(opened) Alertmanager-Routing: [gitops#47](https://rohana.axion1337.de/sorb/axion1337.chat-gitops/issues/47).
hosts/cfgmon.md 160 checked-ok issue-ok:axion1337.chat-gitops#22(opened) 1. **release-watch** (gitops#22, deploybereit): Upstream-Releases/Security-Releases
hosts/cfgmon.md 162 checked-ok issue-ok:axion1337.chat-gitops#31(opened) 2. **Trivy-CVE-Scans** (gitops#31, läuft wöchentlich in der Lab-CI): Funde landen
hosts/cfgmon.md 168 informational package-ref:@alerts scharf/stumm schaltbar bleibt? Oder bewusst alles über `@alerts` bündeln?
hosts/cfgmon.md 174 informational id-no-issue:CFGMON-12 ## CFGMON-12 — Gitea-Projektmetadaten nach GitLab umziehen/integrieren
hosts/cfgmon.md 176 checked-ok issue-ok:axion1337.chat-gitops#48(opened) **Status:** abgelöst durch [gitops#48](https://rohana.axion1337.de/sorb/axion1337.chat-gitops/issues/48) (2026-08-01, sorb: HOHE Priorität — vollständige Issue-Migration + zentrale Gruppen-Roadmap; Pl
hosts/cfgmon.md 178 prose-or-runtime ✅ **Umgesetzt am 2026-08-01/02**: Die Migration ist durch — 62 Issues liegen auf
hosts/cfgmon.md 179 prose-or-runtime git.lab, die Gitea-Issues sind geschlossen und tragen einen Migrations-Fußtext.
hosts/cfgmon.md 181 prose-or-runtime die Aufzählung „Noch auf Gitea" gilt nicht mehr. Die zunächst verbliebene Ausnahme
hosts/cfgmon.md 182 informational id-ok:LABNET-03 für Deploy-Übergabe-Issues ist am 2026-08-02 mit LABNET-03 ebenfalls zurückgebaut.
hosts/cfgmon.md 187 prose-or-runtime Projektmetadaten liegen weiterhin auf Gitea/rohana. Verifiziert per API am
hosts/cfgmon.md 190 prose-or-runtime Noch auf Gitea:
hosts/cfgmon.md 192 checked-ok issue-ok:management#2(opened);issue-ok:management#5(opened);issue-ok:management#1(opened) - **Issues** inkl. Kommentare/Labels: ThreadNet-Web (#2, #5, …), threadnet-call (#1),
hosts/cfgmon.md 193 checked-ok issue-ok:management#24(opened);issue-ok:management#25(opened);issue-ok:management#32(opened) gitops (#24, #25, #32, …)
hosts/cfgmon.md 195 FLAG path-miss:00-TASKS.md path-miss:00-TASKS.md - **Wiki** (gitops-Wiki mit `00-TASKS.md`-Log — bisher bewusst direkt-Gitea)
hosts/cfgmon.md 197 informational id-no-issue:CFGMON-11 [CFGMON-11](#cfgmon-11--gitea-ci-rückbau-nach-gitlab-umzug) auf rohana — bei
hosts/cfgmon.md 202 prose-or-runtime 1. **GitLab-Gitea-Importer vs. API-Skript** — der Importer verliert Autorenschaft
hosts/cfgmon.md 205 prose-or-runtime 2. **Erreichbarkeit**: rohana ist von überall erreichbar, git.lab nur im Homelab —
hosts/cfgmon.md 208 prose-or-runtime direkt-Gitea).
hosts/cfgmon.md 213 prose-or-runtime auf Gitea" als geltende Regel.
hosts/cfgmon.md 219 informational id-no-issue:CFGMON-10 ### CFGMON-10 — threadnet-call-CI schlägt am Artifact-Schritt fehl · verworfen 2026-07-30
hosts/cfgmon.md 221 prose-or-runtime Ausgelöst durch einen Push nach `threadnet-call` am 2026-07-30: der Runner (`builder-1`)
hosts/cfgmon.md 226 prose-or-runtime **Hypothese inzwischen im Kern bestätigt** — beim parallelen ThreadNet-Web-CI-Versuch
hosts/cfgmon.md 229 prose-or-runtime ohne Swap, trägt daneben Gitea/Traefik/Monitoring) kann das strukturell nicht liefern.
hosts/cfgmon.md 233 informational id-no-issue:CFGMON-11 [CFGMON-11](#cfgmon-11--gitea-ci-rückbau-nach-gitlab-umzug)), CFGMON bleibt bei leichten
hosts/cfgmon.md 234 checked-ok issue-ok:threadnet-call#1(closed) Jobs. Issue-Seite: [threadnet-call#1](https://rohana.axion1337.de/sorb/threadnet-call/issues/1).
hosts/cfgmon.md 236 informational id-no-issue:CFGMON-02 ### CFGMON-02 — Traefik, Gitea, cAdvisor und Runner unter IaC gebracht · erledigt 2026-07-30
hosts/cfgmon.md 238 informational runtime-path:/data/compose/8 Liefen ursprünglich im Compose-Projekt `thread-net-git` aus `/data/compose/8`, einem von
hosts/cfgmon.md 239 informational forge-repo:sorb/thread-net-git;image-ref::latest Portainer verwalteten Stack ohne Repo dazu. Jetzt in `sorb/thread-net-git`: `:latest`-Tags
hosts/cfgmon.md 240 prose-or-runtime historical-wording gepinnt (Gitea `1.27.0`, cAdvisor `v0.49.1`), Projektname `thread-net-git` beibehalten
hosts/cfgmon.md 242 prose-or-runtime Volume-Namen, Downgrade-Verbot für Gitea), nächtliches Backup-Script. Zusätzlich neu: ein
hosts/cfgmon.md 243 informational image-ref:gitea/act_runner:0.6.1 `runner`-Service (`gitea/act_runner:0.6.1`, Container `gitea-runner`, Labels
hosts/cfgmon.md 244 prose-or-runtime `ubuntu-latest`/`linux-build`/`win-wine` — die letzten beiden gezielt für Electron-Builds)
hosts/cfgmon.md 245 informational id-no-issue:CFGMON-08 — ursprünglich unter [CFGMON-08](#cfgmon-08) als offene Frage gelistet, siehe dort.
hosts/cfgmon.md 247 informational branch-ok:rework/stack Entstanden auf Branch `rework/stack`, zunächst nicht gemergt (produktiv aber schon aktiv).
hosts/cfgmon.md 248 informational branch-ok:origin/main;branch-ok:origin/rework/stack **2026-07-30 nach `main` gemergt** (`origin/main` == `origin/rework/stack` auf `02b3224`,
hosts/cfgmon.md 249 prose-or-runtime verifiziert) — damit spiegelt die Standardansicht des Repos jetzt den Live-Stand.
hosts/cfgmon.md 250 prose-or-runtime Verifiziert am 2026-07-30 über die Compose-Labels der laufenden Container
hosts/cfgmon.md 251 informational image-ref:working_dir: /opt/thread-net-git (`working_dir: /opt/thread-net-git`) und `docker compose ls`. `gitea-data` ist als
hosts/cfgmon.md 255 prose-or-runtime Zum Bootstrapping-Problem (Definition von Gitea liegt in Gitea): mitigiert,
hosts/cfgmon.md 256 prose-or-runtime weil das Deploy-Verzeichnis selbst der Checkout ist — fällt Gitea aus, liegt
hosts/cfgmon.md 259 informational id-ok:CFGMON-09 [CFGMON-09](#cfgmon-09--gitea-backups-off-host-in-die-storage-box-eigenes-borg-repo).
hosts/cfgmon.md 261 informational id-no-issue:CFGMON-05 ### CFGMON-05 — Monitoring-Stack unter IaC bringen · erledigt 2026-07-30
hosts/cfgmon.md 263 informational runtime-path:/opt/monitoring;image-ref::latest Der Stack lief aus `/opt/monitoring` ohne Versionierung und mit `:latest`-Tags. Jetzt
hosts/cfgmon.md 264 checked-ok forge-repo:sorb/threadnet-operating;path-ok:monitoring/@axion1337.chat-gitops(dir),threadnet-operating(dir) in `sorb/threadnet-operating` unter `monitoring/`, Images gepinnt,
hosts/cfgmon.md 268 informational id-no-issue:CFGMON-06 ### CFGMON-06 — Grafana-Certresolver zeigte ins Leere · erledigt 2026-07-30
hosts/cfgmon.md 273 informational runtime-path:/opt/monitoring aus. Aus dem Altbestand in `/opt/monitoring` unverändert übernommen und dort
hosts/cfgmon.md 276 prose-or-runtime Behoben in `threadnet-operating`, Commit `a400f8a`. Cert von Let's Encrypt (YR2)
hosts/cfgmon.md 277 prose-or-runtime historical-wording ausgestellt, gültig bis 2026-10-28 — die Nachfolge davon ist
hosts/cfgmon.md 278 informational id-ok:CFGMON-01 [CFGMON-01](#cfgmon-01--zertifikatserneuerung-braucht-offene-ports-ipv4-und-ipv6).
hosts/cfgmon.md 280 informational id-no-issue:CFGMON-07 ### CFGMON-07 — Alloy verlor seine Positions-Datei bei jedem Deploy · erledigt 2026-07-30
hosts/cfgmon.md 282 prose-or-runtime historical-wording `--storage.path=/var/lib/alloy/data` war gesetzt, aber ohne Volume: die
hosts/cfgmon.md 288 prose-or-runtime Behoben durch ein `alloy_data`-Volume, Commit `edac97e`. Verifiziert: Positions
hosts/cfgmon.md 291 informational id-no-issue:CFGMON-08 ### CFGMON-08 — Kein Gitea-Actions-Runner registriert, Standort noch offen · erledigt 2026-07-30
hosts/cfgmon.md 294 prose-or-runtime existiert und wo einer laufen sollte, noch offen sei. Beides falsch — ein Runner
hosts/cfgmon.md 295 informational branch-ok:rework/stack (`builder-1`) läuft bereits, auf CFGMON, als Teil von `thread-net-git`s `rework/stack`-
hosts/cfgmon.md 297 informational id-no-issue:CFGMON-02 [CFGMON-02](#cfgmon-02--traefik-gitea-cadvisor-und-runner-unter-iac-gebracht--erledigt-2026-07-30) — hier
hosts/cfgmon.md 298 checked-ok issue-ok:axion1337.chat-gitops#33(closed) nicht dupliziert. [gitops#33](https://rohana.axion1337.de/sorb/axion1337.chat-gitops/issues/33)
hosts/cfgmon.md 299 prose-or-runtime (dieselbe falsche Prämisse) entsprechend korrigiert/geschlossen.
hosts/game.md 3 prose-or-runtime Pterodactyl- / Gameserver-Host.
hosts/game.md 7 informational net-ref:157.90.155.206 | **IPv4** | `157.90.155.206` |
hosts/game.md 10 informational net-ref:10.0.0.4 | **Privat** | `10.0.0.4` (im vSwitch seit 2026-08-02) |
hosts/game.md 20 prose-or-runtime [axion1337.chat/game-operating](https://git.lab/axion1337.chat/game-operating)
hosts/game.md 25 prose-or-runtime Deployment ist gewollt, aber bewusst **zurückgestellt, bis das Matrix-Projekt
hosts/game.md 31 prose-or-runtime **Pterodactyl** (Gameserver-Verwaltung, in Benutzung durch Bekannte des Betreibers
hosts/game.md 36 informational runtime-path:ghcr.io/pterodactyl/panel:v1.12.0 | `pterodactyl` (Panel) | `ghcr.io/pterodactyl/panel:v1.12.0` |
hosts/game.md 37 informational runtime-path:ghcr.io/pterodactyl/wings:v1.12.0 | `wings` (Daemon, fährt die Gameserver als Docker-Container) | `ghcr.io/pterodactyl/wings:v1.12.0` |
hosts/game.md 41 prose-or-runtime **Eigener Monitoring-Stack** (grafana-oss, prometheus v3.0.0 mit 15 d Retention,
hosts/game.md 42 prose-or-runtime loki 3.1.1, promtail 3.1.1, node-exporter v1.8.1, cadvisor v0.49.2). Wird
hosts/game.md 43 prose-or-runtime perspektivisch von CFGMON abgelöst — siehe unten.
hosts/game.md 47 informational id-ok:GAME-01 GAME-01: Auf 9100/8080 des Hosts lauscht nichts, CFGMONs Scrape-Ziele auf der
hosts/game.md 55 informational net-ref:188.245.193.243;net-ref:178.25.213.70 | Port | von CFGMON (`188.245.193.243`, 2026-08-01) | vom Hausanschluss (`178.25.213.70`, 2026-08-02) |
hosts/game.md 57 prose-or-runtime | 80 / 443 | offen | offen (HTTP 404 bzw. 503) |
hosts/game.md 58 prose-or-runtime | **22** | **Timeout** | **offen** |
hosts/game.md 67 prose-or-runtime Es fehlte also keine Ausnahme für CFGMON. Seit 2026-08-02 liegt der Host im
hosts/game.md 68 informational net-ref:10.0.0.4 vSwitch (`10.0.0.4`); die Monitoring-Anbindung läuft künftig **per Push über das
hosts/game.md 69 informational net-ref:10.0.0.3 private Netz** — Alloy sammelt lokal ein und schiebt nach `10.0.0.3`, wodurch der
hosts/game.md 71 checked-ok issue-ok:management#2(opened);id-ok:GAME-01 k3s-Cluster. Details: [GAME-01](https://git.lab/axion1337.chat/management/-/issues/2).
hosts/game.md 80 prose-or-runtime historical-wording [management-Projekt](https://git.lab/axion1337.chat/management/-/issues); die IDs bleiben in den Issue-Titeln erhalten.
hosts/game.md 83 checked-ok issue-ok:management#2(opened);id-ok:GAME-01 historical-wording - [GAME-01 — Host von CFGMON aus nicht erreichbar, 2 Targets down (⚠️ Silences bis 2026-08-04)](https://git.lab/axion1337.chat/management/-/issues/2)
hosts/game.md 84 checked-ok issue-ok:management#3(opened);id-ok:GAME-02 - [GAME-02 — `www.game.axion1337.de` ist überflüssig](https://git.lab/axion1337.chat/management/-/issues/3)
hosts/matrix.md 8 informational net-ref:49.13.132.245 | **IPv4** | `49.13.132.245` |
hosts/matrix.md 10 informational net-ref:10.0.0.2;net-ref:10.0.0.3 | **Privat** | `10.0.0.2` (`enp7s0`, dasselbe Hetzner-Netz wie CFGMON `10.0.0.3`) |
hosts/matrix.md 12 prose-or-runtime | **DNS** | `matrix.axion1337.de` **und** `matrix.axion1337.chat` zeigen auf dieselbe IP — ebenso `axion1337.chat` (Apex) und `account.axion1337.chat` (MAS). `axion1337.de` ist die ältere/Registrar-Do
hosts/matrix.md 15 informational runtime-path:~/.ssh/config **Inventarisiert** (direkter SSH-Zugriff, `~/.ssh/config`-Alias `axion1337`, Port 2248):
hosts/matrix.md 18 informational forge-repo:sorb/axion1337.chat-gitops [`sorb/axion1337.chat-gitops`](https://rohana.axion1337.de/sorb/axion1337.chat-gitops) - dieser
hosts/matrix.md 20 informational forge-repo:sorb/ThreadNet-Web;forge-repo:sorb/threadnet-call `sorb/ThreadNet-Web` (Element Web), `sorb/threadnet-call` (Element Call/LiveKit-Widget).
hosts/matrix.md 21 informational forge-repo:sorb/element-web;forge-repo:sorb/ThreadNet-Stack historical-wording `sorb/element-web` und `sorb/ThreadNet-Stack` sind **veraltete/abgelöste** Vorgänger-Repos
hosts/matrix.md 24 prose-or-runtime `ufw`: aktiv, Default Deny Incoming / Allow Outgoing, explizite Allow-Regeln für
hosts/matrix.md 25 prose-or-runtime 2248/tcp (SSH), 80/443, TURN/RTC-Ports. `unattended-upgrades` aktiv (Debian-Security +
hosts/matrix.md 26 informational id-no-issue:MATRIX-04 Debian-Origin), siehe [MATRIX-04](#matrix-04--host-level-pre-update-benachrichtigung-erledigt).
hosts/matrix.md 31 prose-or-runtime historical-wording [management-Projekt](https://git.lab/axion1337.chat/management/-/issues); die IDs bleiben in den Issue-Titeln erhalten.
hosts/matrix.md 34 checked-ok issue-ok:management#1(opened);id-ok:MATRIX-03 - [MATRIX-03 — `www.matrix.axion1337.de` ist überflüssig](https://git.lab/axion1337.chat/management/-/issues/1)
hosts/matrix.md 36 informational id-no-issue:MATRIX-05 ## MATRIX-05 — node-exporter-DaemonSet in CrashLoopBackOff, Cluster-Scrape seit 2026-08-01 tot
hosts/matrix.md 38 prose-or-runtime **Status:** erledigt (2026-08-01 ~04:10, vom Mac aus mit kubectl/SSH)
hosts/matrix.md 41 informational image-ref:listen tcp 0.0.0.0:9100: bind: address already in use Teil 1 bestätigt per Pod-Log: `listen tcp 0.0.0.0:9100: bind: address already in use`;
hosts/matrix.md 43 informational image-ref:10.0.0.2:9100 via `10.0.0.2:9100` scrapt). Teil 2 erklärt: der Cluster-Service "funktionierte" nur in
hosts/matrix.md 49 checked-ok issue-ok:axion1337.chat-gitops#45(opened) historical-wording **Fix (gitops `228807f`, Weg A aus gitops#45):** HelmRelease + Alloy-Scrape entfernt,
hosts/matrix.md 52 checked-ok issue-ok:axion1337.chat-gitops#45(opened) [gitops#45](https://rohana.axion1337.de/sorb/axion1337.chat-gitops/issues/45).
hosts/matrix.md 61 prose-or-runtime | Messwert | Stand 2026-08-01 |
hosts/matrix.md 67 prose-or-runtime | `waiting_reason` / `ready` | `CrashLoopBackOff` / `0` |
hosts/matrix.md 73 informational image-ref:hostNetwork: true **Vermutete Ursache, nicht verifiziert:** Der Pod läuft mit `hostNetwork: true` und will
hosts/matrix.md 75 informational image-ref:10.0.0.2:9100 derselbe, den CFGMON als Job `k3s_host_node` direkt auf `10.0.0.2:9100` scrapt und der
hosts/matrix.md 86 prose-or-runtime ### Teil 2 — der Cluster-Scrape ist am 2026-08-01 01:19 UTC ausgefallen (akut)
hosts/matrix.md 96 informational net-ref:49.13.132.245 `hostNetwork`, sein Pod-IP ist die öffentliche `49.13.132.245`, dorthin zeigt der
hosts/matrix.md 103 informational image-ref:10.0.0.2:9100 | `10.0.0.2:9100` (privat) | offen, 2706 Metriken |
hosts/matrix.md 104 informational image-ref:49.13.132.245:9100 | `49.13.132.245:9100` (öffentlich) | **keine Antwort** |
hosts/matrix.md 105 informational image-ref:49.13.132.245:80;image-ref::443 | `49.13.132.245:80` / `:443` | offen — Host lebt |
hosts/matrix.md 110 informational image-ref:10.0.0.2:9100;image-ref:0.0.0.0:9100 1. Der Exporter bindet jetzt `10.0.0.2:9100` statt `0.0.0.0:9100`.
hosts/matrix.md 123 informational image-ref:10.0.0.2:9100 auf `10.0.0.2:9100` zeigen lassen. Beendet den Crashloop und erhält die enge Bindung ans
hosts/matrix.md 127 informational net-ref:0.0.0.0 Ebenfalls sauber, aber er bindet dann wieder `0.0.0.0` — also auch die öffentliche IP,
hosts/matrix.md 131 prose-or-runtime ### Nebenbefund — Job-Label kollidiert zwischen zwei Hosts
hosts/matrix.md 137 code-block up=1 instance=node-exporter:9100 -> CFGMON (Kernel 6.8.0-136-generic)
hosts/matrix.md 152 informational package-ref:@matrix.axion1337.de;id-no-issue:MATRIX-01 ### MATRIX-01 — Klären, ob der Server Mail als `@matrix.axion1337.de` verschickt · erledigt 2026-07-30
hosts/matrix.md 154 prose-or-runtime Für `matrix.axion1337.de` existiert der komplette IONOS-Mail-Satz: `MX mx00/mx01`,
hosts/matrix.md 157 prose-or-runtime offen, weil Matrix-Homeserver typischerweise Mail für Registrierung/Passwort-Reset
hosts/matrix.md 160 prose-or-runtime **Antwort, verifiziert per Config** (nicht nur vermutet) — direkt im IaC-Repo
hosts/matrix.md 161 informational forge-repo:sorb/axion1337.chat-gitops `sorb/axion1337.chat-gitops`, dem tatsächlich hier deployten Stand geprüft:
hosts/matrix.md 163 checked-ok path-ok:apps/production/custom-configs/synapse-values.yaml@axion1337.chat-gitops;image-ref:email: - `apps/production/custom-configs/synapse-values.yaml` — kein `email:`/`smtp_host`/
hosts/matrix.md 165 checked-ok path-ok:apps/production/custom-configs/mas-secret.yaml@axion1337.chat-gitops - `apps/production/custom-configs/mas-secret.yaml` (SOPS-entschlüsselt geprüft) — kein
hosts/matrix.md 166 prose-or-runtime `email`/`smtp`/`mailer`-Eintrag.
hosts/matrix.md 167 checked-ok path-ok:apps/production/element-server-suite.yaml@axion1337.chat-gitops - `apps/production/element-server-suite.yaml` (HelmRelease values) — dito, nichts.
hosts/matrix.md 174 informational id-ok:ZONE-02 [ZONE-02](../shared/zone-axion1337.md) an dieser Stelle entblockt.
hosts/matrix.md 179 informational id-no-issue:MATRIX-04 MATRIX-04 unten. Nutzt die ohnehin am Apex laufende echte IONOS-Mail-Infrastruktur,
hosts/matrix.md 182 informational id-no-issue:MATRIX-02 ### MATRIX-02 — Pusht per Remote-Write auf einen offenen Prometheus · erledigt 2026-07-30
hosts/matrix.md 185 informational net-ref:10.0.0.3;net-ref:10.0.0.2 getrennten Absendern aus - "CFGMON (`10.0.0.3`) und der k3s-Host (`10.0.0.2`)" - als wären
hosts/matrix.md 187 informational net-ref:10.0.0.2 selbst die private IP `10.0.0.2` (verifiziert per `ip -4 addr show` auf dem Host).
hosts/matrix.md 189 checked-ok path-ok:apps/monitoring/alloy-config.yaml@axion1337.chat-gitops Verifiziert in `apps/monitoring/alloy-config.yaml` (diesem Cluster): Der Remote-Write-Push
hosts/matrix.md 190 informational runtime-path:http://10.0.0.3:9090/api/v1/write;runtime-path:http://10.0.0.3:3100/... geht bereits an `http://10.0.0.3:9090/api/v1/write` und Loki an `http://10.0.0.3:3100/...` -
hosts/matrix.md 191 informational image-ref:188.245.193.243:9090 **private IP, nicht die öffentliche** `188.245.193.243:9090`. Von dieser Seite aus ist hier
hosts/matrix.md 194 informational id-ok:CFGMON-03 [CFGMON-03](cfgmon.md#cfgmon-03--prometheus-remote-write-und-loki-sind-öffentlich-ohne-auth)
hosts/matrix.md 197 informational id-no-issue:MATRIX-04 ### MATRIX-04 — Host-Level Pre-Update-Benachrichtigung · erledigt 2026-07-30
hosts/matrix.md 200 checked-ok path-ok:docs/deployment-guides/07-host-maintenance-notifications.md@axion1337.chat-gitops `docs/deployment-guides/07-host-maintenance-notifications.md` im gitops-Repo,
hosts/matrix.md 201 checked-ok issue-ok:management#24(opened) [Issue #24](https://rohana.axion1337.de/sorb/axion1337.chat-gitops/issues/24)):
hosts/matrix.md 202 prose-or-runtime historical-wording `unattended-upgrades` war bereits aktiv, neu ergänzt ist ein systemd-Timer
hosts/overmind.md 10 informational runtime-path:git.lab;net-ref:10.58.73.17 | **DNS (Lab)** | `git.lab` → `10.58.73.17` (TLS via Dokploy-Proxy, Zertifikate von der aXionLabs-CA: step-ca, 24h-Leaf, Intermediate bis 2035) |
hosts/overmind.md 11 prose-or-runtime | **CPU/RAM** | 14 Kerne, 30 Gi (Stand 2026-07-31: ~11 Gi verfügbar) |
hosts/overmind.md 12 prose-or-runtime | **Disk** | 444 G NVMe (~278 G frei, Stand 2026-07-31) |
hosts/overmind.md 13 informational runtime-path:/dev/kvm | **KVM** | `/dev/kvm` vorhanden — Basis für die Windows-Build-VM |
hosts/overmind.md 20 informational image-ref:external_url https://git.lab | GitLab CE 18.7.1 + Postgres 16 + Redis 7 | Dokploy-Stack `management-gitlabce` | `external_url https://git.lab`, SSH 2224; TLS terminiert der Dokploy-Proxy (GitLab-nginx lauscht nur :80) |
hosts/overmind.md 21 informational runtime-path:git.lab;image-ref:extra_hosts: git.lab:10.58.73.17;runtime-path:/etc/gitlab-runner/certs/git.lab.crt | gitlab-runner `lab-builder-1` (v18.7.0) | gleicher Stack, Service `gitlab-runner` | Docker-Executor + Socket, `concurrent = 1`. **Stolpersteine, live gefunden**: (1) Docker-interner DNS löst `git.la
hosts/overmind.md 23 FLAG runtime-path:registry.git.lab/axion1337.chat/vendor/windows:stable;runtime-path:git.lab/axion1337.chat/vendor/windows;image-ref:restart: "no";path-miss:docs/axion-runner.md path-miss:docs/axion-runner.md | Windows-Build-VM | Dokploy-Stack `windows-runner` (live seit 2026-07-31) | Image `registry.git.lab/axion1337.chat/vendor/windows:stable` (Eigenbau aus reviewtem Pin `7645a2b`, Vendor-Repo `git.lab/a
hosts/overmind.md 27 prose-or-runtime git.lab ist seit 2026-07-31 **kanonisch** für die gespiegelten Repos der Gruppe
hosts/overmind.md 28 prose-or-runtime `axion1337.chat` — Stand 2026-08-09 **sieben**: die sechs Produkt-Repos (ThreadNet-Web,
hosts/overmind.md 29 prose-or-runtime threadnet-call, thread-net-git, threadnet-operating, axion1337.chat-gitops, seit heute auch
hosts/overmind.md 30 prose-or-runtime `game-operating`) **und `management`, also dieses Repo**. Push-Mirrors nach rohana/Gitea,
hosts/overmind.md 31 prose-or-runtime direkte Gitea-Pushes tabu.
hosts/overmind.md 33 prose-or-runtime ⚠️ `gameserver` (achtes Projekt der Gruppe) hat **keinen** Mirror — offen in
hosts/overmind.md 34 checked-ok issue-ok:management#32(opened);issue-ok:management#32(opened) [management#32](https://git.lab/axion1337.chat/management/-/issues/32), dort liegt auf Gitea
hosts/overmind.md 37 prose-or-runtime Gitea bleibt: Flux-Source (via Mirror beliefert), Registry, Packages.
hosts/overmind.md 38 prose-or-runtime **Issues nicht mehr** — die sind am 2026-08-01/02 nach git.lab gewandert
hosts/overmind.md 39 prose-or-runtime ([ADR-0002](../decisions/0002-issues-und-management-ins-lab.md)). Die letzte Ausnahme,
hosts/overmind.md 40 informational forge-repo:sorb/management die Deploy-Übergabe-Issues auf dem Gitea-Tracker `sorb/management`, ist am 2026-08-02
hosts/overmind.md 41 checked-ok issue-ok:management#25(opened);issue-ok:management#26(closed);id-ok:LABNET-03 mit LABNET-03 zurückgebaut: beide umgezogen (#25, #26), der Tracker ist leer.
hosts/overmind.md 44 prose-or-runtime historical-wording *(Bis 2026-08-01 stand hier „Backlogs (dieses Repo, ungespiegelt)" — das Repo heißt
hosts/overmind.md 45 prose-or-runtime seit der Umwidmung zum Management-Repo `management` und wird seither gespiegelt,
hosts/overmind.md 48 informational id-no-issue:OVERMIND-01 ## OVERMIND-01 — GitLab-Container-Registry aktivieren, Images nach Konsument sortieren
hosts/overmind.md 50 prose-or-runtime **Status:** erledigt (2026-08-01)
hosts/overmind.md 53 informational runtime-path:registry.git.lab/axion1337.chat/threadnet-web/desktop-build:bullseye `registry.git.lab/axion1337.chat/threadnet-web/desktop-build:bullseye` (Job 386 grün,
hosts/overmind.md 55 prose-or-runtime damit grün durch (Job 398 - beweist auch den anonymen Pull des public Projekts durch
hosts/overmind.md 56 prose-or-runtime den Runner-Daemon). Die rohana-`REGISTRY_*`-Variablen bleiben nur noch für den
hosts/overmind.md 61 prose-or-runtime Lab-CI → rohana (Prod, Internet) → zurück ins Lab — koppelt Lab-Infrastruktur unnötig an
hosts/overmind.md 65 informational forge-repo:sorb/threadnet-web - **rohana (Gitea) behält**: `sorb/threadnet-web` (App-Image — Flux/Prod pullt es),
hosts/overmind.md 71 informational image-ref:registry_external_url 'https://registry.git.lab' 1. Omnibus-Config: `registry_external_url 'https://registry.git.lab'`,
hosts/overmind.md 74 informational runtime-path:registry.git.lab;net-ref:10.58.73.17 2. Lab-DNS: `registry.git.lab` → `10.58.73.17`
hosts/overmind.md 78 informational runtime-path:/etc/docker/certs.d/registry.git.lab/ca.crt `/etc/docker/certs.d/registry.git.lab/ca.crt` (Datei liegt schon als
hosts/overmind.md 79 informational runtime-path:/tmp/git.lab.crt `/tmp/git.lab.crt` vom Runner-Setup — kopieren reicht; kein Daemon-Restart nötig)
hosts/overmind.md 80 informational forge-repo:vendor/windows;runtime-path:registry.git.lab 5. CI-Umstellung: `vendor/windows` pusht nach `registry.git.lab` (Bonus: GitLabs
hosts/overmind.md 81 informational runtime-path:$CI_REGISTRY;runtime-path:$CI_JOB_TOKEN eingebaute `$CI_REGISTRY`/`$CI_JOB_TOKEN`-Auth statt Gruppen-Secrets),
hosts/overmind.md 82 prose-or-runtime `desktop_image`/`desktop_linux` in ThreadNet-Web folgen; Registry-Speicher liegt im
hosts/overmind.md 85 prose-or-runtime **Fortschritt 2026-07-31**: Punkte 14 umgesetzt (Registry live auf
hosts/overmind.md 86 informational runtime-path:registry.git.lab;forge-repo:vendor/windows `registry.git.lab`, 401/Bearer-Auth korrekt, CA-Trust auf dem Host); `vendor/windows`
hosts/overmind.md 87 prose-or-runtime pusht per `CI_JOB_TOKEN` in die Lab-Registry — verifiziert, Tags `5bc25447` + `stable`
hosts/overmind.md 90 prose-or-runtime **Nächster Schritt:** `element-desktop-build` von rohana in die Lab-Registry umziehen
hosts/overmind.md 91 prose-or-runtime (ThreadNet-Web-CI: `desktop_image`-Push-Ziel + `desktop_linux`-Image-Referenz) — bewusst
hosts/overmind.md 92 prose-or-runtime historical-wording zurückgestellt, bis kein Auto-Job das alte Image parallel referenziert (Reihenfolge:
hosts/overmind.md 95 informational id-ok:OVERMIND-02 ## OVERMIND-02 — Host-Ausfall 2026-07-31 ~19:15 lokal (NIC-Hang, Fix aktiv)
hosts/overmind.md 97 checked-ok issue-ok:management#4(opened) **Status:** Fix aktiv — die Beobachtung läuft als [Issue #4](https://git.lab/axion1337.chat/management/-/issues/4)
hosts/overmind.md 107 prose-or-runtime **Fix (2026-07-31, Overmind-Session):** `ethtool --set-eee eno1 eee off` live gesetzt
hosts/overmind.md 108 informational runtime-path:/etc/udev/rules.d/71-disable-eee-eno1.rules + persistente udev-Regel `/etc/udev/rules.d/71-disable-eee-eno1.rules` (greift bei
hosts/overmind.md 112 prose-or-runtime - ~~NIC-/BIOS-Firmware-Update 2.4.0.0 → 2.5.2.0~~ **erledigt** (Wartungsfenster
hosts/overmind.md 121 prose-or-runtime - 19:0519:12 — Provision-Job 409 grün (Rust 1.97.1 maschinenweit, Strawberry Perl,
hosts/overmind.md 137 prose-or-runtime 8G. Nach dem NIC-Fix lief die Kette durch: **desktop_windows Job 438 grün**
hosts/overmind.md 138 prose-or-runtime (2026-07-31 ~21:50 lokal, `Element Setup 1.12.17.exe`, 141 MB, unsigniert) —
hosts/overmind.md 139 checked-ok issue-ok:ThreadNet-Web#5(closed);issue-ok:ThreadNet-Web#6(opened) ThreadNet-Web#5 geschlossen, Folgethemen (Signing/Branding) in ThreadNet-Web#6.
hosts/overmind.md 141 prose-or-runtime (resumefähiges Prefetch-Skript im ThreadNet-Web-Repo, Jobs 415/416/424/431).
hosts/overmind.md 145 checked-ok issue-ok:ThreadNet-Web#5(closed) Weitere CI-Betriebsthemen laufen über die Projekt-Issues (ThreadNet-Web#5
hosts/overmind.md 146 checked-ok issue-ok:threadnet-call#1(closed);id-no-issue:CFGMON-11 Windows-Strecke, threadnet-call#1 npm-Ziel) und CFGMON-11 (Gitea-CI-Rückbau).
roadmap.md 3 prose-or-runtime > Stand 2026-08-06. Diese Datei hält die **Linien und die Reihenfolge**,
roadmap.md 6 prose-or-runtime > Die Gruppen-Milestones M1M4 sind angelegt, und seit 2026-08-06 hängt **jedes
roadmap.md 13 prose-or-runtime > „Härtung" werden soll oder M1 bewusst breit bleibt, ist **offen** — zu
roadmap.md 20 prose-or-runtime 1. **CVE-Meldeweg v2 live** — aggregierte Alarme deployen
roadmap.md 21 checked-ok issue-ok:management#25(opened) ([Übergabe-Issue #25](https://git.lab/axion1337.chat/management/-/issues/25)),
roadmap.md 23 checked-ok issue-ok:axion1337.chat-gitops#45(opened);issue-ok:axion1337.chat-gitops#45(opened) (Follow-up-Wunsch sorb). [gitops#45](https://git.lab/axion1337.chat/axion1337.chat-gitops/-/issues/45),
roadmap.md 24 checked-ok issue-ok:axion1337.chat-gitops#49(opened) [#49](https://git.lab/axion1337.chat/axion1337.chat-gitops/-/issues/49)
roadmap.md 26 checked-ok issue-ok:management#7(opened);id-ok:CFGMON-01 [CFGMON-01 (#7)](https://git.lab/axion1337.chat/management/-/issues/7) ⏰
roadmap.md 27 checked-ok issue-ok:management#10(opened);id-ok:CFGMON-09 3. **Backups wiederherstellen** — [CFGMON-09 (#10)](https://git.lab/axion1337.chat/management/-/issues/10)
roadmap.md 29 checked-ok issue-ok:axion1337.chat-gitops#25(opened);id-ok:CFGMON-03 4. K3s-API-Härtung (gitops#25, gemeinsame Session), CFGMON-03-Konsolen-Klärung.
roadmap.md 33 prose-or-runtime 1. ✅ **Site-to-Site-VPN** Hetzner ↔ Lab — erledigt 2026-08-01
roadmap.md 34 checked-ok issue-ok:management#12(closed) ([#12](https://git.lab/axion1337.chat/management/-/issues/12), ADR-0004 akzeptiert,
roadmap.md 35 checked-ok issue-ok:management#13(closed);id-ok:LABNET-03 zwei AARs). Ernte daraus: ✅ **LABNET-03 (#13)** — Übergabe-Issues sind am
roadmap.md 36 prose-or-runtime 2026-08-02 ins Lab gewandert, die Gitea-Ausnahme ist zurückgebaut.
roadmap.md 37 informational id-ok:GAME-01 2. GAME-01-Erreichbarkeit + vSwitch-Aufnahme —
roadmap.md 38 checked-ok issue-ok:management#2(opened) historical-wording [#2](https://git.lab/axion1337.chat/management/-/issues/2) (Silences bis 2026-08-04!)
roadmap.md 39 checked-ok issue-ok:axion1337.chat-gitops#46(opened) 3. Roadmap-/Board-Ausbau in GitLab (Rest von gitops#46: Milestones, Boards).
roadmap.md 40 checked-ok issue-ok:management#20(opened);id-ok:DOC-03 4. **Wiki-Oberfläche entscheiden** — [DOC-03 (#20)](https://git.lab/axion1337.chat/management/-/issues/20):
roadmap.md 45 checked-ok issue-ok:management#14(opened);id-ok:CFGMON-14 [CFGMON-14 (#14)](https://git.lab/axion1337.chat/management/-/issues/14) docker-Gruppe
roadmap.md 47 checked-ok issue-ok:management#15(opened);id-ok:CFGMON-15 [CFGMON-15 (#15)](https://git.lab/axion1337.chat/management/-/issues/15) Token-Hygiene,
roadmap.md 48 checked-ok issue-ok:management#16(closed);id-ok:LABNET-04 [LABNET-04 (#16)](https://git.lab/axion1337.chat/management/-/issues/16) Nacharbeiten.
roadmap.md 52 prose-or-runtime 1. **Rebrand fortsetzen** — Desktop-Client heißt seit 2026-08-02 **ThreadNet** und
roadmap.md 53 checked-ok issue-ok:ThreadNet-Web#10(closed);issue-ok:ThreadNet-Web#10(closed) trägt die eigene Marke ([ThreadNet-Web#10](https://git.lab/axion1337.chat/ThreadNet-Web/-/issues/10),
roadmap.md 54 prose-or-runtime Commit `6b0261d`). Offen: Web-Client-Icons/`brand`, About-Attribution.
roadmap.md 55 checked-ok issue-ok:ThreadNet-Web#6(opened) 2. Signing/Notarisierung (ThreadNet-Web#6) — ohne Signatur muss jeder Nutzer auf
roadmap.md 57 checked-ok issue-ok:management#22(opened);id-ok:BUILD-01 3. **macOS reproduzierbar bauen** — [BUILD-01 (#22)](https://git.lab/axion1337.chat/management/-/issues/22):
roadmap.md 59 checked-ok issue-ok:axion1337.chat-gitops#47(opened) 4. **Raidplaner** (gitops#47) — Lean-Experiment: HumHub-Kandidat evaluieren.
roadmap.md 60 checked-ok issue-ok:axion1337.chat-gitops#48(opened) 5. **Gäste-Invite-Workflow** (gitops#48) — Design steht (@concierge,
roadmap.md 62 checked-ok issue-ok:ThreadNet-Web#9(opened) 6. Zammad-artiges Feedback-Tool als spätere Ergänzung (ThreadNet-Web#9).
roadmap.md 66 checked-ok path-ok:vision/axion1337-chat.md@management - Rebranding-Runde (bewusst vertagt; Leitplanke in `vision/axion1337-chat.md`).
roadmap.md 79 checked-ok issue-ok:management#17(closed) **Der Einstieg ist erfolgt:** [Struktur-Workshop (#17)](https://git.lab/axion1337.chat/management/-/issues/17)
roadmap.md 80 prose-or-runtime am 2026-08-06 — Visionen geschärft, M1M4 angelegt, Board gesichtet, Kadenz und
roadmap.md 88 prose-or-runtime historical-wording Titel-Präfixe aus der Gitea-Migration sind am 2026-08-06 entfernt; zwei davon
roadmap.md 90 checked-ok issue-ok:ThreadNet-Web#7(opened);issue-ok:management#1(opened) (ThreadNet-Web#7 und #1, jeweils im Issue begründet).
shared/branding.md 8 prose-or-runtime Hier im `management`-Repo, weil es als einziges der beteiligten Repos
shared/branding.md 9 prose-or-runtime **gespiegelt** ist und jede Werkzeugentscheidung überlebt: Wird das
shared/branding.md 16 FLAG path-miss:static/img/ path-miss:static/img/ Schriftzug), erstellt von sorb. Sie liegen im Wiki-Repo unter `static/img/` und
shared/branding.md 28 prose-or-runtime Icon-Slots fällt das sofort auf. Korrigiert am 2026-08-06 auf 21 % oben wie unten.
shared/branding.md 37 informational tag-ok:v0.4.0 Elf Artefakte, alle aus einer Quelle (Stand 2026-08-06, `v0.4.0`):
shared/branding.md 41 checked-ok path-ok:apps/web/res/vector-icons/@ThreadNet-Web(dir) | `apps/web/res/vector-icons/` | 1024, 512, 180, 152, 144, 120, 24 px |
shared/branding.md 42 checked-ok path-ok:apps/desktop/build/icon.png@ThreadNet-Web | `apps/desktop/build/icon.png` | App-/Installer-Icon |
shared/branding.md 43 checked-ok path-ok:apps/desktop/build/icon.ico@ThreadNet-Web | `apps/desktop/build/icon.ico` | Windows, 7 Größen von 16 bis 256 |
shared/branding.md 44 checked-ok path-ok:apps/desktop/build/icon.icns@ThreadNet-Web | `apps/desktop/build/icon.icns` | macOS, via `iconutil` aus einem `.iconset` |
shared/branding.md 45 checked-ok path-ok:apps/desktop/build/icon.icon/Assets/element.png@ThreadNet-Web | `apps/desktop/build/icon.icon/Assets/element.png` | Layer des macOS-Icon-Composers |
shared/branding.md 47 checked-ok path-ok:vector-icons/1024.png@ThreadNet-Web Prüfen lässt sich die Gleichheit über die Prüfsumme von `vector-icons/1024.png`
shared/branding.md 48 checked-ok path-ok:build/icon.png@ThreadNet-Web gegen `build/icon.png` — weichen sie ab, ist eine Seite nachgezogen worden und die
shared/branding.md 55 prose-or-runtime Gruvbox Dark. Grundtöne `#282828` / `#1d2021`, Text `#ebdbb2`, Akzent `#bd93f9`,
shared/branding.md 63 prose-or-runtime Am 2026-08-02 in der BookStack-Oberfläche eingestellt und von dort extrahiert
shared/branding.md 65 prose-or-runtime der Coolors-Satz `#264653 · #2A9D8F · #E9C46A · #F4A261 · #E76F51`:
shared/branding.md 69 prose-or-runtime | Primäre Farbe | `#264653` | Charcoal |
shared/branding.md 74 prose-or-runtime | Seitenfarbe | `#77bb41` | Grün |
shared/branding.md 75 prose-or-runtime | Seitenentwurfsfarbe | `#e32400` | Rot |
shared/branding.md 86 prose-or-runtime je Theme vier Farben plus ein Schriftpaar. Sie sind seit 2026-08-02 **wörtlich
shared/branding.md 93 prose-or-runtime | Sunset Boulevard | `#264653` | dunkel | `#e76f51` · `#f4a261` · `#e9c46a` |
shared/branding.md 95 prose-or-runtime | Modern Minimalist | `#ffffff` | hell | `#36454f` · `#708090` · `#d3d3d3` |
shared/branding.md 103 prose-or-runtime ⚠️ **Ob ein Theme hell oder dunkel gemeint ist, steht nicht verlässlich in den
shared/branding.md 121 checked-ok path-ok:apps/desktop/axion1337/build.json@ThreadNet-Web;path-ok:apps/web/res/manifest.json@ThreadNet-Web | Betriebssystem, Startmenü, Installer, PWA | **ThreadNet** | `productName` in `apps/desktop/axion1337/build.json`, `name` in `apps/web/res/manifest.json` |
shared/branding.md 122 checked-ok path-ok:element-values.yaml@axion1337.chat-gitops;path-ok:apps/desktop/axion1337/config.json@ThreadNet-Web | in der Anwendung | **aXion1337.Chat** | `brand` in `element-values.yaml` (Prod) und `apps/desktop/axion1337/config.json` |
shared/branding.md 123 checked-ok path-ok:.env.production@threadnet-call | eingebettetes Call-Widget | **aXion1337.Chat** | `VITE_PRODUCT_NAME` in `.env.production` (threadnet-call) |
shared/branding.md 124 checked-ok path-ok:apps/authentik/authentik-blueprints.yaml@axion1337.chat-gitops | Anmeldeseite (Authentik) | **ThreadNet** | `branding_title` im Brand-Blueprint (gitops, `apps/authentik/authentik-blueprints.yaml`) |
shared/branding.md 130 checked-ok path-ok:vision/threadnet.md@management Die Leitplanke dahinter steht in [`vision/threadnet.md`](../vision/threadnet.md):
shared/branding.md 138 informational tag-ok:v0.4.0 **Attribution:** „ThreadNet — powered by Element" steht seit `v0.4.0` in
shared/branding.md 149 checked-ok path-ok:apps/production/custom-configs/element-values.yaml@axion1337.chat-gitops | Element/ThreadNet-Web | `apps/production/custom-configs/element-values.yaml` (gitops), `setting_defaults.custom_themes` | 17 Themes; Änderungen chirurgisch, **nie die YAML neu serialisieren** |
shared/branding.md 150 checked-ok path-ok:apps/web/res/vector-icons/@ThreadNet-Web(dir);path-ok:apps/web/res/manifest.json@ThreadNet-Web | Web-Icons + PWA | `apps/web/res/vector-icons/`, `apps/web/res/manifest.json` (ThreadNet-Web) | `theme_color` = `#ed4f4c`, die Markenfarbe — nicht Elements `#76CFA6` |
shared/branding.md 151 checked-ok path-ok:apps/desktop/build/@ThreadNet-Web(dir) | Desktop-Icons | `apps/desktop/build/` (ThreadNet-Web) | `.png`, `.ico`, `.icns`, Layer-Asset — alle aus derselben Quelle |
shared/branding.md 152 checked-ok path-ok:apps/desktop/axion1337/config.json@ThreadNet-Web | ThreadNet Desktop | `apps/desktop/axion1337/config.json` (ThreadNet-Web) | eigene Kopie derselben Themes — beim Ändern beide mitziehen |
shared/branding.md 153 FLAG path-miss:theme/sorbs-palette.md path-miss:theme/sorbs-palette.md | BookStack | *Settings → Customization*, getrennt für hell und dunkel | liegt in der Datenbank, **nicht im Repo** — schriftlich hier und in `theme/sorbs-palette.md` |
shared/branding.md 154 prose-or-runtime | BookStack (Feinschliff) | `theme/*.css` im Wiki-BookStack-Repo | nur Flächen, Text, Ränder — die sieben Farben oben gehören in die Oberfläche |
shared/branding.md 155 FLAG path-miss:src/css/custom.css path-miss:src/css/custom.css | Docusaurus-Wiki | `src/css/custom.css` (homelab/wiki) | bislang nur Akzentfarbe |
shared/branding.md 156 checked-ok path-ok:apps/web/res/themes/element/img/backgrounds/alpenglow.jpg@ThreadNet-Web;path-ok:SdkConfig.ts@ThreadNet-Web | Titelbild Login | `apps/web/res/themes/element/img/backgrounds/alpenglow.jpg` (ThreadNet-Web), gesetzt in `SdkConfig.ts` | siehe unten — Bilddatei kommt nur über einen Build in den Container |
shared/branding.md 157 checked-ok path-ok:apps/authentik/authentik-blueprints.yaml@axion1337.chat-gitops;issue-ok:axion1337.chat-gitops#55(opened) | Anmeldeseite Authentik | Brand-Blueprint in `apps/authentik/authentik-blueprints.yaml` (gitops) | Favicon und Hintergrund werden **von axion1337.chat referenziert**, nicht hochgeladen. **Logo ist no
shared/branding.md 161 prose-or-runtime Seit 2026-08-06 zeigt die Login-Seite ein Alpenglühen über einer Bergkette statt
shared/branding.md 173 prose-or-runtime Fotografen namentlich. Nur `en`/`de` anzupassen hätte in 29 Sprachen eine **falsche
shared/branding.md 179 informational runtime-path:https://axion1337.chat/themes/element/img/backgrounds/alpenglow.jpg `https://axion1337.chat/themes/element/img/backgrounds/alpenglow.jpg`. Wer das Bild im
shared/branding.md 185 checked-ok path-ok:vector-icons/512.png@ThreadNet-Web Der erste Versuch setzte `branding_logo` auf `vector-icons/512.png`. Ergebnis: das
shared/branding.md 190 prose-or-runtime Zurückgesetzt am 2026-08-06 auf Authentiks eigenes Logo. Ein Ersatz braucht eine
shared/branding.md 192 FLAG path-miss:threadnet-logo-wortmarke.png path-miss:threadnet-logo-wortmarke.png auch `threadnet-logo-wortmarke.png` (Bildmarke *über* Schriftzug). Offen in
shared/branding.md 204 FLAG path-miss:theme/sorbs-palette.md path-miss:theme/sorbs-palette.md `theme/sorbs-palette.md` im BookStack-Repo ist die betriebsnahe Kopie mit den
shared/branding.md 214 checked-ok path-ok:vision/threadnet.md@management;issue-ok:ThreadNet-Web#10(closed) (→ [`vision/threadnet.md`](../vision/threadnet.md), ThreadNet-Web#10).
shared/commit-zuordnung-2026-08-07.md 3 prose-or-runtime Am 2026-08-07 wurden die Zeitstempel aller Commits aus dieser Zusammenarbeit auf
shared/commit-zuordnung-2026-08-07.md 14 prose-or-runtime `backup-vor-rewrite`-Branches rekonstruiert und **paarweise verifiziert**: Für jedes
shared/commit-zuordnung-2026-08-07.md 26 prose-or-runtime Das Force-Push der umgezogenen Tags hat in ThreadNet-Web **drei Release-Pipelines
shared/commit-zuordnung-2026-08-07.md 27 informational tag-ok:v0.3.0;tag-ok:v0.4.0 neu gestartet** (`v0.3.0`, `v0.4.0`, `desktop-v1.12.17-clientscan`). Ein Tag ist
shared/commit-zuordnung-2026-08-07.md 33 informational image-ref:threadnet-web:v0.4.0;tag-ok:v0.4.0 Glück, keine Planung:** Mit stehender Tag-Protection wäre `threadnet-web:v0.4.0`
shared/commit-zuordnung-2026-08-07.md 37 checked-ok issue-ok:ThreadNet-Web#14(closed) ThreadNet-Web#14.
shared/commit-zuordnung-2026-08-07.md 42 prose-or-runtime ThreadNet-Web vor dem 2026-07-28 (3 Commits), gitops vor dem 2026-07-27 (147).
shared/commit-zuordnung-2026-08-07.md 47 prose-or-runtime ## gitops — 117 Commits
shared/commit-zuordnung-2026-08-07.md 169 prose-or-runtime ## management — 78 Commits
shared/commit-zuordnung-2026-08-07.md 252 prose-or-runtime ## ThreadNet-Web — 47 Commits
shared/commit-zuordnung-2026-08-07.md 304 prose-or-runtime ## threadnet-call — 9 Commits
shared/lab-netzwerk.md 10 checked-ok issue-ok:management#12(closed) > (Testreihe 17 in [#12](https://git.lab/axion1337.chat/management/-/issues/12)).
shared/lab-netzwerk.md 11 checked-ok issue-ok:management#11(closed) > Es gibt dazu **keine offenen Issues mehr** — auch die Restpunkte #11
shared/lab-netzwerk.md 12 checked-ok issue-ok:management#16(closed);id-ok:LABNET-04 > (MacBook-Profil) und #16 (LABNET-04, Feinschliff an den UniFi-Regeln) sind
shared/lab-netzwerk.md 13 prose-or-runtime > geschlossen. Alles Folgende ist **Bestand und Historie**, keine offene Arbeit.
shared/lab-netzwerk.md 15 prose-or-runtime **Zwei WireGuard-Zugänge (Stand 2026-08-01, beide gelöst/abgenommen):**
shared/lab-netzwerk.md 19 informational id-ok:LABNET-01 | Roadwarrior „Thore" | UDM | 51840 | 10.58.74.0/24 | Handy/MacBook ins Lab (LABNET-01) |
shared/lab-netzwerk.md 20 informational id-ok:LABNET-02 | Site-to-Site „Matrix" | UDM | 51841 | 10.58.75.0/24 | Hetzner-Netz 10.0.0.0/24 ↔ Lab (LABNET-02, [ADR-0004](../decisions/0004-site-to-site-vpn-hetzner-lab.md)) |
shared/lab-netzwerk.md 22 informational forge-repo:homelab/docs ### Verhältnis zu `homelab/docs`
shared/lab-netzwerk.md 30 prose-or-runtime Der Grund für die Doppelung ist der Mirror-Geltungsbereich aus der
shared/lab-netzwerk.md 35 informational forge-repo:homelab/docs darüber hinaus. **Bei Widerspruch gilt `homelab/docs`.**
shared/lab-netzwerk.md 39 informational id-ok:LABNET-01 ## LABNET-01 — WireGuard-Roadwarrior ins Lab kaputt (seit einigen Monaten)
shared/lab-netzwerk.md 42 checked-ok issue-ok:axion1337.chat-gitops#48(opened) Damit ist die Cutover-Voraussetzung für gitops#48 erfüllt.
shared/lab-netzwerk.md 46 informational net-ref:178.25.213.70 der Fritzbox ihre öffentliche IP nicht) → Fix: Endpunkt `178.25.213.70`;
shared/lab-netzwerk.md 52 informational net-ref:192.168.0.0/20 /20-Blöcke in 192.168.0.0/16; `192.168.0.0/20` verschluckte das VPN-Subnetz
shared/lab-netzwerk.md 53 prose-or-runtime 192.168.5.0/24 → Antworten an VPN-Clients endeten in der Bridge (SYN kam an,
shared/lab-netzwerk.md 55 prose-or-runtime fremde Hosts funktionierten) → Fix: **VPN-Subnetz auf 10.58.74.0/24** (Docker
shared/lab-netzwerk.md 58 checked-ok issue-ok:management#11(closed) **Restarbeiten:** MacBook-WG-Profil → [Issue #11](https://git.lab/axion1337.chat/management/-/issues/11). ⚠️ Latente Wiederholungsgefahr
shared/lab-netzwerk.md 59 informational net-ref:192.168.176.0/20 notiert: Overminds Docker-Pool deckt auch `192.168.176.0/20` ab = kollidiert mit
shared/lab-netzwerk.md 60 prose-or-runtime dem Fritzbox-Netz 192.168.178.x — aktuell folgenlos, aber bei künftigen Subnetz-
shared/lab-netzwerk.md 66 prose-or-runtime (192.168.178.20) als Endpunkt — die UDM kennt hinter der Fritzbox ihre
shared/lab-netzwerk.md 69 prose-or-runtime 178.25.213.70 ändern!).
shared/lab-netzwerk.md 73 prose-or-runtime einem Port). Fix: UDM-WG auf **51840** umgezogen + Freigabe angepasst.
shared/lab-netzwerk.md 77 checked-ok issue-ok:axion1337.chat-gitops#48(opened) blockierte gitops#48 (Erreichbarkeits-Entscheidung „WireGuard statt exponieren")
shared/lab-netzwerk.md 85 prose-or-runtime **Diagnose-Plan von VOR der Lösung** — ⚠️ abgearbeitet und überholt, steht hier
shared/lab-netzwerk.md 102 checked-ok issue-ok:axion1337.chat-gitops#48(opened) **Verwandt:** gitops#48 (Cutover erst nach Lösung), perspektivisch ersetzt ein
shared/lab-netzwerk.md 105 prose-or-runtime ## Zugehörige Issues — alle geschlossen
shared/lab-netzwerk.md 108 prose-or-runtime historical-wording [management-Projekt](https://git.lab/axion1337.chat/management/-/issues); die IDs bleiben in den Issue-Titeln erhalten.
shared/lab-netzwerk.md 111 prose-or-runtime Zum Netz/VPN ist **nichts mehr offen** (Stand 2026-08-02):
shared/lab-netzwerk.md 115 checked-ok issue-ok:management#11(closed);id-ok:LABNET-01 | [#11](https://git.lab/axion1337.chat/management/-/issues/11) | LABNET-01-Rest — MacBook-WireGuard-Profil | geschlossen |
shared/lab-netzwerk.md 116 checked-ok issue-ok:management#12(closed);id-ok:LABNET-02 | [#12](https://git.lab/axion1337.chat/management/-/issues/12) | LABNET-02 — Site-to-Site-VPN (Design: [ADR-0004](../decisions/0004-site-to-site-vpn-hetzner-lab.md)) | geschlossen, Testreihe 17 proto
shared/lab-netzwerk.md 117 checked-ok issue-ok:management#16(closed);id-ok:LABNET-04 | [#16](https://git.lab/axion1337.chat/management/-/issues/16) | LABNET-04 — Feinschliff UniFi-Regeln | geschlossen |
shared/lab-netzwerk.md 120 FLAG issue-state:management#13=closed,text-says-opened issue-state:management#13 bleiben offen: [#13](https://git.lab/axion1337.chat/management/-/issues/13)
shared/lab-netzwerk.md 121 informational id-ok:LABNET-03 (LABNET-03, Rückbau der Gitea-Ausnahme für Übergabe-Issues — durch den Tunnel
shared/lab-netzwerk.md 123 checked-ok issue-ok:management#15(opened);id-ok:CFGMON-15 [#15](https://git.lab/axion1337.chat/management/-/issues/15) (CFGMON-15,
shared/lab-netzwerk.md 124 informational id-ok:LABNET-02 Widerruf der Einmal-Tokens aus der LABNET-02-Nacht — Credential-Hygiene, und der
shared/lab-netzwerk.md 125 prose-or-runtime Widerruf kann still einen Push-Mirror brechen, solange dessen hinterlegtes Token
shared/zone-axion1337.md 9 informational net-ref:217.160.0.140;image-ref:2001:8d8:100f:f000::2e9 | **Apex** | `217.160.0.140` / `2001:8d8:100f:f000::2e9` — IONOS-Hosting, nicht eigene Infrastruktur |
shared/zone-axion1337.md 18 informational runtime-path:rohana historical-wording | `rohana` | löst auf ❌ | gelöscht | **gelöscht** ⚠️ | fehlt | ⚠️ schwächer als vorher |
shared/zone-axion1337.md 20 informational runtime-path:~all | `matrix` | löst auf ❌ | IONOS ❌ | `~all` ❌ | fehlt | offen |
shared/zone-axion1337.md 22 informational runtime-path:~all;id-ok:ZONE-02 | **Apex** | legitim ✅ | IONOS (genutzt) | `~all` | **`p=none`** ⚠️ | siehe ZONE-02 |
shared/zone-axion1337.md 36 informational net-ref:217.160.0.140;image-ref:2001:8d8:100f:f000::2e9 | `axion1337.de` | `217.160.0.140` | `2001:8d8:100f:f000::2e9` | IONOS-Hosting |
shared/zone-axion1337.md 37 informational net-ref:217.160.0.140 | `www` | `217.160.0.140` | dito | IONOS-Hosting — hier ist `www` **legitim** |
shared/zone-axion1337.md 38 informational runtime-path:rohana;net-ref:188.245.193.243;image-ref:2a01:4f8:c17:93eb::1 | `rohana` | `188.245.193.243` | `2a01:4f8:c17:93eb::1` | CFGMON, Gitea |
shared/zone-axion1337.md 39 informational net-ref:188.245.193.243;image-ref:2a01:4f8:c17:93eb::1 | `selendis` | `188.245.193.243` | `2a01:4f8:c17:93eb::1` | CFGMON, Grafana |
shared/zone-axion1337.md 40 informational net-ref:157.90.155.206 | `game` | `157.90.155.206` | — | Pterodactyl |
shared/zone-axion1337.md 41 informational net-ref:49.13.132.245 | `matrix` | `49.13.132.245` | — | Matrix-Homeserver |
shared/zone-axion1337.md 42 informational net-ref:217.160.233.227;image-ref:2001:8d8:1000:30f5:… | `ftp` | `217.160.233.227` | `2001:8d8:1000:30f5:…` | IONOS-Default |
shared/zone-axion1337.md 43 informational id-ok:ZONE-01 | `www.rohana`, `www.selendis`, `www.game`, `www.matrix` | wie ohne `www` | teils | überflüssig, siehe ZONE-01 |
shared/zone-axion1337.md 46 informational runtime-path:rohana `autodiscover`), auf `rohana` und `game` nicht.
shared/zone-axion1337.md 50 checked-ok issue-ok:management#5(opened);id-ok:ZONE-01 Damit die Rezepte in [ZONE-01](https://git.lab/axion1337.chat/management/-/issues/5)
shared/zone-axion1337.md 57 prose-or-runtime kann `rechnung@rohana.axion1337.de` in den Umschlag schreiben. Die folgenden
shared/zone-axion1337.md 72 informational runtime-path:rohana Genau die richtige Aussage für `rohana`, `selendis`, `matrix` — die verschicken keine
shared/zone-axion1337.md 73 informational id-no-issue:MATRIX-01 Mail (für `matrix` verifiziert in MATRIX-01: weder Synapse noch MAS senden).
shared/zone-axion1337.md 99 prose-or-runtime ⚠️ **DMARC wird vererbt.** Fehlt `_dmarc.rohana`, gilt die Policy des
shared/zone-axion1337.md 101 checked-ok issue-ok:management#6(opened);id-ok:ZONE-02 ([ZONE-02](https://git.lab/axion1337.chat/management/-/issues/6)) — **damit erben
shared/zone-axion1337.md 129 informational runtime-path:rohana historical-wording **Real eingetreten:** Bei `rohana` sind MX und SPF gelöscht, die Ersatz-Records
shared/zone-axion1337.md 137 prose-or-runtime historical-wording [management-Projekt](https://git.lab/axion1337.chat/management/-/issues); die IDs bleiben in den Issue-Titeln erhalten.
shared/zone-axion1337.md 140 checked-ok issue-ok:management#5(opened);id-ok:ZONE-01 - [ZONE-01 — IONOS-Default-Records bereinigen (Rezepte im Issue; rohana/selendis in Arbeit)](https://git.lab/axion1337.chat/management/-/issues/5)
shared/zone-axion1337.md 141 checked-ok issue-ok:management#6(opened);id-ok:ZONE-02 - [ZONE-02 — Apex-DMARC ist `p=none` und schützt nichts](https://git.lab/axion1337.chat/management/-/issues/6)
verfahren/README.md 10 prose-or-runtime | [aar/](aar/) | Abgelegte AARs, benannt `JJJJ-MM-TT-<vorhaben>.md` |
verfahren/README.md 12 checked-ok path-ok:textbloecke.md@management [`textbloecke.md`](textbloecke.md) hält kurze, kopierbare Blöcke, die man einer
verfahren/README.md 18 checked-ok path-ok:.gitlab/issue_templates/Deploy-Übergabe.md@management `.gitlab/issue_templates/Deploy-Übergabe.md` und erscheint beim Anlegen eines
verfahren/README.md 22 checked-ok path-ok:hosts/@management(dir);path-ok:shared/@ThreadNet-Web(dir),management(dir) historical-wording Abgrenzung zum Rest des Repos: `hosts/` und `shared/` halten **offene Punkte**,
verfahren/aar-vorlage.md 7 prose-or-runtime Was ist live und verifiziert. Was ist bewusst **nicht** live, und warum.
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 1 checked-ok issue-ok:axion1337.chat-gitops#47(opened) # AAR — CVE-Pipeline `gitops#47`
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 3 informational runtime-path:/opt/threadnet-operating/monitoring **Datum:** 2026-08-01 · **Host/Stack:** CFGMON, `/opt/threadnet-operating/monitoring`
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 9 prose-or-runtime **Live und verifiziert:** Scanner (29/29 Images gescannt), Exporter, Prometheus-Job
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 12 prose-or-runtime **Bewusst nicht live:** die Alarm-Zustellung nach Matrix. `room="security"` routet in
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 13 checked-ok path-ok:alertmanager.yml@threadnet-operating `alertmanager.yml` auf einen Null-Receiver (Commit `2b715ca` in
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 14 informational forge-repo:sorb/threadnet-operating `sorb/threadnet-operating`). Grund siehe Befund 1.
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 20 prose-or-runtime | 1 | Eine Matrix-Nachricht pro CVE. 126 CRITICAL landen in **einer** Alertmanager-Gruppe, nach 24 h kommen 1222 HIGH dazu. Dazu steht `save_state()` in `do_POST` hinter der Sende-Schleife: bricht ein
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 21 checked-ok issue-ok:axion1337.chat-gitops#52(opened) historical-wording | 2 | `docker compose up -d` aktiviert geänderte Configs nicht. Einzeldatei-Mounts hängen am Inode, `git pull` benennt um. Prometheus lief nach dem Deploy mit alten Regeln — `promtool` fand 9, Prometh
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 22 checked-ok issue-ok:axion1337.chat-gitops#51(opened) | 3 | `TrivyScanStale` kann ein nie erfolgreich gescanntes Image nicht melden — ohne ersten Report existiert keine Serie, an der `time() - trivy_last_scan_timestamp` hängen könnte | LOW | notiert in `
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 23 checked-ok image-ref:except: continue;issue-ok:axion1337.chat-gitops#51(opened) | 4 | Der Exporter prunt den First-Seen-State bei **jedem** Scrape. Ein transienter Lesefehler (`except: continue`) löscht die Erstfund-Zeitstempel des Targets dauerhaft | LOW | notiert in `gitops#51`
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 27 informational image-ref:goauthentik/server:2026.2.3 1316 LOW. Spitzenreiter `goauthentik/server:2026.2.3` mit 369 CRITICAL+HIGH.
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 34 informational runtime-path:rohana.axion1337.de | Private Registry `rohana.axion1337.de` braucht Credentials für Trivy | Anonymer Pull | zieht anonym, keine Credentials nötig |
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 35 checked-ok path-ok:hosts/game.md@management | Zwei down-Targets könnten Folge des Deploys sein | `avg_over_time(up[3h])` | 0.00 — schon 3 h vorher tot, in `hosts/game.md` erfasst |
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 58 checked-ok issue-ok:axion1337.chat-gitops#51(opened) Richtungsentscheidung zu `gitops#51`, bevor die Alarme scharf gehen: entweder
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 59 checked-ok path-ok:matrix-alerts.py@threadnet-operating `matrix-alerts.py` auf eine Sammelnachricht pro Webhook-Batch umbauen (die fünf
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 65 informational image-ref:coturn/coturn:latest Nebenbefund ohne Handlungsbedarf von hier: `coturn/coturn:latest` ist das einzige
verfahren/aar/2026-08-01-cve-pipeline-gitops47.md 66 checked-ok issue-ok:axion1337.chat-gitops#47(opened) ungepinnte Image (bereits in `gitops#47` notiert).
verfahren/aar/2026-08-01-labnet02-cfgmon.md 1 checked-ok forge-repo:sorb/management#2;issue-ok:management#2(opened);id-ok:LABNET-02 # AAR — LABNET-02, CFGMON-Seite (Übergabe `sorb/management#2`)
verfahren/aar/2026-08-01-labnet02-cfgmon.md 8 informational runtime-path:/etc/wireguard/lab.conf **Live:** `wireguard-tools` installiert, Keypair erzeugt, `/etc/wireguard/lab.conf`
verfahren/aar/2026-08-01-labnet02-cfgmon.md 10 informational net-ref:10.58.75.2/24 `enabled`. Interface `lab` steht mit `10.58.75.2/24`, Routen und Forward-Regeln aktiv,
verfahren/aar/2026-08-01-labnet02-cfgmon.md 11 informational net-ref:10.58.73.1;runtime-path:~lab Split-DNS gesetzt (`10.58.73.1`, `~lab`).
verfahren/aar/2026-08-01-labnet02-cfgmon.md 28 prose-or-runtime historical-wording | 1 | `enp7s0` seit 18:11 DOWN, Privatnetz-Route weg. Auslöser war die Hetzner-Range-Umstellung /16 → /8: die private NIC wurde ab- und neu angehängt (`renamed from eth1`), danach wurde `hc-net-ifup@e
verfahren/aar/2026-08-01-labnet02-cfgmon.md 29 FLAG image-ref:Status: inactive;path-miss:lab.conf path-miss:lab.conf | 2 | ufw ist auf CFGMON **inaktiv** (`Status: inactive`, `ENABLED=no`). Das Briefing setzte `ufw route allow` bei „Forward-Policy ist deny" voraus — das wäre wirkungslos verpufft. Die DROP-Policy kom
verfahren/aar/2026-08-01-labnet02-cfgmon.md 30 prose-or-runtime | 3 | `sudo` ist aus einer Agenten-Session nicht bedienbar (kein TTY). Die Schritte liefen über die **docker-Gruppenmitgliedschaft** des Kontos (privilegierter Container + `nsenter`) — das ist root-äq
verfahren/aar/2026-08-01-labnet02-cfgmon.md 31 informational net-ref:10.58.73.0/24 historical-wording | 4 | Hetzner-Range war tatsächlich /16 — unabhängig aus der Routing-Tabelle verifiziert (`10.0.0.0/16 via 10.0.0.1 dev enp7s0`), `10.58.73.0/24` lag außerhalb | LOW | bestätigt, Umstellung durch sorb
verfahren/aar/2026-08-01-labnet02-cfgmon.md 38 prose-or-runtime | Split-Tunnel biegt den Default-Weg um | `ip route get 8.8.8.8` | unverändert über `eth0`; öffentliches DNS und HTTPS funktionieren |
verfahren/aar/2026-08-01-labnet02-cfgmon.md 42 prose-or-runtime **Nicht verifiziert:** ob der k3s-Host selbst läuft. Er ist unerreichbar, *weil* CFGMON
verfahren/aar/2026-08-01-labnet02-cfgmon.md 65 informational net-ref:10.58.75.2 eintragen (`Networks behind client = 10.0.0.0/24`, Client-IP `10.58.75.2`):
verfahren/aar/2026-08-01-labnet02-cfgmon.md 74 informational net-ref:10.0.0.3 1. `ip -brief addr show enp7s0` → UP mit `10.0.0.3`
verfahren/aar/2026-08-01-labnet02-cfgmon.md 75 informational net-ref:10.0.0.0/8;runtime-path:/16 2. `ip route | grep '^10\.'` → neue Route sollte `10.0.0.0/8` zeigen, nicht mehr `/16`
verfahren/aar/2026-08-01-labnet02-cfgmon.md 85 prose-or-runtime **Entscheidung offen:** ob der Root-Zugang über die docker-Gruppe so bleiben soll
verfahren/aar/2026-08-01-labnet02-cfgmon.md 93 checked-ok issue-ok:management#2(opened) AAR-Kommentar an `management#2` („Tunnel auf CFGMON ist active+enabled", daher komme
verfahren/aar/2026-08-01-labnet02-cfgmon.md 115 informational runtime-path:/etc/systemd/system/wg-quick@lab.service.d/10-after-docker.conf 1. Drop-in `/etc/systemd/system/wg-quick@lab.service.d/10-after-docker.conf` mit
verfahren/aar/2026-08-01-labnet02-cfgmon.md 118 prose-or-runtime `PostUp = iptables -N DOCKER-USER 2>/dev/null || true` — Rückfall, falls Docker
verfahren/aar/2026-08-01-labnet02-cfgmon.md 121 prose-or-runtime Verifiziert: `systemctl show -p After` listet `docker.service`, `restart` läuft sauber
verfahren/aar/2026-08-01-labnet02-cfgmon.md 123 prose-or-runtime historical-wording korrekt ab, keine Dubletten bei Neustarts). **Nicht verifiziert:** das Verhalten bei
verfahren/aar/2026-08-01-labnet02-cfgmon.md 143 checked-ok issue-ok:management#2(opened) (`oFRxWU…Z0o=`, Kommentar 399 in `management#2`) **gehört zu keinem Server auf der
verfahren/aar/2026-08-01-labnet02-cfgmon.md 145 informational id-ok:LABNET-02 historical-wording `wgsrv3 = sVuM0pgT…ZyM=` (LABNET-02, 51841). Jede Initiation von CFGMON war damit
verfahren/aar/2026-08-01-labnet02-cfgmon.md 158 informational runtime-path:~lab.de;runtime-path:~axion1337.de;runtime-path:~axionlabs.de;net-ref:10.58.73.1 `~lab.de`, `~axion1337.de`, `~axionlabs.de` über `10.58.73.1`; aXionLabs-Root-CA
verfahren/aar/2026-08-01-labnet02-cfgmon.md 159 prose-or-runtime im Truststore (verifiziert gegen die git.lab-Kette und per Fingerprint-Abgleich
verfahren/aar/2026-08-01-labnet02-cfgmon.md 160 prose-or-runtime gegen die step-ca, Port 666). Voller Dienst-Neustart aus der Datei verifiziert
verfahren/aar/2026-08-01-labnet02-cfgmon.md 170 prose-or-runtime **Offen nach diesem Nachtrag:** Testreihe 17 (inkl. Gateway-Rolle), Reboot-Beweis,
verfahren/aar/2026-08-01-labnet02-cfgmon.md 171 informational forge-repo:sorb/buffer Schlüsselrotation (Client-Private-Key lief beim Bootstrap über `sorb/buffer` auf
verfahren/aar/2026-08-01-labnet02-cfgmon.md 172 prose-or-runtime rohana; Repo wird laut sorb vernichtet, Rotation danach trotzdem empfohlen),
verfahren/aar/2026-08-01-labnet02-cfgmon.md 173 FLAG path-miss:lab.conf path-miss:lab.conf Repo-Zuhause für `lab.conf` + systemd-Drop-in (zurückgestellt bis nach der
verfahren/aar/2026-08-01-labnet02-cfgmon.md 181 informational runtime-path:git.lab Split-DNS-Zonen aktiv; `git.lab` auflösbar und pingbar. Damit sind der Bootfix
verfahren/aar/2026-08-01-labnet02-cfgmon.md 183 prose-or-runtime aus Nachtrag 2 im Ernstfall verifiziert. Aus der Offen-Liste von Nachtrag 2
verfahren/aar/2026-08-01-labnet02-lab.md 1 informational id-ok:LABNET-02 # AAR — LABNET-02, Lab-Seite (UDM/UniFi, Einzäunung und Abnahme)
verfahren/aar/2026-08-01-labnet02-lab.md 5 checked-ok issue-ok:management#12(closed) **Gegenstück:** [CFGMON-Seite](2026-08-01-labnet02-cfgmon.md) · Issue: `management#12`
verfahren/aar/2026-08-01-labnet02-lab.md 14 checked-ok issue-ok:management#12(closed) Testreihe 17 vollständig bestanden (Protokolle in `management#12`), zusätzlich der
verfahren/aar/2026-08-01-labnet02-lab.md 23 informational net-ref:10.0.0.0/24 UDM (Port 51841), **CFGMON als Client/Initiator**, `10.0.0.0/24` als Netz hinter dem
verfahren/aar/2026-08-01-labnet02-lab.md 34 informational net-ref:10.58.75.0/24;net-ref:10.0.0.0/24 | 1 | **„Server = WireGuard Server X" erfasst in der Policy Engine nur das Tunnel-Subnetz**, nicht die über „Networks Behind Client" angehängten Netze. Vier Korrekturrunden lang blieben die Regeln des
verfahren/aar/2026-08-01-labnet02-lab.md 38 informational net-ref:10.0.0.0/16;net-ref:10.58.73.0/24;net-ref:10.0.0.0/8 | 5 | Hetzner-Netz-Range `10.0.0.0/16` deckte das Routen-Ziel `10.58.73.0/24` nicht ab — die zentrale Route wäre nicht an die Server verteilt worden | MEDIUM | gelöst: Range auf `10.0.0.0/8` erweitert
verfahren/aar/2026-08-01-labnet02-lab.md 43 informational net-ref:10.58.75.2;net-ref:10.0.0.3 historical-wording `10.58.75.2` (Tunnel) *und* `10.0.0.3` (Hetzner-Netz) erreichbar. Vom Lab aus war die
verfahren/aar/2026-08-01-labnet02-lab.md 44 prose-or-runtime erste Adresse geblockt, die zweite offen — dieselbe Maschine, dieselben Dienste,
verfahren/aar/2026-08-01-labnet02-lab.md 75 prose-or-runtime - IoT- und Arbeit-Sperren sind **nicht verifiziert** — keine Gegenstelle in diesen
verfahren/aar/2026-08-01-labnet02-lab.md 77 informational id-ok:LABNET-02 - Regel-Beschreibungsfelder in UniFi sind leer; Verweis auf LABNET-02/ADR-0004 fehlt.
verfahren/aar/2026-08-01-labnet02-lab.md 80 prose-or-runtime Gitea-Ausnahme in ADR-0002/README/CLAUDE.md zurückbauen.
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 12 informational runtime-path:axionwiki.lab | Docusaurus-Wiki unter `axionwiki.lab` | ✅ live, eigenes Zertifikat |
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 13 informational forge-repo:homelab/wiki-bookstack | BookStack als Gegenentwurf (`homelab/wiki-bookstack`) | ✅ live unter `bookstack.lab` |
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 14 prose-or-runtime | 11 neue Themes (aXion1337 Light + 10 Paletten) | ✅ Web live, in allen Clients — ⚠️ **Paletten waren falsch**, korrigiert → [Nachtrag](#nachtrag-2026-08-02--die-paletten-waren-erfunden) |
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 15 prose-or-runtime | Desktop-Clients Linux/Windows/macOS | ✅ Release `desktop-1.12.17-themes` |
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 22 checked-ok path-ok:docs/@ThreadNet-Web(dir),axion1337.chat-gitops(dir),threadnet-call(dir);path-ok:docs/@ThreadNet-Web(dir),axion1337.chat-gitops(dir),threadnet-call(dir);issue-ok:management#19(opened) historical-wording | 1 | **Drei auseinandergelaufene Dokustände**: Gitea-Wiki-Repo (gepflegt, nicht gespiegelt), `wiki`-Branch im gitops-Repo (Mai-Abzug von `docs/`), `docs/` im main. Das Wiki enthielt sachlich Falsches
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 24 FLAG runtime-path:/favicon.ico;path-miss:text/html path-miss:text/html | 3 | **`/favicon.ico` lieferte HTTP 200 mit `text/html`** — die nginx-`try_files`-Kette gab die 404-Seite mit Erfolgsstatus aus. Safari hielt das Icon für vorhanden und zeigte den Buchstaben-Fallback
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 27 checked-ok path-ok:res/vector-icons/@ThreadNet-Web(dir);path-ok:manifest.json@ThreadNet-Web | 6 | **Nur macOS bekam neue Icons** — Windows (`.ico`) und Web (`res/vector-icons/`, `manifest.json`) blieben auf Element | MEDIUM | gelöst, `c51b681` |
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 29 checked-ok issue-ok:management#21(opened) historical-wording | 8 | **Windows-Build-VM war weg** (`No such container`) — der CI-Job kann sie nur starten, nicht anlegen | MEDIUM | umgangen (manueller Neustart), Optionen in #21 |
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 30 checked-ok issue-ok:management#22(opened) | 9 | **macOS-Build braucht Xcode** für das DMG (`actool`) und Rust für die nativen Module | MEDIUM | umgangen (electron-builder 25 fürs ZIP, `hdiutil` fürs DMG), dauerhaft offen in #22 |
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 67 prose-or-runtime Release-Notes stand ein Link auf ein Issue, das ich nie angelegt hatte (fiel
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 79 informational runtime-path:/login | 3 | **Healthcheck auf `/login` schlug fehl → Container `unhealthy` → Traefik überspringt ihn komplett** | Default-Zertifikat + leeres 404, **identisch zum Bild eines fehlenden Netzes** |
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 86 prose-or-runtime im laufenden Container verifiziert wurde, ist damit kein Sicherheitsnetz, sondern
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 87 informational runtime-path:/status;runtime-path:/login ein Risiko. Ich hatte ihn zweimal ungeprüft geändert (`/status` → `/login`).
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 91 informational runtime-path:/opt `/opt`-Pfad — und die CI braucht `VARIANT_PATH`, sonst greift die Variante gar
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 98 prose-or-runtime Test, ein Issue-Verweis ohne Existenzprüfung, ein Icon-Skript ohne Blick aufs
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 104 checked-ok issue-ok:management#20(opened);id-ok:DOC-03 - **Entscheidung DOC-03 (#20)**: Docusaurus oder BookStack — beide laufen jetzt,
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 109 checked-ok issue-ok:management#22(opened);issue-ok:management#21(opened) - **macOS reproduzierbar bauen** (#22), **Windows-VM-Robustheit** (#21).
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 111 checked-ok issue-ok:ThreadNet-Web#6(opened) Signing (ThreadNet-Web#6) — ohne Signatur bleibt für Nutzer auf macOS der
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 118 prose-or-runtime historical-wording **Was war.** Die zehn Themes aus dem Rollout trugen nicht die Farben aus Anthropics
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 126 prose-or-runtime **Warum es nicht auffiel.** Erfundene Farben sehen nicht falsch aus. Ein Theme
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 131 prose-or-runtime **Falle für die nächste Runde.** Ob ein Theme hell oder dunkel gemeint ist, steht
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 135 checked-ok path-ok:shared/branding.md@management stehen in [`shared/branding.md`](../../shared/branding.md).
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 144 prose-or-runtime Sunset-Boulevard-Palette sind bis auf zwei Ziffern identisch (`#e76e51`/`#e76f51`,
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 145 prose-or-runtime `#f3a261`/`#f4a261`) — unabhängig voneinander auf demselben Coolors-Satz gelandet.
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 147 prose-or-runtime **Korrigiert:** gitops `b10b607` (Web, live verifiziert) · ThreadNet-Web `80fcf6c`
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 150 FLAG path-miss:resources/webapp.asar path-miss:resources/webapp.asar stecken in `resources/webapp.asar`. Abgestimmt so belassen; der nächste reguläre
verfahren/aar/2026-08-02-wiki-und-desktop-clients.md 151 checked-ok image-ref:status:wartet;issue-ok:ThreadNet-Web#11(opened) historical-wording Build zieht die Korrektur mit (nachgehalten in ThreadNet-Web#11, `status:wartet`).
verfahren/aar/2026-08-09-refinement-und-betrieb.md 3 prose-or-runtime **Datum:** 2026-08-09 · **Host/Stack:** git.lab, Gitea, K3s-Cluster (Authentik,
verfahren/aar/2026-08-09-refinement-und-betrieb.md 9 prose-or-runtime **Live und verifiziert:**
verfahren/aar/2026-08-09-refinement-und-betrieb.md 17 prose-or-runtime - 251 Commits über vier Repos auf 12:00-UTC-Zeitstempel umgeschrieben, Force-
verfahren/aar/2026-08-09-refinement-und-betrieb.md 18 prose-or-runtime gepusht, Mirrors und Flux verifiziert synchron
verfahren/aar/2026-08-09-refinement-und-betrieb.md 20 prose-or-runtime vorher unbekannte Repos ohne Push-Mirror
verfahren/aar/2026-08-09-refinement-und-betrieb.md 21 prose-or-runtime - `game-operating` gespiegelt und secret-frei verifiziert (Coolify-
verfahren/aar/2026-08-09-refinement-und-betrieb.md 26 prose-or-runtime **Bewusst nicht live:**
verfahren/aar/2026-08-09-refinement-und-betrieb.md 33 prose-or-runtime - `gameserver` weiterhin ohne Mirror — zwei Repos gleichen Namens mit
verfahren/aar/2026-08-09-refinement-und-betrieb.md 40 prose-or-runtime | 1 | `matrix-recovery-flow`-Blueprint scheiterte seit Tagen bei jedem Lauf, während Flux grün meldete | HIGH | behoben |
verfahren/aar/2026-08-09-refinement-und-betrieb.md 42 checked-ok path-ok:develop/config.json@ThreadNet-Web | 3 | Web-Client sendete Fehlerberichte an `rageshakes.element.io` — die Desktop-Bereinigung vom 2026-08-01 hatte den Web-Build nie erreicht, weil der beim Bauen Elements eigene `develop/config.json`
verfahren/aar/2026-08-09-refinement-und-betrieb.md 43 checked-ok issue-ok:management#32(opened) | 4 | `game-operating` und `gameserver` ohne Push-Mirror; bei `gameserver` liegt auf Gitea ein anderer Stand als auf git.lab | MEDIUM | `game-operating` behoben, `gameserver` offen (management#32) |
verfahren/aar/2026-08-09-refinement-und-betrieb.md 44 prose-or-runtime | 5 | Nach dem Privat-Stellen von `game-operating` auf Gitea übersprang die Stillstandsprüfung den Mirror-Abgleich klaglos, statt es als Befund zu werten | MEDIUM | behoben |
verfahren/aar/2026-08-09-refinement-und-betrieb.md 46 prose-or-runtime | 7 | Gitops-Leitfaden 04 nannte 7 Themes mit teils erfundenen Namen (`Gruvbox Dark`, `Wal`); tatsächlich 17 | LOW | behoben |
verfahren/aar/2026-08-09-refinement-und-betrieb.md 47 prose-or-runtime | 8 | threadnet-call-Doku beschrieb einen manuellen npm-Publish, der seit 2026-08-06 automatisiert läuft | LOW | behoben |
verfahren/aar/2026-08-09-refinement-und-betrieb.md 48 checked-ok path-ok:overmind.md@management | 9 | `overmind.md` nannte „sechs gespiegelte Repos" — nach dem Mirror für `game-operating` sind es sieben | LOW | behoben |
verfahren/aar/2026-08-09-refinement-und-betrieb.md 50 checked-ok issue-ok:ThreadNet-Web#14(closed);tag-ok:v0.4.0 historical-wording | 11 | Tag-Push (Force, für die Historien-Anonymisierung) löste in ThreadNet-Web drei Release-Pipelines neu aus; nur weil die geschützten Registry-Variablen im Zeitfenster fehlten, wurde `v0.4.0` nich
verfahren/aar/2026-08-09-refinement-und-betrieb.md 54 prose-or-runtime - **`game-operating` öffentlich auf Gitea** — Secret-Scan über alle fünf
verfahren/aar/2026-08-09-refinement-und-betrieb.md 60 FLAG issue-miss:management#60 issue-miss:management#60 - **Meine erste Diagnose zu #60** („Passwort-Wiederherstellung vermutlich tot")
verfahren/aar/2026-08-09-refinement-und-betrieb.md 68 checked-ok issue-ok:management#1(opened) Flux-Status.** Blueprint-Fehler #1/#2 waren nur so sichtbar — Flux, die
verfahren/aar/2026-08-09-refinement-und-betrieb.md 69 prose-or-runtime ConfigMap und der Cluster-Zustand insgesamt meldeten durchgehend grün.
verfahren/aar/2026-08-09-refinement-und-betrieb.md 71 checked-ok issue-ok:management#2(opened) verdeckten Fehler #2 erst zugänglich gemacht — der reguläre Weg (Worker-Log)
verfahren/aar/2026-08-09-refinement-und-betrieb.md 74 checked-ok issue-ok:management#3(opened) zu glauben** hat Befund #3 aufgedeckt — die Annahme im Issue betraf nur den
verfahren/aar/2026-08-09-refinement-und-betrieb.md 75 checked-ok path-ok:config.json@ThreadNet-Web Desktop-Client, `config.json` auf dem Web-Server sagte etwas anderes.
verfahren/aar/2026-08-09-refinement-und-betrieb.md 77 checked-ok issue-ok:management#4(opened) Befund #4 im ersten Lauf gefunden — eine dynamische Projektliste statt einer
verfahren/aar/2026-08-09-refinement-und-betrieb.md 78 prose-or-runtime im Code gepflegten hat zwei Repos zutage gebracht, die niemand auf dem
verfahren/aar/2026-08-09-refinement-und-betrieb.md 81 prose-or-runtime Fehlmessung beim `game-operating`-Check aufgedeckt, bevor sie als „sauber"
verfahren/aar/2026-08-09-refinement-und-betrieb.md 84 prose-or-runtime 251 Paaren über Tree *und* Commit-Nachricht verifiziert, keine Annahme.
verfahren/aar/2026-08-09-refinement-und-betrieb.md 90 checked-ok issue-ok:management#32(opened) - **`gameserver`-Mirror** — Standklärung nötig, management#32
verfahren/aar/2026-08-09-refinement-und-betrieb.md 91 prose-or-runtime - **Stillstandsprüfung Authentik-Teil** — `AUTHENTIK_URL`/`AUTHENTIK_TOKEN`,
verfahren/aar/2026-08-09-refinement-und-betrieb.md 92 checked-ok issue-ok:management#31(opened) management#31, bewusst aufgeschoben (sorb, 2026-08-09)
verfahren/aar/2026-08-09-refinement-und-betrieb.md 94 checked-ok issue-ok:ThreadNet-Web#9(opened) entschieden, ThreadNet-Web#9
verfahren/aar/2026-08-09-refinement-und-betrieb.md 100 checked-ok path-ok:decisions/@management(dir) Lehre aus der Retro, in `decisions/` dokumentiert
verfahren/deploy-uebergabe.md 6 checked-ok issue-ok:axion1337.chat-gitops#47(opened) Eingeführt am 2026-08-01 nach dem Deploy der CVE-Pipeline (`gitops#47`), siehe
verfahren/deploy-uebergabe.md 11 prose-or-runtime 1. Wer baut, öffnet **auf git.lab** ein Issue aus der Vorlage **Deploy-Übergabe**
verfahren/deploy-uebergabe.md 12 checked-ok path-ok:.gitlab/issue_templates/Deploy-Übergabe.md@management (`.gitlab/issue_templates/Deploy-Übergabe.md`, im Feld *Description template*).
verfahren/deploy-uebergabe.md 51 checked-ok issue-ok:axion1337.chat-gitops#52(opened) `--force-recreate`. Details: `gitops#52`.
verfahren/deploy-uebergabe.md 55 prose-or-runtime historical-wording Datensammlung und Außenwirkung lassen sich fast immer getrennt scharf schalten.
verfahren/deploy-uebergabe.md 71 prose-or-runtime - [ ] Nach dem Deploy **im Container** verifiziert, dass die neue Config aktiv ist
verfahren/deploy-uebergabe.md 83 prose-or-runtime direkt auf dem Gitea-Mirror und werden vom nächsten Mirror-Lauf **kommentarlos
verfahren/deploy-uebergabe.md 89 informational runtime-path:https://rohana.axion1337.de/sorb/<repo>/commit/<sha>.patch `https://rohana.axion1337.de/sorb/<repo>/commit/<sha>.patch` ziehen
verfahren/deploy-uebergabe.md 92 prose-or-runtime 3. **CFGMON** vor dem nächsten Pull: `git fetch && git reset --hard origin/main`
verfahren/issue-migration/README.md 1 checked-ok issue-ok:axion1337.chat-gitops#48(opened) # Issue-Migration Gitea → GitLab (gitops#48)
verfahren/issue-migration/README.md 3 checked-ok path-ok:migrate.py@management `migrate.py` überführt Issues (offen **und** geschlossen, inkl. Kommentare)
verfahren/issue-migration/README.md 4 prose-or-runtime eines Gitea-Repos in ein bestehendes GitLab-Projekt. Einmal-Werkzeug für den
verfahren/issue-migration/README.md 5 FLAG issue-miss:management#48 issue-miss:management#48 #48-Cutover; hier versioniert wegen Reproduzierbarkeit.
verfahren/issue-migration/README.md 10 informational image-ref:<!-- gitea-migration: OWNER/REPO#N --> - **Idempotent** über Marker `<!-- gitea-migration: OWNER/REPO#N -->` in der
verfahren/issue-migration/README.md 16 informational image-ref:host:* 2026-08-01 sind die 9 Gitea-Labels + 5 `host:*` als Gruppe-13-Labels angelegt)
verfahren/issue-migration/README.md 17 prose-or-runtime - PRs werden ausgefiltert, geschlossene Issues nach Anlage geschlossen
verfahren/issue-migration/README.md 26 informational runtime-path:~/.config/gitea-rohana/token Tokens: `~/.config/gitea-rohana/token` (read:issue) und
verfahren/issue-migration/README.md 27 informational runtime-path:~/.config/gitlab-lab/token `~/.config/gitlab-lab/token` (Admin) auf dem Mac.
verfahren/issue-migration/README.md 33 prose-or-runtime | sorb/thread-net-git | Projekt 18 | ✅ 2026-08-01 (1 Issue, nummerngleich) |
verfahren/issue-migration/README.md 34 prose-or-runtime | sorb/threadnet-call | Projekt 19 | ✅ 2026-08-01 (2 Issues, nummerngleich) |
verfahren/issue-migration/README.md 35 prose-or-runtime | sorb/ThreadNet-Web | Projekt 16 | ✅ 2026-08-01 (9 Issues, nummerngleich) |
verfahren/issue-migration/README.md 36 prose-or-runtime | sorb/axion1337.chat-gitops | Projekt 17 | ✅ 2026-08-01 (50 Issues, **Nummern verschoben**) |
verfahren/issue-migration/README.md 38 prose-or-runtime ⚠️ **gitops-Nummern sind NICHT deckungsgleich**: Gitea hatte Lücken (PRs zählen
verfahren/issue-migration/README.md 39 prose-or-runtime mit), GitLab vergibt lückenlos — z. B. Gitea#48 → GitLab#46, Gitea#51 → GitLab#49,
verfahren/issue-migration/README.md 40 prose-or-runtime Gitea#52 → GitLab#50. Die verbindliche Zuordnung steht im Migrations-Fußtext
verfahren/issue-migration/README.md 41 prose-or-runtime historical-wording jedes GitLab-Issues (`Migriert aus Gitea …#N`); alte Commit-/Doku-Verweise auf
verfahren/issue-migration/README.md 42 prose-or-runtime „gitops#N" meinen die **Gitea**-Nummer.
verfahren/issue-migration/README.md 44 checked-ok issue-ok:axion1337.chat-gitops#48(opened) **Cutover-Nachschritte** (siehe gitops#48): Gitea-Issues schließen/als migriert
verfahren/issue-migration/README.md 47 prose-or-runtime aktiven), Bot-/Token-Workflows (claude-issues → GitLab-Äquivalent) offen.
verfahren/refinement.md 20 prose-or-runtime des Monats an — dann ist die Vorbereitung (die AARs des Monats) ohnehin offen.
verfahren/refinement.md 29 prose-or-runtime 2. **WIP-Limit prüfen** — höchstens zwei Issues in `doing`. Ist es voll, wird nichts
verfahren/refinement.md 44 prose-or-runtime - Welche **ADRs** sind durch die Realität überholt (→ neues ADR, altes auf
verfahren/refinement.md 45 prose-or-runtime „abgelöst durch")?
verfahren/refinement.md 51 checked-ok path-ok:retro/@management(dir) Ergebnisse werden unter [`retro/`](retro/) abgelegt, eine Datei je Termin. Die
verfahren/refinement.md 59 prose-or-runtime ermöglicht, welche Lehren, was bleibt offen. **Offene Punkte aus einem AAR werden
verfahren/refinement.md 61 checked-ok issue-ok:management#14(opened);issue-ok:management#16(closed) 2026-08-01, nachgezogen als #14#16).
verfahren/refinement.md 88 checked-ok path-ok:CLAUDE.md@axion1337.chat-gitops,management - Die **kanonischen Arbeitskonventionen** stehen in [`CLAUDE.md`](../CLAUDE.md) und
verfahren/refinement.md 89 prose-or-runtime sind über den Gitea-Mirror von überall lesbar.
verfahren/retro/2026-08-09.md 13 prose-or-runtime **„Alles Offene wird ein Issue."** Das ist das Verfahren, das diesen Monat am
verfahren/retro/2026-08-09.md 15 prose-or-runtime vergessen, weil sie im Moment des Findens ein Issue bekamen — auch die, für die
verfahren/retro/2026-08-09.md 23 checked-ok issue-ok:management#15(opened);issue-ok:management#20(opened) historical-wording management#15 und #20 lagen drei Tage ohne Spalte — das ist der beabsichtigte
verfahren/retro/2026-08-09.md 31 informational image-ref:status:offen muss. Genau deshalb hat eine Session am 2026-08-06 ein `status:offen` erfunden und
verfahren/retro/2026-08-09.md 40 prose-or-runtime ## 2. Welche ADRs sind durch die Realität überholt?
verfahren/retro/2026-08-09.md 42 prose-or-runtime **Keine überholt — aber eine Lücke.**
verfahren/retro/2026-08-09.md 45 prose-or-runtime gebraucht.** Am 2026-08-07 wurde eine dauerhafte Prozessregel eingeführt (englische
verfahren/retro/2026-08-09.md 46 prose-or-runtime Conventional Commits, Zeitstempel auf 12:00 UTC) und am 2026-08-09 rückwirkend auf
verfahren/retro/2026-08-09.md 47 prose-or-runtime 251 Commits angewandt — eine **irreversible** Änderung an vier Repos, mit
verfahren/retro/2026-08-09.md 48 prose-or-runtime Force-Push durch einen Mirror, von dem Flux liest.
verfahren/retro/2026-08-09.md 51 checked-ok path-ok:CLAUDE.md@axion1337.chat-gitops,management ist das ein Lehrbuchfall. Stattdessen steht die Regel nur in der `CLAUDE.md` und
verfahren/retro/2026-08-09.md 55 checked-ok path-ok:CLAUDE.md@axion1337.chat-gitops,management erweitert (Titel ohne Priorität, Meilenstein-Pflicht) — beides in der `CLAUDE.md`,
verfahren/retro/2026-08-09.md 57 checked-ok path-ok:CLAUDE.md@axion1337.chat-gitops,management die `CLAUDE.md` die *Regel*. Es ist aber genau die Zwei-Orte-Konstruktion, die wir
verfahren/retro/2026-08-09.md 70 prose-or-runtime | `build_embedded` (threadnet-call) | grün, seit jeher | lud **nie** ein Artefakt hoch, falscher Pfad |
verfahren/retro/2026-08-09.md 71 FLAG path-miss:dist/ path-miss:dist/ | npm-Paket `0.19.2-threadnet.6` | veröffentlicht | 12,5 KB statt 12,8 MB, **ohne `dist/`** |
verfahren/retro/2026-08-09.md 72 prose-or-runtime | Blueprint `matrix-recovery-flow` | Flux grün, ConfigMap aktuell | seit Tagen bei **jedem** Lauf verworfen |
verfahren/retro/2026-08-09.md 73 prose-or-runtime | gitops-Arbeitskopie | „normal" | `main` trackte **Gitea** — ein `git push` wäre in die verbotene Richtung gegangen |
verfahren/retro/2026-08-09.md 74 prose-or-runtime | Leere Pipelines | rot | **nichts kaputt** — der umgekehrte Fall, Rauschen, das rot abtrainiert |
verfahren/retro/2026-08-09.md 75 informational tag-ok:v0.4.0 | Release-Pipeline auf `v0.4.0` | lief nach Tag-Push an | hätte ein veröffentlichtes Image überschrieben |
verfahren/retro/2026-08-09.md 87 checked-ok issue-ok:axion1337.chat-gitops#50(opened) Es gibt Issues für Einzelfälle — gitops#50 (Configs greifen nicht ohne Neustart),
verfahren/retro/2026-08-09.md 88 checked-ok issue-ok:management#28(opened);issue-ok:ThreadNet-Web#14(closed) management#28 (Mirror-Ausfall unbemerkt), ThreadNet-Web#14 (Release überschreibbar,
verfahren/retro/2026-08-09.md 91 informational tag-ok:v0.4.0 ⚠️ **Der letzte Fall ist der unangenehmste.** Dass `v0.4.0` nicht überschrieben
verfahren/retro/2026-08-09.md 99 prose-or-runtime diesen Monat einzeln und mühsam gelernt haben — Blueprint-Status ≠ error, Mirror
verfahren/retro/2026-08-09.md 103 checked-ok issue-ok:management#28(opened) Das ist die Verallgemeinerung von management#28, das am 2026-08-06 bewusst nach
verfahren/retro/2026-08-09.md 112 checked-ok image-ref:status:next;issue-ok:management#15(opened);issue-ok:management#20(opened) - `status:next`: management#15 und #20 (fällig 31.08.) — Zusage von sorb
verfahren/retro/2026-08-09.md 113 checked-ok image-ref:status:wartet;issue-ok:threadnet-call#4(opened);issue-ok:ThreadNet-Web#11(opened) historical-wording - `status:wartet` entfernt bei threadnet-call#4 und ThreadNet-Web#11: der im Issue
verfahren/retro/2026-08-09.md 115 prose-or-runtime - **M5 — Härtung** angelegt, 14 Issues aus M1 verschoben. Trennlinie: *Ist etwas
verfahren/retro/2026-08-09.md 123 prose-or-runtime ## Offen aus dieser Retro
verfahren/stillstandspruefung.md 11 prose-or-runtime der bei jedem Lauf verworfen wurde, während Flux grün meldete.
verfahren/stillstandspruefung.md 23 prose-or-runtime | Repo ohne aktiven Push-Mirror | `game-operating` wurde angelegt und nie gespiegelt — auf Gitea existierte es nicht |
verfahren/stillstandspruefung.md 24 checked-ok issue-ok:management#28(opened);id-ok:MIRROR-01 | Mirror-Drift | MIRROR-01 (management#28): fällt der Mirror aus, liefert Flux still den letzten Stand weiter |
verfahren/stillstandspruefung.md 25 prose-or-runtime historical-wording | Pipeline mit null Jobs | ThreadNet-Web 203/204, threadnet-call 187 — rot, ohne dass etwas kaputt war |
verfahren/stillstandspruefung.md 26 prose-or-runtime | Erfolgreicher Job ohne Artefakt | `build_embedded` lief seit jeher grün und lud **nichts** hoch |
verfahren/stillstandspruefung.md 27 FLAG path-miss:dist/ path-miss:dist/ | npm-Paket zu klein | `0.19.2-threadnet.6`: 12,5 KB statt 12,8 MB, ohne `dist/` |
verfahren/stillstandspruefung.md 32 prose-or-runtime jahrelang durchrutscht. (Beim ersten Lauf kamen so zwei Projekte zum Vorschein,
verfahren/stillstandspruefung.md 37 prose-or-runtime Geplanter CI-Job im management-Repo, zusätzlich von Hand über *Run pipeline*
verfahren/stillstandspruefung.md 38 prose-or-runtime auslösbar. Befunde färben die Pipeline **rot** — das ist bei uns die Alarmanlage,
verfahren/stillstandspruefung.md 39 checked-ok path-ok:CLAUDE.md@axion1337.chat-gitops nicht ein zusätzlicher Meldeweg (siehe `gitops/CLAUDE.md` zur TURN-Rotation).
verfahren/stillstandspruefung.md 45 code-block export GITEA_TOKEN=$(cat ~/.config/gitea-rohana/push-token) # fuer private Spiegel
verfahren/stillstandspruefung.md 53 prose-or-runtime aufgefallen am 2026-08-09: `game-operating` wurde auf Gitea privat gestellt, und
verfahren/stillstandspruefung.md 54 prose-or-runtime die Prüfung übersprang den Mirror-Abgleich klaglos. Ein Repo, das gespiegelt wird,
verfahren/textbloecke.md 5 checked-ok path-ok:CLAUDE.md@axion1337.chat-gitops,management Die Konventionen stehen kanonisch in [`CLAUDE.md`](../CLAUDE.md) — aber eine
verfahren/textbloecke.md 13 checked-ok path-ok:CLAUDE.md@axion1337.chat-gitops passiert am 2026-08-02, als `gitops/CLAUDE.md` „keine Gitea-Ausnahme mehr" behauptete,
verfahren/textbloecke.md 14 checked-ok path-ok:CLAUDE.md@management während die `management/CLAUDE.md` zwei nannte.
verfahren/textbloecke.md 24 code-block historical-wording Lies zuerst CLAUDE.md im management-Repo auf git.lab und halte dich daran.
verfahren/textbloecke.md 25 code-block Kanonisch ist git.lab; nie direkt nach Gitea pushen.
verfahren/textbloecke.md 27 code-block Bevor du ein Issue schließt oder darüber urteilst: vollständig lesen, inklusive
verfahren/textbloecke.md 30 code-block Verifiziert und vermutet klar trennen; fremde Messungen als fremde kennzeichnen.
verfahren/textbloecke.md 35 informational forge-repo:sorb/Backlogs > dem Pfad `sorb/Backlogs` statt nach dem Namen `Backlogs`; und ein Issue, von dem
verfahren/textbloecke.md 43 code-block Konventionen: CLAUDE.md im management-Repo — von hier lesbar über den Gitea-Mirror
verfahren/textbloecke.md 44 code-block rohana.axion1337.de/sorb/management. Dort NUR lesen, niemals hinpushen.
verfahren/textbloecke.md 48 code-block Ping auf 10.58.73.17 schlägt IMMER fehl (nur 443 + DNS offen), das ist kein
verfahren/textbloecke.md 58 code-block Öffne auf git.lab ein Issue aus der Vorlage "Deploy-Übergabe"
verfahren/textbloecke.md 64 code-block · Außenwirkung und Not-Aus · Rollback · bewusst offen Gelassenes.
verfahren/textbloecke.md 79 code-block - Alle Commits über git.lab gepusht, kein Rest im Arbeitsverzeichnis, Mirror grün.
verfahren/textbloecke.md 80 code-block - Jeder offene Punkt und Nebenbefund ist ein Issue — nichts bleibt nur im Chat.
vision/axion1337-chat.md 3 checked-ok issue-ok:management#17(closed) > **Getragene Fassung** — geschärft im Struktur-Workshop am 2026-08-06 (#17).
vision/axion1337-chat.md 23 prose-or-runtime **Kontrolliert wachsend** (entschieden 2026-08-06). Offen für Neue, aber **jeder
vision/axion1337-chat.md 37 prose-or-runtime Nicht mehr offen: Das Rebranding wird in **M4 zu Ende gebracht**, nicht separat
vision/axion1337-chat.md 38 checked-ok path-ok:threadnet.md@management terminiert — siehe [`threadnet.md`](threadnet.md).
vision/homelab.md 3 checked-ok issue-ok:management#17(closed) > **Getragene Fassung** — geschärft im Struktur-Workshop am 2026-08-06 (#17).
vision/homelab.md 33 checked-ok issue-ok:management#10(opened) [#10](https://git.lab/axion1337.chat/management/-/issues/10) — offen bleibt
vision/homelab.md 35 prose-or-runtime Gitea-Datenbank). Siehe dort.
vision/threadnet.md 3 checked-ok issue-ok:management#17(closed) > **Getragene Fassung** — geschärft im Struktur-Workshop am 2026-08-06 (#17).
vision/threadnet.md 9 prose-or-runtime wiederverwendbare Produkte gedacht: ThreadNet-Web (Element-Web-Fork mit
vision/threadnet.md 10 prose-or-runtime Discord-artiger Raumliste), threadnet-call (Call-Fork), thread-net-git,
vision/threadnet.md 11 prose-or-runtime threadnet-operating.
vision/threadnet.md 37 prose-or-runtime und entscheiden, ob bereinigt (History-Rewrite) oder bewusst akzeptiert wird.
vision/threadnet.md 46 checked-ok issue-ok:ThreadNet-Web#6(opened);issue-ok:management#7(opened);issue-ok:management#10(opened) „Produktreife ThreadNet" (ThreadNet-Web#6, #7, #10).
Can't render this file because it contains an unexpected character in line 7 and column 79.
+1 -1
View File
@@ -12,7 +12,7 @@ axion1337.chat-gitops upstream-or-bot turn-secret-rotation <turn-secret-rotation
axion1337.chat-gitops upstream-or-bot Flux <> real-clock-time main 2
axion1337.chat-gitops upstream-or-bot turn-secret-rotation <turn-secret-rotation@axion1337.chat> real-clock-time side-branch-only 1
management own Thore Cimbal <cfx@riot.8shield.net> anonymised main 86
management own Thore Cimbal <cfx@riot.8shield.net> anonymised side-branch-only 2
management own Thore Cimbal <cfx@riot.8shield.net> anonymised side-branch-only 6
thread-net-git agent Claude <noreply@anthropic.com> real-clock-time main 9
thread-net-git own Thore Cimbal <cfx@riot.8shield.net> real-clock-time main 2
threadnet-call own Thore Cimbal <cfx@riot.8shield.net> anonymised main 12
1 repo identity_class author timestamp_state reachable_from commits
12 axion1337.chat-gitops upstream-or-bot Flux <> real-clock-time main 2
13 axion1337.chat-gitops upstream-or-bot turn-secret-rotation <turn-secret-rotation@axion1337.chat> real-clock-time side-branch-only 1
14 management own Thore Cimbal <cfx@riot.8shield.net> anonymised main 86
15 management own Thore Cimbal <cfx@riot.8shield.net> anonymised side-branch-only 2 6
16 thread-net-git agent Claude <noreply@anthropic.com> real-clock-time main 9
17 thread-net-git own Thore Cimbal <cfx@riot.8shield.net> real-clock-time main 2
18 threadnet-call own Thore Cimbal <cfx@riot.8shield.net> anonymised main 12
+7
View File
@@ -41,6 +41,13 @@ apps/desktop/axion1337/build.json
apps/desktop/axion1337/config.json
apps/desktop/axion1337/prefetch-buildcache.ps1
apps/desktop/babel.config.cjs
apps/desktop/build/entitlements.mac.plist
apps/desktop/build/icon.icns
apps/desktop/build/icon.ico
apps/desktop/build/icon.icon/Assets/element.png
apps/desktop/build/icon.icon/icon.json
apps/desktop/build/icon.png
apps/desktop/build/install-spinner.gif
apps/desktop/dockerbuild/Dockerfile
apps/desktop/dockerbuild/setup.sh
apps/desktop/electron-builder.ts
@@ -0,0 +1,50 @@
<!-- ENTWURF aus der Session-1-Analyse (Neckbeard-Feldtest).
Zielpfad: decisions/0010-haertung-eigener-meilenstein.md
Diese Session darf außerhalb von analysis/ nichts anlegen; das Platzieren
ist ein `git mv analysis/drafts/0010-haertung-eigener-meilenstein.md \
decisions/0010-haertung-eigener-meilenstein.md` durch sorb (plus das
Entfernen dieses Kommentarblocks). Bewusst im alten Schema und auf
Deutsch — Entscheidung sorb, 2026-08-10: „im alten Schema noch, wird
hier nichts migriert." Quelle der Entscheidung:
verfahren/retro/2026-08-09.md (Beschlüsse), Befund F-001 der Analyse. -->
# 0010 — Härtung ist ein eigener Meilenstein (M5); M1 misst nur Kaputtes
**Status:** akzeptiert · **Datum:** 2026-08-09 · **Entscheider:** sorb
## Kontext
M1 („Betrieb absichern") trug 33 von 70 offenen Issues — fast die Hälfte. Elf
davon waren zusätzliche Sicherheits-Werkzeuge (Falco, CrowdSec, Lynis, auditd,
WAF, PSA, Trivy …), keine kaputten Schutzmechanismen. Die roadmap.md hatte die
Frage seit 2026-08-06 explizit offen gestellt: eigener Meilenstein „Härtung"
oder M1 bewusst breit? Ein Meilenstein beantwortet „worauf zahlt es ein"
(CLAUDE.md) — ein M1, der Reparatur und Ausbau mischt, beantwortet das nicht
mehr.
## Entscheidung
Im Refinement vom 2026-08-09 (mit sorb, gemäß Board-Pflege-Regel nicht durch
eine Session allein): **M5 — Härtung** wird angelegt. Trennlinie:
> *Ist etwas Vorhandenes kaputt (M1) oder fehlt etwas, das wir noch nie
> hatten (M5)?*
14 Issues wurden aus M1 nach M5 verschoben (Verteilung danach laut Retro:
M1 18 · M2 21 · M3 4 · M4 13 · M5 14).
## Konsequenzen
- Der Meilenstein-Satz ist **M1M5**. `roadmap.md` (Kopf und „Stand"-Block)
und `CLAUDE.md` (Abschnitt Arbeitsframework, „M1M4") sind nachzuziehen —
beide behaupten Stand 2026-08-09 noch den alten Satz bzw. stellen die
Frage als offen dar (Analyse-Befund F-001).
- Neue Sicherheits-Issues werden an der Trennlinie einsortiert: fehlendes
Werkzeug → M5, kaputter Schutz → M1. Die Trennlinie steht damit hier und
nicht nur im Retro-Protokoll.
- Die Retro-Zahlen sind eine Momentaufnahme; verbindlich ist das Board.
## Verworfene Alternativen
- **M1 bewusst breit lassen:** verworfen — die Meilenstein-Frage „worauf
zahlt es ein" bekäme für die Hälfte des Backlogs zwei Antworten zugleich.
@@ -29,6 +29,10 @@ root-cause pattern: **Rule declared repo-wide, applied to a subset** — the sam
F-002, in the same operation. Both were verified for the property that was easy to check
(SHA pairs matched) and not for the property the operation existed to achieve.
session addendum: the human confirmed at session close (2026-08-10) that the canonical
identity is **`Thore Cimbal <cfx@riot.8shield.net>`** — recorded here as the target value
for any later remediation; nothing was rewritten in this session.
neckbeard mechanism: **Gap in neckbeard**, as in F-002 — no commit or identity hygiene
exists in the framework. The closest structural analogue is `scripts/validate.py`, which
enforces that declared metadata matches reality for *documents* (`check_fields`,
@@ -22,6 +22,11 @@ evidence:
meinen die Gitea-Nummer". A reader who resolves `gitops#48` on git.lab lands on a
different issue than the one meant — and `analysis/data/links.tsv` records
`axion1337.chat-gitops#48` as an existing GitLab issue, so nothing looks broken.
- The shift is now verified by title, not only by the warning: GitLab gitops#48 is
"Gäste-Invite-Workflow per Bot …" — a different topic — while GitLab gitops#46 is
"Issue-Migration nach GitLab + zentrale Projekt-Roadmap …", exactly the substance
CFGMON-12 describes. The Gitea#48 the doc links **is** today's GitLab#46, confirming
`CLAUDE.md:51`'s example as fact (`analysis/data/gitlab_issues.json`).
- CFGMON-12 has no issue of its own anywhere in the group (F-004).
impact: A high-priority decision ("HOHE Priorität", plus an open reachability question) is
@@ -0,0 +1,55 @@
# F-017: Prose still asserts work-item states the tracker has already resolved
category: doc-drift
confidence: high
Found by the systematic claim-verification pass (`analysis/scripts/verify_claims.py`
-> `analysis/data/claims_verification.tsv`), which gave all 813 extracted claim rows a
mechanical disposition; the 28 flagged rows were adjudicated by hand (REPORT.md appendix).
Two survived as genuine drift; a third observation rides along.
evidence:
1. **A closed issue described as open.** `shared/lab-netzwerk.md:118-120`: "Zwei Punkte
… bleiben offen: [#13] … und [#15]". management#13 (LABNET-03) is **closed**,
`closed_at` 2026-08-02T13:43Z (`analysis/data/gitlab_issues.json`); #15 is indeed open.
The doc's last commit is dated 2026-08-02 12:00 UTC — but that timestamp is the
*anonymised* one (`CLAUDE.md:122-128`), so whether the sentence was already false when
written or became false minutes later is **undecidable from the repository**: the
anonymisation rule destroys exactly the evidence a freshness analysis needs. What is
decidable: seven days later it still says "offen".
2. **An open decision whose premise was already executed — in the same file.**
`hosts/cfgmon.md:119-124` ("### Entscheidungsabhängig") makes removing the
`thread-net-git` runner dependent on "ob das gitops-Repo seinen leichten
`deploy-on-push.yml` … behält". `hosts/cfgmon.md:61` records that gitops removed
`.gitea/workflows/` entirely (commit `5e46a24`; verified: the commit deletes exactly
`deploy-on-push.yml` + `milestone-release.yml`, and `tree_axion1337.chat-gitops.txt`
contains no `.gitea/` today), and `hosts/cfgmon.md:70-75` records the runner removal
as done. The "pending" decision block outlived its own answer by 60 lines.
3. **Bare issue references default to the wrong project.** `hosts/cfgmon.md:63` "siehe
#33" and `verfahren/aar/2026-08-09-refinement-und-betrieb.md:60` "#60" carry no
project. Under `README.md:47` ("Alle offenen Punkte sind Issues **in diesem
Projekt**") a reader resolves them as management#33/#60**neither exists**. Both
resolve by content to gitops issues (gitops#33 "Gitea Actions Workflows existieren,
laufen aber nie…" matches the dead-workflow context; gitops#60 "Blueprint
matrix-recovery-flow … Passwort-…" matches the password-recovery diagnosis). Content
correct, address ambiguous.
impact: Small per instance, but these are precisely the rows a systematic sweep exists to
find: each is a sentence a reader would act on (reopen a closed question, wait on a dead
decision, search the wrong tracker). Instance 1 also shows a structural side effect worth
naming for Session 2: **the timestamp anonymisation makes "was this claim true when
written" an unanswerable question** for every doc-vs-tracker discrepancy on the same day.
root-cause pattern: **Decision executed in the tool, documentation not carried along**
(pattern A) — here at sentence granularity rather than document granularity.
neckbeard mechanism: Partly covered, partly gap. Under ADR-0002
(`docs/adr/0002-in-repo-issues.md`) an issue reference is a relative link to
`docs/issues/NNNN-slug.md` — instance 3's ambiguity cannot exist, because
`scripts/validate.py` `check_body_links` fails on a target that is not there. For
instances 12 the framework has the *rule* (`WORKFLOW.md:136-138`, contradictions never
left silently coexisting) and the *ritual* (`WORKFLOW.md:126`, wiki lint for "claims
superseded by newer sources"), but no deterministic check compares a prose assertion
("open", "pending") against the frontmatter status of the artifact it points at —
**that specific check is a neckbeard gap**, and `verify_claims.py`'s expectation-word
logic is a working sketch of it.
+6 -2
View File
@@ -40,8 +40,12 @@ COMPONENTS = [
OUT_OF_SCOPE_PROJECTS = ["game-operating", "gameserver"]
OUT_OF_SCOPE_SUBGROUPS = ["vendor", "Archiv"]
# Tracked-but-vendored paths, excluded from trees and scans.
VENDORED = re.compile(r"(^|/)(node_modules|dist|build|\.yarn|vendor)/")
# Tracked-but-vendored paths, excluded from trees and scans. Deliberately
# narrow: an earlier broader pattern also excluded build/ and dist/, which
# silently dropped 7 tracked files -- ThreadNet-Web keeps its desktop icons
# under apps/desktop/build/, tracked source assets, not build output. That
# made this analysis flag documented icon paths as missing.
VENDORED = re.compile(r"(^|/)(node_modules|\.yarn)/")
DOC_SUFFIXES = {".md", ".rst"}
+4
View File
@@ -72,5 +72,9 @@ echo
echo "== timestamp anonymisation coverage"
python3 "$SCRIPTS/inv_timestamps.py"
echo
echo "== claim verification (mechanical pass over claims.tsv)"
python3 "$SCRIPTS/verify_claims.py"
echo
echo "done. raw data in $MGMT_REPO/analysis/data/"
+264
View File
@@ -0,0 +1,264 @@
"""Mechanically verify every claim row -> analysis/data/claims_verification.tsv.
Closes the gap HANDOFF.md named as the analysis' largest hole: claims.tsv
was extracted in full but verified selectively. This pass gives every one
of its rows an explicit disposition instead of an implicit "not chased".
What a script can and cannot do here is stated, not blurred:
* checkable here -- backticked repo paths resolved against all six trees;
issue references resolved against the group export,
including expectation words ("geschlossen", "offen")
checked against the actual state; legacy IDs against
issue titles; version tokens against git tags.
* not checkable -- host/runtime state (absolute paths, service versions,
DNS), claims about the past, and claims whose truth
lives outside the analysed repos. These are classed,
counted and left honest, not silently passed.
Rows that fail a mechanical check are FLAGged for human adjudication; the
verdicts live in REPORT.md's appendix, not here -- this file is
regenerated and must stay free of hand-written content.
"""
import csv
import json
import re
from common import DATA_DIR, MGMT_REPO, cell, git, repos, write_tsv
# --- reference data -------------------------------------------------------
PROJECT_ALIASES = {
"gitops": "axion1337.chat-gitops",
"axion1337.chat-gitops": "axion1337.chat-gitops",
"threadnet-web": "ThreadNet-Web",
"ThreadNet-Web": "ThreadNet-Web",
"threadnet-call": "threadnet-call",
"thread-net-git": "thread-net-git",
"threadnet-operating": "threadnet-operating",
"management": "management",
}
CLOSED_WORDS = re.compile(r"geschlossen|erledigt|abgeschlossen", re.I)
OPEN_WORDS = re.compile(r"\boffen(?:e[rs]?)?\b", re.I)
HISTORY_WORDS = re.compile(
r"entfernt|gelöscht|removed|hieß|war\b|bis 2026|damals|Vorgänger|alte?[rn]?\b", re.I)
PATH_EXT = (".md", ".yml", ".yaml", ".json", ".py", ".ts", ".toml", ".crt",
".sh", ".env", ".example", ".cjs", ".rst", ".txt", ".conf", ".rules",
".png", ".jpg", ".ico", ".icns", ".exe", ".production")
DOMAIN_PREFIX = re.compile(
r"^(https?://|git\.lab|registry\.|rohana|axionwiki|wiki\.lab|ghcr\.io|gcr\.io)")
FORGE_REPO = re.compile(r"^(sorb|homelab|vendor|axion1337\.chat)/")
NET_REF = re.compile(r"^\d{1,3}(\.\d{1,3}){3}(/\d+)?$")
BARE_EXT = re.compile(r"^\.[a-z0-9]{1,6}$")
VERSION_RE = re.compile(r"\bv?\d+\.\d+\.\d+(?:-[\w.]+)?\b")
NAMED_REF_RE = re.compile(r"\b([A-Za-z][\w.-]*)#(\d{1,4})\b")
URL_REF_RE = re.compile(r"/([\w.-]+)/-/issues/(\d{1,4})")
BARE_REF_RE = re.compile(r"(?<![\w/])#(\d{1,4})\b")
LEGACY_ID_RE = re.compile(r"\b([A-Z]{3,8}-\d{2})\b")
def load_issues():
data = json.loads((DATA_DIR / "gitlab_issues.json").read_text(encoding="utf-8"))
by_ref = {(i["project"], i["iid"]): i for i in data["issues"]}
id_in_titles = set()
for i in data["issues"]:
id_in_titles.update(LEGACY_ID_RE.findall(i["title"]))
return by_ref, id_in_titles
def load_trees():
"""repo -> set of tracked paths, read from the committed tree files so a
rerun without component clones still verifies identically."""
trees = {}
for name, _ in repos():
tree_file = DATA_DIR / f"tree_{name}.txt"
trees[name] = set(tree_file.read_text(encoding="utf-8").splitlines())
return trees
def load_tags():
tags = {}
for name, repo in repos():
try:
tags[name] = {t for t in git(repo, "tag", "--list").splitlines() if t}
except RuntimeError:
tags[name] = set()
return tags
def load_branches():
"""Remote branch names across all repos, with and without origin/."""
out = set()
for _, repo in repos():
try:
for b in git(repo, "branch", "-r", "--format=%(refname:short)").splitlines():
b = b.strip()
if b and "HEAD" not in b:
out.add(b)
out.add(b.removeprefix("origin/"))
except RuntimeError:
pass
return out
# --- per-token checks ------------------------------------------------------
# Doc names that qualify a path with a repo alias ("gitops/CLAUDE.md").
TREE_ALIASES = {"gitops": "axion1337.chat-gitops", "management": "management"}
def classify_path_token(tok, trees, branches, src_dir):
"""-> (check_note, flag_or_None)"""
if tok.startswith(("/", "~", "$")) or DOMAIN_PREFIX.match(tok):
return (f"runtime-path:{tok}", None)
if NET_REF.match(tok):
return (f"net-ref:{tok}", None)
if FORGE_REPO.match(tok):
return (f"forge-repo:{tok}", None)
if tok.startswith("@"):
return (f"package-ref:{tok}", None)
if ":" in tok:
return (f"image-ref:{tok}", None)
if BARE_EXT.match(tok):
return (None, None)
if any(c in tok for c in " *<{=!") or tok.startswith("-"):
return (None, None)
looks_like_path = "/" in tok or tok.endswith(PATH_EXT)
if not looks_like_path:
return (None, None)
clean = tok[2:] if tok.startswith("./") else tok
stripped = clean.removeprefix("origin/")
if stripped in branches or clean in branches:
return (f"branch-ok:{clean}", None)
first, _, rest = clean.partition("/")
if rest and first in TREE_ALIASES and rest in trees[TREE_ALIASES[first]]:
return (f"path-ok:{rest}@{TREE_ALIASES[first]}", None)
candidates = [clean]
if src_dir: # doc-relative resolution inside the management repo
candidates.append(f"{src_dir}/{clean}")
hits = []
for name, files in trees.items():
for cand in candidates:
if cand in files or any(f.endswith("/" + cand) for f in files):
hits.append(name)
break
if any(("/" + cand.rstrip("/") + "/") in ("/" + f) or
f.startswith(cand.rstrip("/") + "/") for f in files):
hits.append(name + "(dir)")
break
if hits:
return (f"path-ok:{clean}@{','.join(sorted(hits)[:3])}", None)
return (f"path-miss:{clean}", f"path-miss:{clean}")
def issue_refs(line):
"""Extract (project, iid) refs; bare #N defaults to management."""
refs, spans = [], []
for m in list(NAMED_REF_RE.finditer(line)) + list(URL_REF_RE.finditer(line)):
proj = PROJECT_ALIASES.get(m.group(1))
if proj:
refs.append((proj, int(m.group(2))))
spans.append(m.span())
named_iids = {iid for _, iid in refs}
for m in BARE_REF_RE.finditer(line):
if any(a <= m.start() < b for a, b in spans):
continue
iid = int(m.group(1))
# "[#49](…/gitops/-/issues/49)" names the same issue twice; the
# bare token is the link text, not a second (management) reference.
if iid in named_iids:
continue
refs.append(("management", iid))
return refs
def check_issue_ref(proj, iid, line, by_ref, single_ref):
issue = by_ref.get((proj, iid))
if issue is None:
return (f"issue-miss:{proj}#{iid}", f"issue-miss:{proj}#{iid}")
expect = None
# Expectation words are only attributable when the line references
# exactly one issue ("#5 geschlossen, Folgethemen in #6" must not
# expect #6 to be closed).
if single_ref and CLOSED_WORDS.search(line) and not OPEN_WORDS.search(line):
expect = "closed"
elif single_ref and OPEN_WORDS.search(line) and not CLOSED_WORDS.search(line):
expect = "opened"
if expect and issue["state"] != expect:
return (f"issue-state:{proj}#{iid}={issue['state']},text-says-{expect}",
f"issue-state:{proj}#{iid}")
return (f"issue-ok:{proj}#{iid}({issue['state']})", None)
def main():
by_ref, ids_in_titles = load_issues()
trees = load_trees()
tags = load_tags()
branches = load_branches()
all_tags = {t for s in tags.values() for t in s}
rows = []
counts = {}
with (DATA_DIR / "claims.tsv").open(encoding="utf-8") as fh:
for row in csv.DictReader(fh, delimiter="\t"):
line = row["claim_text"]
checks, flags = [], []
if row["in_code_block"] == "yes":
status = "code-block"
else:
src_dir = row["path"].rsplit("/", 1)[0] if "/" in row["path"] else ""
for tok in re.findall(r"`([^`]+)`", line):
note, flag = classify_path_token(tok, trees, branches, src_dir)
if note:
checks.append(note)
if flag:
flags.append(flag)
refs = issue_refs(line)
for proj, iid in refs:
note, flag = check_issue_ref(proj, iid, line, by_ref,
single_ref=len(refs) == 1)
checks.append(note)
if flag:
flags.append(flag)
for lid in LEGACY_ID_RE.findall(line):
checks.append(f"id-{'ok' if lid in ids_in_titles else 'no-issue'}:{lid}")
for v in VERSION_RE.findall(line):
if v in all_tags or "v" + v in all_tags:
checks.append(f"tag-ok:{v}")
if flags:
status = "FLAG"
elif any(c.startswith(("path-ok", "issue-ok")) for c in checks):
status = "checked-ok"
elif checks:
status = "informational"
else:
status = "prose-or-runtime"
hint = "historical-wording" if HISTORY_WORDS.search(line) else ""
counts[status] = counts.get(status, 0) + 1
rows.append([row["path"], row["line"], status,
";".join(checks)[:400], ";".join(flags), hint,
cell(line)[:200]])
rows.sort(key=lambda r: (r[0], int(r[1])))
write_tsv("claims_verification.tsv",
["path", "line", "status", "checks", "flags", "hint", "claim_text"],
rows)
for k in sorted(counts):
print(f" {k:<18} {counts[k]}")
print(" -- FLAG rows:")
for r in rows:
if r[2] == "FLAG":
print(f" {r[0]}:{r[1]} [{r[4]}] {'(hist?)' if r[5] else ''} {r[6][:110]}")
if __name__ == "__main__":
main()