Repository navigation
File the failure class #10560 repaired: a field carried on arms where it has no meaning - #10792
Closed
gunbai-bot[bot] wants to merge 3 commits into
Closed
gunbai-bot[bot] wants to merge 3 commits into
gunbai-bot[bot] wants to merge 3 commits into
Conversation
… it has no meaning Review 57275 on #10560 found that `CliWireResponse` was a record pairing a terminal-write projection with a `ProcessExit`, computed independently -- so a projection that REFUSED could carry `ExitSuccess`, and a verb printed nothing and reported success. It was reachable: an ESC byte in a commit message makes `project_terminal_write` refuse while the read itself answered fine. The repair was a coproduct whose refusal arm has no exit field to set. The repair landed; the class was never rostered, so nothing carries its recognition rule for the next carrier. It is its own row rather than an origin on a neighbour. Against `subject_and_its_digest_as_independent_parameters`: there the two fields are a value and a SUMMARY of it and the repair is derivation; here they are independent facts, one only defined when the other exists, and no derivation joins them. Against `kind_carried_but_its_fields_stay_optional`, which is the dual and is cross-cited: there an arm NEEDS a field the carrier does not guarantee and the repair REQUIRES it; here an arm carries a field it must not have and the repair DELETES it. Same law -- a carrier's field set belongs to its arms -- read from opposite ends, and filing either under the other would make one identity a nickname for both. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VQ4iThiZ1B9LPB9ePr8qa9
Ledger-Repair-Judged: docs/design-failure-modes.md Ledger-Rows-Repaired: docs/design-failure-modes.md field_carried_on_arms_where_it_has_no_meaning Ledger-Repair-Judged: docs/design-rung-drops.md
# Conflicts: # dag/gunbc/recurring_failure_mode/roster.dag # docs/design-failure-modes.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#10560 repaired a real defect and never rostered its class, so nothing carries the recognition rule for the next carrier that has the same shape.
The class
A carrier is a record whose fields are computed independently, and one field is meaningful on only some of the situations the carrier represents. A record has no arms, so that field must be given a value even where it denotes nothing — the author supplies whatever the type admits, and the resulting pairing is a claim nobody made and nothing refuses.
The receipt (review 57275, #10560)
gunbc.cli_wire.CliWireResponsewas{ write: TerminalWriteProjection, exit: ProcessExit }. A projection that refused could therefore be paired withExitSuccess, so a verb printed nothing and reported success — fail-open at the output boundary, where an operator's only signal is the exit status. Reachable, not theoretical: a commit message is an unrestrictedStringonCommitLogRowand is rendered directly into a log row, so an ESC byte makesproject_terminal_writerefuse while the read answered fine.The defence of the record is a true sentence about a neighbouring question, which is why this shape survives review. Bytes and exit status genuinely are two facts — a refused repository must print its diagnostic and exit nonzero. What does not follow is that the exit is independent of whether there are bytes at all. "The exit is not derivable from what the bytes say" and "the exit is unconstrained by whether there are bytes" are different claims; the first is true and the second is false.
Why its own row and not an origin on a neighbour
subject_and_its_digest_as_independent_parameters: there the two fields are a value and a summary of it, and the repair is derivation at the point the value is obtained. Here they are independent facts, one only defined when the other exists; no derivation joins them.kind_carried_but_its_fields_stay_optional, the dual, cross-cited in both directions: there an arm needs a field the carrier does not guarantee and the repair requires it; here an arm carries a field it must not have and the repair deletes it. Same law — a carrier's field set belongs to its arms — read from opposite ends. Filing either under the other would make one identity a nickname for both, and their recognition rules and repairs differ.Recognition rule
Asked of the carrier, not of any call site: for every field of a record, enumerate the situations the record represents and name what the field means in each. A situation whose honest answer is "nothing" is an arm the record is missing, and the value currently supplied there is a fabrication with a type. The tell that survives longest is a field whose only defensible value on some situation is a neutral-looking one — success, zero, empty — because that is the value a reader who sorts, thresholds or branches on the field reads as a measurement rather than as an absence.
Rung
The
cli_wireinstance reached structural impossibility, so what is enrolled here is the class, not a stall:CliWireUnprintablehas no exit field to set to success, and there is no check to run because there is nothing to check. The next-rung trigger for the corpus population is stated as a capability — a census that, per record carrier, resolves the situations its producers can be in and refuses a field unconstrained on one of them. That is the same foldkind_carried_but_its_fields_stay_optionalnames from its end, and neither row retires until it can ask both directions.docs/design-failure-modes.mdis a generated projection and is deliberately not regenerated here;heal-generated-artifactsderives it. (The local gate cannot run on this tree at all —src/v2/lens/module_graph.dagfails to resolve on currentmain, unrelated to this change.)🤖 Generated with Claude Code
https://claude.ai/code/session_01VQ4iThiZ1B9LPB9ePr8qa9