portfolio-optimiser/docs/plan/2026-07-02-sesjonsplan.md
Kjell Tore Guttormsen 84d19c97d6 docs(plan): session-by-session execution plan from the 2026-07-02 status analysis
Sequences the decided arc (R1 extraction -> D7 sibling -> comparison) into
12 single-session increments (S1-S12), folding in the analysis findings:
truth maintenance (S1), the missing shared method spec (S2), extraction
de-risking + comparison protocol (S3), and per-session verification
criteria + key-assumption tests. Target picture stays the frozen north star.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015PAnzFPa9KXqjQEkw9q5Zs
2026-07-02 17:11:10 +02:00

222 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Sesjonsplan — fra statusanalyse til sammenligning (2026-07-02)
> **Hva dette er:** Program-nivåets øktkart fra statusanalysen 2026-07-02 (full gjennomgang av
> levert kode mot [målbildet](2026-06-26-maalbilde-agentic-loop.md), verifisert mot ground truth:
> suite 152/4 grønn, mypy/ruff rene, alle 8 loop-steg wiret + load-bearing). Målbildet forblir
> FROSSEN nordstjerne; denne planen erstatter ingen §-definisjoner — den sekvenserer veien til
> program-målet (§1: rettferdig sammenligning av to stacker på identisk delt kjerne).
> Hver økt under er scoped til å **fullføres innenfor én sesjon**.
## Rammer (gjelder alle økter)
- **Modell (operatørdirektiv 2026-07-02):** planens økter kjøres på **Opus 4.8 med xhigh
reasoning effort** — også alle subagenter. (Scoped unntak fra Fable-5-defaulten satt samme dag;
gjelder øktene i denne planen.)
- **Én økt = én lukket leveranse:** grønn suite, STATE.md overskrevet, commit + push til Forgejo
før økta slutter. Aldri broken state over en øktgrense.
- **Kode-økter:** stram Plan-modus + TDD (Iron Law: ingen produksjonskode uten rød test først).
Større faser kjører Voyage (`/trekbrief → /trekplan → /trekexecute → /trekreview`).
- **Kostnadsdisiplin (D6):** alt offline/deterministisk — unntatt S10 (den ene minimale
API-kjøringen på Claude-siden) og S11s bruk av dens artefakter. MAF kjøres ALDRI mot ekte
modell (låst 2026-06-30).
- **Operatør-gates:** S4 og S5 er repo-skapende → plan presenteres og bekreftes FØR utførelse.
S12 gates på «ingen release før operatør er 100 % enig».
- **D7-øktene (S5S10)** er et estimat på snittet; hver får egen `/trekbrief` som kan re-scope
innenfor rammen «én økt = én lukket leveranse».
## Avhengigheter
S1 (uavhengig, tas først) → S2 og S3 (vilkårlig innbyrdes rekkefølge) → S4 → S5 → S6 → S7 → S8
→ S9 → S10 → S11. S12 sist, når operatør ønsker.
---
## S1 — Sannhetsvedlikehold (funn 47 + dokumenterte kutt)
**Mål:** Fjerne all dokumentasjons-usannhet og støy før noe ekstraheres eller deles. Kirurgisk —
ingen kodeatferd endres.
**Innhold:**
1. `CHANGELOG.md` omskrives sannferdig (sier i dag «Plan phase — no framework code yet» i et repo
med 2 593 linjer kjerne og 152 tester).
2. `README.md` Stack-linje: meta-pakken `agent-framework` → de faktiske split GA-pakkene.
3. Prosjekt-`CLAUDE.md`: MCP-konvensjonen nedjusteres til det koden gjør («MCP = extension point,
demonstrert via `build_mcp_server`; in-process `FunctionTool` er default-søm»).
4. Konfliktsemantikk for dommer dokumenteres som valgt (README-avsnitt + docstring i
`verdicts.py`): store er first-write-wins per id; wiki-promotering er last-write-wins per fil.
Full B10-taksonomi forblir bevisst utsatt til ekte eksperter finnes.
5. `docs/extending.md`: eksplisitt 90 %-kuttliste — B10 full taksonomi, B11 varsling
(`notify`-stub i `run.py`), U12 checkpointing, U14 OTEL, concurrent fan-out.
6. `ruff format` på de 4 driftede filene (`backends.py`, `budget.py`, `verdicts.py`,
`test_contracts.py`) som egen `chore:`-commit.
7. `git rm --cached docs/.DS_Store`; `.gitignore`-regel som dekker `.trekexecute-progress-*`.
**Verifisering:** `uv run pytest` 152/4 grønn · `uv run ruff format --check .` 0 filer ·
`git status` rent · grep bekrefter at stale CHANGELOG-linja og meta-pakke-referansen er borte ·
CLAUDE.md-diff viser MCP-omformuleringen.
## S2 — Metode-spec i `shared/` (målbilde §8, den fjerde delte artefakten)
**Mål:** Metoden skal kunne implementeres fra spec alene — D7 skal ikke reverse-engineere
MAF-koden. Lukker funn 1 (spec står som «(planned)» i `shared/README.md`).
**Innhold:** Forfatt `shared/method-spec.md`, framework-nøytral (prosaen nevner aldri et konkret
framework — samme regel som persona-SKILL.md): 8-stegs-loopen normativt; verdict-JSON-kontrakten
(binær decision på run-stien); inbox/outbox-mappekontrakten (tolerant last, id verbatim, systemet
leser / eksperten skriver); promoteringsgate-semantikk (fail-closed, nøytral index-label, minimal
promotert fil); IR-projeksjon + golden-suite som eneste fasit; budsjett-/stopp-krav (fail-fast);
provenance-krav (validator_decision speiler kun validatoren). Verifiseringsplikt: hver normativ
påstand kryss-sjekkes mot eksisterende load-bearing tester/kode. Oppdater `shared/README.md`.
**Verifisering:** ny test i stil med persona-trioen: spec-fila finnes med gyldig struktur, og
framework-nøytralitets-guarden dekker den (grep-formet, rød på framework-navn i `shared/`) ·
kryss-sjekk-tabell i spec: felt i `example-verdict.json` ↔ spec-avsnitt, komplett.
## S3 — R1-forberedelse: konsummekanisme + sammenligningsprotokoll
**Mål:** De-riske ekstraksjonen (funn 2) og definere målestokken for sluttleveransen (funn 3) FØR
noe repo opprettes.
**Innhold:**
1. Konfigurerbar shared-rot: én resolver (env `PORTFOLIO_SHARED_ROOT`, default = dagens
`parents[2]/shared`) brukt av både `persona.py:22` og `simulation.py:44`. Ny load-bearing
test: override mot en tmp-kopi → markøren følger kopien (rød uten resolver).
2. `docs/plan/`-sammenligningsprotokoll (12 sider, framework-nøytral): metrikker
(validator-samsvar mot golden, konvergens/runder, tokenforbruk, kvalitativ vurdering),
identisk input = pinned commons-ref, og **eksplisitt liveness-asymmetri-erklæring** (MAF =
skriptet offline-bevis; Claude-siden = minimal ekte API-kjøring) + hvordan LLM-ikke-determinisme
håndteres i S10/S11.
3. Lokal dry-run av split (nøkkelantakelse 1): `git subtree split -P shared -b _dryrun`
ingen remote opprettes.
**Verifisering:** suite grønn + ny override-test bevist RØD ved detach ·
`git ls-tree -r _dryrun --name-only | wc -l` = 12 (nøyaktig de 12 rene datafilene) ·
protokoll-doc committet med asymmetri-erklæringen ordrett.
## S4 — R1: ekstraksjon av `shared/` → `portfolio-optimiser-commons` **[GATED]**
**Mål:** Delt kjerne som eget Forgejo-repo (besluttet R1, §9) — født komplett med alle fire
§8-artefakter (bundle, golden-suite, persona, metode-spec fra S2).
**Innhold:** Opprett `portfolio-optimiser-commons` på Forgejo; push split-historikken fra S3;
re-innfør `shared/` i dette repoet som **subtree av commons** (anbefalt over submodule:
offline-vennlig, stien uendret → testene upåvirket; commons = source of truth). Dokumentér
synk-kommandoene (subtree pull/push) i `shared/README.md`; oppdater prosjekt-CLAUDE.md.
**Verifisering:** commons-repo på Forgejo viser 12 filer + historikk (`git log` i commons ikke
tom) · i dette repoet: `uv run pytest` grønn UTEN testendringer · MAF-frihets-guarden fortsatt
grønn · én subtree-synk (pull ELLER push) demonstrert og loggført.
## S5 — D7-oppstart: søskenrepo på Claude Agents SDK **[GATED]**
**Mål:** Søskenrepoet eksisterer, konsumerer commons, og har kontraktene på plass — ingen
agent-kjøring ennå.
**Innhold:** Nytt Forgejo-repo (repo-init-skill); Python-scaffold med Claude Agent SDK
(søk-først: verifiser gjeldende SDK-API mot offisiell doc FØR skriving; grunnlag i
[MAF vs Claude Agent SDK](../research/2026-06-24-maf-vs-claude-agent-sdk.md)); egen CLAUDE.md +
STATE.md; commons inn som subtree; fail-fast oppstartskontrakter (speiler `contracts.py`-rollen:
data-source, modell-map, terminering, feedback).
**Verifisering:** `uv run pytest` kjører grønt · commons-innhold på plass (12 filer) ·
kontrakts-tester grønne (avvis manglende tak, avvis tredje decision-verdi) · ingen API-nøkkel
nødvendig for suiten.
## S6 — D7 deterministisk ryggrad
**Mål:** Egen validator-implementasjon + budsjett-tak + provenance, med golden-suiten som eneste
fasit (nøkkelantakelse 3).
**Innhold:** TDD mot `validator-input.json`/`golden.json`: IR-projeksjon → deterministisk solve +
Monte Carlo (eller ekvivalent deterministisk metode som reproduserer golden-utfallene);
`Rejection` som egen ukonsumerbar type; budsjett nektes uten positive tak; provenance-stamp.
**Verifisering:** golden-suite-test grønn på alle besluttede felt · mutasjonskontroll: én endret
parameter i input → rød · tak-test: oppstart uten budsjett feiler fail-fast.
## S7 — D7 kontekst-søm (OKF-navigasjon + ExpeL-fold)
**Mål:** Steg 1 på Claude-siden: kontekst ved navigasjon (aldri stuffing), verdict-laget gated ut,
tidligere dommer når prompten KUN via folden.
**Innhold:** Port av `okf.py`-metoden (ren stdlib, D7-portabel by design) til søskenrepoet;
`bundle_context`-ekvivalent + seed-fra-bundle + fold-før-generering.
**Verifisering:** speilpar av MAF-ens load-bearing-tester: (a) realiseringsmarkør når prompten via
folden, rød ved detach; (b) verdict-laget lekker aldri via lese-konteksten; tom-store-kontroll.
## S8 — D7 agentisk loop (maker-checker + gate + informert refinement)
**Mål:** Steg 25 på Claude Agents SDK: hypotese-generering, maker/checker-debatt der checkeren
faktisk gater (VERDICT-markør, opt-in-reject), og validator-grunn inn i neste forsøk under
eksisterende tak. Offline (skriptet klient-stand-in for test, som MAF-siden).
**Verifisering:** speiltester: checker-REJECT flipper et ellers validert utfall (rød uten
override) · refinement-testen: forrige `Rejection.reason` verbatim i neste prompt + utfallet
flipper (rød ved detach) · tak-kontroll: løkka stopper på max_attempts.
## S9 — D7 læringssløyfe (inbox + promoteringsgate + persona)
**Mål:** Steg 7+8 på Claude-siden, med personaen instansiert fra den DELTE `SKILL.md`-artefakten
via egen loader (beviser at delt kjerne faktisk deles).
**Innhold:** verdict-inbox (tolerant last, merge, aldri skriv tilbake); fail-closed
promoteringsgate mot commons-bundelen; persona-loader mot `example-verdict.json`; to-runs
offline-bevis (sim-ekvivalent).
**Verifisering:** speiltester av step7/step8/persona-trioen (hver bevist RØD på sin detach) ·
to-runs-bevis: dom droppet etter Run A når Run B's prompt med fersk store; tom-inbox-kontroll.
## S10 — D7 minimal ekte API-kjøring (den genuine modell-atferden)
**Mål:** Den ENE ekte modell-kjøringen i hele programmet (per beslutning 2026-06-30 lever
genuint modell-bevis på Claude-siden): mikro-bundelen, billigste egnede Claude-modell (slås opp
via claude-api-skill i økta), harde token-tak.
**Innhold:** kjør loopen live én gang; fang artefakter (forslag-JSON, checker-dom, tokenforbruk,
validator-utfall) til S11; loggfør kost.
**Verifisering:** kjøringen fullfører innenfor forhåndssatt tak (taket + faktisk forbruk logget) ·
artefakter persistert i output-laget · determinisme-grensene håndtert slik protokollen (S3)
foreskriver · kost rapportert i STATE.
## S11 — Sammenligningen + rapport
**Mål:** Program-leveransen (§1): begge stacker målt på identisk commons-ref etter protokollen
fra S3; norsk rapport (forretningsdokument).
**Innhold:** kjør MAF offline-sim + D7 offline-speil på samme pinned commons-ref; sammenstill med
S10-artefaktene; rapport: metode-samsvar, validator-samsvar mot golden, utviklings-/
kompleksitetssammenligning, tokenkost, og asymmetri-erklæringen ordrett.
**Verifisering:** rapporten har verifiseringslogg (hver tallpåstand → kommando/kilde som
reproduserer den) · begge repo grønne på pinned ref · ingen påstand om live-atferd på MAF-siden.
## S12 — Release-hygiene begge repo **[INGEN HAST — GATED på 100 % enighet]**
**Innhold:** prepare-release-løpet: LICENSE, `[project.scripts]` (`run:main` + `simulation:main`),
CHANGELOG-poler, CONTRIBUTING/SECURITY, prominent D3-disclaimer, gitleaks-sjekk.
**Verifisering:** fersk klon + README alene → kjørbar simulering · gitleaks rent · inkrementell
plans Fase 4-kriterier grønne.
---
## Nøkkelantakelser (med eksplisitt test)
1. **`git subtree split` bevarer historikk og tar nøyaktig de 12 rene datafilene** → testes lokalt
i S3 (dry-run branch) FØR noe remote opprettes i S4.
2. **Claude Agent SDK dekker primitivene** (subagenter, verktøy, budsjett-hooks) → grunnlag i
research-doc 2026-06-24; re-verifiseres søk-først mot gjeldende SDK-doc i S5 (risiko: API-drift
siden research).
3. **Golden-suiten er framework-nøytral fasit** → allerede bevist (MAF-testene konsumerer
`validator-input.json`/`golden.json`); S6 gjenbruker uendret.
4. **Konfigurerbar shared-sti brekker ingen tester** → S3 beviser med grønn suite + ny
load-bearing override-test før S4 flytter noe.
## Verifisering (planen som helhet)
- Ingen økt erklæres ferdig uten at øktas verifiseringskriterier over er kjørt og grønne.
- Program-sluttkriterium: S11-rapport levert med begge stacker på identisk delt kjerne,
liveness-asymmetrien eksplisitt erklært, alle repo grønne — og ingen artefakt (README,
CHANGELOG, CLAUDE.md, spec) påstår mer enn koden gjør.