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.
2.9 KiB
F-013: The mirror topology works exactly as documented — all six repos in sync
category: works-well confidence: high
evidence:
-
mainheads compared between canonical git.lab and the Gitea mirror, both read live withgit ls-remote:repo git.lab rohana/Gitea management 2f012a6cd22f012a6cd2in sync axion1337.chat-gitops 151ef3c8d0151ef3c8d0in sync ThreadNet-Web d3bd5b20c2d3bd5b20c2in sync threadnet-call d13cce7337d13cce7337in sync thread-net-git 2f4a15ce852f4a15ce85in sync threadnet-operating 32f89afebf32f89afebfin sync -
The reasoning behind the topology is written down and is genuinely good:
CLAUDE.md:26-33explains 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-20andCLAUDE.md:45-48— pull the.patchfrom Gitea,git amto 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 jobcanonize_rotation, present at.gitlab-ci.yml:51in 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.