# D2 — register-form-fiks: to-utgangs-modell som løser ÅS#5 **Status:** forslag + kontraktutkast. Ingen global konvensjon er endret. Ratifiseres av operatøren. **Foranledning:** D2 (koordineringsregister — committet per-repo-bærer + generert pekerindeks) er blokkert av **ÅS#5**: en committet, fjern-hentbar bærer lekker intern koordineringsmetadata (repo-navn, statuser, arkitekturprosa) til offentlige speil. Commons er selve mønstereksemplet — åpen publisering **+** subtree-konsumert → `STATE.md` er allerede LOCAL-ONLY av nettopp denne grunn. Denne doken forfatter register-form-**kontrakten** HER (jf. driftsmodell: kontrakten forfattes i commons, wiringen i catalog/impl), til ratifisering inn i koordineringskonvensjonen. **Ratifiserte valg (operatør, 2026-07-23):** to-utgangs-modell; leveranse = denne proposal-doken (ingen unilateral global edit). --- ## 1. Rotårsak: D2 konflaterer durabilitet med offentlighet Roll-up-markøren har i dag én form — en linje i hvert repos `STATE.md`: ``` : ``` Første token etter `:` er maskinlesbar status; resten er menneskeprosa. `STATE.md` er LOCAL-ONLY (gitignored), og «roll-up-en» er en tverrsnittsvisning satt sammen ved å **grep-e `~/repos/*/STATE.md`**. Den assemblen er **manuell/ad-hoc** — det finnes ikke noe automatisert assembler-script (verifisert: `session-start.sh` injiserer kun *nærmeste enkelt*-STATE, ikke noe tverrsnitt). Det finnes altså ingen automatisert konsument å regressere. D2 ville gjøre markøren **committet** slik at den overlever fresh clone / subtree-konsum *uten* en co-lokalisert LOCAL-ONLY STATE. Men «committet» drar **to uavhengige egenskaper** sammen: - **Durabilitet** — reiser markøren med repoet (clone/subtree) uten STATE? - **Offentlighet** — tåler innholdet å bli speilet til en offentlig flate? D2 valgte «committet» for durabilitet og fikk offentlighet på kjøpet. **Fiksen er å koble dem fra:** en markør kan være durabel uten å være offentlig-eksponert, og offentlig-eksponert innhold kan reduseres til det som trygt tåler speiling. ## 2. Fiksen: to utganger, aldri konflatert igjen Registeret har **to distinkte utganger** med ulik målgruppe. De blandes aldri. ### Utgang A — rik lokal roll-up (LOCAL-ONLY) - **Kilde:** `STATE.md`-markørlinjene (full `topic: status — prosa`), grep-et over `~/repos/*/STATE.md`. - **Målgruppe:** operatøren, lokalt. **Publiseres aldri.** - **Endring: ingen.** Dette er dagens mekanisme. Den forblir komplett og LOCAL-ONLY. ### Utgang B — offentlig status-token-indeks (VALGFRI, per repo) - **Kilde:** en per-repo **minimal committet bærer** — status-token(s) *alene*, ingen prosa, ingen repo-intern arkitekturdetalj. - **Målgruppe:** enhver som kloner/konsumerer repoet (inkl. offentlige speil). Trygg fordi den kun bærer `topic: status`. - **Valgfri per repo:** et repo i offentlig-speil-klassen (commons) KAN velge å publisere ingenting → det opptrer da ikke i utgang B. Det er «tverrsnitt-eksklusjon by design», ikke et tap. Utgang B er en **projeksjon** av utgang A, bevisst strippet til den offentlig-trygge delmengden (status-token), og **opt-in per repo**. Rik prosa forlater aldri utgang A. ## 3. Bærer-grammatikk (normativ) ### 3.1 Utgang A-kilde — STATE.md-markøren (uendret) Som i dag; LOCAL-ONLY. Ingen endring, tatt med for kontrast. ### 3.2 Utgang B-kilde — minimal committet bærer - **Fil:** en committet fil i repo-rot. Navn (forslag): `.rollup-carrier`. - **Form:** én linje per tema, **status-token alene** — ingen em-dash, ingen prosa: ``` llm-ingestion-guard: planned llm-ingestion-okf: not-applicable ``` - **Vokabular:** status-token trekkes fra D3-status-vokabularet (`planned` / `in-progress` / `blocked` / `done` / `not-applicable` / `partial` / `deferred` / `active` …). D3 er eget spor; denne doken *refererer* vokabularet, definerer det ikke. - **Offentlig-trygghet er per repo, ikke absolutt:** selv `topic: status` avslører at repoet deltar i en intern koordinering. `.rollup-carrier` brukes derfor KUN når topic+status er ikke-sensitivt for det repoet. Er selv det sensitivt → bruk modus «fraværende» (§4.1). ## 4. Tre-modus builder-toleranse (avgjort ved register-build) Register-builderen prober hvert repo og **tolererer fravær** — ingen global regel tvinger commit. Hver modus svarer til en repo-klasse: ### 4.1 Fraværende bærer Repoet committer ingenting. **Utgang B utelater det** (ingen feil); **utgang A** (lokal STATE-grep) dekker det fullt. → Offentlig-speil-klassen (**commons**). ### 4.2 Minimal committet bærer Repoet committer `.rollup-carrier` (`topic: status`, §3.2). Reiser med clone/subtree/offentlig speil. → Repo der topic+status er offentlig-trygt OG durabel offentlig-side-reise ønskes. ### 4.3 Privat sidekanal Bæreren bor på en privat-kun flate — en `*.local`-gitignored fil, coord-området (`~/.claude/coord/`, allerede lokalt/privat), eller en privat-remote-kun sti. Builderen leser den ved assembly av den **private/lokale** indeksen (utgang A-siden). → Privat repo (intet offentlig speil), subtree-konsumert, som vil ha markør-reise *innen* det private økosystemet uten offentlig eksponering (f.eks. `claude-code-llm-wiki`: «fullt privat, intet open/-speil» i dag). ## 5. Presedens når et repo har flere kilder - **Utgang A** er autoritativt fra `STATE.md`-markøren (kanonisk state-of-play per kontinuitets-systemet). - **Utgang B** er autoritativt fra `.rollup-carrier`. - **Drift-invariant:** når STATE-markørens status ≠ committet bærers status, **vinner STATE**, og builderen SKAL varsle (den offentlige projeksjonen har drevet fra den lokale sannheten). Prosa promoteres aldri inn i utgang B; intet repo tvinges til å committe. ## 6. Commons' egen posisjon Commons velger **modus «fraværende»** (§4.1): ingen `.rollup-carrier`, markøren blir i LOCAL-ONLY `STATE.md`. Begrunnelse er commons' definerende egenskap — åpen publisering + subtree-konsum — den samme som allerede holder `STATE.md` gitignored. Commons opptrer i utgang A (lokal grep), aldri i utgang B. **Interim-linjen i STATE («hold roll-up-markørene LOCAL-ONLY, aksepter tverrsnitt-eksklusjon») blir dermed den permanente designen for denne klassen**, ikke en midlertidig innrømmelse. ## 7. Plassering av grammatikken (anbefaling — avgjøres ved ratifisering) STATE peker grammatikken til «koordineringskonvensjonen». Men coord-README-en er eksplisitt *postkasse-transport* (Regel 1: «Postkasse, ikke state»; Regel 2: «Ingen varige beslutninger bor her»). Roll-up-registeret er **state-roll-up, ikke transport** — å veve det inn i postkasse-reglene grumser Regel 1. **Anbefaling:** plasser det som en **avgrenset register-del i coord-området**, eksplisitt adskilt fra postkasse-transporten — f.eks. `~/.claude/coord/register.md`, eller en klart merket seksjon «Register — state-roll-up, distinkt fra postkasse-transporten». Det honorer STATEs retning (koordineringsflaten er den globale hjemmen for tverrsnitt-mekanikk) samtidig som coord Regel 1/2 holdes rene. Alternativet — å legge det ved STATE-konvensjonen i global `CLAUDE.md` — ble vurdert: forkastet fordi registeret er en *tverr-repo* mekanisme, ikke en enkelt-repos STATE-form. ## 8. Avhengigheter og grenser - **D3-status-vokabular** (eget spor) leverer status-token-settet. Denne kontrakten refererer det; definerer det ikke. - **catalog** eier builderens *wiring* (det faktiske register-build-scriptet + adversariske akser). Denne doken er den framework-nøytrale kontrakten — commons rører ikke catalog-moduler. - **Ingen global konvensjon endres her.** Ratifisering (den globale register-seksjonen + catalog-wiring) er neste steg, etter operatør-OK. ## 9. Verifisering Testbare kriterier som beviser at fiksen er korrekt og ikke-regressiv: - **V1 (ingen regresjon i utgang A):** `for f in ~/repos/*/STATE.md; do grep -nE '^[a-z][a-z0-9-]+: (planned|not-applicable|blocked|in-progress|done|partial|deferred|active)' "$f"; done` gir fortsatt begge temaene på tvers av repo (uendret mot i dag). - **V2 (commons fraværende fra utgang B):** `git ls-files | grep -i 'rollup-carrier'` i commons → tomt; commons' markør vises fortsatt i V1-grepet. Bekrefter tverrsnitt-eksklusjon by design. - **V3 (sidekanal er gitignored):** `git check-ignore .rollup-carrier.local` → matcher (`*.local.md` dekker ikke bare `.local` — bekreft mønsteret ved ratifisering; utvid `.gitignore` om nødvendig). - **V4 (offentlig-trygghet):** en `.rollup-carrier` inneholder ingen prosa/em-dash: `grep -n '—' .rollup-carrier` → tomt. Regex-gate builderen kan håndheve. - **V5 (drift-varsel):** når STATE-markørens status ≠ bærers status, varsler builderen (§5). Spec-nivå- assertion; catalog-wiring implementerer. **Nøkkelantakelser — eksplisitt testet:** - *«Ingen automatisert roll-up-konsument å knuse.»* Testet: `grep -rl 'repos/\*/STATE' ~/.claude/{scripts,hooks}` → kun `session-start.sh`, som injiserer nærmeste *enkelt*-STATE, ikke tverrsnitt. **Verifisert 2026-07-23.** - *«Commons' offentlig-lekkasje er prospektiv, ikke live.»* Testet: `git remote -v` → kun privat Forgejo (`git.fromaitochitta.com`), intet `open/`-speil. **Verifisert 2026-07-23.** Fiksen er altså forebyggende for klassen, ikke en akutt tetting. ## 10. Ratifiseringssti 1. Operatør-OK på denne kontrakten. 2. `coord-send` til catalog (builder-wiring) + broadcast til deltakende repo (bærer-modus-valg per repo). 3. Ratifiser inn i koordineringskonvensjonen (register-del, §7). 4. catalog wirer builderen med de tre modusene + V4/V5-gatene.