docs(plan): P4 pkt. 5, 2 og 1 lukket — og pinningen i pkt. 3 har fått sin egen måling

Punkt 5 (entry points), 2 (stderr) og 1 (fresh-clone) er merket ✔ med en UTFØRT-blokk
som bærer beslutningen og belegget, ikke bare utfallet.

Punkt 2 var øktas åpne beslutning, og den ble avgjort ved måling framfor preferanse:
rund-taks-linjene dempes, ExperimentalWarning-paret gjør det ikke — de fyrer før
simulation i det hele tatt importeres, så demping ville krevd et warnings-filter inne
i bibliotekpakken.

Punkt 3 får en konsekvens fra fresh-clone-målingen: fasiten kan ikke være literal.
De to gjenstående stderr-linjene bærer en absolutt sti inn i site-packages, som er
ulik i klon og arbeidskopi — normaliser på BÅDE den og po-sim-suffikset. Pinnet
stderr blir fire linjer, ikke to.

[skip-docs]

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C2bxLcCRguxXzpM4priTMn
This commit is contained in:
Kjell Tore Guttormsen 2026-08-09 15:21:20 +02:00
commit 7acd331e31

View file

@ -207,14 +207,12 @@ et planlagt utfall, ikke en krise — generalprøve nr. 0 mandag har allerede ve
demoen denne varianten (call-site-valg i `main()` — samme søm GO-utfallet uansett bruker).
**Faller den:** fallback = uforankret reserve + den gamle NO-GO-setningen — ingenting tapt mot
planen slik den sto før revisjonen.
1. **Fresh-clone-kriterium:** klon til scratch → `uv sync` → kjør simuleringen → diff mot
arbeidskopiens output. Beviser «last ned → kjør»-påstanden. **Kjøres ETTER pkt. 5**
(`[project.scripts]`), så målingen dekker den endelige install-flaten (I3).
2. **Stderr: FØRST beslutningen, SÅ pinningen (I2).** Dempingen er besluttet JA (§0 Spor 2) og
utføres FØR pinning. Målt 08-07: stderr er seks linjer — fire støylinjer + blanklinje + den
bevisst ikke-deterministiske `arbeidskopi:`-linja (`simulation.py:531-534`), som aldri kan stå
ubehandlet i en byte-fasit. Pin deretter: «stderr = kun `arbeidskopi:`-linja (+ blank),
normalisert på prefiks»; nye advarsler etter subtree-pull fanges fortsatt.
1. **Fresh-clone-kriterium ✔ (2026-08-09, `ab7f45a`)** — se UTFØRT-blokka under punkt 5.
2. **Stderr: FØRST beslutningen, SÅ pinningen (I2) ✔ (2026-08-09, `ab7f45a`)** — beslutningen er
tatt og målt; se UTFØRT-blokka under punkt 5. **Konsekvens for pinningen (pkt. 3):** fasiten kan
IKKE være literal — de to gjenstående `ExperimentalWarning`-linjene bærer en absolutt sti inn i
`.venv/…/site-packages`, som er ulik i fersk klon og arbeidskopi (målt). Normaliser på BEGGE:
site-packages-stien OG `po-sim-`-suffikset. Pinnet stderr er da fire linjer, ikke to.
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.
**Transkriptet er også demoens abortsti** (gjort eksplisitt i P4.5).
@ -224,10 +222,41 @@ et planlagt utfall, ikke en krise — generalprøve nr. 0 mandag har allerede ve
(fallback hvis pkt. 0 faller: den gamle setningen «kostnads-forankringen er ikke aktiv i
reserve-eksemplet»). Frø-setningen står: «én av de to tidligere dommene i Kjøring B fulgte med
eksempelet — den andre er den demoen lærte».
5. **`[project.scripts]` (flyttet HIT fra S1.c, I3):** entry point inn i `pyproject.toml`
(`grep -n scripts pyproject.toml` → 0 treff i dag) + `uv sync` → deretter pkt. 1. En
install-flate som endres på frysedagen ville krevd ny fresh-clone-måling ETTER frys —
selvmotsigende.
5. **`[project.scripts]` (flyttet HIT fra S1.c, I3) ✔ (2026-08-09, `ab7f45a`)** — se UTFØRT-blokka
rett under.
**UTFØRT — punkt 5, 2 og 1 (2026-08-09, `ab7f45a`). 775 → 785 passed / 4 skipped.**
*Punkt 5:* to konsoll-kommandoer — `portfolio-optimiser` (`run:main`) og `portfolio-optimiser-demo`
(`simulation:main`). **Bevisst to av fem `main()`:** `costsim`/`hitl`/`preflight` beholder
`-m`-formen; hvert navn her er et navn frysen må bære. Testen leser den INSTALLERTE distribusjonens
metadata, ikke TOML-en — en `[project.scripts]`-linje som aldri er `uv sync`-et er en påstand, ikke
en kommando. Målt: stdout er byte-identisk mellom `uv run portfolio-optimiser-demo` og
`uv run python -m portfolio_optimiser.simulation`.
*Punkt 2 — den åpne beslutningen, avgjort ved måling:* **rund-taks-linjene dempes, de to
`ExperimentalWarning`-linjene gjør det ikke.** Loggeren er lest ut av MAFs kilde
(`logger.warning` i `_base_group_chat_orchestrator`), ikke gjettet; filteret er nøklet på MELDINGEN
og installeres i `main()`, aldri ved import. **Hvorfor de to andre ikke dempes:** de fyrer mens
`portfolio_optimiser/__init__.py` importerer `run``agent_framework` — alltid FØR `simulation` sin
egen importblokk, under BEGGE kjøreformer. Å dempe dem ville krevd et warnings-filter inne i
bibliotekpakken, altså at rammeverket bestemmer hva MAF får si til enhver konsument. En wrapper bak
konsoll-kommandoen ble avvist av en andre grunn: de to kjøreformene ville da skrevet ULIK stderr, og
en byte-fasit ville pinnet kommandoen i stedet for programmet. **stderr 6 → 4 linjer.**
*Første implementasjon ble FJERNET etter måling:* en scoped mute rundt `simulation`s egen
`agent_framework`-import kan aldri fyre (pakken har allerede importert den) — en grønn-men-død søm.
*Punkt 1 — fresh-clone, målt mot `ab7f45a`:* klon fra `origin``uv sync` → `uv run
portfolio-optimiser-demo`. **stdout byte-identisk** med arbeidskopien; stderr identisk normalisert
på site-packages-sti + `po-sim-`-suffiks. READMEens egen verifikasjon kjørt i klonen: **785 passed /
4 skipped**. *(Merk: `open/`-speilet står fortsatt på `520e7412` = `v0.1.0` — publisering dit er
S1.c onsdag, ikke en del av denne målingen.)*
**Load-bearing MÅLT mot HELE suiten, fem mutasjoner alle røde + grønn kontroll:** fjern
`[project.scripts]` · typo i target · detach `main()`-kallet · la filteret droppe alt · installer
filteret ved import. **Typo-mutasjonen felte en TEST:** resolve-asserten resolverte det FORVENTEDE
targetet mot seg selv; den leser nå det distribusjonen faktisk installerer. Fjerde gang på fem økter
at mutasjonsmålingen feller testen, ikke koden.
**UTFØRT — punkt 0 (2026-08-09).** `materialize_anchored_bundle` kopierer reserven og legger til
`cost-baseline.json` utenfor `shared/`; `main()` kjører den varianten, og hele demoløpet er kjørt