Files
management/analysis/findings/F-013-mirror-topology-actually-holds.md
T
Thore Cimbal eaa00f0ed2 analysis: add 16 evidence-backed drift findings
Twelve drift findings and four works-well findings, each citing file
paths, line numbers, commit hashes or rows in analysis/data/. Every
'neckbeard mechanism' field names a concrete rule in neckbeard v0.1.1 or
states explicitly that none exists.
2026-08-10 12:00:00 +00:00

2.9 KiB

F-013: The mirror topology works exactly as documented — all six repos in sync

category: works-well confidence: high

evidence:

  • main heads compared between canonical git.lab and the Gitea mirror, both read live with git ls-remote:

    repo git.lab rohana/Gitea
    management 2f012a6cd2 2f012a6cd2 in sync
    axion1337.chat-gitops 151ef3c8d0 151ef3c8d0 in sync
    ThreadNet-Web d3bd5b20c2 d3bd5b20c2 in sync
    threadnet-call d13cce7337 d13cce7337 in sync
    thread-net-git 2f4a15ce85 2f4a15ce85 in sync
    threadnet-operating 32f89afebf 32f89afebf in sync
  • The reasoning behind the topology is written down and is genuinely good: CLAUDE.md:26-33 explains why two locations exist rather than only asserting it — the Hetzner cluster must rebuild when the lab is off — and pre-empts the tempting cleanup with a named warning: "⚠️ Die Flux-Quelle nicht „geradeziehen" auf git.lab: Das sähe aufgeräumter aus und würde die Verfügbarkeit der Produktion an das Lab koppeln".

  • The failure mode is documented with its rescue procedure, not just prohibited: README.md:16-20 and CLAUDE.md:45-48 — pull the .patch from Gitea, git am to preserve authorship, push via git.lab.

  • The one standing exception is explicit, justified, bounded, and has a live mechanism: the TURN rotation CronJob (CLAUDE.md:53-60), canonised daily by the scheduled CI job canonize_rotation, present at .gitlab-ci.yml:51 in the gitops repo. The alarm design is stated deliberately — "diese rote Pipeline ist der Alarm, einen zusätzlichen Termin gibt es bewusst nicht."

impact: This is the part of the current approach that must survive migration untouched. The value is not the sync itself but the form: a decision with its reason, its counter-argument, its rescue path, and its one exception each written where the next session will look.

root-cause pattern: A decision recorded with its reasoning outlives the person who made it. Every claim in this cluster held up under measurement; the ones that failed elsewhere in this report are the ones recorded as bare assertions.

neckbeard mechanism: This is what docs/adr/ is for. AGENTS.md:81 — "Architecture Decision Records — binding; never edited, only superseded" — and AGENTS.md:89-90, "Before proposing options (Gate 2), read the relevant ADRs and AARs first — past decisions and learnings are input, not trivia." The existing decisions/0001-gitlab-kanonisch-push-mirror.md already is an ADR in all but schema; migrating it needs frontmatter per schema.yaml:39-52 (type, id, status, date) and nothing else. The "don't straighten this out" warning maps to the ADR Consequences section, and WORKFLOW.md:56 ("Options & trade-offs … pro/contra each, chosen option, and why") is where the two-host reasoning belongs.