portfolio-optimiser-claude/tests/data/mini-bundle/verdict-vfd-fro.md
Kjell Tore Guttormsen f2c64da9ee feat(portfolio): K2 — sequential multi-project run (parity row 4)
New portfolio.py: run_portfolio drives N projects sequentially from a
schema-validated reference config, composing each project's §5 context
(merge inbox -> seed -> fold) and running the loop core UNCHANGED per
project, collecting one typed result per project IN CONFIG ORDER. This is
the run path MAF got in its Fase 1 and D7 never had — the prior entrances
(run.py, run_s10.py) drive a single bundle. PortfolioResult holds
per-project results tagged with the config project_id.

Re-entrancy (§3 Step 3): each project composes its OWN context inside the
loop, never a hoisted shared one, so nothing survives one project into the
next except the explicitly shared mutable state — the §8 budget meter, a
portfolio-wide cap. Failure policy is a STACK-LOCAL choice until D-D: the
default RAISES (today everything is thrown); K18 flips it to
collect-and-continue when the D-D wave model lands.

New config contract in contracts.py: ReferenceProjectContract (project_id +
required non-empty bundle_dir + optional inbox_dir) + ReferenceProjectsContract,
loaded fail-fast by load_reference_projects (§10) — a project without a
bundle path is refused before any run. New data/reference_projects.json
example (shape-validated, never executed by the suite). New repo-local
mini-bundle fixture under tests/data/ (a distinct second project, VFD-retrofit
— ALDRI in shared/).

Two detach proofs delivered: drop the bundle_dir Field requirement -> a run
starts on the invalid config and only crashes mid-run -> the fail-fast test
goes red; hoist the per-project composition out of the loop -> project 2 runs
on project 1's context and the VFD marker never reaches its prompt -> the
re-entrancy test goes red. 11 new tests (test_portfolio.py 5 +
test_contracts.py TestReferenceProjects 6). 426 -> 437 tests, golden
byte-exact, full gate clean (ruff + format + mypy strict). README synced
(test count + a Run layer module block).

[skip-docs] — README documents the new module; CLAUDE.md holds invariants
(rules/commands) only, and K2 adds no new invariant, command, or convention.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RiTwaKLesgcwXx2mDviqpt
2026-07-23 21:39:39 +02:00

1.1 KiB

type title description resource measure_id decision realization_rate modelled_saving_nok expected_actual_saving_nok gap_source context_key provenance tags timestamp
verdict Ekspert-dom (frø): VFD-retrofit — godkjent med realiseringskorreksjon Frøsatt ekspert-dom for VFD-tiltaket. Koder et realiseringsgap distinkt fra LED-frøet (0.75, ikke 0.82) så porteføljetesten kan skille prosjektenes kontekst. PUMPE-SOR VFD-RETROFIT-01 approved_with_adjustment 0.75 12000 9000 pump-affinity-oversimplification naeringsbygg; pumpe-last=stipulert frø — AI-forfattet test-fixture; erstattes av ekte HITL i produksjon
verdict
realization-rate
ExpeL-seed
fixture
2026-07-16

Ekspert-dom (frø): VFD-retrofit

Dette er et frø, ikke en ekte dom — en test-fixture for porteføljekjøringen.

Dommen

Beslutning: godkjent — med realiseringskorreksjon. Den modellerte besparelsen er teknisk plausibel, men i drift realiseres erfaringsvis ~75 % fordi den antatte affinitets-forenklingen overvurderer hvor mye tid pumpene faktisk kjører på redusert turtall.