feat(row6): a proposal whose approach declared no requirement is unsupported
Stress round 6 validated three falsification arms, and every validated approach rested only on run-level declarations nobody can attribute to one approach. declare_requirement now takes a required approach_id (a mandate id or own-proposal; an unknown id is refused naming the valid ones), and a ValidatedProposal whose approach has neither a mandate requirement nor a declaration under its own id becomes validator.Unsupported - a Rejection subclass carrying the validator's own ruling, reported as `unsupported` in coverage, the outcome artefact, the settlement and the judge, and never counted or summed. The rule is active whenever the debate held the declaration tool, the micro base included; the road and pre-pass paths are untouched. Declaration quality is not judged, so the rule can be satisfied by declaring any document the run read. The v1 gate's row 6 probes pass; its artefact half reads IKKE MÅLT because stress round 6 predates approach-addressed declarations, and IKKE MÅLT is never green - it fails the exit code. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
9847e014e7
commit
938a1ca30e
23 changed files with 718 additions and 115 deletions
|
|
@ -24,7 +24,7 @@ from pathlib import Path
|
|||
|
||||
import pytest
|
||||
|
||||
from portfolio_optimiser.mandate import OWN_PROPOSAL_ID, Approach, Mandate
|
||||
from portfolio_optimiser.mandate import BindingRequirement, OWN_PROPOSAL_ID, Approach, Mandate
|
||||
from portfolio_optimiser.simulation import ScriptedChatClient
|
||||
from portfolio_optimiser.run import run_project
|
||||
from portfolio_optimiser.validator import Rejection, ValidatedProposal
|
||||
|
|
@ -48,8 +48,11 @@ def _reply(measure: str, claimed: int) -> str:
|
|||
# Labels are chosen to be ABSENT from the bundle's own prose: "LED-retrofit" appears in 6 of the
|
||||
# bundle's files, so a client keyed on it would match every prompt through the context and prove
|
||||
# nothing about which approach was bound to which call.
|
||||
_LED = Approach(id="led-retrofit", label="Behovsstyrt belysning i fellesarealer")
|
||||
_HVAC = Approach(id="hvac-swap", label="Utskifting av ventilasjonsaggregat")
|
||||
#: Row 6: a commissioned approach validates only on a requirement of its own. These tests are about
|
||||
#: selection and per-approach artefacts, not about declarations, so the commission names one.
|
||||
_REQ = BindingRequirement(path="tiltak-led-retrofit.md", ref="Krav 1")
|
||||
_LED = Approach(id="led-retrofit", label="Behovsstyrt belysning i fellesarealer", requirement=_REQ)
|
||||
_HVAC = Approach(id="hvac-swap", label="Utskifting av ventilasjonsaggregat", requirement=_REQ)
|
||||
|
||||
#: LED validates (30k <= cap); HVAC is above the cap -> the validator rejects it.
|
||||
_REPLY_BY_LABEL = {
|
||||
|
|
@ -160,8 +163,12 @@ async def test_outcome_is_the_best_validated_candidate_deterministically(big_fir
|
|||
orderings pinned, ``produced[-1]`` fails one case and ``produced[0]`` fails the other.
|
||||
"""
|
||||
sink: list[str] = []
|
||||
big = Approach(id="big", label="Behovsstyrt belysning i fellesarealer") # 30k, validates
|
||||
small = Approach(id="small", label="Nattsenking av temperatur") # default reply, 20k
|
||||
big = Approach(
|
||||
id="big", label="Behovsstyrt belysning i fellesarealer", requirement=_REQ
|
||||
) # 30k, validates
|
||||
small = Approach(
|
||||
id="small", label="Nattsenking av temperatur", requirement=_REQ
|
||||
) # default reply, 20k
|
||||
mandate = Mandate(
|
||||
objective="Cut energy cost without rebuilding.",
|
||||
approaches=(big, small) if big_first else (small, big),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue