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