feat(p20): the requirement that is RIGHT, and a clause number that is not a price
Three seams, one commit: A, B and C touch the same four modules (run.py carries
the debate task, the grounding composition and the announcement; okf.py carries
one reference-number vocabulary read by both A and B), so splitting them into
three commits would have meant hunk-level staging of entangled files. Stated
rather than silently restructured.
A — the declaration answers with the DOCUMENT's own words. Measured: 13
declarations over round 3 and P17b, not one naming a fasit concept, while the
tool answered {"declared": true, ...} by echoing the caller's own arguments. It
now returns the document's title and req_number, read off Bundle.context_files
(so the type: verdict layer can never be named back), plus the sentence saying
what the declaration binds. A path the base carries as no concept answers with
empty strings rather than refusing. The commission's success_criteria now reach
the DEBATE task through mandate.criteria_block, the one renderer, empty when
there are none — which is what keeps every un-commissioned prompt, and the
golden, byte-identical.
B — a clause number is not a price. THE ORDER'S OWN RULE WAS FELLED BY
MEASUREMENT: it asks to refuse a code that IS declared req_number/prosessnr,
and neither of its two known positives is. n500 declares seksjon 10.4.1..10.4.4
but never the bare 10.4; r761 declares 2727 prosessnr and 2753 seksjon, none of
them 1.10.4, which occurs once, as prose ("iht. vegnormal N200 kap. 1.10.4").
The COMPLEMENT fires on both and closes the hole _ground_against_input already
admits in writing -- "it fails OPEN on a coincidental match". Unanchored run +
requirement-shaped code + the base declares a vocabulary + the code is not in
it -> refused, naming the denominator. All five of kontrakt-sorasen's real
process codes ARE declared and pass, which is what keeps the one context set
built on real codes measurable. Replayed over all 24 codes of round 3 + P17b:
exactly the two known positives flip validated -> rejected, 22 unchanged.
C — a parse failure no longer burns the round ledger blind. _fetch_parsed takes
a BUILDER instead of a finished message list, so the retry carries the parse
reason; measured, kontrakt-sorasen-04 spent 11 of 12 rounds re-asking the same
question. And announced_subject names the routed bases instead of saying "the
portfolio" for a two-base commission.
Suite 1807/5 (from 1781, +26, 0 removed), golden demo-transcript.stdout
BYTE-UNCHANGED (shasum -a 1 of the CONTENT = ea8c534773acdbe41ae68f2c55724d69aaf8be4f),
ruff and mypy clean.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
64723c5d89
commit
c8f0c8f7c4
12 changed files with 1098 additions and 37 deletions
|
|
@ -414,6 +414,29 @@ def announce(
|
|||
return "\n".join(lines)
|
||||
|
||||
|
||||
def criteria_block(success_criteria: str) -> str:
|
||||
"""The ONE rendering of a commission's success criteria INTO a prompt, or ``""``.
|
||||
|
||||
MEASURED (P19 F2): ``success_criteria`` reached ``announce`` and nothing else, so the operator's
|
||||
own statement of what a good answer looks like was printed for a human and withheld from the
|
||||
only reader who could act on it. The approach's ``description`` has always reached the
|
||||
generation prompt (``generate._build_messages``); this is its run-level sibling.
|
||||
|
||||
ONE composer, for kø-(p): the debate task and any later prompt that carries the criteria must
|
||||
say the same thing about them, and two renderings of one commission are free to disagree about
|
||||
what the operator asked for.
|
||||
|
||||
Empty in, empty out — omission rather than an empty heading, the ``announce`` rule. That is
|
||||
what keeps every prompt of every un-commissioned run, the demo's included, byte-identical.
|
||||
"""
|
||||
if not success_criteria:
|
||||
return ""
|
||||
return (
|
||||
"\nWhat the commissioner counts as success (restated verbatim from the commission):\n"
|
||||
f"{success_criteria}\n"
|
||||
)
|
||||
|
||||
|
||||
def settle(
|
||||
coverage: tuple[ApproachOutcome, ...],
|
||||
*,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue