Operator decision 2026-08-09. Track 1 (complete v1, incl. other repos): S1.a = P1 step-7 inbox, S1.b = P2 content gate, S1.c = release cut (1.0.0 synced in four places, CHANGELOG, [project.scripts] moved in from P9, tag only AFTER a green dress rehearsal). Other-repo accounting is measured: commons already ordered with the Tuesday deadline and a reserve, okf/guard/po-claude need nothing — no new coord message. Each post carries a named degradation so v1 stays honestly complete at every level. Track 2 (convincing demo): P3 + P4 + rehearsal + one spoken mandate sentence, optional stderr-noise muting before the freeze. The O4-vs-tag conflict is flagged for the operator, not decided. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019xhQpH4oQBaf8dxCkXuB8Z
211 lines
15 KiB
Markdown
211 lines
15 KiB
Markdown
# 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 |
|