1
0
Fork 0

docs(plan): D2 register-form fix — two-output model resolves ÅS#5

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
This commit is contained in:
Kjell Tore Guttormsen 2026-07-23 22:14:00 +02:00
commit c66ccc3ed9

View file

@ -0,0 +1,177 @@
# 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 (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.