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:
parent
b6417414c8
commit
c66ccc3ed9
1 changed files with 177 additions and 0 deletions
177
docs/plan/2026-07-23-d2-register-form-fix.md
Normal file
177
docs/plan/2026-07-23-d2-register-form-fix.md
Normal 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue