portfolio-optimiser/docs/plan/2026-07-23-d2-register-form-fix.md
Kjell Tore Guttormsen 8a86f2ab6d Squashed 'shared/' changes from 7aa53fc..a2b57d2
a2b57d2 docs(plan): V1 — «de 5 linjene» var ikke homogene; :214 er ikke en literal
d63e45d docs(plan): okf-versjonssjekken utført — hypotesen falsifisert på to stale premisser
ef31dda docs(plan): V1 §4.2 — pin + id + sitering avgjort, og ratifiseringsgaten funnet
35220f7 docs(plan): V1 §4.1 — serialiseringsformen er bundet av :158, så 6 sider er invariant
8a7d430 docs(plan): operatøren avgjorde V1 (O2) og B1 (O1) — B1 utført, V1 gated
f306c7b docs(plan): V1 §5.1 — konsument-kostnaden målt @ 8a14137, O3-raden priset
ab0ea8f docs(plan): innboksrunden — V1 utvidet med tre målte funn, §7.2-siteringen ref-bundet
84a3010 docs(plan): §7.2 — MCP-spørsmålet er avgjort av frossen tekst, S2.2 og S2.4 er ugated
e984d51 docs(plan): D-B ankret, D-A#3s årsak er repo-avhengig, V1 utvidet med oppstrøms-evidens
3de702b docs(plan): V1 §6 — rekkevidde-forbeholdet korrigert, og funnet under funnet
249425b docs(plan): amendment-underlag — D-A#3s ÅRSAK rettet, drift ikke avvik
4876970 docs(plan): V1-underlag — generated-feltets form etter OKF v0.2
3f18ca7 docs(plan): B1/D4 operator question — nav-golden's normative status, four costed options
29ad8ca docs(plan): amendment-underlag — frossen tekst per køpunkt, med målt fasit-effekt
a67a243 docs(plan): ordering-axes ruling — three distinct axes, as an interpretation record
381d9e5 docs(plan): guard adoption plan pins no version — v0.2 header was stale
54ca0ff docs(plan): D3 ratified — status vocabulary landed in coord register
fe6b998 docs(plan): D3 status vocabulary — canonical 7-token set for roll-up register
c66ccc3 docs(plan): D2 register-form fix — two-output model resolves ÅS#5
b641741 docs(examples): nav-golden fixture class — bundle → read-context goldens
9801d35 docs(spec): method-spec §3 Step 1 — Q3 navigation contract (hierarchy)
bfa5a9b docs(spec): ingest-spec — land ratified D1 stamp model
5f046ab docs(plan): Q3 finding — method-spec §3 silently forbids hierarchical bundles
a013e8b docs(plan): F1 direction — free-text sources belong in ingest-spec door A
84191c6 docs(plan): record commons↔implementation-repo coordination boundary
cae9972 docs(plan): llm-ingestion-guard adoption — planned at future untrusted ingest boundaries

git-subtree-dir: shared
git-subtree-split: a2b57d20fc0953c19776c21ce1311f234386a590
2026-07-31 18:37:48 +02:00

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 (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.