portfolio-optimiser/docs/2026-09-10-p9-v070-bundler.md
Kjell Tore Guttormsen 3082e704d2 docs(p9): okf v0.7.0 measured - the rename costs nothing, content adds 15 identifiers [skip-docs]
P8's grounding-offer measurement repeated on the okf v0.7.0 bundles, free, NOK 0.

N100/N200/N500 reproduce P8 EXACTLY (446/1133/270 concepts, 462041/1500962/408220
chars, 435/982/272 identifiers, 0 cost lines, derive REFUSED) - as predicted, because
vegnormal never went through okf's pandoc converter. K2 on the pinned v0.7.0 build
(453 concepts / 865 md) offers 65 identifiers against P8's 50: no row got worse
(0 lost, 15 new, derive REFUSED on both builds with a byte-identical message).

The cause is MEASURED, not guessed: CONTENT, not the concept rename. Concept NAMES
contribute 0 of 50 identifiers in the old build and 0 of 65 in the new one, because
the identifier forms require an uppercase head and a concept slug is lowercase - so
the rename cannot move the count at all. The 15 new tokens come from three documents
present under the SAME name in both builds with different bodies (snitt-e.md
28 -> 11029 chars, generell-orientering.md 1662 -> 47503); 102 of 414 shared concept
names differ in body length.

okf check (0.7.0, --skill/--payload): 15 rules; payload-n100 rc 0 with 0 findings;
the two K2 payloads rc 1 with 12 and 8 findings, all excerpt_unnamed - payload AGE
(recorded before the title field existed), not a v0.7.0 regression; known-negative
{} rc 1 with 9 findings, reproducing V3's figure, so the check can fail.

Two docstrings corrected to the new concept id, each naming the build its numbers
were measured on. src/ carries 0 occurrences of the old form. The recorder-test
string label and the two *-SYNTETISK fixtures are left untouched with the reason
stated: the label is arbitrary and looked up nowhere, and the fixtures simulate
converter output as it was.

No new seam, no new function, no contract change against okf. _ground_against_input
is untouched. No paid run.

Suite 1570 passed / 5 skipped, golden demo-transcript.stdout content sha1 unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-10 06:33:57 +02:00

227 lines
15 KiB
Markdown

# 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 <bundle> -name 'ark1*'` gir én treff:
`del-ii-bilag-0-dokumentliste-del-ii/ark1.md`, ikke `del-ii-bilag-7-prisskjema/`.
* `find <bundle> -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 <bundle> --out <dir>` (`--out` er en katalog; fila blir `<dir>/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 <bundle-sti>` 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.