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:
parent
3f18ca7c27
commit
48769708ad
1 changed files with 216 additions and 0 deletions
216
docs/plan/2026-07-26-v1-generated-felt-okf-v0.2.md
Normal file
216
docs/plan/2026-07-26-v1-generated-felt-okf-v0.2.md
Normal 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 |
|
||||
Loading…
Add table
Add a link
Reference in a new issue