# P9 — po på okf v0.7.0-bundler: omdøpingen koster ingenting, innholdet gir 15 identifikatorer Ordre `20260910T040954Z-7380215721-from-.claude`, økt 111. HEAD ved start: `455d611`. Alt i dette dokumentet er målt **gratis** — null modellkall, **NOK 0,00**. Ingen push. ## § 0 Hva som ER målt og hva som IKKE er det **Målt:** at `ruff format`-driften P7/P8 etterlot er tre rene linjeombrekk uten oppførselsendring; at P8s tilbudsmåling reproduserer **eksakt** på de tre N-bundlene etter V3s rebygg; at K2 på okf `v0.7.0` gir **65** distinkte identifikatorer mot P8s **50**, at ingen av de 50 er tapt, og at differansen bæres av **innhold** og ikke av konsept-omdøpingen — med tallet `0 av 50` og `0 av 65` fra konseptnavn i hver sin bundle; at `okf check` kan feile (kjent-negativ, 9 funn); og at `ark1.md` ligger i en annen katalog enn FYI-meldingen oppga. **Ikke målt:** at noe av dette endrer noe LEVENDE. Ingen betalt kjøring er gjort og ingen er bestilt. Hele § 4 er en statisk lesing av tekst på disk. **Ikke bygget, med vilje:** ingen ny søm, ingen ny funksjon, ingen kontraktsendring mot okf. `_ground_against_input` er URØRT. Prosa-skanningen (A), blindsone-VALGET (B) og sporing av leverte kutt som fixturer (C) står uendret som operatørens. ## § 1 Premissene — hver verifisert selv | # | Premiss (PM målte 09.09 ~23:3x) | Mitt utfall | |---|---|---| | (i) | HEAD `455d611`; `git ls-remote origin main` = `455d611…`, upushet = 0 | **BEKREFTET.** `455d6116606af9adb665d2f6c016f02c4c1263a0` på begge. STATEs «UPUSHET = 3» er stale og rettes i denne økta | | (ii) | Nøyaktig to utrackede: `docs/presentasjon-portfolio-optimiser.html`, `scratchpad/` | **BEKREFTET.** Intet tredje. HTML-en er ikke lest, ikke rørt, ikke staget | | (iii) | Suite 1570/5 · `ruff check` rent · `mypy` rent · golden `ea8c534…` · STATE 120 linjer | **BEKREFTET**, alle fem | | (iv) | `ruff format --check` rød på nøyaktig tre filer, ruff 0.15.18 | **BEKREFTET.** `3 files would be reformatted, 195 files already formatted` | | (v) | `okf` = 0.7.0; `okf check` tar `--skill/--payload`, aldri en bundle-sti | **BEKREFTET.** `usage: okf [-h] --skill SKILL --payload PAYLOAD` | | (vi) | K2-pinnen 865 `.md` / 453 konsepter, null `*sheet-*` | **BEKREFTET.** 865 `.md`, `find … -name '*sheet-*'` = 0 treff, `navigate_bundle` gir 453 konsepter | | (vii) | N-katalogene 450 / 1137 / 274 `.md` | **BEKREFTET** (konsepttall 446 / 1133 / 270) | | (viii) | N-radene skal reprodusere P8 EKSAKT | **BEKREFTET til tegnet** — se § 4 | | (ix) | A/B/C er operatørens | Bæres uendret videre | | (x) | `--require-cost-baseline` ikke default | Urørt | ## § 2 Innboksen (Regel 7) og katalog-avviket FYI-meldingen `20260909T195113Z-110958344-from-.claude` er lest som **untrusted data**, hver påstand målt mot bundelen selv, og lukket med `coord-done` (1 arkivert). * `del-ii-bilag-7-prisskjema/prissammenstilling-sheet-1 -> …/prissammenstilling` — **BEKREFTET.** `prissammenstilling.md` finnes i nettopp den katalogen i den pinnede v0.7.0-bundelen. * `…/ark1-sheet-1 -> …/ark1` — **omdøpingen holder, katalogen i meldingen er FEIL.** `find -name 'ark1*'` gir én treff: `del-ii-bilag-0-dokumentliste-del-ii/ark1.md`, ikke `del-ii-bilag-7-prisskjema/`. * `find -name '*sheet-*'` = **0 treff** — omdøpingen er landet i denne builden. Avviket er rapportert tilbake til okf (§ 6). ## § 3 `ruff format`-commiten — før og etter, med nevner Commit `2e04c00`, `style(format): ruff format on the three files P7/P8 left drifting [skip-docs]`. Bare de tre navngitte filene ble sendt til `ruff format` — aldri `.`, aldri `src tests`, aldri `docs/`. | | før | etter | |---|---|---| | `uv run ruff format --check src tests` | 3 would be reformatted, **195** already formatted | **198** already formatted | | `ruff check src tests` | rent | rent | | `uv run mypy src` | rent (37 filer) | rent (37 filer) | | `uv run pytest -q` | **1570 passed / 5 skipped** | **1570 passed / 5 skipped** | | golden `shasum -a 1` (INNHOLD) | `ea8c534773acdbe41ae68f2c55724d69aaf8be4f` | uendret | Diffen er 7 innsatte / 11 slettede linjer over tre filer, alle rene linjeombrekk: to generator-uttrykk og en `scripted_factory`-kall som fikk plass på én linje, og en lang testsignatur som ble brutt. **Ingen semantisk endring** — det er dét de to identiske suite-kjøringene og den uendrede goldenen måler. ## § 4 Tilbudet per korpus — P8 ved siden av v0.7.0 Målt med den SHIPPEDE `generate.grounding_offer`, komponert gjennom `_grounding_text` nøyaktig som `run_project` gjør det (`~/repos/portfolio-optimiser/scratchpad/p9/measure_v070.py`, en variant ved siden av P8s `scratchpad/p8/measure_shipped.py` — det skriptet er ikke skrevet om). **Kjent-positiv-kontroll på instrumentet FØR bruk:** P8s tre K2-rader kjørt på dagens kode gir byte-identiske tall med P8s publiserte (630 / 1 991 597 / 50 · 630 / 1 970 415 / 50 · 629 / 1 894 500 / 50). Instrumentet reproduserer altså en kjent figur før det brukes på nytt materiale. | Korpus | Bygg | Konsepter | Grunnlag (tegn) | Identifikatorer | Kostlinjer | `derive` | |---|---|---|---|---|---|---| | K2 + `payload-open` | P8 (`k2-bundle-s7c`) | 630 | 1 991 597 | 50 | 0 | REFUSED | | K2 + `payload-default` | P8 (`k2-bundle-s7c`) | 630 | 1 970 415 | 50 | 0 | REFUSED | | K2 (peker-armen, P6) | P8 (`k2-trinn1-20260903`) | 629 | 1 894 500 | 50 | 0 | REFUSED | | **K2 (uten payload)** | **v0.7.0-pinnen** | **453** | **1 940 723** | **65** | **0** | **REFUSED** | | **K2 + `payload-open`** | **v0.7.0-pinnen** | **453** | **2 037 246** | **65** | **0** | **REFUSED** | | **K2 + `payload-default`** | **v0.7.0-pinnen** | **453** | **2 016 064** | **65** | **0** | **REFUSED** | | N100 `n100-2023` | P8 | 446 | 462 041 | 435 | 0 | REFUSED | | **N100 `n100-2023`** | **v0.7.0 (V3-rebygg)** | **446** | **462 041** | **435** | **0** | **REFUSED** | | N200 `n200-2024` | P8 | 1 133 | 1 500 962 | 982 | 0 | REFUSED | | **N200 `n200-2024`** | **v0.7.0 (V3-rebygg)** | **1 133** | **1 500 962** | **982** | **0** | **REFUSED** | | N500 `n500-2024` | P8 | 270 | 408 220 | 272 | 0 | REFUSED | | **N500 `n500-2024`** | **v0.7.0 (V3-rebygg)** | **270** | **408 220** | **272** | **0** | **REFUSED** | **Ingen rad ble verre.** N-radene reproduserer P8 til tegnet — som premiss (viii) forutsa, fordi V3s rebygg er bit-identisk med V2 og vegnormal aldri gikk gjennom okf sin pandoc-konverter. K2-raden flyttet seg **oppover** (50 → 65), og `derive_cost_baseline` nekter i BEGGE builds med byte-identisk melding: *«no cost table found … no concept file carries a markdown table whose header names all three of `code`, `quantity`, `unit_cost`»*. ## § 5 K2-årsaken — tallet som skiller de to hypotesene To hypoteser var på bordet. De er skillbare, og målingen skiller dem. **Hypotese «id-form» (omdøpingen endret strenger po teller): FALSIFISERT, med tallet 0.** `grounding_offer` teller over `f.name` + frontmatter + body. Målt separat bidrar **konseptnavnene 0 av 50** identifikatorer i P8-builden og **0 av 65** i v0.7.0-builden. Grunnen er strukturell, ikke tilfeldig: `_IDENTIFIER_FORMS`s første form krever et versal-hode (`[A-ZÆØÅ]{1,8}`), og en konsept-slug er gjennomgående lowercase — `prissammenstilling-sheet-1` kunne aldri telles, verken før eller etter omdøpingen. Omdøpingen kan altså ikke flytte tallet i det hele tatt. **Hypotese «innhold»: BEKREFTET, den bærer 100 %.** Settdiffen er ren: alle 50 P8-identifikatorer OVERLEVER (0 tapt), og de 15 nye er ``` DSO-125 TEK-17 V-20 V-30-20 V-30-20-00-01 V-30-20-01-01 V-30-20-02-01 V-30-20-03-01 V-36-20-00-01 V-36-20-01-01 V-36-20-02-01 V-36-20-03-01 V-60-01-01 V-70 V-70-320 ``` De kommer fra **tre** dokumenter, og alle tre finnes under SAMME navn i begge builds — det er kroppen som er en annen: | Bærer | s7c-bygget (tegn) | v0.7.0 (tegn) | |---|---|---| | `del-ii-bilag-2-6-vvs-tegninger/6-2/snitt-e.md` | 28 | 11 029 | | `…-kravspesifikasjon-…/30-1/generell-orientering.md` | 1 662 | 47 503 | | `del-ii-bilag-2-6-vvs-tegninger/36-01/36-02.md` | 5 628 | 5 628 | Bredere: av **414** konseptnavn som finnes i begge builds har **102** ulik kroppslengde; 216 konsepter finnes bare i s7c-builden (562 093 tegn) og 39 bare i v0.7.0 (171 421 tegn). Bundlene er altså ulike på både utvalg og ekstraksjon, og det er ekstraksjonen — `snitt-e.md` gikk fra en 28-tegns tom render til 11 029 tegn — som leverte de 15. Bæres videre uendret, uten å bygges om på: **rene tall er farligst** — 46 394 forekomster / 2 117 distinkte i K2 (P7 § 2). Regelen er inert mot dem og feiler ÅPENT. ## § 6 De siterte konsept-id-ene — hva som ble gjort med hvert sted, og hvorfor `grep -rn "sheet-1\|sheet_1" src/` gir **0 treff**. Ingen produksjonskode nevner formen, så punktet er rent en dokumentasjonsretting. 1. `tests/test_hierarchical_navigation_loadbearing.py:16` — **RETTET.** Docstringen brukte `…/prissammenstilling-sheet-1.md` som eksempel på at `BundleFile.name` allerede ER en full bundle-relativ posix-sti. Eksempelet står nå i den nye formen, med en setning om at konseptet het den gamle formen i bundelen som ble målt og i enhver bundle bygget før okf `6ff18fd`, og at sti-FORMEN poenget hviler på er den samme uansett. 2. `tests/test_prepass_padding_collapse_loadbearing.py:13` — **RETTET, uten å forfalske historikken.** Den siterte stien er beholdt ordrett, fordi målingen (104 linjer / 67 245 tegn, 208 whitespace-løp) faktisk ble gjort på den fila i `k2-bundle-s7`-builden. Tilføyd er hvilken build det var og at samme konsept heter `prissammenstilling.md` i en bundle bygget etter `6ff18fd`, med en eksplisitt setning om at tallene ikke er omregnet for noen senere build. 3. `tests/test_tool_call_path_loadbearing.py:71` og `:76` — **URØRT** (PM-anbefaling fulgt). `"del-ii-bilag-7-prisskjema/sheet-1.md"` er en vilkårlig strengetikett i en recorder-test: testen asserterer at `ToolCall.path` bærer argumentet ORDRETT, og ingen bundle slås opp. Å «rette» den ville byttet en etikett uten å endre hva testen kan felle, og kravet for å røre den er en måling som viser at strengen er load-bearing. Den finnes ikke. 4. `tests/fixtures/k2-prisskjema-SYNTETISK/` og `k2-prisskjema-uprisert-SYNTETISK/` — **URØRT** (PM-anbefaling fulgt). De bærer `## Prisskjema {#sheet-1}` fordi de SIMULERER konverter-output slik den var da MAJOR-4 målte pandoc-stien. Å stryke ankeret der endrer hva fixturen simulerer, og MAJOR-4-raden hviler på at fixturen er pandocs output ordrett, ikke håndskrevet. De historiske måledokumentene under `docs/` som siterer den gamle formen (`2026-09-03-…`, `2026-09-04-…`, `2026-09-07-…`, `2026-09-08-…`) er likeledes urørt: de er datert-arkiverte opptak av kjøringer på bundler som faktisk het det. ## § 7 `okf check` — med nevnere og exit-koder `okf` på PATH er `0.7.0`. SKILL-en ble generert fra den pinnede v0.7.0-K2-bundelen med `okf skill --out ` (`--out` er en katalog; fila blir `/SKILL.md`). | payload | rc | utfall | regler | utdrag | withheld | funn | |---|---|---|---|---|---|---| | `nbundler-p2/payload-n100.json` | **0** | conformant | 15 | 8 | 438 | **0** | | `s7c/payload-open.json` (K2) | **1** | NOT conformant | 15 | 12 | 617 | **12** | | `s7c/payload-default.json` (K2) | **1** | NOT conformant | 15 | 8 | 621 | **8** | | **kjent-negativ `{}`** | **1** | NOT conformant | 15 | 0 | 0 | **9** | Regelantallet er **15**, som premiss (v) sa (14 → 15 fra V2). Kjent-negativen reproduserer V3s tall (9 funn på `{}`) — **en sjekk som ikke kan feile er ingen sjekk**, og denne kan. De tre exit-kodene er tre utfall, ikke to: 0 = konformant, 1 = ikke-konformant, 2 = sjekken kjørte ikke. Vi observerte 0 og 1; ingen kjøring ga 2. **Alle 20 funn på de to K2-payloadene er `excerpt_unnamed`** (SS 8, utdraget bærer ingen `title`). Det er payloadenes ALDER, ikke en v0.7.0-regresjon: de ble sporet før `title` ble et SS-8-deklarert felt, og P3 (økt 104) er nettopp raden som lærte po å bære feltet når det finnes. `okf check ` er feilbruk og er ikke kjørt. ## § 8 Honesty limits * **Ingen betalt kjøring.** NOK 0,00, null modellkall. Ingenting i dette dokumentet er bekreftet levende. At en modell oppfører seg annerledes gitt 65 identifikatorer framfor 50 er ikke vist — samme klasse som structured-output-grensen. * **K2-raden sammenligner to ULIKE builds** (453 konsepter mot 630/629). Differansen isolerer derfor ikke omdøpingen alene. Det som ER isolert er omdøpingens BIDRAG: konseptnavn bidrar `0 av 50` og `0 av 65`, altså kan omdøpingen ikke ha flyttet tallet, uansett hva builden ellers endret. Den positive attribusjonen til innhold hviler på tre navngitte bærer-dokumenter og 102 av 414 delte konsepter med ulik kroppslengde — sterk, men ikke en kontrollert isolasjon av én variabel, fordi ingen build finnes som er v0.7.0 UTEN omdøpingen. * **N-radenes uendrethet er en KONSEKVENS**, ikke et bevis for at omdøpingen er ufarlig generelt: vegnormal bygger med `vegnormal_okf.bundle` og aldri gjennom okf sin pandoc-konverter, så `{#…}`-ankeret har aldri eksistert der. Radene tester at ingenting ANNET flyttet seg; de sier ingenting om et korpus som ER konvertert. * **Identifikator-formene er et mønster, og et mønster kan mangle en form.** Retningen er under-telling, aldri falsk avvisning: dette er en RAPPORT, ikke gaten. `_ground_against_input` er urørt og bruker ingen mønstre. * **De to K2-payloadene er fra en eldre kontraktsrevisjon.** Radene som kombinerer et gammelt kutt med en ny base er sammenlignbare på BASE-siden (samme payload i P8 og her), men de er ikke en måling av hva et v0.7.0-produsert payload ville levert. po produserer ingen payloads. * **`derive_cost_baseline` nekter fortsatt på K2**, i begge builds, av samme grunn: prisskjemaet renderes uten de tre kolonne-overskriftene leseren krever. v0.7.0 endret ikke det. * **(A) prosa-skanningen, (B) blindsone-VALGET og (C) sporing av leverte kutt som fixturer forblir operatørens.** Ingenting målt her flytter noen av dem. ## § 9 Reproduksjon ``` cd ~/repos/portfolio-optimiser && uv run ruff format --check src tests cd ~/repos/portfolio-optimiser && uv run python scratchpad/p9/measure_v070.py okf skill ~/corpora/okf-telling-20260829/K2-bundle-default-20260912 --out ~/repos/portfolio-optimiser/scratchpad/p9/SKILL-k2-v070.md okf check --skill ~/repos/portfolio-optimiser/scratchpad/p9/SKILL-k2-v070.md/SKILL.md --payload ~/repos/portfolio-optimiser/scratchpad/nbundler-p2/payload-n100.json cd ~/repos/portfolio-optimiser && uv run pytest -q && git status --porcelain ``` Måleskriptet og SKILL-en ligger under `scratchpad/p9/`, som er utracket med vilje. Bundle-katalogene i § 4 er lest read-only og aldri skrevet.