1
0
Fork 0

docs(plan): V1-underlag — generated-feltets form etter OKF v0.2

llm-ingestion-okf spør fordi authorship er vår: DEFAULT-profilen staterer
ingest-spec §5. Fire opsjoner (O0 status quo / O1 produsent-aktør / O2
produsent-nøytral aktør / O3 omdøping) med kostnad målt i kontraktslinjer.

Oppstrømspremisset er verifisert mot okf/SPEC.md selv, ikke overtatt: `by` er
REQUIRED, aktørkonvensjonen har tre former, og toleransen dekker ukjente — ikke
feiltypede — nøkler. Forbehold: spec-en er lest på en gren, ikke en tag.

Aksefunnet: `generated` bærer TO laster hos oss — ærlighetsmarkør (§1, §7) og
eierskapspredikat (§3, §11). Oppstrøms er feltet ren attribusjon.

Funnet som omformer opsjonssettet: O1 med `by: "<produsent>/<versjon>"` legger
en produsents navn inn i det byte-sammenlignede prefikset, og kolliderer da med
§1s krav om at enhver konform implementasjon reproduserer DELT fasit byte for
byte (:29 + :267 + :280). I dag normativ, ikke observerbar — ingen
examples/ingest-golden-* finnes. Ingen spec-tekst røres.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XYkLsRfSBBUjULS219Fy8X
This commit is contained in:
Kjell Tore Guttormsen 2026-07-26 17:02:36 +02:00
commit 48769708ad

View file

