feat(p16): the stress judge -- and the order's own (a) was a gate that could only be green

Session 102's criterion ((a) built on the right fasit concept OR refused anchored, (b') names it,
(c) zero hallucinations) was adjudicated BY HAND. Measured 14.09: nothing in the tree read
contexts/<set>/fasit.json against an outbox at all, so "provable against the base" had no
repeatable form. portfolio_optimiser.stress reads ONLY artefacts that already exist -- the
per-approach proposal/outcome pair and {run_id}-debate.json -- so no run gains a field.

MEASURED BEFORE BUILDING: the order defines grounded as "OPENED or CITED", but on the S2c path
run_project stamps citations = bundle_citations(bundle), one per context file. On n100-2023 that
is 446 citations over 446 concepts, and 6 of 6 fasit paths are already "cited" before a single
model call. Honouring it literally would be the repo's own vacuous-gate class inside the gate
built to catch it, so a citation grounds an approach only under a NARROWED list (a declared
pre-pass cut); both halves are reported either way. (b') was checked for the same vacuity and is
clean -- snippets are bodies, ref/title live in frontmatter (0 of 446 n100 bodies carry
"Krav 4.1.2-1") -- so the order's definition stands.

A2: unanswerable questions had no runnable form (po is not a lookup tool), so they become a FOURTH
commissioned approach per set whose cost line the base carries no ground for, and fasit.json
carries must_refuse INSTEAD of unanswerable -- one form, never two copies of one fact. Rule U is
untouched and its known-positive is still red.

Load-bearing MEASURED (20 arms), eleven mutations all red on their own arm, green control 1663/5
(from 1643/5, superset, 0 removed), golden demo-transcript.stdout BYTE-UNCHANGED
(shasum -a 1 of the CONTENT = ea8c534773acdbe41ae68f2c55724d69aaf8be4f).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-14 11:58:48 +02:00
commit f21007c858
13 changed files with 1008 additions and 87 deletions

View file

@ -629,6 +629,27 @@ when the seam is detached, so the loop cannot silently degrade into theater.
--derive-cost-baseline
```
- **Judging a finished run against a fasit**`python -m portfolio_optimiser.stress`. A run's
outbox already carries the evidence (which documents the debate opened, which files the stamp
cites, which approaches validated). This reads it against a context set's own `fasit.json` and
answers three questions per commissioned approach, by machine: was it **grounded** in a document
the fasit says a right answer must reach, does the proposal **name** that requirement, and did it
**hallucinate** a file, a path or a cost code. A fourth, `must_refuse` approach is the
falsification arm: a cost line the base carries no ground for, which must never come back
validated. Every verdict carries its denominators, and an empty outbox — or a base that scans to
no concepts — is refused rather than reported as clean.
One caveat is worth stating, because it decides what the verdict means: when the debate navigates
the base, the provenance stamp cites *every* concept file, so "the fasit path is cited" is true
before any model call. A citation therefore only counts as grounding under a declared pre-pass
cut; otherwise grounding must come from a document the run actually opened. Both halves are
reported either way.
```bash
uv run python -m portfolio_optimiser.stress contexts/<set> \
--outbox-dir <outbox> --run-id <run-id>
```
- **Requiring the run to be anchored**`--require-cost-baseline` (opt-in, requires
`--bundle-dir`). Without a baseline the validator's stage 0 is skipped, and the run says so on
stdout — but it still finishes and still stamps `validator_decision: validated` over cost lines