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
|
|
@ -102,6 +102,30 @@ class Rejection:
|
|||
reason: str
|
||||
|
||||
|
||||
#: The ONE sentence an unsupported outcome carries. ``rejection_stage`` keys on it, so the judge can
|
||||
#: tell this falsifier from the numeric ones without a second copy of the wording.
|
||||
UNSUPPORTED_REASON: Final = (
|
||||
"no declared requirement for this approach: the numbers held, but no requirement of the "
|
||||
"knowledge base was declared as binding it"
|
||||
)
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class Unsupported(Rejection):
|
||||
"""A proposal whose NUMBERS held but whose approach declared no binding requirement (row 6).
|
||||
|
||||
Neither ``validated`` (nothing in the knowledge base was said to support the direction) nor an
|
||||
ordinary rejection (every numeric stage passed). It subclasses ``Rejection`` on purpose: every
|
||||
consumer that asks "is this validated?" with ``isinstance(..., ValidatedProposal)`` answers no
|
||||
without being touched, so it is never counted, summed or carried as a success. The consumers
|
||||
that NAME the status — coverage, the outcome artefact, the settlement, the judge — check for
|
||||
this class first. ``validated`` keeps the validator's own ruling, which is what
|
||||
``provenance.validator_decision`` mirrors: the validator said yes, and the record says so.
|
||||
"""
|
||||
|
||||
validated: ValidatedProposal
|
||||
|
||||
|
||||
def _solve_max_feasible(items: list[AffectedItem], fraction: float) -> float:
|
||||
"""Real CBC solve: maximize total saving subject to a per-item upper bound and a
|
||||
global fraction cap. Raises ``CbcUnavailable`` if CBC is genuinely missing."""
|
||||
|
|
@ -728,6 +752,7 @@ _REJECTION_STAGES: Final = (
|
|||
("stage4-p90", ("exceeds P90 feasible",)),
|
||||
("stage4b-nominal", ("exceeds the nominal feasible",)),
|
||||
("stage5-method-cap", ("method cap",)),
|
||||
("unsupported", ("no declared requirement for this approach",)),
|
||||
)
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue