Skip to content

F1-transport: row-grain failure_mode edge beside ObservationOutcome - #7827

Merged
briansrls merged 7 commits into
mainfrom
session/royal-raven-604-transport
Aug 5, 2026
Merged

briansrls merged 7 commits into
mainfrom
session/royal-raven-604-transport

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

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_mode is deliberately many-to-one: Infra and WitnessRed both map to Failed. 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 the Failed arm 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

FloorComponentRow 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; 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, not an Optional standing 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 and not_concluded arms). This is the field the alert seam should route on instead of the Failed outcome.

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_mode asserts both halves — the outcomes still agree (both Failed, 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_mapping covers all five modes.
  • fcr_red_control_tag_built_row_records_no_mode_rather_than_guessing pins ModeUnrecorded rather than letting it default 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.

gunbc-ci-auto-heal and others added 5 commits August 5, 2026 00:19
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>
gunbc-ci-auto-heal added 2 commits August 5, 2026 01:53
…04-transport

# Conflicts:
#	dag/test/claim/floor_component_receipt_witness_test.dag
@briansrls
briansrls merged commit 73413e0 into main Aug 5, 2026
5 checks passed
@briansrls
briansrls deleted the session/royal-raven-604-transport branch August 5, 2026 05:15
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>
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