From e68b2952496d42309aa105ccb0a0f377abb263f0 Mon Sep 17 00:00:00 2001 From: Thore Cimbal Date: Mon, 10 Aug 2026 12:00:00 +0000 Subject: [PATCH] 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. --- analysis/HANDOFF.md | 41 +- analysis/REPORT.md | 22 + analysis/SCOPE.md | 2 +- analysis/data/claims_verification.tsv | 814 ++++++++++++++++++ analysis/data/timestamp_anonymisation.tsv | 2 +- analysis/data/tree_ThreadNet-Web.txt | 7 + .../0010-haertung-eigener-meilenstein.md | 50 ++ ...-author-identity-unification-incomplete.md | 4 + ...005-dead-gitea-tracker-still-referenced.md | 5 + ...7-prose-asserts-states-already-resolved.md | 55 ++ analysis/scripts/common.py | 8 +- analysis/scripts/run_all.sh | 4 + analysis/scripts/verify_claims.py | 264 ++++++ 13 files changed, 1265 insertions(+), 13 deletions(-) create mode 100644 analysis/data/claims_verification.tsv create mode 100644 analysis/drafts/0010-haertung-eigener-meilenstein.md create mode 100644 analysis/findings/F-017-prose-asserts-states-already-resolved.md create mode 100644 analysis/scripts/verify_claims.py diff --git a/analysis/HANDOFF.md b/analysis/HANDOFF.md index 230d3a0..02e0b05 100644 --- a/analysis/HANDOFF.md +++ b/analysis/HANDOFF.md @@ -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 ` (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 1–5 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/` 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 diff --git a/analysis/REPORT.md b/analysis/REPORT.md index c51b2ee..b9f4a84 100644 --- a/analysis/REPORT.md +++ b/analysis/REPORT.md @@ -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 diff --git a/analysis/SCOPE.md b/analysis/SCOPE.md index 796bf67..b221072 100644 --- a/analysis/SCOPE.md +++ b/analysis/SCOPE.md @@ -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). diff --git a/analysis/data/claims_verification.tsv b/analysis/data/claims_verification.tsv new file mode 100644 index 0000000..2353c27 --- /dev/null +++ b/analysis/data/claims_verification.tsv @@ -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 1–7 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 1–4 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:05–19: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 M1–M4 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, M1–M4 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 1–7 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 1–7 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-.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 1–7 (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 1–7 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//commit/.patch `https://rohana.axion1337.de/sorb//commit/.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: - **Idempotent** über Marker `` 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). diff --git a/analysis/data/timestamp_anonymisation.tsv b/analysis/data/timestamp_anonymisation.tsv index 089d859..3c98f89 100644 --- a/analysis/data/timestamp_anonymisation.tsv +++ b/analysis/data/timestamp_anonymisation.tsv @@ -12,7 +12,7 @@ axion1337.chat-gitops upstream-or-bot turn-secret-rotation real-clock-time main 2 axion1337.chat-gitops upstream-or-bot turn-secret-rotation real-clock-time side-branch-only 1 management own Thore Cimbal anonymised main 86 -management own Thore Cimbal anonymised side-branch-only 2 +management own Thore Cimbal anonymised side-branch-only 6 thread-net-git agent Claude real-clock-time main 9 thread-net-git own Thore Cimbal real-clock-time main 2 threadnet-call own Thore Cimbal anonymised main 12 diff --git a/analysis/data/tree_ThreadNet-Web.txt b/analysis/data/tree_ThreadNet-Web.txt index 7223acd..06e2cdf 100644 --- a/analysis/data/tree_ThreadNet-Web.txt +++ b/analysis/data/tree_ThreadNet-Web.txt @@ -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 diff --git a/analysis/drafts/0010-haertung-eigener-meilenstein.md b/analysis/drafts/0010-haertung-eigener-meilenstein.md new file mode 100644 index 0000000..257ba59 --- /dev/null +++ b/analysis/drafts/0010-haertung-eigener-meilenstein.md @@ -0,0 +1,50 @@ + + +# 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 **M1–M5**. `roadmap.md` (Kopf und „Stand"-Block) + und `CLAUDE.md` (Abschnitt Arbeitsframework, „M1–M4") 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. diff --git a/analysis/findings/F-003-author-identity-unification-incomplete.md b/analysis/findings/F-003-author-identity-unification-incomplete.md index c2d0982..a91a95a 100644 --- a/analysis/findings/F-003-author-identity-unification-incomplete.md +++ b/analysis/findings/F-003-author-identity-unification-incomplete.md @@ -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 `** — 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`, diff --git a/analysis/findings/F-005-dead-gitea-tracker-still-referenced.md b/analysis/findings/F-005-dead-gitea-tracker-still-referenced.md index a3e30c5..2a8c62b 100644 --- a/analysis/findings/F-005-dead-gitea-tracker-still-referenced.md +++ b/analysis/findings/F-005-dead-gitea-tracker-still-referenced.md @@ -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 diff --git a/analysis/findings/F-017-prose-asserts-states-already-resolved.md b/analysis/findings/F-017-prose-asserts-states-already-resolved.md new file mode 100644 index 0000000..ef119b9 --- /dev/null +++ b/analysis/findings/F-017-prose-asserts-states-already-resolved.md @@ -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 1–2 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. diff --git a/analysis/scripts/common.py b/analysis/scripts/common.py index 850eef2..1f3d81a 100644 --- a/analysis/scripts/common.py +++ b/analysis/scripts/common.py @@ -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"} diff --git a/analysis/scripts/run_all.sh b/analysis/scripts/run_all.sh index 7b5151c..dc30a96 100755 --- a/analysis/scripts/run_all.sh +++ b/analysis/scripts/run_all.sh @@ -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/" diff --git a/analysis/scripts/verify_claims.py b/analysis/scripts/verify_claims.py new file mode 100644 index 0000000..bcbf1ea --- /dev/null +++ b/analysis/scripts/verify_claims.py @@ -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"(? 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()