Repository navigation
F1-transport: row-grain failure_mode edge beside ObservationOutcome - #7827
Merged
Merged
Conversation
floor_component_outcome_of_failure_mode is deliberately many-to-one: Infra and WitnessRed both map to Failed. That is right for the observation record and wrong for anyone deciding what to do next -- a dead runner and a genuinely false claim are different faults with different owners. A consumer holding only the Failed arm had to re-derive the class by sniffing diagnostic prose, which is the string classification this module already refuses at the seed boundary. FloorComponentRow now carries the declared mode beside the outcome, at ROW grain. std.observation is NOT widened: ObservationOutcome stays the canonical record of WHAT the transition was, and the mode records WHICH declared failure vocabulary produced it. Both are derived from ONE tag in one place (floor_component_row_of_failure_mode), so they cannot disagree -- a row whose mode says Infra while its outcome says Done is not constructible through the seed path. An unmodelled mode still refuses in both, so the fail-closed arm is unchanged. ModeUnrecorded is the honest arm for the tag-built constructor, which is handed an outcome directly and genuinely never saw a mode. The seed path never produces it; it is a named state rather than an Optional standing for "not applicable". The seed transport is untouched -- floor_component_row_of_failure_mode's signature is unchanged, so no Rust marshalling moved. Evidence, green by execution with the RED direction checked by deleting the projection line (both then fail): - fcr_infra_and_witness_red_share_an_outcome_but_not_a_mode asserts BOTH halves: the outcomes still agree (both Failed -- the edge did not fork the record) AND the modes differ. Either half alone is satisfiable by a broken projection. - fcr_failure_mode_edge_agrees_with_the_outcome_mapping covers all five modes. - fcr_red_control_tag_built_row_records_no_mode_rather_than_guessing pins ModeUnrecorded rather than defaulting to "none". claim_executor's unreached_components_carry_planned_identity_not_placeholder still passes, exercising the real receipt write through the interpreter with the added field. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
added 2 commits
August 5, 2026 01:53
…04-transport # Conflicts: # dag/test/claim/floor_component_receipt_witness_test.dag
2 tasks done
gunbai-bot Bot
pushed a commit
that referenced
this pull request
Aug 5, 2026
#7827 made failure_mode required on floor_component_row_of; update falsifier_witness_row to pass ModeUnrecorded for synthetic fixture rows. Also pass job_id to falsifier_job_steps in the cold-control order witness after the falsifier-build/falsifier job split. Co-authored-by: Cursor <cursoragent@cursor.com>
gunbai-bot Bot
pushed a commit
that referenced
this pull request
Aug 5, 2026
falsifier_witness_row to pass ModeUnrecorded for synthetic fixture rows. Also pass job_id to falsifier_job_steps in the cold-control order witness after the falsifier-build/falsifier job split. Co-authored-by: Cursor <cursoragent@cursor.com>
gunbai-bot Bot
pushed a commit
that referenced
this pull request
Aug 5, 2026
falsifier_witness_row to pass ModeUnrecorded for synthetic fixture rows. Also pass job_id to falsifier_job_steps in the cold-control order witness after the falsifier-build/falsifier job split. Co-authored-by: Cursor <cursoragent@cursor.com>
briansrls
added a commit
that referenced
this pull request
Aug 5, 2026
…7790) * WIP: Rich PDF citation anchors * Regen extdeps_uri after RFC 3986 percent-encode landing. CI regen_verify_gate_passes failed because dag/extdeps/uri.dag grew without the emitted stage0 mirror; witness test imports trimmed to match sibling uri_witness_test style. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: Rich PDF citation anchors * Surface precise refusal causes at URI percent-encode boundary. UriPercentEncodeRefusalCause carries surrogate, Unicode-max, hex-nibble, and utf8-octet refusals separately instead of flattening to UriHexNibbleOutOfRange with scalar digits; witnesses assert the boundary arms. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: Rich PDF citation anchors * Address review 48086: unicode authority, refusal taxonomy, empty input, RFC cite. Route scalar bounds through std.unicode.types rows; refuse negative scalars at construction; refuse empty code_points instead of minting NonEmptyStr from empty wire; add extdeps.uri_component RFC 3986 section 2.1 anchor (avoids extdeps.uri ↔ external_authority cycle). Co-authored-by: Cursor <cursoragent@cursor.com> * Close URI percent-encode construction bypass and sequence concat debt. Re-validate UriUnicodeScalar at encode entry so directly constructed invalid scalars refuse at the scalar boundary; encode code-point sequences by collecting fragments and joining once. Witnesses cover bypass, negative, empty, and multi-scalar join paths. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: Rich PDF citation anchors * Fix #7790 regen drift and close URI percent-encode blockers. Delete extdeps.uri_component (unscoped RFC section fork); cite section 2.1 inline in extdeps.uri. Mint UriValidatedScalar only via construction; admitted_scalar_wire accepts that carrier only with compile-red controls. Replace growing fragment concat with list_push, reverse, join once. Regen extdeps_uri.rs so regen_verify_gate_passes. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: Rich PDF citation anchors * Fix UriValidatedScalar runtime mint and fragment fold order. Use a record with where unicode_scalar field instead of branded Int cast so construction works at interpreter runtime. Accumulate fragments with list_push and join once (no erroneous reverse). Regen extdeps_uri.rs after design settled. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: Rich PDF citation anchors * Regen extdeps_uri after admitted_cp carrier rename and fix compile-red witnesses. UriValidatedScalar uses admitted_cp (not cp) so it is not structurally interchangeable with UriUnicodeScalar. Regen closes stage0 drift that blocked regen_verify_gate_passes; compile-red controls now refuse bare Int and misspelled field names at the admitted wire entry. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: Rich PDF citation anchors * Close #7790 fragment accumulation cost class with map-then-join regen and measurement. Regenerate extdeps_uri after the scan/map/join shape already in uri.dag, and add an interpreter counter test asserting list_concat_items_copied stays zero on a multi-scalar encode path. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix #7790 accumulation receipt to discriminate list_push scaling. Compare list_push counter pairs at five and fifty encoded scalars so the assertion fails on fold-grown accumulation and passes on scan/map/join. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: Rich PDF citation anchors * Regen extdeps_uri after one-pass scalar encode recut on #7790. Fold prepends each computed wire fragment, reverses once, and joins once so uri_percent_encode_scalar_fragment runs exactly once per scalar; stage0 matches the .dag authority. Co-authored-by: Cursor <cursoragent@cursor.com> * Fix #7790 encode accumulation with map-then-sequence and three-axis receipt. Map each scalar to an encoded-or-refused outcome once, join wires without fold-concat copying; charge list_concat_items_copied for RrbVector operand sizes so the receipt discriminates quadratic prepend accumulation. Co-authored-by: Cursor <cursoragent@cursor.com> * Revert #7790 interpreter instrument edits; restore independent cost receipt. Keep map-then-sequence .dag encoder. Revert list_concat charge change, remove hardcoded eval_call fragment counter, and count uri_percent_encode_scalar_fragment via record_call_frequency watchlist with test-only forensics enable. Co-authored-by: Cursor <cursoragent@cursor.com> * Gate call-frequency forensics toggle behind test_hooks feature. Construction-wall the diagnostic enable path so production builds cannot call set_call_frequency_forensics_for_test or reach the static it toggles. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: Rich PDF citation anchors * Regen extdeps_uri after UriValidatedScalar sole_constructor wall. Sync generated Rust with uri_validated_scalar_construction and the UriValidatedScalarConstruction sum type; regen_stage0 --verify reports regen_divergence_count=0. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: Rich PDF citation anchors * Fix falsifier CI witnesses broken by #7827 failure_mode edge. falsifier_witness_row to pass ModeUnrecorded for synthetic fixture rows. Also pass job_id to falsifier_job_steps in the cold-control order witness after the falsifier-build/falsifier job split. Co-authored-by: Cursor <cursoragent@cursor.com> * Restore URI cost-receipt test hooks removed by accidental 74a1f1f edit. Reinstate set_call_frequency_forensics_for_test and the uri_percent_encode_scalar_fragment watchlist entry required by uri_percent_encode_code_points_cost_shape_receipt in v1-compiler-tests. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: Rich PDF citation anchors * WIP: Rich PDF citation anchors * Fix guarantee probe dark-suite disposition census for sole_constructor migration. The enrolled sole-constructor probes added a fourth MigratedToEnrolledDagProbe row; update the witness ledger counts so CI executes the migration receipt instead of failing on a stale 3×7 expectation. Co-authored-by: Cursor <cursoragent@cursor.com> * Remove unused unicode_scalar import from extdeps.uri. Review 48772 noted the symbol was imported but only the bound constants are referenced. Co-authored-by: Cursor <cursoragent@cursor.com> * Regen extdeps_uri.rs after dropping unused unicode_scalar import. Fixes regen_verify_gate_passes staleness on bd6c53f. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Brian Searls <briansearls1@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com>
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.
Stacked on #7818 (same constructor). Until that merges this PR's diff shows #7818's commits too; the transport-specific change is
dag/gunbc/floor_component_receipt.dag+ its witness.The collapse this undoes
floor_component_outcome_of_failure_modeis deliberately many-to-one:InfraandWitnessRedboth map toFailed. That is correct for the observation record and wrong for anyone deciding what to do next — a dead runner and a genuinely false claim are different faults with different owners. A consumer holding only theFailedarm had to re-derive the class by sniffing diagnostic prose, which is exactly the string classification this module already refuses at the seed boundary.Shape
FloorComponentRowcarries the declared mode beside the outcome, at row grain.std.observationis not widened:ObservationOutcomestays the canonical record of what the transition was; the mode records which declared failure vocabulary produced it.Both are derived from one tag in one place (
floor_component_row_of_failure_mode), so they cannot disagree — a row whose mode saysInfrawhile its outcome saysDoneis not constructible through the seed path. An unmodelled mode still refuses in both, so the fail-closed arm is unchanged.ModeUnrecordedis the honest arm for the tag-built constructor, which is handed an outcome directly and genuinely never saw a mode. The seed path never produces it — it is a named state, not anOptionalstanding in for "not applicable".Seed transport untouched:
floor_component_row_of_failure_mode's signature is unchanged, so no Rust marshalling moved.Consumer note
The JSON gains
"failure_mode"on every row (both the concluded andnot_concludedarms). This is the field the alert seam should route on instead of theFailedoutcome.Evidence
Green by execution; RED direction checked by deleting the projection line, which fails both:
fcr_infra_and_witness_red_share_an_outcome_but_not_a_modeasserts both halves — the outcomes still agree (bothFailed, so the edge did not fork the record) and the modes differ. Either half alone is satisfiable by a broken projection: renaming outcomes apart would pass a modes-differ check while breaking the record; dropping the mode would pass an outcomes-agree check while restoring the blindness.fcr_failure_mode_edge_agrees_with_the_outcome_mappingcovers all five modes.fcr_red_control_tag_built_row_records_no_mode_rather_than_guessingpinsModeUnrecordedrather than letting it default to"none".claim_executor'sunreached_components_carry_planned_identity_not_placeholderstill passes, exercising the real receipt write through the interpreter with the added field.