docs(p18): stress round 2 -- five paid runs, and the mutation that found a hole

P18 parts D and E (order 20260914T105139Z), plus the two things measuring
them turned up.

DEL D -- five paid runs (gpt-4-1-mini, azure, PACE_SECONDS=2), same four
context sets, SAME parameters on all four (--max-rounds 3 --max-tokens
600000), plus one variance repeat of gate-nordvik. All four free
--live-dry-runs first: rc 0, and Grounding-offer numbers IDENTICAL to round 1
(435/272/982/3) -- the control that the Grounding structure did not change
what the gate measures.

MEASURED, round 1 -> round 2:
- runs that died on the token cap: 3 of 7 -> 0 of 5, and two sets now fit a
  LOWER cap than round 1 had to give them;
- guessed read paths: 12 -> 0;
- wall time, the two sets whose parameters are directly comparable: n100
  140.1 s -> 70 s, n500 73.5 s -> 69 s;
- 5 of 31 read_file calls opened documents BEYOND the default window, so the
  window WAS widened -- the trace does not record which knob (finding 1);
- (a) grounded in a fasit concept: 0 of 26, UNCHANGED. That is the mission
  gap, and DEL A did not close it.

The a4 falsification arm fails once in each round, on a different set. r761's
a4 is now rejected -- but NOT by B1: the model proposed "Kontraktsum" this
time, so the "appears nowhere" arm caught it, and B1's effect on that row is
proven offline, not live. NEW failure: tunnel-hauglia a4 VALIDATED on
"impulsventilator" (3/270 documents), and fv412 a1 on "bituminost barelag"
(4/1133). Both are ordinary Norwegian words from the standard's prose, not
cost codes. B1 cannot and should not fell them: this is an ANCHORING defect,
not a grounding one, and it is finding 2 with two named remedies and a
recommendation.

C2 isolated by re-judging round 1 with the new judge: kontrakt-sorasen goes
named=3 -> named=1, and the survivor is named_in_measure -- the model's own
words. Two of the three were the whole-base snippet artefact.

DEL E -- docs/2026-09-14-p18-stressrunde-2.md: round 1 against round 2, what
each fix bought (measured, never attributed), the B2 table, variance, and for
EACH remaining ugly finding a NAMED solution with an estimate.

THE MUTATION THAT FOUND A HOLE. B6 (revert run.py to compose ONE blob instead
of one document per concept file) left the WHOLE suite green: 1698 passed / 5
skipped. The composition arm drives _grounding_text with a Grounding it
builds ITSELF, so it cannot see what the RUN handed over -- and a blob has
exactly one boundary, so the floor can never be reached, the share can never
fire, and the measured defect is back intact. The rule is only as good as the
boundaries it is given.

Arm (h) is the gate that was missing: a crafted base with TWELVE concept
files all carrying the same token -- per document 12 of 17 and inert, as one
blob 1 of 1 and grounding -- with a control on a code only ONE file carries,
which must still validate. Measured RED against exactly that mutation. The
mutation was not dropped and the seam was not declared unwitnessed: it got a
witness.

Also: the debate's own bundle pointer (run.py _bundle_pointer) now explains
the window and the filter, alongside the tool description and the navigator
instruction updated in 9b47e5a -- a description that lies about the body IS
the model's instruction (the Fase 3 class). Golden transcript unaffected.

Mutations, all against the FULL suite in an isolated worktree, one at a time:
DEL A 7 of 7 red (control 1685/5), DEL B+C 9 of 10 red (control 1698/5), the
tenth being B6 above. Tables in the report s 9.

Verification: uv run pytest -q 1699 passed / 5 skipped (1670 on cfd9079; +29,
0 removed). ruff check + format clean, mypy clean (38 files). Golden
demo-transcript.stdout BYTE-UNCHANGED, shasum -a 1 of the CONTENT =
ea8c534773acdbe41ae68f2c55724d69aaf8be4f. No version bump, no push.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-09-15 00:03:26 +02:00
commit e7ba367f9d
4 changed files with 432 additions and 5 deletions

View file

