fix(proposer): affected_items maa baere BASELINE-linja, ikke den foreslaatte reduksjonen

Funn (a) fra oekt 94s levende K2-maaling (docs/2026-09-06-major2-levende-k2.md
§ 4, rad 3-4). Genererings-prompten beskrev feltet som

    affected_items (list of {code, quantity, unit_cost})

og sa ingenting om HVEM sine tall det er. Stage 0 (S4.0) avstemmer hver linje
mot prosjektets egen kostbaseline, saa de eneste tallene som kan passere er
prisskjemaets EGNE - men en modell som blir bedt om aa halvere et volum leser
quantity som feltet tiltaket sitt hoerer i, fyller inn den REDUSERTE verdien
(1000 der baselinen sier 1250) og avvises. Den levende kjoeringen hadde lest det
prisede skjemaet TO ganger gjennom navigasjonsstigen og gjettet likevel: tallene
var tilgjengelige, KONTRAKTEN for feltet var ikke uttalt.

Besparelsen har sitt eget felt, og prompten sier det i samme aandedrag - "dette
er baseline-tallene" uten "og reduksjonen din hoerer der" etterlater modellen med
en verdi den er fortalt aa ikke putte noe sted.

Blokka rir paa BASE-prompten, ikke paa en gren, og det er hva arm (3) finnes for:
defekten ble maalt paa et REVIDERT forsoek, saa en instruksjon som bare naadde
forsoek 1 ville vaert fravaerende fra noeyaktig den prompten den ble maalt i.
prior_rejection / prior_feedback / approach appendes ETTER basen, saa hver
komposisjon baerer den fortsatt.

RoedT foerst: 6 av 7 armer roede (kontrollen groenn - den asserterer at
referanseprosjektet faktisk HAR kostlinjer, saa gaten ikke beskriver noe
imaginaert). Ingen endring i skjema, validator eller stage 0.

Suite 1381 passed / 5 skipped (fra 1368/5; +13, 0 fjernet - strengt supersett).
ruff + mypy rene. Golden demo-transcript.stdout BYTE-UENDRET,
shasum -a 1 av INNHOLDET = ea8c534773acdbe41ae68f2c55724d69aaf8be4f.

Ordre 20260906T212735Z-2448754-from-.claude, funn (a).

Co-Authored-By: Claude <claude-opus-5>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-06 23:38:16 +02:00
commit c6886ed605
2 changed files with 126 additions and 1 deletions

View file

@ -331,7 +331,11 @@ def _build_messages(
f"Context (prior verdicts / cited cost docs):\n{context}\n\n"
"Respond with ONLY a JSON object for a SavingsProposal with keys: project_id, "
"measure, affected_items (list of {code, quantity, unit_cost}), claimed_saving_nok, "
"and optional assumptions."
"and optional assumptions.\n"
"Each entry in affected_items must restate a cost line as the project's price schedule "
"already carries it: quantity and unit_cost are the unchanged baseline figures, not the "
"reduced quantity or unit cost your measure would produce. The effect of the measure "
"belongs in claimed_saving_nok."
)
if prior_rejection is not None:
prompt += (