Skip to content

Per-route effect receipt: a route disagreement classifies as a route disagreement, not a host defect - #12059

Merged
briansrls merged 1 commit into
mainfrom
session/nimble-dove-324
Sep 22, 2026
Merged

briansrls merged 1 commit into
mainfrom
session/nimble-dove-324

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

A route disagreement on effect order is located at the routes, not the host

Closes the one open item from gunbc#12032, at the carrier home gunbc.semantic_conformance.

Defect. DifferentialRecord carried ONE effect_receipt attributed to no route, and classify_bound_record read it before either route arm. When the interpreter and the emitted binary disagree on effect order, the verdict was HostRealizationDefect, which names the host instead of the routes. Worse, for a subject whose authority is a value (every row today), a disagreement was not detected at all: the verdict was Conforms.

Fix (carrier, not consumer).

  • DifferentialRecord.effect_receipt is deleted and replaced by native_v2_effects and v2_evaluator_effects. The old field had one consumer, the witness, which is migrated in the same change.
  • New disposition arm RouteEffectDisagreement, which blocks cutover.
  • route_effect_receipts_disagree: when both v2 routes ran, the two receipts are joined against each other at identity grain (operation + ordinal) using the existing effect_receipts_agree. No expected order is consulted. The subject in the red expects a value. ExpectsEffectOrder is not populated anywhere new, so the split makes the observation attributable without deciding which order is correct (per Sibling-operand effect order: the absence is already declared, so acceptance refuses the programs that depend on it #12034). A route that was not run has recorded nothing, so its empty receipt is never compared.
  • The existing expected-order check (→ HostRealizationDefect) now reads the observed route's receipt. That check is reached only once the routes agree, so which route supplies the receipt cannot change the answer.

Evidence by execution

Run with gunbc run --source-root dag --source-root src/v2 --entry dag/test/claim/self_host_semantic_conformance_witness_test.dag --claim-run:

stage two_routes_disagreeing_on_effect_ordinal_is_a_route_disagreement (red) routes_agreeing_on_effects_classify_by_value_unchanged (control) the 17 existing claims
carrier split + arm type, classifier unchanged FAIL PASS PASS
+ route_effect_receipts_disagree branch PASS PASS PASS

The control is shaped like the #12032 specimen: the routes agree on empty receipts and the native route is wrong on value, giving NativeV2Defect. The control also checks an agreeing nonempty receipt pair, which gives Conforms. #12032 itself is not on main. When it rebases it must rename effect_receipt to the two per-route fields, and that is the entire migration.

Frontier (not built)

This makes the route axis on BehaviorSubjectIdentity concrete: the receipt is now an observation of a route, as it already is in v2.compiler.effect_demand's key. The identity key itself is unchanged here.

🤖 Generated with Claude Code

…ectDisagreement, not a host defect

DifferentialRecord carried one effect_receipt attributed to no route, so the
interpreter and the emitted binary disagreeing on effect order could only land
on HostRealizationDefect. Each v2 route now carries its own receipt, and the
two are joined against each other at identity grain (operation + ordinal)
before any authority order is consulted -- no ExpectsEffectOrder is needed or
populated.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@briansrls
briansrls added this pull request to the merge queue Sep 22, 2026
Merged via the queue into main with commit 45286d6 Sep 22, 2026
4 checks passed
@briansrls
briansrls deleted the session/nimble-dove-324 branch September 22, 2026 20:24
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