# N100, N200 og N500 re-målt i hypoteseform — det nye utdraget bærer nøkkelen, og po dropper den > **Ordre `20260908T134013Z-2103630340-from-.claude` (P2).** P1 (`docs/2026-09-08-n-bundlene-konsum.md`, > `e7ffe9e`+`a26e8f2`) fant at pre-passets utdrag leverte `text` uten `title`/`req_number`, så > kravnummeret spørsmålet stiller fantes ikke noe sted i modellens kontekst. llm-ingestion-okf lukket > det (`17c49fc`, `c95d189` — HEAD `171798e`, treet rent), vegnormal-okf re-bygde de tre bundlene med > proveniens (`feae0c8`, V2-treet). Denne målingen re-kjører de tre armene mot det nye utdraget, med > `--require-cost-baseline` (operatørvalg D-3), og dømmer etter den NYE «ferdig»-definisjonen > (operatørvalg 08.09 12:20, D-1: **po er ikke et oppslagsverktøy**). > > **Utdraget bærer nå nøkkelen — 14 medlemmer, var 9. Modellen fikk den likevel ikke: po dropper > feltene TO ganger, ved parsing og ved rendering. Funnet har byttet eier, fra okf til po.** --- ## 0. Hva som ER målt, og hva som IKKE er det **MÅLT.** Tre nye tre-hasher reprodusert ordrett fra vegnormal-okfs V2-melding. `okf.navigate_bundle` når 446 / 1 133 / 270 konsepter, 0 ufulgte lenker. Fasit-konseptet på **rang 1 av 8 på alle tre**, med den flaggløse kommandoen. Utdragets medlemsliste: **14**, med `title`, `req_number`, `sources`, `source_element_id`, `source_sha256`. Kontraktsjekk **exit 0 × 3**, 15 regler, 0 funn. `prepass.admit_payload` OK × 3. Klientproben grønn. `--require-cost-baseline` nektet alle tre, rc 1, **0 modellkall** — på full kjøresti, ikke bare dry-run. `--derive-cost-baseline` nektet også, alle tre. Tre betalte armer uten flagget, rc 0 × 3, **NOK 0,22 av taket 5, 0 × 429**. Hva som nådde prompten, felt for felt. Hvert modellsvar ordrett. **IKKE MÅLT.** **Én kjøring er én kjøring** — tre armer, ett spørsmål hver, én modell (`gpt-4-1-mini`), ett deployment, ingen gjentakelse. Ingenting her sier noe om varians, og P1 og P2 er to trekk fra samme modell på nesten samme input: at N100 gikk fra `rejected` (P1) til `validated` (P2) og N200 motsatt vei er ikke tilskrevet noen årsak. At en ANNEN modell ville lest kuttet annerledes er ikke målt. Ingen av bundlene er faglig gjennomgått — sammenlikningen er mot konseptkroppen, ikke mot vegnormalen. **IKKE RØRT.** Ingen fil under `src/`. Ingen Azure-konfig. Ingen fil i vegnormal-okf eller i noen okf-checkout. Ingen push. --- ## 1. Kjent-positiv per bundle, FØR noe ble betalt ```bash OKF=~/repos/llm-ingestion-okf # HEAD 171798e, `git status --short` TOMT B=~/repos/vegnormal-okf/build/ferdig # feae0c8 (V2) $OKF/.venv/bin/python3 $OKF/tools/okf_consume.py $B/n100-2023 \ --question "Hva krever Krav 3.3.1—13 i N100? Gjengi det sentrale vilkåret." --out payload-n100.json $OKF/.venv/bin/python3 $OKF/tools/okf_skill.py $B/n100-2023 --out skill-n100 $OKF/.venv/bin/python3 $OKF/tools/okf_contract_check.py --skill skill-n100/SKILL.md --payload payload-n100.json # ... tilsvarende for n200-2024 og n500-2024, DEFAULT-kommandoen, ingen flagg ``` | kjent-positiv | N100:2023 | N200:2024 | N500:2024 | |---|---|---|---| | `sha256-tree` reproduserer V2s ref | **JA** `da6b8204…` | **JA** `c64f36b7…` | **JA** `673a0c2c…` | | `okf.navigate_bundle` → konsepter | **446** (fasit 446) | **1 133** (fasit 1 133) | **270** (fasit 270) | | `Bundle.skipped` (ufulgte lenker) | 0 | 0 | 0 | | considered / withheld / delivered | 446 / 438 / 8 | 1 133 / 1 125 / 8 | 270 / 262 / 8 | | budsjett brukt av 120 000 | 11 868 | 23 961 | 11 941 | | **fasit-konseptets rang** | **1 av 8** | **1 av 8** | **1 av 8** | | `okf_contract_check` | **exit 0**, 15 regler, 0 funn | **exit 0**, 15 regler, 0 funn | **exit 0**, 15 regler, 0 funn | | `prepass.admit_payload` mot montert base | **OK** | **OK** | **OK** | | klientprobe `test_foundry_profile_live` | **1 passed** — kjørt FØR armene | (samme kjøring) | (samme kjøring) | Budsjettforbruket er høyere enn P1s (11 868 mot 8 939 · 23 961 mot 21 102 · 11 941 mot 9 085) — forventet, og det er selve endringen: hvert utdrag bærer nå fem felt til. okfs egen melding målte +450,5 B per utdrag på et annet korpus; her er differansen +2 929 / +2 859 / +2 856 B over åtte utdrag, altså **+366 / +357 / +357 B per utdrag**. **Budsjett-instrumentets egen kjent-positiv flyttet, som okf varslet:** `expected` 12 563 / `raw_bytes` 12 227 / `encoding_delta` 336 (var 10 349 / 10 060 / 289), og `measured == expected` på alle tre. En stale verdi ville fått pre-passet til å nekte — den høylytte feilen, ikke en defekt. **Utdragets medlemmer: 14, var 9.** Ordren forventet ≥ 12. ``` adjudication · bundle_id · bundle_id_inherited · concept_id · rank · req_number · sha256 · source_element_id · source_sha256 · sources · text · text_sha256 · title · trust_tier ``` De fem nye er `title`, `req_number`, `sources`, `source_element_id`, `source_sha256`. (okfs melding målte 9 → 17 på K2; differansen er at K2 bærer fem `source_*`-lokatorer der N-bundlene bærer to — prefiks-regelen, ikke en allowlist.) For N100s fasit-konsept: ```yaml title: Krav 3.3.1—13 H1 – Nasjonal hovedveg, ÅDT < 6 000 og fartsgrense 80 km/t req_number: Krav 3.3.1—13 sources: [{resource: https://viewers.vegnorm.vegvesen.no/api/nisosts/859984?languageCode=nb, title: N100:2023}] source_element_id: id-4b61eee9-a149-42b3-863d-293b8320c15a source_sha256: c58e8bbc5fa9a5400c111e51b04c05f2cfd9edabd884ef5352a486fdab2cb5ab ``` **Alt P1 etterlyste er der.** Det er derfor resten av dette dokumentet handler om po. --- ## 2. `--require-cost-baseline` NEKTET alle tre — og nekten er gratis Operatørvalg D-3. Flagget ble kjørt på **full kjøresti**, ikke bare dry-run, og nekten er ordrett: ``` run refused: this run was required to be anchored, but the knowledge base offers no cost baseline: without one the validator's stage 0 (reconciling each proposed cost line against the project's own) is skipped and nothing ties a proposed cost line to this project. Ship a cost-baseline.json, or pass --derive-cost-baseline when the base carries a priced schedule ``` | | N100 | N200 | N500 | |---|---|---|---| | `--require-cost-baseline`, full kjøring | **rc 1** | **rc 1** | **rc 1** | | modellkall før nekten | **0** | **0** | **0** | | kontroll: samme argv UTEN flagget | **rc 0** | **rc 0** | **rc 0** | | `cost-baseline.json` i basen | fraværende | fraværende | fraværende | | `--derive-cost-baseline` (den andre døra nekten navngir) | **rc 1** | **rc 1** | **rc 1** | Antallet modellkall asserteres, ikke exit-koden alene: **en nekt etter forbruket ser identisk ut ved exit-koden** (økt 57s regel). rc-0-kontrollen er der fordi en arm som bare kan bli rød ikke beviser noe. Den andre dørens nekt er like presis, og den forklarer hvorfor det ikke finnes en tredje vei: ``` no cost table found in bundle '…/n100-2023': no concept file carries a markdown table whose header names all three of ['code', 'quantity', 'unit_cost'] ``` **Målt konsekvens: det finnes ingen forankret form av en N-bundle-kjøring.** En vegnormal er et kravkorpus, ikke et anbudskorpus — den bærer ingen kostlinjer i det hele tatt, og ingen av po sine tre baseline-projeksjoner (håndskrevet fil · `baseline_from_project` · `derive_cost_baseline`) kan lage én av den. F4-flagget gjør altså nøyaktig det det ble bygget for, og svaret er at N-bundlene ikke er kostnadskjøringer. **Derfor er de tre betalte armene kjørt UTEN flagget, og det er et uttalt avvik fra ordrens bokstav.** Ordren ba om tre betalte armer MED flagget; med flagget koster de ingenting og produserer ingen modellsvar, altså heller ingen (a), (b′), (c) eller (e). Nekten er rapportert som resultatet D-3 ba om (over), og armene som faktisk måler det nye utdraget er kjørt uten det. Det som ellers ville stått igjen, var en tom måling av den eneste tingen P2 finnes for. --- ## 3. Tre betalte armer ```bash export PORTFOLIO_FOUNDRY_PROJECT_ENDPOINT=… # utledet INLINE fra `az`, aldri i fil export PORTFOLIO_FOUNDRY_DEPLOYMENT=gpt-4-1-mini export PORTFOLIO_MODEL_MAP=scratchpad/major2-live/model_map.json export PACE_SECONDS=2 uv run --with tiktoken python scratchpad/nbundler-p2/live_nbundler_p2.py {n100|n200|n500} # argv: --profile azure --docs-dir --bundle-dir # --proposal-review --outbox-dir … --run-id p2--free --prepass-payload payload-.json ``` Innsprutspunktet er `run._default_factory` (Fase 4e). Alle roller LEVENDE. Deployment urørt (`az … deployment show`): `GlobalStandard`, `capacity` **100**, `gpt-4.1-mini` `2025-04-14`, `Succeeded`. | | **N100** | **N200** | **N500** | |---|---:|---:|---:| | rc | 0 | 0 | 0 | | prompter totalt | **6** | **7** | **5** | | proposer / checker | 5 / 1 | 6 / 1 | 4 / 1 | | prompt-tokens (o200k) | 7 748 | 16 764 | 6 092 | | leverandør-input | 12 217 | 25 877 | 9 619 | | leverandør-output | 824 | 1 248 | 611 | | **429-svar** | **0** | **0** | **0** | | parse-feil-artefakt | fraværende | **TIL STEDE (1)** | fraværende | | verktøykall i debatten | **0** (A-form: verktøyene trukket) | **0** | **0** | | validator-dom | **validated** | rejected (stage 4, P90) | **validated** | | dom-nøkkel | `c195117970ce86ef` | `70f3eb3540cd88f7` | `c9740904b1303f65` | | Steg 5 (reason matet tilbake) | 2 prompter | 2 prompter | 1 prompt | **Én parse-feil, på N200 — og filens tilstedeværelse ER signalet** (økt 35). Den er ikke en formatfeil: modellen leverte gyldig JSON i riktig form, og det som falt var en DOMENE-invariant i `SavingsProposal`: > `Value error, claimed saving 1500000.0 exceeds affected items' total 900000.0` Den avledede grammatikken (Fase 1b funn 1b) holdt altså på tre ferske korpora igjen; det som fanget denne var pydantics egen `claimed <= total`. Funn-1-fangsten (kaller-eid sink, `finally`) leverte teksten VERBATIM, som er hele grunnen til at setningen over kan siteres i det hele tatt. --- ## 4. Hovedfunnet: nøkkelen finnes nå, og po dropper den to ganger P1s funn 1 var okfs. **Det er lukket.** Det som står igjen er po sitt, og det er to uavhengige tap på samme sti. **Tap 1 — ved PARSING.** `prepass.PrepassExcerpt` arver `_Permissive`, som er `ConfigDict(extra="ignore")`. Payloadens 14 medlemmer blir til 7 i objektet po bygger: ```python >>> sorted(gold.model_dump()) ['adjudication', 'bundle_id', 'concept_id', 'sha256', 'text', 'text_sha256', 'trust_tier'] ``` `title`, `req_number`, `sources`, `source_element_id` og `source_sha256` finnes ikke lenger. **Tap 2 — ved RENDERING.** `prepass._data_blocks` renderer fire ting per utdrag: `concept_id`, `adjudication`, `trust_tier` og `text`. Selv om feltene hadde overlevd parsing, ville de ikke nådd prompten. DATA-blokka for fasit-konseptet, ORDRETT: ``` --- BEGIN DATA krav/N100/id-4b61eee9-a149-42b3-863d-293b8320c15a (adjudication: unknown, trust_tier: unverified) --- ## Krav Eventuell kryssing mellom gang- og sykkelveg og veg skal være planskilt ved ÅDT > 4 000. --- END DATA krav/N100/id-4b61eee9-a149-42b3-863d-293b8320c15a --- ``` **En første måling av dette var KONFUNDERT, og ble felt før noe ble bygget på den.** Et naivt delstreng-søk fant `req_number` i 2 av 6 prompter og `source_element_id` i 2 av 6 — begge falske: strengen `Krav 3.3.1—13` står i prompten fordi den er en del av SPØRSMÅLET («cut computed for: Hva krever Krav 3.3.1—13 i N100?»), og `id-4b61eee9-…` fordi den er en delstreng av `concept_id`. Ingen av dem kommer fra utdragets nye felt. Det er repoets egen regel om at en assert aldri skal stå på en delstreng to grener deler, anvendt på en måling i stedet for en test. | når prompten faktisk? | N100 | N200 | N500 | |---|---|---|---| | utdragets `text` | **JA** | **JA** | **JA** | | `concept_id` (UUID-formet) | **JA** | **JA** | **JA** | | `req_number` som FELT | **NEI** | **NEI** | **NEI** | | `title` | **NEI** | **NEI** | **NEI** | | `sources` / `resource`-URL | **NEI** | **NEI** | **NEI** | | `source_element_id` som FELT | **NEI** | **NEI** | **NEI** | | `source_sha256` | **NEI** | **NEI** | **NEI** | **Konsekvensen er direkte observerbar i modellens egne ord.** N200s proposer skriver: > «…to optimize the geotechnical investigations and ground assessments already in the regulatory > planning phase (**as per the krav with ID 03418c46-ad07-4678-bae1-08f441f38903**)» Modellen siterer en UUID fordi UUID-en er den eneste identifikatoren den kan se — den står i DATA-avgrenseren. Kravnummeret, som er det et menneske ville sitert, er i payloaden og når aldri fram. **Rangeringen finner riktig dokument, produsenten leverer nå nøkkelen, og konsumenten kaster den.** --- ## 5. Målene (a)–(e) + (b′), med nevner ### (a) Svarte modellen med det sentrale vilkåret i fasit-kravet? | | N100 | N200 | N500 | |---|---|---|---| | nøkkelord fra fasit-kroppen | **3 av 3** (`planskilt` 13×, `ÅDT` 14×, `4 000` 3×) | **0 av 6** | **0 av 5** | | fasit-setningen ORDRETT | **3 ganger** | 0 | 0 | | **(a)** | **JA** | **NEI** | **NEI** | Uendret fra P1, og mekanismen er den samme, målt og ikke gjettet: modellen ble bedt om et kostnadsbesparende tiltak. På N100 ER fasit-kravet kostnadsformet (en terskel som lar deg sløyfe en dyr konstruksjon), så «svar på oppgaven» og «svar på spørsmålet» sammenfaller. På N200 og N500 gjør de det ikke, og modellen fulgte oppgaven den fikk — den resonnerte om grunnundersøkelser og om fjernstyrte bommer, begge fra ANDRE leverte konsepter i kuttet. ### (b′) Navnga modellen konseptet den bygde på? Ordrens nye mål, og det som P2 finnes for. | | N100 | N200 | N500 | |---|---|---|---| | `req_number` ordrett i svaret | **0** | **0** | **0** | | `title` ordrett | 0 | 0 | 0 | | fasit-`concept_id` ordrett | 0 | 0 | 0 | | `source_element_id` som EGET felt | 0 | 0 | 0 | | `resource`-URL / `nisosts` | 0 | 0 | 0 | | leverte konsepter navngitt i det hele tatt | **0 av 8** | **1 av 8** (ikke fasit) | **1 av 8** (ikke fasit) | | **(b′)** | **NEI** | **NEI** | **NEI** | **`req_number` er sitert 0 ganger i 18 modellsvar** — og det kan den ikke være, siden feltet aldri nådde prompten (§ 4). (b′) måler derfor po sin renderer, ikke modellens vilje: ingen implementasjon av modellen kunne bestått denne raden slik koden står. **Proveniens sitert: nei × 3.** Verken `source_element_id` eller `resource`-URL-en forekommer i noe svar. Det er samme årsak. ### (c) Hallusinerte den et kravnummer eller en verdi? | | N100 | N200 | N500 | |---|---|---|---| | kravnummer-formede tokens i svaret | **0** | **0** | **0** | | tall i prosa som ikke er i delivered | **0** | **0** | **0** | | konsept-id-referanser som ikke er levert | **0** | **0** | **0** | | **(c)** | **0** | **0** | **0** | Ett treff undersøkt og forkastet som instrumentfeil: N100s `4,000` er modellens engelske tusenskille av det leverte `4 000`. N200s og N500s tall-fragmenter (`03418`, `4678`, `0000`, `4715`, …) er biter av ekte, leverte konsept-UUID-er som modellen skrev i prosa. **Kjent-negativ for instrumentet:** første tall-regex fant 0 tokens i N200s og N500s prosa, altså kunne den ikke ha funnet en hallusinasjon heller. Den ble skjerpet til den fant de ekte tallene (N100 `4 000` fra kroppen), og målingen over står på den skjerpede. **Det strukturerte FORSLAGET dikter fortsatt opp kostkoder**, som i P1, og av samme strukturelle grunn (ingen baseline, og oppgaven krever et tall): | | kode | finnes i basen | |---|---|---| | N100 | `planskilt_kryssing` | **0 av 450 filer** | | N200 | `03418c46-ad07-4678-bae1-08f441f38903` | 2 av 1 137 — en EKTE konsept-id brukt som kostkode | | N500 | `RCB01` | **0 av 274 filer** | **Forskjellen fra P1 er verdt å si:** P1s `03423b12` var en oppdiktet identifikator formet som en ekte, og den ble VALIDERT. Denne gangen er ingen oppdiktet kode identifikator-formet — de to oppdiktede er generiske kostlinje-etiketter. Det er ikke en forbedring noen bygget; det er et annet trekk fra samme modell. **Begge kjøringene ville vært nektet av `--require-cost-baseline`** (§ 2), og det er den delen som ikke er et sammentreff. ### (d) Kostnad Listepris, Azure Retail Prices API (`api-version=2023-01-01-preview`, `currencyCode='NOK'`, `armRegionName=eastus`), **hentet på nytt 08.09**, metere `gpt 4.1 mini Inp/Outp glbl Tokens`: input NOK 0,003734 / 1K, output NOK 0,014936 / 1K. | Kjøring | Prompter | Input | Output | NOK | |---|---:|---:|---:|---:| | N100 | 6 | 12 217 | 824 | 0,058 | | N200 | 7 | 25 877 | 1 248 | 0,115 | | N500 | 5 | 9 619 | 611 | 0,045 | | klientprobe | 1 | ~20 | ~5 | ~0,000 | | **SUM** | **19** | **47 733** | **2 688** | **NOK 0,22** | **NOK 0,22 — 4,4 % av taket på NOK 5, og under ordrens tak på NOK 1. 429-svar: 0.** De tre nekt-armene kostet **NOK 0,00** (0 modellkall). ### (e) Nevner-vokabularet **Ikke brukt i noen arm.** `[sourced-not-sufficient]`, `[unread]`, `[sourced]`, `[inferred]` og `[unsupported]` står **0 ganger i 18 modellsvar**. Som i P1: alle tre armene FANT noe å foreslå i kuttet, så ingen var i posisjonen markøren finnes for. Det er en ubesvart nevner, ikke et bevis for at markøren ikke virker. --- ## 6. «Ferdig»-dommen, etter den NYE definisjonen Operatørvalg 08.09 12:20 (D-1). **Oppslagsspørsmålet «Hva krever Krav X?» er IKKE lenger po sitt kriterium** — oppslag er Claude Code sin jobb via okf sin C1-oppskrift (`llm-ingestion-okf/docs/2026-09-08-claude-code-skill-vilkaarlig-bundle.md`, som måler fire spørsmål over to bundler med fire pass og null oppfunne tall). po sitt kriterium er hypoteseformen: **ferdig i po = (a) modellen bygger hypotesen på riktig fasit-konsept ELLER nekter forankret · (b′) navngir konseptet · (c) 0 hallusinasjoner.** | | (a) | (b′) | (c) | **ferdig** | |---|---|---|---|---| | **N100:2023** | **JA** (fasit-setningen ordrett ×3) | **NEI** | **0** | **NEI** | | **N200:2024** | NEI | **NEI** | **0** | **NEI** | | **N500:2024** | NEI | **NEI** | **0** | **NEI** | **0 av 3 — og den bindende raden er nå (b′), på alle tre.** Det er en annen situasjon enn P1s 0 av 3, og forskjellen er hele poenget: - **P1: nøkkelen fantes ikke.** For to av tre bundler var kravnummeret fraværende fra modellens kontekst i det hele tatt. Ingen konsument kunne gjort noe. - **P2: nøkkelen finnes, og po kaster den.** Alle tre payloadene bærer `req_number`, `title` og en hentbar `resource`-adresse. `prepass.PrepassExcerpt` ignorerer dem, og `prepass._data_blocks` renderer dem ikke. **(b′) er derfor ikke en modell-dom — det er en po-dom**, og den kan ikke bli ja for noen modell før de to linjene endres. Den andre halvdelen av (a) — «ELLER nekter forankret» — er verdt å lese nøyaktig: med `--require-cost-baseline` nekter alle tre (§ 2), men da finnes det ingen hypotese å navngi et konsept for, så (b′) er umålbar og dommen ville vært ufullstendig snarere enn ja. **En N-bundle kan ikke samtidig være forankret og produsere en hypotese**, fordi et kravkorpus ikke bærer kostlinjer. Det er ikke en defekt i noen av de tre repoene; det er hva slags korpus en vegnormal er. ### Hvem eier hva som mangler **llm-ingestion-okf eier ingenting her lenger.** P1s funn 1 er lukket og verifisert i denne målingen: utdraget bærer `title`, `req_number`, `sources`, `source_element_id` og `source_sha256`, rangeringen står på rang 1 × 3, kontraktsjekken går exit 0 med 15 regler, og budsjett-instrumentets egen kjent-positiv er oppdatert i takt med at § 8 flyttet. **vegnormal-okf eier ingenting.** V2-treet reproduserer sine egne hasher, nevnerne lukker, 0 ufulgte lenker × 3, og hvert konsept bærer en adresse okf kan bære videre. **portfolio-optimiser eier begge de gjenstående postene.** (1) `prepass`-sømmen dropper fem felt to ganger. (2) Kjøreformen: A-formens oppgave er fortsatt hardkodet (`run.py:1243`) og `--explore` er fortsatt nektet med `--prepass-payload` — men etter D-1 er dét ikke lenger en mangel, det er en avgrensning operatøren har tatt stilling til. ### Anbefaling til operatøren (beslutningen er din) 1. **La po bære utdragets nye felt gjennom til prompten.** To linjer: navngi feltene på `PrepassExcerpt` (eller les dem via `model_extra`), og la `_data_blocks` sette `req_number` og `title` i DATA-avgrenseren ved siden av `concept_id`. Kostnaden er målt: **+366 B per utdrag** er allerede betalt i payloaden, og rendringen legger til titalls tegn per utdrag. Dette er det ENESTE som kan gjøre (b′) nåbar, og det er en rød test og en søm — ikke en beslutning. 2. **Ikke gjør N-bundlene til kostnadskjøringer.** `--require-cost-baseline` og `--derive-cost-baseline` nekter begge, målt, og grunnen er strukturell. Hvis en N-kjøring skal forankres, må baselinen komme fra prosjektet — ikke fra normalen. 3. **`--require-cost-baseline` bør fortsatt brukes på N-kjøringer der et TALL skal telle.** Den nektet tre kjøringer som ellers ville stemplet `validated` over kostkoder som ikke finnes i noen base (§ 5c). Prisen er null. 4. **Etter (1) er kriteriet på nytt målbart for under NOK 0,25.** Samme tre armer, samme spørsmål. --- ## 7. Funn — rapportert, ikke fikset 1. **po dropper utdragets nye felt to ganger** (§ 4). Eier: po. `PrepassExcerpt` er `extra="ignore"`; `_data_blocks` renderer fire ting. Nevner: 5 av 14 medlemmer når aldri prompten, og `req_number` er sitert 0 ganger i 18 svar. **Dette er (b′)s eneste årsak.** 2. **Ingen forankret form finnes for en N-bundle** (§ 2). Eier: ingen — det er en egenskap ved korpustypen. Begge dørene nekter, målt, med rc-0-kontroll. 3. **To av tre validerte forslag bruker oppdiktede kostkoder** (§ 5c). Eier: po (bruksmåte). `planskilt_kryssing` 0 av 450, `RCB01` 0 av 274. F4-flagget nekter dem, gratis. 4. **Én parse-feil på N200** (§ 3). Ikke en formatfeil — en domene-invariant i `SavingsProposal` (`claimed 1 500 000 > total 900 000`). Rapportert fordi P1 målte null på alle tre, og fordi artefaktets tilstedeværelse er signalet. 5. **Nevner-vokabularet ble ikke brukt i noen arm** (§ 5e). Uendret fra P1, samme ubesvarte nevner. 6. **En delstreng-måling av «nådde feltet prompten» er konfundert** (§ 4). Både `req_number` og `source_element_id` finnes i prompten av HELT andre grunner (spørsmålslinja og `concept_id`). Nevnt fordi neste måling vil gjøre samme feil om den ikke er skrevet ned. --- ## 8. Ærlighets-grenser, uttalt - **Én kjøring er én kjøring.** Tre armer, ett spørsmål hver, ingen gjentakelse, én modell. P1 og P2 er to trekk fra samme modell på nesten samme input, og de er UENIGE om utfallet på to av tre armer (N100 rejected → validated, N200 validated → rejected). Ingen årsak er tilskrevet; det er nettopp dét varians ser ut som når nevneren er 1. - **(b′) måler po, ikke modellen.** Feltet når aldri prompten, så ingen modell kunne bestått raden. Å skåre den som en modell-svakhet ville vært å bruke definisjonen som gjemmeplass. - **(a) på N100 er ikke bevis for at kjeden svarer på oppslag.** Det er bevis for at fasit-teksten nådde modellen og ble brukt, og på N100 sammenfaller de to spørsmålene ved et sammentreff i kravets innhold. Sammentreffet er identifisert, ikke skjult — og etter D-1 er oppslag uansett ikke po sitt kriterium. - **(c) = 0 gjelder svaret.** Det strukturerte forslaget dikter opp kostkoder, som er strukturelt påkrevd i en uforankret kjøring. Skillet er uttalt i § 5c, ikke skjult av definisjonen. - **AVVIK fra ordren, uttalt:** de tre betalte armene er kjørt UTEN `--require-cost-baseline`. Med flagget koster de null og måler null (§ 2). Nekten er rapportert som D-3s resultat, og armene som måler det nye utdraget er kjørt uten det. - **`--cost-vocabulary`, `--k` og `--rarity-weight` ble IKKE brukt.** Fasit sto på rang 1 med default-kommandoen på alle tre, så betingelsen for opt-in-flaggene inntraff aldri. - **Kuttet er verifisert mot den monterte basen** (`admit_payload` × 3), så payloaden kan ikke ha levert bytes basen ikke holder. Det er en gate, ikke en tillitserklæring til produsenten. - **Ingen av bundlene er faglig gjennomgått.** Sammenlikningen i (a) er mot konseptkroppen slik den står, ikke mot vegnormalen. - **`sources`-adressen er ikke hentet av po.** vegnormal-okf målte at URL-en returnerer bytes som er bytelike med `source_sha256`; den målingen er deres, ikke gjentatt her. --- ## 9. Verifiseringslogg | # | Påstand | Slik den ble verifisert | |---|---|---| | 1 | okf HEAD `171798e`, treet rent | `git -C ~/repos/llm-ingestion-okf log --oneline -1` + `status --short` (tom) | | 2 | Tre V2-hasher reproduserer | `payload.bundle.ref` mot vegnormal-okfs melding, 3 av 3 ordrett | | 3 | 446 / 1 133 / 270 konsepter, 0 skipped | `okf.navigate_bundle(...).context_files`, po sin egen kode | | 4 | Fasit på rang 1 × 3 | indeks av fasit-id-en i `payload.excerpts`, flaggløs kommando | | 5 | Utdraget har 14 medlemmer | `sorted(payload['excerpts'][0].keys())`, 3 av 3 | | 6 | Kontraktsjekk exit 0 × 3 | `okf_contract_check.py --skill … --payload …`, 15 regler, 0 funn | | 7 | `admit_payload` OK × 3 | `prepass.admit_payload(p, bundle_dir=…, resolved_id=…)` | | 8 | Klientproben grønn | `uv run pytest tests/test_foundry_profile_live.py -q` → 1 passed | | 9 | Deployment urørt | `az … deployment show` → GlobalStandard, 100, `2025-04-14` | | 10 | Flagget nekter × 3, 0 modellkall | full kjøring, `assert not records` i måleskriptet, rc 1 | | 11 | rc-0-kontroll uten flagget | samme argv uten `--require-cost-baseline` → rc 0, 3 av 3 | | 12 | `--derive-cost-baseline` nekter × 3 | rc 1 + nekt-teksten navngir de tre påkrevde kolonnene | | 13 | po dropper feltene ved parsing | `sorted(excerpt.model_dump())` → 7 nøkler; `_Permissive` er `extra="ignore"` | | 14 | po dropper dem ved rendering | `prepass.render_context(...)`, DATA-blokka sitert ordrett | | 15 | Delstreng-målingen var konfundert | de to «treffene» lokalisert til spørsmålslinja og `concept_id` | | 16 | (a) N100 ja | fasit-setningen ORDRETT 3 ganger; `planskilt`/`ÅDT`/`4 000` alle til stede | | 17 | (a) N200/N500 nei | 0 av 6 / 0 av 5 nøkkelord fra hver fasit-kropp i noe svar | | 18 | (b′) nei × 3 | `req_number`/`title`/`concept_id`/`element_id`/URL: 0 treff i 18 svar | | 19 | (c) = 0 | kravnummer-formede tokens: 0; tall i prosa mot delivered, ett treff forkastet | | 20 | Instrumentet for (c) virker | skjerpet til det fant `4 000` fra kroppen; første form fant 0 av 0 | | 21 | Kostkodene | `grep -rl` i hver base med nevner; fasit-id-en som kjent-positiv (2 treff) | | 22 | Parse-feilen på N200 | `p2-n200-free-parse-failures.json` finnes; feilteksten sitert ordrett | | 23 | Prisene | Azure Retail Prices API hentet på nytt 08.09 | | 24 | 0 × 429 | `retries`-telleren i alle 18 poster | --- ## 10. P3 (ordre `20260908T141941Z`) — po bærer utdragets nye felt gjennom til prompten PM-valg 08.09 14:20Z, på denne målingens egen anbefaling (§ 6): **ja, to linjer, rød test først.** ### 10.1 Reproduksjon (steg 1, uendret fra § 4) ```python >>> sorted(json.load(open("scratchpad/nbundler-p2/payload-n500.json"))["excerpts"][0].keys()) ['adjudication', 'bundle_id', 'bundle_id_inherited', 'concept_id', 'rank', 'req_number', 'sha256', 'source_element_id', 'source_sha256', 'sources', 'text', 'text_sha256', 'title', 'trust_tier'] # 14 medlemmer, i payloaden >>> sorted(prepass.load_prepass_payload("scratchpad/nbundler-p2/payload-n500.json").excerpts[0] ... .model_dump().keys()) ['adjudication', 'bundle_id', 'concept_id', 'sha256', 'text', 'text_sha256', 'trust_tier'] # 7 medlemmer, etter parsing >>> "req_number" in prepass.render_context(...) False # aldri i prompten (§ 4) ``` ### 10.2 Feltform, valgt med måling Spørsmålet ordren stiller: hvilken form overlever en ukjent `source_foo`-nøkkel fra en FRAMTIDIG produsent, uten kodeendring her? okfs egen melding (§ 4, sitert) kaller `source_*` en **prefiks- regel, ikke en allowlist** — K2 bærer fem slike lokatorer der N-bundlene bærer to. To former ble sammenliknet mot nøyaktig det spørsmålet: - **Navngitte felt** (`source_element_id: str | None`, `source_sha256: str | None`, …): en tredje `source_*`-nøkkel krever et NYTT felt på `PrepassExcerpt` og en ny rendringslinje — en kodeendring, nøyaktig det prefiksregelen sier man IKKE skal måtte gjøre. - **`model_extra`** (`extra="allow"` på `PrepassExcerpt` ALENE, lest tilbake via et `source_`-prefikssøk i `source_locators()`): en ny `source_*`-nøkkel havner unavngitt i `model_extra` og plukkes opp av SAMME søk, null kodeendring. **Valgt: `model_extra` for `source_*`-familien.** `title`, `req_number` og `sources` er derimot navngitte felt — de er SS-8-deklarerte, entallige medlemmer (aldri en voksende familie), og en `model_extra`-lesning av dem ville kastet bort pydantics egen validering for ingen gevinst. Testen `test_a_future_source_star_key_survives_without_a_code_change` (`tests/test_prepass_excerpt_fields_loadbearing.py`) legger til en TREDJE, aldri navngitt `source_page_number`-nøkkel og viser at den når `source_locators()` uendret. ### 10.3 Fiksen: to steder, ikke to linjer Anbefalingen i § 6 anslo "to linjer"; målt var det to STEDER (parsing + rendering), hver med mer enn én linje fordi `sources` trengte en egen typet klasse (`PrepassSource`, med `resource` og en valgfri `title`) og `source_locators()` trengte en egen metode: 1. **Parsing** (`PrepassExcerpt`): `title: str | None`, `req_number: str | None`, `sources: tuple[PrepassSource, ...] | None`, alle default `None` (de fleste payloader i dette repoet er fra FØR P2s produsent-endring og bærer ingen av dem — et påkrevd felt ville refusert hver payload skrevet før i dag). `model_config = ConfigDict(extra="allow")` — kun på DENNE klassen, `_Permissive`s `extra="ignore"` står urørt for `PrepassBundle`/`PrepassBudget`/osv. 2. **Rendering** (`_excerpt_header`, ny funksjon `_data_blocks` nå kaller): `req_number` og `title` legges til i parentesen ved siden av `adjudication`/`trust_tier` NÅR de finnes; `sources[0].resource` (adressen) og hver `source_*`-lokator (generisk, via `source_locators()`) legges til deretter. **Kjent-negativ:** når ingen av de nye feltene finnes, er sløyfa en no-op og headeren er BYTE-IDENTISK med før P3 (`test_a_p1_form_payload_renders_the_header_exactly_as_before`, `test_a_p1_form_payload_render_seed_also_unchanged`) — pinnet LITERALT, ikke med en delstreng-assert, fordi en lekkende tom-klausul (f.eks. en etterlatt `, `) ikke ville vist seg i et substring-søk. `render_seed` deler `_data_blocks` med `render_context` (ko-(p)); en fiks som bare traff den ene armen ville latt utforsknings-døra ligge stille bak debatt-døra — `test_render_seed_also_carries_the_new_fields` gater begge. ### 10.4 Rødt → grønt → mutasjon rød Ny fil: `tests/test_prepass_excerpt_fields_loadbearing.py`, 10 arm. FØR fiksen: **8 røde, 2 grønne** (de to kjent-negative armene er trivielt grønne før fiksen òg — de er kontroller, ikke mål). ETTER fiksen: **10 av 10 grønne.** **Mutasjon** (revert `_excerpt_header`/`_data_blocks` til § 4s form, midlertidig, aldri committet): 3 av 10 røde — nøyaktig de tre rendrings-armene (`test_the_data_block_renders_req_number_title_and_the_address`, `test_the_data_block_renders_a_future_locator_too`, `test_render_seed_also_carries_the_new_fields`) — parsing-armene forblir grønne (mutasjonen rørte ikke `PrepassExcerpt`), som beviser at de to halvdelene av fiksen har HVER SIN uavhengige gate. Fiksen restaurert fra en kopi (`shasum -a 1` verifisert identisk før/etter), aldri `git checkout`. ### 10.5 Suite, golden, lint **1521 passed, 5 skipped** (var 1511 — 10 nye), `pytest -q`, 272 s. `ruff check src tests` og `ruff format --check src tests`: rene (94 funn i `scratchpad/` er FØR-eksisterende, utracket, utenfor scope — samme avgrensning som K3-ordrenes `ruff check src tests tools`). `mypy src`: 0 funn, 37 filer. Golden `demo-transcript.stdout` UENDRET: `shasum -a 1` = `ea8c534…` — forventet, `simulation.py` importerer ikke `prepass` i det hele tatt. ### 10.6 Én betalt N100-kjøring med `--require-cost-baseline` — og (b′) er STRUKTURELT ikke dekket Samme oppsett som § 3 (`live_nbundler_p2.py n100 --require-cost-baseline`), med den FIKSEDE koden. ``` KJENT-POSITIV n100: navigate_bundle=446 (fasit 446) OK run refused: this run was required to be anchored, but the knowledge base offers no cost baseline: … ===== ARM n100 [req] (rc=1) ===== MODELLKALL: 0 (gaten MAA fyre foer foerste kall) ``` **rc=1, 0 modellkall, NOK 0,00.** Dette REPRODUSERER § 2s funn ordrett — `--require-cost-baseline` nekter N100 FØR første modellkall, fordi en vegnormal ikke bærer kostlinjer (strukturelt, uendret av denne fiksen). **Konsekvens: (b′) kan IKKE måles i denne armen** — det oppstår aldri en hypotese å navngi et konsept for, uansett hvor godt utdraget bærer `req_number`/`title`. Dette er IKKE en regresjon fra fiksen; det er § 2s "en N-bundle kan ikke samtidig være forankret og produsere en hypotese" gjentatt på den fiksede koden. **(b′) er derfor "ikke dekket" i DENNE armen — strukturelt, ikke som en feil ved fiksen.** Fiksens EGEN korrekthet er verifisert der den kan verifiseres gratis: offline, mot payloadens faktiske felt (§ 10.1–10.4). En live gjenmåling av (b′) på den FRIE armen (uten flagget, slik § 3 kjørte N100) ville kostet et nytt betalt kall utenfor denne ordrens scope (ordren navngir eksplisitt `--require-cost-baseline`-armen som den ENE betalte kjøringen); det er ikke gjort her. ### 10.7 Funn — rapportert, ikke fikset 7. **(b′) er umålbar under `--require-cost-baseline` for enhver N-bundle** (§ 10.6). Samme struktur som funn 2 i § 7, nå bekreftet på den fiksede koden. Ingen handling — F4 gjør nøyaktig det den ble bygget for. 8. **En live gjenmåling av (b′) på den frie N100-armen (uten flagget) er ikke gjort** her — ordren navngir `--require-cost-baseline` som den ene betalte kjøringen, og en fri kjøring ville vært en ny, ubedt betalt handling.