@ -2520,7 +2520,17 @@ Python ≥3.10. MAF (`agent-framework-core` 1.16.0, `-orchestrations` 1.1.1 —
at vinduet er fullstendig og ikke-overlappende. **Ærlighets-grenser, uttalt:** `navigate_bundle`
kalles fortsatt per verktøykall (I/O, ikke tokens); A3-nekten navigerer basen ÉN gang ekstra på
feilstien for å finne den nærmeste listbare katalogen; at en LEVENDE modell BRUKER `filter` er
ikke bevist (structured-output-grensens klasse) — DEL D er målingen.
ikke bevist (structured-output-grensens klasse) — DEL D er målingen. Load-bearing MÅLT
(`tests/test_navigation_window_loadbearing.py`, 13 armer), **sju mutasjoner alle røde mot HELE
suiten** + grønn kontroll 1685/5 og golden BYTE-UENDRET: ingen vindu (8 røde) · bundet men VAKUØST
(**26**, tolv filer hvorav ni eldre enn dette arbeidet — dét er hva som skiller bindingen fra en
gate som bare kan bli grønn) · `total` droppet (11) · filteret leser bare tittelen (1) · en
fraværende sti reiser igjen (4) · et filter uten treff NEKTER (1) · filteret snevrer ikke
kataloger (1). Verktøybeskrivelsen, navigatør-instruksjonen OG debattens `_bundle_pointer` flyttet
i SAMME commit-serie — en beskrivelse som lyver om kroppen ER modellens instruks (Fase 3-klassen).
**MÅLT LEVENDE (DEL D):** 0 gjettede lesestier i fem betalte kjøringer (runde 1: 12), og 5 av 31
`read_file`-kall åpnet dokumenter UTENFOR default-vinduet — altså ble vinduet utvidet, men sporet
sier ikke med hvilken knapp (funn 1 i rapporten).
- **En identifikator som står OVERALT identifiserer INGENTING — og grunnlaget bæres som DOKUMENTER,
ikke som én blob (P18/B1, 14.09):** P7 gjorde stadium 0b til `item.code in grounding`, ren
delstreng over én sammenslått streng. P16 kjørte den mot et LEVERT korpus og målte hva
@ -2551,8 +2561,19 @@ Python ≥3.10. MAF (`agent-framework-core` 1.16.0, `-orchestrations` 1.1.1 —
dokument også, så (b) ville **ikke** fanget defekten (grunner fortsatt), mens B1 gjør den inert og
lar den ekte prosesslinja `65 ASFALTDEKKER` (29/2756 = 1,05 %) grunne. (b) er altså ikke et
substitutt for B1; målt, ikke bygget. Load-bearing MÅLT
(`tests/test_inert_identifier_loadbearing.py`, 7 armer): kjent-positiv er P16s EGET artefakt
spilt av mot basen den fikk, kjent-negativ er **26 av 26** fasit-referanser som fortsatt grunner.
(`tests/test_inert_identifier_loadbearing.py`, **8 armer**), **sju mutasjoner mot HELE suiten** +
grønn kontroll 1698/5: detach regelen (3 røde) · flagg alt som er til stede (**77**) · dropp
andels-konjunktet (2) · dropp det ABSOLUTTE gulvet (**74** — hver pre-P18-fixtur brekker, altså er
gulvet dét som gjør regelen URØRENDE for dem i stedet for å unnta dem) · dropp nevneren i grunnen
(1) · dropp lengde-konjunktet (1) · blob-komposisjonen i `run.py` (**0** — se under).
Kjent-positiv er P16s EGET artefakt spilt av mot basen den fikk; kjent-negativ **26 av 26**
fasit-referanser. **ÉN MUTASJON VAR GRØNN, OG DET ER ET FUNN (repoets vakuøs-gate-klasse,
SEKSTENDE gang):** å reversere `run.py` til ÉN blob lot HELE suiten stå grønn — komposisjons-armen
driver `_grounding_text` med en `Grounding` den bygger SELV, så den kan ikke se hva KJØRINGEN
leverte, og en blob har nøyaktig ÉN grense (gulvet kan aldri nås, andelen aldri fyre, defekten er
tilbake intakt). Arm (h) er gaten som mangler: en crafted base med TOLV konseptfiler som alle
bærer samme token — per dokument 12 av 17 og inert, som blob 1 av 1 og grunnende — med en kontroll
på en kode bare ÉN fil bærer. Målt rød mot nettopp den mutasjonen.
**Ærlighets-grenser, uttalt:** regelen er per-DOKUMENT, så en base med ett gigantisk dokument er
upåvirket; `assumptions`-nøkler er fortsatt utenfor (økt 109s grense); og ingen betalt kjøring
bekrefter at den endrer utfallet levende før DEL D.
@ -2565,13 +2586,18 @@ Python ≥3.10. MAF (`agent-framework-core` 1.16.0, `-orchestrations` 1.1.1 —
«`--docs-dir`-omveien»** (å mate prosjektdokumenter gjennom retrieval I STEDET FOR å ingeste dem
inn i en kunnskapsbase): ingen slik sti åpnes, og veg-grenen nekter fortsatt uten en EKTE
`--docs-dir` (egen arm). Nekten navngir nå BEGGE dører, ikke bare den ene den pleide å navngi.
To mutasjoner, begge røde på de SAMME to armene (`tests/test_docs_dir_optional_loadbearing.py`,
5 armer): krev `--docs-dir` igjen (2) · la CLI-en aldri videresende basen (2).
- **Dommerens snippet-arm teller KUN under `citation_scope == "narrowed"` (P18/C2, PM-valg P16
§ 6.2):** (a) hadde alt den korreksjonen; (b) hadde den ikke. P16s egen begrunnelse for at (b)
var ren — «snippetene er konsept-BODYER mens `ref`/`title` bor i FRONTMATTER, målt 0 av 446
n100-bodyer» — holder for `Krav 4.1.2—1`, men **IKKE for R761**, der et prosessnummer som `12.1`
står i bodyene selv. Under en helbase-siteringsliste var det merket «sitert» før noe modellkall,
så raden kom tilbake `named` for en kjøring der modellen ikke hadde sagt noe slikt. Diskriminatoren
er PARET av to armer med SAMME snippet og SAMME merke, der eneste forskjell er scopet.
er PARET av to armer med SAMME snippet og SAMME merke, der eneste forskjell er scopet. Mutasjon
(ignorer scopet) → 1 rød, den nye armen ALENE. **Isolert målt på ekte data:** re-dømming av runde 1
med den nye dommeren tar kontrakt-sorasen fra `named=3` til `named=1`, og den ene som står igjen
er `named_in_measure` — modellens egne ord.
- **STATE.md er local-only** (gitignored). Voyage session-state er efemert; STATE.md er kanonisk kontinuitet.
- Prosess: Voyage-plugin (`/trekbrief → /trekplan → /trekexecute → /trekreview`) per større fase.