@ -0,0 +1,216 @@
# V1 — hvilken form skal `generated` ha i ingest-spec etter OKF v0.2?
> **Status:** beslutningsunderlag for operatøren. Fire opsjoner med målt kostnad, ingen
> anbefaling. Utløst av `llm-ingestion-okf` (coord, 2026-07-26) som spør fordi authorship er
> vår: deres DEFAULT-profil staterer ingest-spec §5, og «ingen lokale spec-endringer» er deres
> stående non-goal.
>
> Underlaget rører ingen spec-tekst. `ingest-spec.md` står uendret på `bfa5a9b`/`9801d35`.
Beslektet: `2026-07-25-amendment-underlag.md` (køen av ratifiserbare punkter — V1 hører hjemme
der hvis den ratifiseres), `2026-07-25-b1-nav-golden-normative-status.md` (samme form).
---
## 1. Det som ikke er oppe til vurdering
- **Ærlighetsregelen selv** (`ingest-spec.md:33-34`, avledet av `method-spec.md:26`) er
*unwaivable*. Alle fire opsjoner under oppfyller den. Spørsmålet er hvilken **form**
merkingen har, aldri **om** den finnes.
- **Eierskaps-stempelets funksjon** (`:70`, `:82`): at re-materialisering bare rører egne filer,
og at en kurert skriver avviser det *komplette* stempelet. Ingen opsjon svekker den regelen.
- **`ingested_at` som eksplisitt påkrevd argument** (`:139-143`). Ingen opsjon innfører
wall-clock. Der `at` finnes, bindes den til `ingested_at`.
- **Hastegrad.** `llm-ingestion-okf` er *ikke* blokkert: deres v0.2-støtte kommer som en ny
profil ved siden av DEFAULT, additivt. Ingenting her er en brannslukking.
## 2. Premissene, verifisert
`llm-ingestion-okf`s to påstander er kontrollert mot kilden, ikke overtatt:
- **Oppstrøms:** OKF v0.2 (`GoogleCloudPlatform/knowledge-catalog`, `okf/SPEC.md`) definerer
`generated: { by, at }`, og `generated.by` er **REQUIRED within `generated`**, typet som en
aktør per §7. Aktørkonvensjonen har **tre** former: `<producer>/<version>` for agenter og
verktøy, `human:<id>` for en person, `process:<id>` for en automatisert prosess.
- **Toleransen dekker det ikke.** v0.2 sier at konsumenter «MUST NOT reject documents with
unrecognized fields» og ikke skal avvise for *manglende valgfrie* felter eller *ukjente*
nøkler. Ingen setning pålegger en leser å svelge en **kjent nøkkel med feil type**.
`llm-ingestion-okf`s lesning holder.
- **Historikken frikjenner valget.** `generated` var ikke reservert i v0.1. Ingen innførte en
defekt; v0.2 tok navnet etterpå.
**Én forbeholdsrad:** deres egen plan (`okf-v0.2-alignment.md`) slår fast at spec-en er lest på
`main` — en gren, ikke en tag — og at «an enumeration read off a moving branch is a premise, not
a fact». Vår kontroll traff samme bevegelige gren. **Ingen frossen spec-tekst bør endres før
oppstrømsversjonen er pinnet til en commit.** Det gjelder O1, O2 og O3 likt.
## 3. `generated` bærer to laster i vår spec, ikke én
Dette er funnet som former underlaget, og grunnen til at opsjonssettet ikke er tre.
Nøkkelen opptrer 7 ganger som kontraktsreferanse, fordelt på fem seksjoner. De deler seg på
**to akser** som ingen av dem navngir:
| Last | Hvor | Hva den svarer på | Hvem leser den |
|---|---|---|---|
| **Ærlighetsmarkør** | §1 `:34`, §7 `:214` | «er dette maskingenerert?» | en leser/presentatør av bundelen |
| **Eierskapspredikat** | §3 `:70`, §3 `:82`, §11 `:275` | «hvilke filer eier ingest — og hva skal en kurert skriver avvise?» | materialiseringen og dør C |
Oppstrøms `generated { by, at }` er **provenance/attribusjon** — den første lasten, ikke den
andre. v0.2 har ingen skriveeierskaps-semantikk; feltet er valgfritt, konsument-skrivbart og
fritt for enhver aksesskontrollmening.
Konsekvensen er ikke at feltet ikke *kan* bære begge, men at en opsjon som flytter
eierskapspredikatet over på et oppstrømsdefinert felt **må uttale det**: predikatet går fra en
literal-sjekk (`generated == true`) til en parse-og-match på et felt hvis grammatikk oppstrøms
eier og fritt kan revidere. Konjunksjonen med `ingest_manifest` — vår egen nøkkel, ikke reservert
oppstrøms i noen versjon — bærer fortsatt uforfalskbarhet-mot-uhell, så stempelet kollapser
ikke. Men `:82`s «permitting either field alone» må omformuleres: under v0.2 vil *kurert*
innhold legitimt kunne bære en `generated`-mapping med en helt annen `by`.
## 4. Spørsmålet
> Skal `generated` i ingest-spec §5/§7 forbli den literale `true`, anta v0.2-formen
> `{ by, at }` — og i så fall med hvilken aktørstreng — eller skal vår markør flytte til en
> nøkkel oppstrøms ikke eier?
## 5. Opsjonene, med målt kostnad
Kostnad er talt som **kontraktslinjer som må skrives om** av de 7 (`:34`, `:70`, `:82`, `:152`,
`:214`, `:275`, `:309`).
**Det som ikke koster noe i noen opsjon:** §5s formkrav overlever uendret. Prefikset er «OKF
line-oriented `key: value`» (`:150`) og «All values MUST be single-line» (`:158`) — v0.2s
kanoniske form for `generated` er en **inline flow mapping** på én linje, så den er single-line
og line-oriented allerede. `:153` («additional frontmatter keys MAY follow») er heller ikke i
veien. Ingen opsjon tvinger fram en rikere frontmatter-modell i *specen*.
### O0 — la `generated: true` stå, dokumentér avviket
**0 av 7 linjer.** Ingen frossen tekst røres; ingenting går i ratifiseringskøen. Eneste
tilføyelse er en merknad om at nøkkelen kolliderer med et v0.2-definert felt.
Kostnad: DEFAULT fortsetter å emittere en v0.2-definert nøkkel med v1-verdi. En v0.2-leser har
ingen plikt til å akseptere den (§2). Kollisjonen forsvinner ikke — den venter.
**Reverserbar.** Ja.
### O1 — v0.2-form med produsent-aktør (`llm-ingestion-okf`s anbefaling)
`generated: { by: "llm-ingestion-okf/<versjon>", at: <ingested_at> }`, predikatet utledet av
`generated.by`.
**5 av 7 linjer** (`:34`, `:70`, `:82`, `:214`, `:275`). `:152` og `:309` navngir bare nøkkelen
og overlever.
**Denne opsjonen kolliderer med en eksisterende normativ setning — se §6.** Kostnaden er ikke
bare fikstur-regenerering.
**Reverserbar.** Nei — frossen normativ tekst.
### O2 — v0.2-form med produsent-nøytral aktør
`generated: { by: "process:<fast id>", at: <ingested_at> }`. v0.2 §7 tillater eksplisitt
`process:<id>` for en automatisert prosess (verifisert, §2). Aktøren navngir da **prosessen
specen definerer**, ikke verktøyet som kjørte den.
**5 av 7 linjer** — nøyaktig samme som O1. Den eneste tekstlige forskjellen mot O1 er
aktørstrengen; den avgjør til gjengjeld §6.
Kostnad: `generated.by` identifiserer ikke lenger *hvilket* verktøy som produserte filen.
Produsent-identitet må da bo i implementasjonens egen logg. Om det er et tap eller et krav
avhenger av §6.
**Reverserbar.** Nei.
### O3 — døp om vår markør, la `generated` være fri
Vår markør flyttes til en nøkkel oppstrøms ikke eier; `generated` overlates til v0.2-semantikk.
**7 av 7 linjer** — også `:152` (prefiks-lista) og `:309` (kryss-sjekk-tabellen), fordi nøkkelen
selv skifter navn. Dyrest i tekst.
Til gjengjeld: predikatet bevares **eksakt** som en literal-sjekk, aksene i §3 skilles ved
konstruksjon, og kollisjonen kan ikke gjenoppstå ved neste oppstrømsrevisjon. v0.2 forbyr det
ikke — de nye feltene er valgfrie oppstrøms.
Kostnad: interop-tapet er reelt. En v0.2-leser som spør «er dette maskingenerert?» via
`generated` får ikke svar. Ærlighetsregelen er oppfylt internt, men ikke lesbar for formatets
egne lesere — som er en del av hvorfor vi ligger i OKF i det hele tatt.
**Reverserbar.** Nei.
## 6. Funnet som omformer opsjonssettet (ikke en anbefaling)
**O1 som formulert kolliderer med konformansleddet i §1.**
- `ingest-spec.md:29`: en konform implementasjon MUST «reproduce the shared golden extractions
(§11) byte for byte».
- `ingest-spec.md:267`: `expected-bundle/` er «compared file by file, **byte for byte**».
- `ingest-spec.md:280`: sømmen `Golden regression` fyrer når «any byte of a golden extraction's
expected bundle diverges».
- `generated` ligger i det **obligatoriske ordnede prefikset** (`:149-152`) — altså inne i de
bytene.
Med `by: "llm-ingestion-okf/<versjon>"` bærer en **delt** fasit én produsents navn og
versjonsnummer. Da følger to ting mekanisk:
1. **Ingen annen konform implementasjon kan reprodusere fasiten byte for byte.** Kravet i `:29`
gjelder enhver konform implementasjon, ikke den som lagde fikstursettet. Kravet blir
uoppfyllbart ved konstruksjon for alle andre enn én.
2. **`Golden regression` fyrer på hver versjonsbump av biblioteket** — uten at noen kontrakt har
endret seg. Sømmen slutter å måle det den er satt til å måle.
O2 unngår begge: aktørstrengen er da specens, ikke produsentens, og bytene forblir
produsent-nøytrale. O0 og O3 berører ikke spørsmålet.
**Merk hva funnet ikke er.** Det er ikke et argument for O2 og mot O1 i seg selv. Operatøren kan
gyldig svare at fasit-klassen aldri får mer enn én produsent, eller at `generated` skal ut av
det byte-sammenlignede prefikset. Men da er *det* valget som må ratifiseres — funnet sier bare
at O1 ikke kan vedtas uten samtidig å ta stilling til `:29`.
**Målt forbehold om rekkevidde:** `examples/ingest-golden-*` **finnes ikke i commons i dag**
(`ls` → ingen treff). Klassen er specifisert (`:259-267`), ikke materialisert. Konflikten er
derfor i dag **normativ, ikke observerbar** — den utløses den dagen commons publiserer sin
første ingest-fasit. Fikstursettet `llm-ingestion-okf` snakker om å regenerere, er deres eget.
## 7. Det som ikke er commons' å avgjøre
- **Hvilken opsjon som velges.** Spec-teksten er frossen; endringer går gjennom
ratifiseringskøen. V1 er punkt nummer 8 hvis den ratifiseres — den står **utenfor** de 7 i
`2026-07-25-amendment-underlag.md` og fortrenger ingen av dem.
- **Hva `llm-ingestion-okf` gjør i sin egen v0.2-profil.** Den er additiv og deres authorship.
Bare DEFAULT staterer vårt lag.
- **Om produsent-identitet skal logges et annet sted** (O2s pris). Implementasjonens valg.
## 8. Det som ikke endres uansett utfall
Ærlighetsregelen, eierskapsstempelets funksjon, `ingested_at`-argumentet, §5s single-line- og
line-oriented-krav, og `ingest_manifest` som stempelets andre halvdel. Ingen opsjon rører
`method-spec.md` — nøkkelen forekommer ikke der (`grep -c '\`generated' method-spec.md` → 0).
---
## Verifiseringslogg
| Påstand | Sjekk | Resultat |
|---|---|---|
| v0.2 definerer `generated: { by, at }` | `okf/SPEC.md` @ `main`, hentet 2026-07-26 | «generated: { by: reference_agent/gemini-2.5-pro, at: 2026-06-20T22:53:05Z }» |
| `by` er påkrevd | samme | «generated.by: REQUIRED within `generated`. An actor (§7).» |
| Aktørkonvensjonen har tre former | samme, §7 | `<producer>/<version>` / `human:<id>` / `process:<id>` |
| `timestamp` er superseded | samme | «`timestamp` is superseded by `generated.at`» |
| Toleransen gjelder ukjente, ikke feiltypede | samme | «MUST NOT reject documents with unrecognized fields»; lista dekker manglende valgfrie + ukjente |
| Oppstrøms er lest på en gren, ikke en tag | `llm-ingestion-okf/docs/plan/okf-v0.2-alignment.md` | «`main` on 2026-07-26 — a branch, not a tag» |
| Kontraktsreferanser til nøkkelen | `grep -n '\`generated' ingest-spec.md` | 7 linjer: `:34 :70 :82 :152 :214 :275 :309` |
| Nøkkelen finnes ikke i method-spec | `grep -c '\`generated' method-spec.md` | 0 |
| Ærlighetsregelen er unwaivable | `ingest-spec.md:33-34`, `method-spec.md:26` | «unwaivable» begge steder |
| Stempelet er `generated: true` + `ingest_manifest` | `ingest-spec.md:70`, `:82` | ordrett sitert over |
| Dør C avviser kun det komplette stempelet | `ingest-spec.md:82-85` | «while permitting either field alone» |
| `generated` ligger i det ordnede prefikset | `ingest-spec.md:149-152` | 7 nøkler, `generated` er den sjuende |
| Prefikset er åpent bakover | `ingest-spec.md:153` | «additional frontmatter keys MAY follow it» |
| Single-line-kravet holder for flow mapping | `ingest-spec.md:150`, `:158` | «line-oriented `key: value`» / «All values MUST be single-line» |
| Konformans krever byte-lik delt fasit | `ingest-spec.md:29` | «reproduce the shared golden extractions (§11) byte for byte» |
| Fasiten sammenlignes byte for byte | `ingest-spec.md:267`, `:280` | «byte for byte» / «any byte … diverges» |
| Ingen ingest-fasit finnes i commons | `ls -d examples/ingest-golden-*` | ingen treff |
| `ingested_at` har ingen wall-clock-default | `ingest-spec.md:141` | «there is NO wall-clock default» |
| Spec-tekst uendret siden 07-21 | `git log --oneline -- ingest-spec.md` | `bfa5a9b`, forrige `7aa53fc` — ingen commit etter |