# Egnethetsreview → plan — funnene gjort varige, én økt av gangen > **Hva dette er.** Fable-reviewen (2026-08-09, kjørt fra > `2026-08-09-fable-egnethetsreview-prompt.md`) leverte funnene sine i et chat-transkript som > forsvinner. Dette dokumentet er den varige formen: hvert funn i klarspråk, med belegget som > produserte det, rangert som en plan `STATE.md` peker inn i økt for økt. Chatten kan glemmes — > alt som trengs står her. > > **Slik brukes den:** `STATE.md`s «👉 NESTE»-blokk peker alltid på det ØVERSTE ulukkede > P-punktet her. En økt lukker et punkt → setter ✔ med commit-hash HER → overskriver STATE.md → > neste økt leser videre. **Demo-uke-planen (`2026-08-06-demo-uke-plan.md`) og innholdsgate-planen > (`2026-08-09-innholdsgate-og-aerlighet.md`) BESTÅR uendret** — denne planen føyer review-funnene > inn i samme løp og flytter ingenting som er besluttet (O1–O4 står). > > **Voyage:** småjobber (≤1 økt, kjent sti) kjøres direkte med `/tdd`-disiplin. Full > Voyage-syklus (`/trekbrief → /trekplan → /trekexecute → /trekreview`) brukes der et punkt er > merket **[Voyage]** — punktene med reell design-usikkerhet eller ≥2 økters bygging. ## 0. TO SPOR (operatørbeslutning 2026-08-09 — overordner rekkefølgen under) Operatøren har delt uka i to spor. P-punktene under består, men hører nå hjemme slik: ### SPOR 1 — KOMPLETT VERSJON 1, klar til torsdag 13. (inkludert andre repo) v1 = den **målte kjernen** (alle åtte steg wiret, 42 load-bearing-testfiler, 766/770 grønn — inventaret i `2026-08-06-v1-inventory.local.md`) + to lukkinger + release-kuttet: | Post | Innhold | Kost | Nedgradering hvis tid/kvote ryker | |---|---|---|---| | S1.a = **P1** | Steg 7-innboksen inn i demoløpet | 1 økt | ærlig etikett (0,1 økt) | | S1.b = **P2** | Innholdsgaten (Spor B) | 1–2 økter | NEI-varianten i ærlighets-teksten (ferdigskrevet) | | S1.c (ny) | **Release-kuttet:** versjon `1.0.0` synket FIRE steder (`pyproject`/`__init__`/`uv.lock`/`test_smoke`) + CHANGELOG (`[Unreleased]` → 1.0.0; Steg-5-API-endringen står alt der) + `[project.scripts]`-entry (flyttet HIT fra P9 — release-hygiene, målbilde §11 pkt. 7) + tag `v1.0.0` på begge remotes ETTER grønn generalprøve | 1 økt (ons kveld) | tag fredag i stedet — aldri tag før grønn generalprøve | **Andre repo — hva som faktisk MÅ gjøres der (målt, ikke antatt):** - **commons:** energieksemplet MED `cost-baseline.json` — ALLEREDE bestilt (frist tir 11., coord `20260806T112037Z…`); GO/NO-GO tirsdag står. Reserven (mikro) gjør at v1 ALDRI blokkeres av commons: **rammeverket er v1, innholdet er data.** - **llm-ingestion-okf:** ingenting — pinnet `v0.3.2` gjennom v1 (målt at den holder). - **guard-repoet:** ingenting — `v0.3.4` finnes, stdlib-only; wiringen skjer HER (S1.b). - **po-claude:** PARKERT (ramme B) — v1 er MAF-siden alene, og det SIES i release-notatet. → **Ingen ny coord-melding trengs.** Alt andre-repo-arbeid er enten bestilt eller ikke nødvendig. **Flagget konflikt (operatøren eier den):** O4 sier README-løftet kommer ETTER demoen (fre–lør). Anbefaling: tag `v1.0.0` onsdag med nøktern README-status; nivå-2-påstanden inn i README fre/lør som besluttet. Beviset først, påstanden etterpå — det gjelder også taggen. **EKSPLISITT UTE av v1 (sies i release-notatet, ikke i en fotnote):** CLI-porteføljetak (P6), commons-amendmentene (P7), metode-skillen (P8), bestiller-flaten (åpen beslutning i STATE), bundle-fabrikken (O1), søsken-repoet (parkert), okf `v0.4.0`+. ### SPOR 2 — KOMPLETT OG OVERBEVISENDE DEMO av alle åtte steg = **P3** (GO-dag + kostnads-sjekk-prøven) + **P4** (fresh-clone-/stderr-/golden-kriterier + to ærlighets-setninger) + generalprøven + én **muntlig** mandat-setning (bestillingsflyten er svaret på «kan vi styre hva som analyseres?» — `docs/bestille-en-kjoring.md`). Valgfritt før frys (0,1 økt — inventarets kosmetikk-funn «leser som en feil i en sal»): demp de fire stderr-støylinjene i `simulation.main` (logging-/warnings-filter; rører ikke stdout, altså ikke kriterium 6). Ellers nevnes de høyt. **Økt-regnskap for uka i dette repoet:** S1.a (1) + S1.b (1–2) + S1.c (1) + P3 (0,25) + P4/generalprøve (0,5–0,75) ≈ **3,75–4,75 økter.** Ved kvotepress er nedgraderingskolonnen rekkefølgen — v1 forblir ærlig komplett på hvert nivå, den blir aldri stille ufullstendig. ## 1. Funnene i klarspråk Reviewen fant ingen brann i koden: suiten er grønn (766 passed / 4 skipped), demo-outputen er byte-identisk over to kjøringer, og alle åtte steg har sin merkede linje. Det den fant, er fire steder der **demoen lover mer enn den viser**, og noen hull i sikkerhetsnettet rundt torsdag. **Funn 1 — kostnads-sjekken har aldri kjørt på ekte innhold.** Validatoren KAN avstemme et forslag mot prosjektets faktiske kostnadstall (S4.0), men sjekken aktiveres bare når kunnskapsbasen shipper `cost-baseline.json` — og **ingen bundle i repoet har den fila** (målt, §4 rad 3). I dagens demo regner validatoren derfor kun på tall forslaget selv oppgir. Bestillingen til commons krever fila (bra) — men første gang sjekken møter ekte innhold blir på leveransedagen, og avviker manus-tallene mer enn 5 % fra de leverte kostnadstallene, avvises BÅDE det overdrevne og det korrigerte forslaget på scenen. Og reserven (mikro-eksemplet) kan aldri få fila, så NO-GO-tilfellet trenger sin egen ærlige setning. **Funn 2 — demoen sier «fil-innboks for ekspertdommer», men bruker den ikke.** Steg 7-linja i demoen sier «lang fil-løkke». I virkeligheten leveres dommen som et funksjonsargument — `simulate_learning_loop` kaller `run_project` uten `verdict_dir` (§4 rad 4). Fil-innboksen finnes og er testet (`test_step7_async_loop_loadbearing.py`), men demoen kjører den ikke. Dette er samme klasse som Steg 5 var før 7. august: **et steg som omtales er ikke vist.** **Funn 3 — «last ned og kjør» er aldri testet fra en fersk nedlasting.** Ingen av de åtte demo-kriteriene kjører fra en ren klone. `uv.lock` finnes, så beviset er én kommandosekvens — og den fanger miljøavhengigheter (`PORTFOLIO_SHARED_ROOT` re-peker kunnskapsbasen!), utrackede filer og lokal `.venv`-drift. **Funn 4 — små presisjonshull i det som sies og vises.** Kjøring A kalles «fersk kunnskapsbase, ingen tidligere dommer», men bundelen shipper ett dom-frø, og Kjøring B viser «2 dommer» der bare én kom fra sløyfa — én muntlig setning retter det. Stderr-støyen (to warnings + to «forcing completion») er det første publikum ser. **Etter demoen (feature-settet):** - **Funn 5:** porteføljekjøring fra kommandolinja har ikke noe samlet token-tak — taket finnes i biblioteket (`PortfolioMeter`, seks målte mutasjoner), men `main()` kobler det aldri på; koden sier det selv (§4 rad 6). - **Funn 6:** spec-gjelden mot commons/søskenet vokser — seks lokale semantikk-beslutninger er uspeilet (D7-speiling ÅPEN i CLAUDE.md), og «rettferdig sammenligning» (A6) blir mindre sann for hver av dem. - **Funn 7:** «metoden som Agent Skill» er en CLAUDE.md-konvensjon uten realisering — kun ekspert-personaen finnes (§4 rad 5). - **Funn 8:** `[project.scripts]` mangler (release-hygiene, målbilde §11 pkt. 7). - **Null-funn:** bytte av orkestrering (Sequential/Handoff/graf-laget/checkpointing) skal IKKE gjøres — målt: debatten er i praksis en fast sekvens og Group Chat beholdes av byttekost-grunner, gevinsten er kosmetisk, kostnaden er re-verifisering av hele offline-beviskjeden (§4 rad 7–8). ## 2. Plan FØR demoen (P1–P4, i utførelsesrekkefølge) ### P1 — Steg 7-innboksen kobles på i demoen ☐ **[1 økt · Opus 5/high · TDD direkte · MÅ lande før onsdags-frysen]** Rute persona-dommen gjennom en faktisk `verdict_dir`-katalog i `simulate_learning_loop` — sømmene finnes allerede (`run_project(verdict_dir=…)` + `write_verdict` er offentlig primitiv). Ny load-bearing-test: detach innboks-lesingen → markør-/Steg 7-linja endres → RØD. Kriterium 6 (byte-identisk stdout) måles på nytt etterpå. **Faller den på tid:** minimumsvarianten = ærlig etikett i `_run_trace_lines` («dom levert direkte her; fil-innboksen er samme søm, bevist i test») + én muntlig setning. 0,1 økt. ### P2 — Spor B: innholdsgaten ☐ **[1–2 økter · Opus 5/high · TDD direkte · følger innholdsgate-planen §3–§4 uendret]** Reviewens skjerpelse, ellers ingen endring: §4-beslutning 2 (avvisning per dokument eller per bundle?) tas FØR bygging, og innholdsgate-planens kriterium 5 (byte-uendret demo-stdout) måles ETTER wiring. Målt frys-sikker: verken `run.py` eller `simulation.py` importerer `ingest`. ### P3 — Tirsdag 11.: GO/NO-GO + kostnads-sjekk-prøven ☐ **[0,25 økt, del av tirsdagsøkta · Opus 5/medium]** Som demo-uke-planen — PLUSS to tillegg fra funn 1: (a) kjør demo-kriterium 1+2 (åtte steg-linjer; REJECTED- og VALIDATED-linje for samme kandidat) mot den NYE bundelen allerede tirsdag, ikke først onsdag; (b) skriv manus-registerets tall FRA den leverte `cost-baseline.json`, aldri ved siden av den. Dette er første gang S4.0-forankringen kjører på ekte innhold. **Prøve som feller feil:** kjør sim mot ny bundle med bevisst 10 %-avvik i manuset → skal gi FORKASTET; korrigert → FORESLÅTT. ### P4 — Onsdag 12.: tre nye kriterier + to setninger, så generalprøve og FRYS ☐ **[0,5 økt, del av generalprøve-økta · Opus 5/low]** 1. **Fresh-clone-kriterium:** klon til scratch → `uv sync` → kjør simuleringen → diff mot arbeidskopiens output. Beviser «last ned → kjør»-påstanden. 2. **Stderr pinnes:** de fire kjente linjene er fasit; nye advarsler etter subtree-pull fanges. 3. **Golden-transkript:** sjekk inn demo-outputen som fasit-fil og diff mot den — selvidentitet (kriterium 6) fanger ikke-determinisme, men ikke regresjon mellom onsdag og torsdag. 4. **To ferdigskrevne setninger** inn i ærlighets-teksten (mønsteret fra innholdsgate-planen §5): NO-GO-varianten «kostnads-forankringen er ikke aktiv i reserve-eksemplet», og frø-setningen «én av de to tidligere dommene i Kjøring B fulgte med eksempelet — den andre er den demoen lærte». ## 3. Plan ETTER demoen (P5–P10, i verdirekkefølge) ### P5 — README + nivå-2-påstanden (O4, fre 14.–lør 15.) ☐ **[1 økt · Opus 5/medium]** Allerede besluttet (O4). Reviewens tillegg: G5-forbeholdet skal stå i teksten som løftes — sammenligningen mot søskenet gjelder den spec-ede kjernen, ikke hele dette repoet (mandat/hovedbok/portefølje-budsjett m.m. er utenfor spec-ene, målt 0 treff). ### P6 — Globalt token-tak inn i CLI-en ☐ **[1 økt · Opus 5/high · TDD direkte]** `--budget`-dør i `main()`: `PortfolioMeter` + `read_spend`/`write_spend`-wiring + `BudgetRefused` inn i except-tuplen (TRAP-kommentaren i `run.py` sier selv at den ikke fanges i dag). Feller: CLI-test med spend-fil nær taket + `--portfolio` → strukturert refusal; detach flagget → rød. ### P7 — Amendment-pakken til commons — ÉN samlet bestilling ☐ **[1 økt · Fable 5/high (spec-review er formen) · leveres via coord-send, ALDRI arbeid i commons]** D-A-restene samlet i én tekst: F2/F3-validator-semantikken, S3.2-seedingregelen, S4.0-baseline-formatet, (p)-kvantiseringen, Steg-5-returtypen. Feller: amendmentet gir spec-tester/goldens som binder semantikken på tvers av stackene — i dag kan søskenet følge spec-en korrekt og likevel divergere fra dette repoet. ### P8 — Metoden som Agent Skill (B6) ☐ **[Voyage]** **[/trekbrief først; bestilling til commons + liten konsum-søm her]** Målt: kun `shared/skills/expert-reviewer/SKILL.md` finnes. Innholdet eies av commons (bestilling som tekst); konsum-sømmen her er liten (MAF `SkillsProvider` er experimental — pin versjon). [Voyage] fordi formen har reell design-usikkerhet — hva av metoden som skal være skript vs. referanse er ikke avgjort. ### P9 — Småting ☐ **[0,5 økt samlet · Opus 5/low]** Kapabilitetskartets to korreksjoner (topologi-notatet fra funn «null»: debatten er en fast sekvens, Group Chat beholdes av byttekost; checkpointing-raden nedgraderes fra «ADOPT (later)» til «NEI med begrunnelse» — pass-nivå-gjenopptakelse er allerede levert via spend-fila). *(`[project.scripts]` er flyttet inn i v1-release-kuttet, §0 S1.c.)* ### P10 — Eksplisitt NULL (ingen økt) ✔ Ingen Sequential-swap, ingen Handoff, ingen graf-adopsjon, ingen checkpointing. Står her så ingen senere økt «oppdager» dem på nytt. Falsifisering av selve null-beslutningen: forsvinner «forcing completion»-linjene en dag uten bytte, var topologi-analysen feil. ## 4. Belegg (kommandoene bak påstandene, målt 2026-08-09 på HEAD `c96ef90`) | # | Påstand | Kommando → resultat | |---|---|---| | 1 | Suiten grønn | `uv run pytest -q` → 766 passed / 4 skipped (111 s) | | 2 | Demo deterministisk + 8 steg | to kjøringer, stdout adskilt fra stderr, `diff` → tom; `grep -cE "^ *Steg [1-8]"` → 8. (Første måling viste avvik — det var målefeil: `2>&1` blandet inn stderr; mkdtemp-linja går bevisst til stderr, `simulation.py:531-534`) | | 3 | Ingen bundle har kostbaseline | `ls shared/examples/bygg-energi-mikro/` → 8 filer, ingen `cost-baseline.json`; bestillingen (coord `20260806T112037Z…`) krever den per ny bundle | | 4 | Steg 7 vises uten fil-innboksen | `simulation.py:328-366`: `run_project` kalles uten `verdict_dir`; dommen er argumentet `verdict_input` (`:322`); etiketten «lang fil-løkke» står i `:478` | | 5 | Metode-skill finnes ikke | `find shared -name "SKILL.md"` → kun `expert-reviewer` | | 6 | CLI-porteføljen uten pass-tak | `run.py:1679-1686`: budget-stop-armen «currently UNREACHABLE from here»; `BudgetRefused` (RuntimeError) utenfor except-tuplen | | 7 | Debatten er en fast sekvens | `workflow.py:97-108`: round-robin-selector, terminerings-nett = `max_rounds*2+1` = 7 > 3 dispatcher → fyrer aldri; «forcing completion» ×2 i hver kjøring (målt) | | 8 | MAF-alternativene gir ikke gevinst | introspeksjon installert orchestrations 1.0.0: ingen innebygd round-robin (kun docstring-eksempel `_group_chat.py:149-151`); `SequentialBuilder.__init__` tar `checkpoint_storage` direkte; Handoff = modelldreven ruting | | 9 | `[project.scripts]` mangler | `grep -n scripts pyproject.toml` → 0 treff | | 10 | Spor B er frys-sikker | `grep -n "ingest" src/portfolio_optimiser/{run,simulation}.py` → kun docstring-omtaler, ingen import | ## 5. Ukens kalender (hvor punktene lander) | Dag | Innhold | |---|---| | søn 9.–man 10. | **P1** (Steg 7-innboksen) + **P2** (Spor B økt 1, evt. 2) | | tir 11. | **P3**: GO/NO-GO på commons-innholdet + kostnads-sjekk-prøven | | ons 12. | **P4**: nye kriterier + setninger → generalprøve → **FRYS** → **S1.c: release-kuttet + tag `v1.0.0`** | | tor 13. | **DEMO = v1 vises** | | fre 14.–lør 15. | **P5**: README (O4) | | deretter | **P6 → P7 → P8 → P9**, ett punkt per økt; STATE.md peker på øverste åpne |