portfolio-optimiser-commons/docs/plan/2026-08-09-v1-ss12-undernoekler.md
Kjell Tore Guttormsen 38a117837d docs(plan): SS12-underlaget lukket — O-A ratifisert og utført (§9)
Banner: «UNDERLAG, ikke ratifisert — men KØPLASSERT» → «RATIFISERT SOM O-A OG
UTFØRT 2026-08-25 (`0f88324`)». Uten dette ville neste økt greppet et
statusfelt som påsto at saken fortsatt var åpen — nøyaktig den stale-premiss-
klassen dokumentet selv advarer mot i §8 punkt 2.

Ny §9 fører utfallet: de to radene ordrett, at O-B/O-C/erstatning er AVVIST og
ikke nedprioritert, premissene re-målt med kontroller (nevner 20 rader,
`generated` = 1, `source` + seks undernøkler = 7, method-spec §12 = 0), og
hvorfor ingen coord-melding er sendt (§8 punkt 4 gjaldt erstatnings-formen).

§1–§7 er BEVART urørt. De er underlaget beslutningen ble tatt på, ikke et
referat av den; skrives de om i etterkant, mister §9 det den viser til.
2026-08-25 06:31:24 +02:00

238 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# V1-etterspill — krever `generated.by` / `generated.at` egne rader i §12?
> **Status: RATIFISERT SOM O-A OG UTFØRT 2026-08-25 (`0f88324`). Saken er lukket.**
> Funnet under utførelsen av V1 (`54e0ec7`, 2026-08-09). V1 selv er ratifisert og utført;
> dette var en spenning utførelsen *avdekket*, ikke en del av vedtaket. Underlaget sto som
> UNDERLAG fra 09.08, ble køplassert 24.08 og ratifisert 25.08. **§1§7 er bevart slik de sto
> da beslutningen ble tatt** — de er underlaget, ikke referatet. Hva køen forpliktet til: **§8**.
> Hva som faktisk ble gjort, og hva som ble avvist: **§9**.
>
> Beslektet: `2026-07-26-v1-generated-felt-okf-v0.2.md` (V1-vedtaket),
> `2026-08-02-ss11-mangler-rad-for-ss8.md` (samme klasse: intern spenning i frossen tekst).
---
## 1. Funnet
O2 gjør `generated` om fra en literal til en **inline mapping med to navngitte undernøkler**:
```
generated: { by: process:okf-ingest, at: <ingested_at> }
```
§12s kryssjekk-tabell bærer fortsatt **én rad** for `generated` (`| generated | provenance
frontmatter | §3, §7 |`). Spørsmålet er om `by` og `at` skal ha egne rader.
To setninger i frossen tekst gjør dette til mer enn kosmetikk:
> **§12, ingressen** — «Every field of the machine-readable contracts, mapped to its normative
> section (completeness is enforced by the spec-integrity test)»
> **§11, søm «Spec integrity»** — «this spec goes missing, names a concrete agent toolkit, or
> **stops documenting a contract field**»
§12 er altså ikke en bekvemmelighetstabell. Den står under en **load-bearing søm**.
## 2. Presedensen i vår egen tekst — målt begge veier
Dette er poenget som avgjør, og det peker ikke én vei før man skiller aksene.
**Presedens FOR egne rader — `source`:**
`source` er et strukturert kontraktsfelt med navngitte undernøkler. §12 gir det **både** en
toppnivå-rad **og** en rad per undernøkkel:
| Rad i §12 | Hva den er |
|---|---|
| `source` | toppnivå-feltet, «polymorphic on `source.type`» |
| `type` | undernøkkel (diskriminator) |
| `id` | undernøkkel (felles) |
| `root` | undernøkkel, kun `type: "file"` |
| `connection_ref` | undernøkkel, kun `type: "sql"` |
| `base_url` | undernøkkel, kun `type: "http"` |
| `credential_ref` | undernøkkel, kun `type: "http"`, valgfri |
Merk at undernøklene er definert i **prosa** i §4 (punktlisten), ikke i §4s tabell — men de får
likevel egne rader i §12. Tabell-plassering i §4 avgjør altså ikke §12-plikten.
**Presedens MOT egne rader — `ingest_manifest`:**
`ingest_manifest` har intern struktur (`{stem}@{hash16}`, §5) og får **nøyaktig én** rad. Struktur
inne i en verdi utløser altså ikke automatisk rader.
**Aksen som skiller dem:**
| Felt | Intern struktur er… | Egne rader? |
|---|---|---|
| `source` | **navngitte nøkler i en mapping** | ja (4 undernøkler + felles) |
| `ingest_manifest` | et **strengformat** med posisjonelle deler | nei |
| `generated` (etter O2) | **navngitte nøkler i en mapping** | *åpent — men faller på `source`-siden* |
`generated: { by, at }` er en mapping med navngitte nøkler. På den målte aksen ligner den
`source`, ikke `ingest_manifest`.
## 3. Hvorfor V1-vedtaket ikke fanget dette
`2026-07-26-v1-generated-felt-okf-v0.2.md:161` sier: «`:152` og `:309` navngir bare nøkkelen og
overlever.»
**Den påstanden er sann om den eksisterende raden** — raden heter fortsatt `generated`, ligger
fortsatt i provenance-frontmatter, og peker fortsatt på §3/§7. Ingenting ved raden ble usant.
**Den er taus om de to NYE nøklene.** Kostnaden ble talt som «kontraktslinjer som må skrives
om» (§5) — en *omskrivings*-akse. Rader som må **tilføyes** er en annen akse, og den ble aldri
stilt. Dette er ikke en feil i ratifiseringen; det er et hull i dens scope-formulering. Samme
klasse som «de 5 linjene var ikke homogene» og «`:214` er ikke en literal»: kostnadstellingen var
riktig på sin egen akse og blind for en nabo-akse.
## 4. Er sømmen rød i dag? Nei — og det er grunnen til at dette ikke haster
§11-sømmens ordlyd er «**stops documenting** a contract field». §7s omskrevne feltrad
**dokumenterer begge undernøklene** ordrett — den navngir `by`, fastslår at det er en
`process:`-aktør, navngir `at`, og binder den til `ingested_at`. Specen har altså ikke sluttet å
dokumentere noe.
Eksponeringen er mot **§12s egen ingress** («every field … mapped to its normative section»), som
er en fullstendighets-påstand om tabellen. Det er en svakere binding enn sømmens ordlyd.
**Konsekvens:** ingen kjent implementasjon går rød av dagens tilstand. Dette er en intern
spenning, ikke en defekt i drift.
## 5. Opsjoner (ingen anbefaling — operatøren ratifiserer)
| | Hva | Kostnad | Hva den koster i konformans |
|---|---|---|---|
| **O-A** | Tilføy to rader i §12 (`by`, `at` → §7) | 2 linjer, ren prosa | Utvider hva §12 påstår fullstendighet over. Ingen fixture-endring, ingen konsument-kostnad. |
| **O-B** | La §12 stå, men **snevre ingressen** til «every top-level field» | 1 linje | Gjør dagens tilstand eksplisitt konform. Men svekker en påstand `source`-radene allerede motsier. |
| **O-C** | La alt stå | 0 | Spenningen består, udokumentert. |
**O-B har en målt selvmotsigelse:** `root`/`connection_ref`/`base_url`/`credential_ref` er *ikke*
toppnivå-felter og står allerede i tabellen. En «top-level»-innsnevring ville gjort fire
eksisterende rader uhjemlede. Det er ikke et argument mot O-B, men det må løses samtidig.
**Konsument-måling mottatt 2026-08-09 (`portfolio-optimiser-claude`, ført som DERES):** deres
§12-vakt keyer på at radens første kolonne er ordrett `| `generated` |`. Konsekvensen skiller
skarpt mellom to former som ellers leser likt:
| Form | Konsekvens hos dem (deres måling) |
|---|---|
| **TILFØYE** rader for `by`/`at` (= O-A) | ingen — vakten er urørt |
| **ERSTATTE** `generated`-raden med to undernøkkel-rader | vakten går **RØD**, by design (den skal fange at en rad forsvinner) |
To ting følger. (1) O-A-radens «ingen konsument-kostnad» er nå målt utenfra, ikke bare antatt av
oss. (2) Erstatnings-formen er en **fjerde** opsjon underlaget ikke listet, og den er den eneste
som koster en konsument en samtidig endring. De ber ikke om noe; de opplyser.
## 6. Et separat, mindre funn fra samme utførelse
`generated.at` gjentar verdien av `ingested_at`, som er sitt **eget felt i samme
frontmatter-prefiks** (§5s sju nøkler; §7s tabell). Etter O2 bærer et stemplet dokument altså
samme tidsstempel to steder.
Dette er **en følge av den ratifiserte formen**, ikke en feil i utførelsen — v0.2s `generated`
tar `at` som påkrevd del av mappingen, og §1s premiss («der `at` finnes, bindes den til
`ingested_at`») er innfridd nøyaktig som vedtatt. Ført her fordi det er den slags redundans som
senere leses som drift hvis ingen skrev ned at den var tilsiktet.
**Ikke oppe til vurdering her.** En eventuell konsolidering ville rørt §5s ordnede prefiks, som er
en helt annen og dyrere sak.
## 7. Ankere re-målt (2026-08-09, etter `54e0ec7`)
Utførelsen flyttet tre av våre egne ankere. Ført ordrett, ikke som linjenumre:
| Sted | Seksjon | Status |
|---|---|---|
| Honesty rule | §1 | omskrevet — «`generated.by` naming the ingest actor» |
| Ingest owns only its own files | §3 | omskrevet — «`generated.by` equal to the ingest actor» |
| No other writer may forge the stamp | §3 | omskrevet — samme gjengivelse |
| Feltraden for `generated` | §7 | omskrevet, definerer begge undernøkler |
| Load-bearing «Stamp integrity (curated writers)» | §11 | omskrevet — aktør-spesifikt predikat |
| Frontmatter-prefikset (sju nøkler) | §5 | **uendret** — navngir bare nøkkelen |
| Kryssjekk-raden for `generated` | §12 | **uendret** — dette dokumentets tema |
`generated: true` finnes ikke lenger i specen (verifisert med `grep`).
---
## 8. Køplassering (operatørbeslutning 2026-08-24)
**Merk om §-henvisninger: dokumentets §11/§12 er `ingest-spec.md`s, ikke `method-spec.md`s.**
Se punkt 1 under.
Operatøren har køplassert denne saken. Ordre `20260824T155506Z-3454831118-from-.claude`, punkt 3,
sier det eksplisitt: *«Det som mangler er ren køplassering … IKKE utfør selve SS12-arbeidet i denne
ordren.»* Denne seksjonen er derfor køoppføringen, ikke utførelsen.
**Beslutningen som fortsatt er åpen, er den samme som §5 stiller.** Ingen opsjon er valgt her, og
denne seksjonen anbefaler ingen. Utfallsrommet er fire former, ikke tre — §5s O-A/O-B/O-C pluss
**erstatnings-formen** §5 selv fører som «en fjerde opsjon underlaget ikke listet».
**Hva økten som tar denne saken skal gjøre, i rekkefølge:**
1. **Les hvilken spec §-henvisningene gjelder, FØR den måler.** Hele dette dokumentets §11 og §12
er **`ingest-spec.md`s** §11 og §12 — ikke `method-spec.md`s. Begge filer har en §11 «load-bearing
tests» og en §12 «Cross-check table» med identisk ingress, og `method-spec.md`s §12 har verken
`generated`- eller `source`-rad. Målt 2026-08-24 mens denne køoppføringen ble skrevet: å lese
§-tallet uten filnavnet gir 0 treff og ser ut som «raden er borte». Dokumentet nedenfor navngir
ikke filen; gjør det selv før du greper.
2. **Re-mål underlagets premisser før den handler på dem.** Alle tall og sitater i §1§7 er fra
2026-08-09 og er premisser, ikke fakta. Re-målt 2026-08-24 mot `ingest-spec.md`, med kontroller:
`generated` = **1 rad**, `source` + de seks undernøklene = **7 rader**, nevner **20 rader** i
tabellen (kjent-positiv); samme grep mot `method-spec.md` §12 = **0** (kjent-negativ). Begge
premissene i §1 og §2 står altså. Ankertabellen i §7 er skrevet som seksjon + ordrett tekst
nettopp for å kunne re-måles med `grep -F`. Også ordlyden er re-målt 2026-08-24: §11-sømmen
lyder ordrett «stops documenting a contract field» (`ingest-spec.md:285`) og §12-ingressen
«Every field of the machine-readable contracts …» (`ingest-spec.md:289`) — begge som sitert i
§1 og §4. Linjenumrene er ferskvare; sitatene er ankeret.
3. **Legg de fire formene fram for operatøren og få én ratifisert.** Vi forbereder underlaget,
operatøren ratifiserer — også når funnet er vårt eget.
4. **Meld formen til `portfolio-optimiser-claude` FØR den ligger i commons' main** dersom den
ratifiserte formen er erstatning. Deres §12-vakt keyer på at radens første kolonne er ordrett
`` | `generated` | `` (deres måling, ført som deres i §5): tilføying koster dem ingenting,
erstatning gjør vakten rød *by design*. Pullen deres er atomisk, så varselet må komme først.
**Hva køplasseringen IKKE utløser:** ingen versjonsbump, ingen tag, ingen endring i §5s ordnede
frontmatter-prefiks, og ingen behandling av §6s redundans-funn (`generated.at` gjentar
`ingested_at`) — §6 fører selv det som en følge av den ratifiserte formen og eksplisitt ikke oppe
til vurdering.
**Hvorfor det ikke haster, uendret fra §4:** ingen kjent implementasjon går rød av dagens tilstand.
Eksponeringen er mot §12-ingressens fullstendighets-påstand, som er en svakere binding enn
§11-sømmens «stops documenting a contract field». Køplasseringen er en beslutning om *rekkefølge*,
og skal ikke leses som at sømmen har blitt rød.
---
## 9. Utfall (operatørbeslutning 2026-08-25, utført samme dag)
Operatøren ratifiserte **O-A**: to rader tilføyd i `ingest-spec.md` §12s kryssjekk-tabell,
rett under `generated`-raden. Ordre `20260825T042426Z-7242731354-from-.claude`, utført i
`0f88324`.
```
| `by` | provenance frontmatter (`generated` subkey) | §7 |
| `at` | provenance frontmatter (`generated` subkey) | §7 |
```
**Avvist, ikke nedprioritert:** O-B (snevre ingressen), O-C (la alt stå) og erstatnings-formen.
Ordren sier det eksplisitt. §5s opsjonstabell står urørt som underlag; den beskriver
utfallsrommet slik det så ut FØR beslutningen, og skal ikke leses som fortsatt åpen.
**Premissene re-målt før handlingen, med kontroller** (25.08, mot `ingest-spec.md`): nevner
**20 rader** i §12 (kjent-positiv), `generated` = **1 rad**, `source` + de seks undernøklene =
**7 rader**; samme grep mot `method-spec.md` §12 = **0** (kjent-negativ). §11-sømmen «stops
documenting a contract field» og §12-ingressen «Every field of the machine-readable contracts …»
verifisert ordrett. Alle premissene i §1§7 står altså; ingenting ble målt annerledes enn i
køoppføringen.
**Konsument-kostnaden verifisert utenfra, ikke antatt.** §5 førte `portfolio-optimiser-claude`s
egen måling (deres §12-vakt keyer på radens første kolonne). Ved utførelsen ble vakten lest
direkte i deres kildekode: den sjekker at hvert sporet kontraktsfelt FINNES som rad i en
§12-slice, pluss at slicen ikke har degenerert til hele dokumentet. Tilføying rører ingen av
delene — `generated`-raden er byte-uendret og alle 13 sporede felt står. Derfor **ingen
coord-melding sendt**: plikten i §8 punkt 4 gjaldt erstatnings-formen, som ikke ble valgt.
**Utløste ikke:** versjonsbump, tag, fixture-endring, §5s ordnede frontmatter-prefiks, og §6s
redundans-funn (`generated.at` gjentar `ingested_at`) — §6 fører selv det som en følge av den
ratifiserte formen og eksplisitt ikke oppe til vurdering.