refactor(examples): replace sector-specific example material with generic, fictitious examples

The context sets, the packaged knowledge bases and the example bundles are
replaced by one fictitious example set about IT operations in an invented
organisation: three context sets (serverrom-2027, driftsavtale-2027 and the
two-base drift-og-avtale-2027), two synthetic knowledge bases under
src/portfolio_optimiser/data/kunnskapsbaser and two example bundles under
src/portfolio_optimiser/data/bundles. Numbers, codes and structural values in
tests and fixtures are kept; names, ids and wording change. Dated measurement
documents that only recorded runs on the replaced material are deleted.

Gate figures measured on the new set are not comparable with earlier ones.
The exclusion gate from the previous commit is green: 0 tracked files hit
outside the shared/ subtree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-23 15:04:21 +02:00
commit 37547fe292
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
1147 changed files with 24138 additions and 9503 deletions

View file

@ -253,16 +253,16 @@
<rect class="box dashed" x="40" y="40" width="430" height="360"/>
<rect class="box" x="70" y="64" width="370" height="58"/>
<text class="lbl" x="88" y="90">FV42-GSV-E1</text>
<text class="sub" x="88" y="110">Fv. 42 gang- og sykkelveg, etappe 1</text>
<text class="lbl" x="88" y="90">KONTOR-IT-E1</text>
<text class="sub" x="88" y="110">Kontor-IT, etappe 1</text>
<rect class="box soft" x="70" y="150" width="370" height="58"/>
<text class="lbl" x="88" y="176">RV13-RAS-TP</text>
<text class="sub" x="88" y="196">Rv. 13 rassikring tunnelportal</text>
<text class="lbl" x="88" y="176">NETT-SIKR-TP</text>
<text class="sub" x="88" y="196">Nettverkssikring, tilkoblingspunkter</text>
<rect class="box soft" x="70" y="236" width="370" height="58"/>
<text class="lbl" x="88" y="262">BRU-LAKS-REHAB</text>
<text class="sub" x="88" y="282">Bru over Lakselva, rehabilitering</text>
<text class="lbl" x="88" y="262">ARKIV-LAGR-MIGR</text>
<text class="sub" x="88" y="282">Arkivlagring — migrering</text>
<rect class="box soft" x="70" y="322" width="370" height="58"/>
<text class="lbl" x="88" y="348">SKOLE-VVS-OPPGR</text>
@ -275,7 +275,7 @@
<path class="edge" d="M472 93 H556"/>
<rect class="box" x="560" y="40" width="600" height="360"/>
<text class="lbl" x="580" y="72">FV42-GSV-E1 — kostnadslinjene INNI prosjektet</text>
<text class="lbl" x="580" y="72">KONTOR-IT-E1 — kostnadslinjene INNI prosjektet</text>
<path class="hair" d="M580 86 H1140"/>
<text class="tiny" x="580" y="106">kode</text>
<text class="tiny" x="650" y="106">beskrivelse</text>
@ -283,32 +283,32 @@
<text class="tiny" x="1140" y="106" text-anchor="end">enhetspris</text>
<text class="mono" x="580" y="134">01.1</text>
<text class="mono" x="650" y="134">Rigg og drift</text>
<text class="mono" x="650" y="134">Prosjektledelse og drift</text>
<text class="mono" x="940" y="134">1 rs</text>
<text class="mono" x="1140" y="134" text-anchor="end">850 000</text>
<text class="mono" x="580" y="164">02.3</text>
<text class="mono" x="650" y="164">Masseutskifting bløt grunn</text>
<text class="mono" x="940" y="164">4 200 m3</text>
<text class="mono" x="650" y="164">Migrering av brukerdata</text>
<text class="mono" x="940" y="164">4 200 GB</text>
<text class="mono" x="1140" y="164" text-anchor="end">420</text>
<text class="mono" x="580" y="194">03.1</text>
<text class="mono" x="650" y="194">Forsterkningslag knust grus</text>
<text class="mono" x="940" y="194">1 800 m3</text>
<text class="mono" x="650" y="194">Nettverksutstyr kontor</text>
<text class="mono" x="940" y="194">1 800 port</text>
<text class="mono" x="1140" y="194" text-anchor="end">310</text>
<text class="mono" x="580" y="224">05.2</text>
<text class="mono" x="650" y="224">Asfalt Ab11</text>
<text class="mono" x="940" y="224">4 300 m2</text>
<text class="mono" x="650" y="224">Lisens kontorpakke</text>
<text class="mono" x="940" y="224">4 300 lisens</text>
<text class="mono" x="1140" y="224" text-anchor="end">215</text>
<text class="mono" x="580" y="254">07.4</text>
<text class="mono" x="650" y="254">Kantstein granitt</text>
<text class="mono" x="940" y="254">2 400 m</text>
<text class="mono" x="650" y="254">Skjerm 27 tommer</text>
<text class="mono" x="940" y="254">2 400 stk</text>
<text class="mono" x="1140" y="254" text-anchor="end">690</text>
<text class="mono" x="580" y="284">09.1</text>
<text class="mono" x="650" y="284">Veglysmaster LED</text>
<text class="mono" x="650" y="284">Møteromsskjerm med kamera</text>
<text class="mono" x="940" y="284">34 stk</text>
<text class="mono" x="1140" y="284" text-anchor="end">28 500</text>
@ -1243,9 +1243,9 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
<p class="lede">Stage 0 avstemmer hver <code>affected_item</code> mot prosjektets egen <code>CostBaseline</code>: koden må finnes, og avviket i mengde og enhetspris må ligge innenfor 5 % av baselinen.</p>
<table class="compact">
<tr><th>Prosjekt</th><th>01.1 enhetspris</th><th>Σ prosjekt</th><th>Utfall</th></tr>
<tr><td>FV42-GSV-E1</td><td>850 000</td><td>6 721 500</td><td class="ok">validated</td></tr>
<tr><td>RV13-RAS-TP</td><td>1 450 000</td><td>7 529 700</td><td class="bad">rejected</td></tr>
<tr><td>BRU-LAKS-REHAB</td><td>620 000</td><td>3 099 700</td><td class="bad">rejected</td></tr>
<tr><td>KONTOR-IT-E1</td><td>850 000</td><td>6 721 500</td><td class="ok">validated</td></tr>
<tr><td>NETT-SIKR-TP</td><td>1 450 000</td><td>7 529 700</td><td class="bad">rejected</td></tr>
<tr><td>ARKIV-LAGR-MIGR</td><td>620 000</td><td>3 099 700</td><td class="bad">rejected</td></tr>
<tr><td>SKOLE-VVS-OPPGR</td><td>480 000</td><td>4 640 000</td><td class="bad">rejected</td></tr>
</table>
<p class="small">READMEs portefølje-demo sender det SAMME forslaget mot alle fire. Alle fire bærer kostnadskoden 01.1, men til fire ulike beløp. Ett validert forslag, tre avvisninger. Ingenting ved forslaget endret seg.</p>
@ -1262,15 +1262,15 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
<path class="edge" d="M520 96 C600 150 340 370 240 438"/>
<rect class="box ok" x="240" y="140" width="640" height="64"/>
<text class="lbl" x="262" y="166">FV42-GSV-E1</text>
<text class="lbl" x="262" y="166">KONTOR-IT-E1</text>
<text class="sub" x="262" y="190">01.1 = 850 000 · innenfor toleransen · videre til solveren</text>
<rect class="box warn" x="240" y="230" width="640" height="64"/>
<text class="lbl" x="262" y="256">RV13-RAS-TP</text>
<text class="lbl" x="262" y="256">NETT-SIKR-TP</text>
<text class="sub" x="262" y="280">01.1 = 1 450 000 · avviket er langt over 5 % · nektet</text>
<rect class="box warn" x="240" y="320" width="640" height="64"/>
<text class="lbl" x="262" y="346">BRU-LAKS-REHAB</text>
<text class="lbl" x="262" y="346">ARKIV-LAGR-MIGR</text>
<text class="sub" x="262" y="370">01.1 = 620 000 · avviket er langt over 5 % · nektet</text>
<rect class="box warn" x="240" y="410" width="640" height="64"/>
@ -1337,7 +1337,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
<text class="lbl" x="452" y="424">classify_codes: identifier | prose | requirement</text>
<text class="tiny" x="452" y="448">En RAPPORT om hva kjøringen gjorde av koden, ikke porten. Havner i provenance-stemplet som code_forms.</text>
</svg>
<figcaption>Fire underkontroller per berørt post, første treff vinner. Målt i P18 runde 2: to alminnelige ord fra en standards prosa (4 av 270 N500-dokumenter og 4 av 1 133 N200-dokumenter) passerte hele porten som kostnadskoder før kodeform-regelen fantes.</figcaption>
<figcaption>Fire underkontroller per berørt post, første treff vinner. Målt i P18 runde 2: to alminnelige ord fra en standards prosa (4 av 270 dokumenter i én kravbase og 4 av 1 133 i en annen, i et kravkorpus brukt under utviklingen) passerte hele porten som kostnadskoder før kodeform-regelen fantes.</figcaption>
</figure>
<p class="src">Kilde: <code>src/portfolio_optimiser/validator.py:471-491</code> · <code>validator.py:494-571</code> · <code>validator.py:574-645</code> · <code>validator.py:388-408</code></p>
</div>
@ -1409,7 +1409,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
</table>
<figure class="fig">
<svg viewBox="0 0 1200 130" role="img" aria-label="Elleve av tolv runder brukt paa svar som feilet identisk">
<text class="sub" x="40" y="26">kontrakt-sorasen-04, runde-3-kjøring: 11 av 12 runder brukt på svar som feilet på samme måte</text>
<text class="sub" x="40" y="26">Runde-3-kjøring på et kontraktssett under utviklingen: 11 av 12 runder brukt på svar som feilet på samme måte</text>
<rect class="box warn" x="40" y="42" width="82" height="46"/>
<rect class="box warn" x="128" y="42" width="82" height="46"/>
<rect class="box warn" x="216" y="42" width="82" height="46"/>
@ -2043,7 +2043,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
</svg>
<figcaption>Alle tre lukkes uten at noe forlater prosessen. Avvisningene samles opp i <code>RunResult.refinements</code>, så en leser kan se hva kjøringen faktisk ble fortalt.</figcaption>
</figure>
<p class="callout warn"><b>Målt, ikke antatt.</b> Før parse-grunnen ble båret videre, kalte <code>_fetch_parsed</code> modellen med byte-identisk prompt. Én betalt kjøring (<code>kontrakt-sorasen-04</code>) brukte elleve av sine tolv runder på svar som feilet på samme måte, fordi ingenting noensinne fortalte modellen hva som var galt.</p>
<p class="callout warn"><b>Målt, ikke antatt.</b> Før parse-grunnen ble båret videre, kalte <code>_fetch_parsed</code> modellen med byte-identisk prompt. Én betalt kjøring på et kontraktssett under utviklingen brukte elleve av sine tolv runder på svar som feilet på samme måte, fordi ingenting noensinne fortalte modellen hva som var galt.</p>
<p class="src">Kilde: <code>src/portfolio_optimiser/generate.py:282-327</code>, <code>:642-673</code> · <code>workflow.py:100-116</code> · <code>run.py:664-687</code>, <code>:204-214</code> · <code>budget.py:44</code></p>
</div>
</section>
@ -2945,7 +2945,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
<tr><td>Penger kvantiseres i én rekkefølge, fra én kilde: per beløp, så summeres heltallene.</td><td>Tre linjer à 60000,005 NOK er 18 000 003 øre kvantisert først, 18 000 001 summert først. En fiks på bare ett av de to kallstedene overlevde hele suiten</td><td><code>test_money_quantization_loadbearing.py</code>, 5 mutasjoner røde</td></tr>
<tr><td>Sporing er opt-in, og «av» betyr at MAF aldri kalles.</td><td>Et kall med tom exporter-liste ville installert providers og lest hver <code>OTEL_EXPORTER_OTLP_*</code> i omgivelsene. «Av» må være fravær av kallet</td><td><code>test_tracing_loadbearing.py</code>, 9 mutasjoner røde</td></tr>
<tr><td>En nekt modellen skal kunne rette seg etter er en returverdi, aldri en raise.</td><td>Funn 99, 08.09: MAF gjør en raise om til <code>Error: Function failed.</code>, undertrykker detaljen og teller den mot grensen på 3 påfølgende verktøyfeil. Modellen gjettet på JSON-formatet, som var riktig hele veien</td><td><code>test_run_cli_chatclient_refusal.py</code>, 8 armer, 7 mutasjoner røde</td></tr>
<tr><td>Målingene leser en FROSSET kopi av korpuset, pinnet med sha256 — aldri et annet repos build-mappe.</td><td>17.09 kl. 17:43: nabo-repoet bygde om <code>r761-2025</code>, gatens rad 6 og 7 ble IKKE MÅLT og fem tester falt, for en endring ingen her hadde gjort</td><td><code>test_frozen_bundles_loadbearing.py</code>, 17 armer, 8 mutasjoner røde</td></tr>
<tr><td>Målingene leser en FROSSET kopi av korpuset, pinnet med sha256 — aldri et annet repos build-mappe.</td><td>17.09 kl. 17:43: nabo-repoet bygde om en av kildebasene, gatens rad 6 og 7 ble IKKE MÅLT og fem tester falt, for en endring ingen her hadde gjort</td><td><code>test_frozen_bundles_loadbearing.py</code>, 17 armer, 8 mutasjoner røde</td></tr>
</tbody>
</table>
<p class="callout"><b>Hovedboken ble flyttet 18.09.2026.</b> <code>CLAUDE.md</code> hadde vokst til 310 919 byte mot Claude Codes kutt på 150 000 tegn, så omtrent halvparten av reglene nådde ingen økt. Etter flyttingen er fila 6 033 byte, og 93 rader står ordrett i hovedboken.</p>
@ -2961,7 +2961,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
<figure class="fig">
<svg viewBox="0 0 1200 500" role="img" aria-label="Fire målte kontekstkostnader, hver med søyle for før og etter">
<text class="lbl" x="10" y="40">list_bundles — katalogen</text>
<text class="sub" x="10" y="60">3 flate Vegnormal-baser, o200k_base</text>
<text class="sub" x="10" y="60">3 flate kravbaser (utviklingskorpus), o200k_base</text>
<text class="tiny" x="10" y="78">docs/2026-08-26-katalogkostnaden.md</text>
<text class="tiny" x="420" y="42" text-anchor="end">før</text>
<rect class="box soft" x="430" y="24" width="560" height="24"/>
@ -2972,7 +2972,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
<line class="hair" x1="10" y1="110" x2="1190" y2="110"/>
<text class="lbl" x="10" y="158">read_bundle — payloaden</text>
<text class="sub" x="10" y="178">tunnel-basen, 5 kopier per kjøring</text>
<text class="sub" x="10" y="178">én eksempelbase, 5 kopier per kjøring</text>
<text class="tiny" x="10" y="196">docs/2026-09-02-read-bundle-kontekstkostnad.md</text>
<text class="tiny" x="420" y="160" text-anchor="end">før</text>
<rect class="box soft" x="430" y="142" width="560" height="24"/>
@ -3050,7 +3050,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
<figcaption>Testtallet er målt i denne økten med <code>uv run pytest -q --co</code> (kun innsamling; suiten ble ikke kjørt). STATE fører hovedtreet som 1 984 passed / 5 skipped / 5 xfailed.</figcaption>
</figure>
<p class="callout"><b>To forsøk samme dag, begge dokumentert.</b> Måleprotokollen fra 14.08 fører første forsøk som RC=1 med <code>BudgetExceeded</code> på rundetaket (rounds 12/13), som en uhåndtert traceback; det ble senere den hostede 429-armen. Gjenkjøringen samme dag (protokollens § 6) konkluderte i <code>rejected</code>: validatoren tok en kostlinje modellen hadde funnet på, på toleranseporten fordi bundlen ikke bar noen baseline. README beskriver gjenkjøringen. Kilde: <code>docs/2026-08-14-fase1b-forste-levende-kjoring.md:35-60</code> og <code>:189-224</code>.</p>
<p class="src">Kilde: <code>docs/2026-08-14-fase1b-forste-levende-kjoring.md:36</code>, <code>:55</code> · <code>README.md:281</code>, <code>:284</code> · <code>docs/2026-08-25-fable-misjonsreview.md:21</code>, <code>:22</code> · <code>docs/2026-09-14-p16-stressrunde-1.md:178</code></p>
<p class="src">Kilde: <code>docs/2026-08-14-fase1b-forste-levende-kjoring.md:36</code>, <code>:55</code> · <code>README.md:281</code>, <code>:284</code> · <code>docs/2026-08-25-fable-misjonsreview.md:21</code>, <code>:22</code> · <code>docs/invarianter.md</code></p>
</div>
</section>
@ -3137,8 +3137,8 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
</svg>
<figcaption>Runde 1–4 teller fasit-KONSEPTER åpnet (dokumenter i <code>fasit.must_cite</code>). Runde 5–6 rapporterer i stedet <code>grounded</code> per TILNÆRMING, 20 approach-rader. De to nevnerne er ulike og tallene er ikke direkte sammenlignbare; de står som publisert. Runde 3 er publisert både som 1 av 32 og som 1 av 26 pluss P17bs 0 av 6. <b>Og en sammendragslinje i STATE blander de to målene:</b> «0/26, 0/26, 1/32, 2/20, 1/20, 1/20» har skiftende nevner, og den siste verdien tilhører <code>named</code>, ikke <code>grounded</code> — runde 6 leser <code>grounded</code> 3 av 20. Konklusjonen overlever korreksjonen; aritmetikken i linja gjør det ikke.</figcaption>
</figure>
<p class="callout warn"><b>«N100 = FERDIG» fra økt 102 er motsagt av P16 til P22.</b> Mekanikken virker og navigerer ekte korpus; de faglige treffene kommer ikke. Ingen faktura er lest i noen runde, så hvert NOK-tall er et listepris-anslag. Og som P22 selv skriver: at <code>must_refuse</code> falt fra 5 av 5 til 2 av 5 er ikke bevis for at systemet er blitt verre, det er bevis for at den forrige målingen ikke kunne skille.</p>
<p class="src">Kilde: <code>docs/2026-09-14-p16-stressrunde-1.md</code> · <code>-p18-</code> · <code>-p19-</code> · <code>-p20-</code> · <code>-p21-</code> · <code>docs/2026-09-16-p22-stressrunde-6.md</code> · <code>STATE.md</code></p>
<p class="callout warn"><b>«Første kravbase = FERDIG» fra økt 102 er motsagt av P16 til P22.</b> Mekanikken virker og navigerer ekte korpus; de faglige treffene kommer ikke. Ingen faktura er lest i noen runde, så hvert NOK-tall er et listepris-anslag. Og som P22 selv skriver: at <code>must_refuse</code> falt fra 5 av 5 til 2 av 5 er ikke bevis for at systemet er blitt verre, det er bevis for at den forrige målingen ikke kunne skille.</p>
<p class="src">Kilde: <code>docs/invarianter.md</code> · <code>STATE.md</code></p>
</div>
</section>
@ -3160,7 +3160,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
<div class="cols">
<div class="col">
<span class="step">Hvorfor det ble omskrevet</span>
<p>Økt 102 konkluderte «N100 = FERDIG». P16 til P22 motsa den. Seks betalte runder på syntetiske mandater, uten et menneske i sløyfa, produserte ingen rapport en fagperson har rettet.</p>
<p>Økt 102 konkluderte «første kravbase = FERDIG». P16 til P22 motsa den. Seks betalte runder på syntetiske mandater, uten et menneske i sløyfa, produserte ingen rapport en fagperson har rettet.</p>
</div>
<div class="col">
<span class="step">Hva målingen faktisk viste</span>
@ -3264,7 +3264,7 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
</table>
<p class="callout warn"><b>En strukturell spenning — dette er en lesning, ikke repoets tekst (antakelse).</b> Rad 6 kan bare måles mot artefakter yngre enn regelen, og ordren sier gaten ikke når exit 0 «før en ny stressrunde finnes». Planen forbyr samtidig en ny stressrunde på syntetiske mandater. Begge holder bare hvis runden som løsner rad 6 er én av de tre ekte fagperson-rundene. Det står ingen steder, og må bekreftes av operatøren.</p>
<p class="callout"><b>Måle-hygiene som egen sak.</b> Samme commit bærer tre suite-tall — 1 967, 1 962 og 1 917 — og ingen av dem lot seg gjenfinne. Regelen ordren setter er kort: før et suite-tall med kommandoen som ga det. Tallet i denne presentasjonen er 1 995 samlet, målt 18.09 med <code>uv run pytest -q --co</code>.</p>
<p class="src">Kilde: <code>PLAN.md § Ferdig-kriteriet</code>, <code>§ Åpne spørsmål</code> · <code>STATE.md § NESTE</code> · ordre <code>20260917T223645Z-1292712426</code> · <code>docs/2026-09-16-p22-stressrunde-6.md § 4</code></p>
<p class="src">Kilde: <code>PLAN.md § Ferdig-kriteriet</code>, <code>§ Åpne spørsmål</code> · <code>STATE.md § NESTE</code> · ordre <code>20260917T223645Z-1292712426</code> · <code>docs/invarianter.md</code></p>
</div>
</section>
@ -3292,8 +3292,8 @@ Produce a REVISED SavingsProposal that resolves this.</code></pre>
<text class="band-lbl" x="632" y="42">Bygges ikke</text>
<text class="lbl" x="632" y="86">Ny stressrunde på syntetiske mandater</text>
<text class="sub" x="632" y="106">og ingen niende tilbakemeldingstype</text>
<text class="lbl" x="632" y="150">Nye korpus: N400 og R762</text>
<text class="sub" x="632" y="170">basene publiseres ikke, ingen etatskontakt</text>
<text class="lbl" x="632" y="150">Nye kunnskapskorpus</text>
<text class="sub" x="632" y="170">ingen nye baser i denne fasen</text>
<text class="lbl" x="632" y="214">Compliance-funksjoner</text>
<text class="sub" x="632" y="234">DPIA, ROS og behandlingsformål eies av den som deployer</text>
<text class="lbl" x="632" y="278">Reallokering mellom prosjekter</text>