docs(plan): the review's findings as a ranked plan the NESTE block walks, one point per session

Fable-review 2026-08-09 made durable: P1-P10 in plain language with the
commands behind every number (evidence table §4). Pre-demo: step-7 inbox
wired into the walkthrough (P1), Spor B sharpening (P2), the stage-0
first-contact check on Tuesday's GO (P3), fresh-clone/stderr/golden
criteria plus two honesty sentences on Wednesday (P4). Post-demo: CLI
portfolio cap (P6), one consolidated commons amendment (P7), method
skill [Voyage] (P8), and an explicit NULL for orchestration swaps (P10).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019xhQpH4oQBaf8dxCkXuB8Z
This commit is contained in:
Kjell Tore Guttormsen 2026-08-06 23:13:23 +02:00
commit 0eb0f3d72b

View file

@ -0,0 +1,165 @@
# 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 (O1O4 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.
## 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 78).
## 2. Plan FØR demoen (P1P4, 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 ☐
**[12 ø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 (P5P10, 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]** `[project.scripts]`-entry i `pyproject.toml`;
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).
### 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** |
| tor 13. | **DEMO** |
| fre 14.lør 15. | **P5**: README (O4) |
| deretter | **P6 → P7 → P8 → P9**, ett punkt per økt; STATE.md peker på øverste åpne |