Skip to content

File the class #12020 repaired: a termination contract met by a trimming transport - #12024

Merged
briansrls merged 2 commits into
mainfrom
session/silent-ibex-813
Sep 22, 2026
Merged

briansrls merged 2 commits into
mainfrom
session/silent-ibex-813

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Scope changed after #12020 landed. This PR is now one ledger row and no behaviour change.

I was dispatched to repair test.claim.mtcollins1_census_image_local_wet.the_rendered_program_runs_and_its_output_parses_by_real_execution, red on main and refusing the merge queue for #11829. While I was verifying, #12020 landed the same diagnosis and a better repair. The blocker is fixed on main; nothing here fixes it. My claim-side repair is dropped — this branch now differs from main by a single new file.

What both sessions found

Neither the world nor the rendering moved — the reader did.

#11987 gave host_capture_bind the rule "only newline-terminated lines are evidence", grounded: the capture is bound while the host is still writing it over serial, and boot 23 had a half-written workload-write-rc= fragment. Independently, extdeps.shell.exec Exec.RunArgv captures through retained_utf8_lossy_trimmed() → .trim_end(), correct for its own consumers. The trim deletes the newline the program really wrote after its envelope END marker; the binder correctly declines to read an unterminated final line; a program that finished writing binds HostCaptureOpen. Exactly one of the module's seven identities refused because production and the six siblings all feed the binder Filesystem.Read bytes, which keep the newline.

I confirmed this in-session before #12020 appeared: control on main's tree, 7 scheduled / 7 terminals, 6 PASS and FAIL on exactly the identity the floor names.

Why my repair is dropped

I had the claim render to a real file via console_device and read it back with Filesystem.Read — the production medium. That works and keeps every red, and it is the worse repair: it leaves host_capture_bind still inferring a fact about the writer from the bytes. #12020 declares it instead — HostCaptureText = HostCaptureLiveStream | HostCaptureCompletedTranscript on the binder's input, one scan, host_capture_bind unchanged for existing consumers. That is the earliest boundary that could not be justified (DESIGN §6b), and a live stream cut mid-line is byte-indistinguishable from a trimmed transcript, so the reader was never entitled to guess. Two structures answering one question is the §3 fork; theirs is landed and correct, so mine goes.

What this PR keeps

#12020 filed no recurring_failure_mode row, and DESIGN §4b makes that an obligation for every newly discovered error class. This adds gunbc.recurring_failure_mode.a_termination_contract_is_met_by_a_trimming_transport, written around the repair that actually landed:

Membership is the directory, so no roster edit and no projection regen. Row resolves with 0 blocking errors.

Two receipts worth keeping: the class was caught only because one claim over the route happened to be a wall, in a lane that was itself fail-open at the time — and two sessions reached the same chain independently, so the cost was in noticing it existed, not in explaining it.

🤖 Generated with Claude Code

Brian Searls and others added 2 commits September 22, 2026 01:20
…rimmed pipe (the reader moved under it, not the world)

test.claim.mtcollins1_census_image_local_wet.the_rendered_program_runs_and_its_output_parses_by_real_execution is RED on main and is what the merge queue refuses on for #11829. Re-derived the slice (DESIGN 6b) from the producer forward; the rendering did not move and the world did not move -- the READER moved, and this claim is the only consumer feeding it a medium whose contract deletes the byte the reader's contract reads.

THE CHAIN. host_capture_program emits its envelope END marker terminated with a newline (unchanged). extdeps.shell.exec Exec.RunArgv is realized by retained_utf8_lossy_trimmed, i.e. trim_end (unchanged, and correct for its own consumers). host_capture_bind gained host_capture_terminated_lines in #11987 -- only newline-terminated lines are evidence -- for a grounded reason: the capture is bound while the host is still writing it over serial, and boot 23 had a half-written workload-write-rc= fragment. The trim removes the newline the program really wrote, the binder correctly declines to read an unterminated final line, and a program that finished binds HostCaptureOpen. Both contracts sound, composing to a false reading.

WHY EXACTLY ONE OF SEVEN. Production (gunbc.machine_intake_mtcollins1_boot_run mtcollins1_boot_await_capture_terminal) and the six sibling claims all hand the binder Filesystem.Read bytes, which keep the newline. This claim passed console_device: "/dev/stdout" and bound obs.stdout.

THE REPAIR is neither an expectation flip nor a 4b(3) rung drop. host_capture_program already takes console_device to name that medium, so the claim renders to a real file, runs the program, and reads the capture back with Filesystem.Read -- the production route exactly, and the route the claim's own annotation says it asserts: render -> run -> parse, same medium at each link as the census.

EVIDENCE, claim_batch --wet, all seven identities of the module, in-session against e62f8a2 (= origin/main at the time):
- CONTROL, main's claim file: 7 scheduled / 7 terminals, 6 PASS and FAIL the_rendered_program_runs_and_its_output_parses_by_real_execution -- the exact identity the floor names, and all seven are declared ExpectedToHold in v2.workflow.local_repo_wet_terminal. The floor's refusal reproduces locally; it is not a CI-environment artifact.
- HEAD: 7 scheduled / 7 terminals, 7 PASS. Schedule and terminals agree.
- MUTATION CONTROL, so the repair is a wall and not a transcript: delete the END-marker echo from host_capture_program (one line) and the repaired claim goes FAIL. The arm the trim was falsely tripping is the same arm a genuinely truncated capture must trip, so it had to be shown unblunted.

Also files the class it is an instance of, per DESIGN 4b: gunbc.recurring_failure_mode.a_termination_contract_is_met_by_a_trimming_transport -- a reader whose contract is line termination fed through a transport whose contract is trimming. Rung found at silent wrongness at the composition, ceiling structurally impossible, trigger at capability grain: a captured-text carrier that declares what its transport normalized, sufficient for a termination-contracted reader to refuse a normalized capture at the type boundary. Membership is the directory, so no roster edit and no projection regen. Row resolves with 0 blocking errors.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
# Conflicts:
#	dag/test/claim/machine_intake/mtcollins1_census_image_local_wet_test.dag
@gunbai-bot gunbai-bot Bot changed the title Main repair: the census wet claim binds the console device, not the trimmed pipe (the reader moved under it) File the class #12020 repaired: a termination contract met by a trimming transport Sep 22, 2026
@briansrls
briansrls added this pull request to the merge queue Sep 22, 2026
Merged via the queue into main with commit f2b948e Sep 22, 2026
4 checks passed
@briansrls
briansrls deleted the session/silent-ibex-813 branch September 22, 2026 03:26
gunbai-bot Bot pushed a commit that referenced this pull request Sep 22, 2026
…d the END marker; the claim binds the console device now), so the schedule withdrawal and its rung drop are retracted

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
gunbai-bot Bot pushed a commit that referenced this pull request Sep 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant