feat(p21): a declaration that must have LOOKED, and a refusal that names the neighbours
C1. Round 4 produced 13 declarations over six runs and NOT ONE named a fasit concept. The distinct documents opened before each were 1,1,1,1,1,1,1,2,5,5,6,13,13: seven declared the base's FIRST requirement after opening exactly ONE document. The order offered two rules and asked which discriminates. Replayed against the real listings: "the declared document must have come back from a read_dir filtered on a word from the approach's label" refuses 13 of 13 -- including Soraasen's 12.11, the closest any run came -- because ZERO of the 13 were reached through a filtered listing at all. A gate that refuses every measured case, right and wrong alike, cannot discriminate. "fewer than k distinct documents opened" at k=3 refuses 8 of 13 and keeps the five that navigated. k=3, 4 and 5 refuse the SAME eight -- the distribution has a gap between 2 and 5 -- so the threshold is not on a cliff, and 3 is the lowest of that plateau. DISTINCT paths, not calls, and capped by the base's own size so a small base stays declarable. C2. Over the same traces 18 of 143 path-bearing calls named a path the base does not hold, ELEVEN of them one run walking R761/4-3, 4.3, 4-2, 4-1, 4-0, 4-5, 4-6 while the real names are R761/4, R761/41, R761/42. The refusal already named the nearest listable ancestor; now it also names up to five of that rung's own subdirectories, ranked by longest common prefix with the segment that failed. ONE copy shared by both refusal sites, built from context_files through in_dimension, so every name handed back resolves and the verdict layer can never be advertised in an apology. MEASURED after: 16 of 18. Load-bearing MEASURED, four mutations all red against the WHOLE suite, green control 1863/5, golden byte-unchanged: C3(i) the declaration gate detached (2 red) . C3(ii) the neighbour list empty (6) . C3(iii) built from files (1, the verdict arm alone) . C3(iv) count CALLS instead of distinct documents (1, the repetition arm alone). Three existing arms REWRITTEN, not weakened: all three read one document and declared, which is the measured failure class exactly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
7b4f85d77c
commit
ac0bfdba27
8 changed files with 534 additions and 28 deletions
|
|
@ -38,6 +38,7 @@ What each arm pins:
|
|||
|
||||
from __future__ import annotations
|
||||
|
||||
from collections.abc import Sequence
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
|
|
@ -60,8 +61,22 @@ def _wired(bundle_dir: Path) -> tuple[dict[str, Any], list[ToolCall], list[Decla
|
|||
return {t.name: t for t in tools}, opened, declared
|
||||
|
||||
|
||||
def _declare(tools: dict[str, Any], opened: list[ToolCall], base: str, path: str) -> dict[str, Any]:
|
||||
"""Read it the way a run does, then declare it — the (b) path of P19 DEL A."""
|
||||
def _declare(
|
||||
tools: dict[str, Any],
|
||||
opened: list[ToolCall],
|
||||
base: str,
|
||||
path: str,
|
||||
*,
|
||||
also: Sequence[str] = (),
|
||||
) -> dict[str, Any]:
|
||||
"""Read it the way a run does, then declare it — the (b) path of P19 DEL A.
|
||||
|
||||
``also`` carries the OTHER documents the run opened. P21/C1 made "it opened enough of the base
|
||||
to have looked" part of the declaration's precondition, capped by the base's own size, so a
|
||||
crafted two-document base needs no extras while a five-document example does.
|
||||
"""
|
||||
for other in also:
|
||||
opened.append(ToolCall(name="read_file", bundle_id=base, path=other))
|
||||
opened.append(ToolCall(name="read_file", bundle_id=base, path=path))
|
||||
return tools["declare_requirement"].func(bundle_id=base, path=path, ref="Krav 4.1.2-1")
|
||||
|
||||
|
|
@ -130,8 +145,9 @@ def test_a_verdict_document_is_never_named_back_by_title(tmp_path: Path) -> None
|
|||
def test_the_tunnel_example_answers_its_own_title_and_no_number() -> None:
|
||||
"""(a) control on a REAL example base: title present, reference number honestly absent."""
|
||||
tools, opened, _declared = _wired(_TUNNEL)
|
||||
path = okf.navigate_bundle(str(_TUNNEL)).context_files[0].name
|
||||
answer = _declare(tools, opened, "tunnel-hauglia", path)
|
||||
files = [f.name for f in okf.navigate_bundle(str(_TUNNEL)).context_files]
|
||||
path = files[0]
|
||||
answer = _declare(tools, opened, "tunnel-hauglia", path, also=files[1:3])
|
||||
assert answer["title"].startswith("Kilder: tunnelbelysning")
|
||||
assert answer["req_number"] == "", "this base declares none, and the reply must not invent one"
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue