Author the framework-neutral contract that unblocks D2 (coordination register). Root cause: D2 conflated marker durability with content publicness. Fix decouples them via a two-output model — LOCAL-ONLY rich roll-up (grep STATE, unchanged) + optional public status-token-only index from minimal committed carriers. Register-builder tolerates three per-repo modes (absent / minimal-committed / private-sidechannel), decided at build; never forces a commit. Commons picks 'absent' → the STATE interim line becomes the permanent design for the public-mirror class. Contract only; no global convention edited. Ratification (register section placement + catalog builder wiring) is the next step. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016oMpAhQcJZVGBW182stSPn
9.5 KiB
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:
<topic>: <status> — <fri prosa; kan navngi repo, arkitektur, blokkere>
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 (fulltopic: 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: statusavslører at repoet deltar i en intern koordinering..rollup-carrierbrukes 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"; donegir 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.mddekker ikke bare.local— bekreft mønsteret ved ratifisering; utvid.gitignoreom nødvendig). - V4 (offentlig-trygghet): en
.rollup-carrierinneholder 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}→ kunsession-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), intetopen/-speil. Verifisert 2026-07-23. Fiksen er altså forebyggende for klassen, ikke en akutt tetting.
10. Ratifiseringssti
- Operatør-OK på denne kontrakten.
coord-sendtil catalog (builder-wiring) + broadcast til deltakende repo (bærer-modus-valg per repo).- Ratifiser inn i koordineringskonvensjonen (register-del, §7).
- catalog wirer builderen med de tre modusene + V4/V5-gatene.