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
21 lines
890 B
Markdown
21 lines
890 B
Markdown
---
|
|
type: hypothesis
|
|
title: "VFD-retrofit av sirkulasjonspumper"
|
|
description: "Turtallsregulering (variable frequency drive) på 12 sirkulasjonspumper som i dag går på konstant hastighet."
|
|
measure_id: VFD-RETROFIT-01
|
|
resource: PUMPE-SOR
|
|
tags: [pumper, VFD, energieffektivisering]
|
|
timestamp: 2026-07-16
|
|
---
|
|
|
|
# VFD-retrofit av sirkulasjonspumper
|
|
|
|
Kandidat-tiltaket: montere frekvensomformere (VFD) på 12 sirkulasjonspumper i et
|
|
sørvendt næringsbygg. Pumpene går i dag på konstant turtall; med turtallsregulering
|
|
følger de faktisk lastbehov, og pumpeeffekten faller tilnærmet kubisk med turtallet.
|
|
|
|
## Mapping til validatoren
|
|
|
|
`validator-input.json` projiserer tiltaket inn i kost-IR-en: `affected_items` er byggets
|
|
årlige pumpe-energikostnad (`ENERGI-PUMPE-EL`), `claimed_saving_nok` er den modellerte
|
|
VFD-besparelsen, og `assumptions` bærer energipris-båndet for Monte Carlo-en.
|