Branch Eligibility Receipts Lens / 分支资格回执 Lens

This lens observes whether 分支资格回执线 and 分支资格回执机制 prevent meaningful unavailable branches from disappearing as clean non-options.

A pass cannot be achieved by adding lock text, a hint, a disabled button reason, or a replay note. The implementation must prove that the unavailable branch becomes an in-world receipt or a durable silent-suppression default that future play consumes.

This lens observes:

It is observed through:

Observable promise

Storyteller must prove that unavailable choices have custody when absence matters.

The lens passes only when the game can answer:

Which branch was tested, why was it unavailable, who benefited from the lock, who was harmed by not seeing it, what recovery posture exists, and what future route or reader consumes the lock?

The lens fails if the unavailable branch produces only locked, missing prerequisite, insufficient resource, route unavailable, not enough trust, try later, or a UI-only hint with no future route effect.

Exact runtime oracle

Nine real assignments

The rite must expose exactly these required slot/card pairs, require all assigned cards in hand, enforce exact accepts, and require a selected option:

SlotCard ID
receiptstoryteller.card.branch_eligibility_receipt.v1
source_option_setstoryteller.card.branch_eligibility_source_option_set.v1
candidate_branchstoryteller.card.branch_eligibility_candidate_branch.v1
blocker_rowstoryteller.card.branch_eligibility_blocker_row.v1
missing_requirementstoryteller.card.branch_eligibility_missing_requirement.v1
lock_beneficiarystoryteller.card.branch_eligibility_lock_beneficiary.v1
harmed_readerstoryteller.card.branch_eligibility_harmed_reader.v1
proof_bridgestoryteller.card.branch_eligibility_proof_bridge.v1
future_readerstoryteller.card.branch_eligibility_future_reader.v1

Eight exact branch results

Branch IDBranch flagState flagFuture flag
fulfill_requirementbranch_eligibility.branch.fulfill_requirementbranch_eligibility.state.eligibility_restored_with_costfuture_route.branch_eligible_with_named_cost
assign_carrierbranch_eligibility.branch.assign_carrierbranch_eligibility.state.carrier_assignedfuture_route.eligibility_carrier_required
downgrade_branchbranch_eligibility.branch.downgrade_branchbranch_eligibility.state.branch_downgradedfuture_route.downgraded_branch_only
pay_bondbranch_eligibility.branch.pay_bondbranch_eligibility.state.bond_postedfuture_route.eligibility_bond_required
publish_absencebranch_eligibility.branch.publish_absencebranch_eligibility.state.absence_publishedfuture_route.public_absence_receipt_required
accept_recovery_onlybranch_eligibility.branch.accept_recovery_onlybranch_eligibility.state.recovery_only_acceptedfuture_route.branch_recovery_only
suppress_lockbranch_eligibility.branch.suppress_lockbranch_eligibility.state.lock_suppressedfuture_route.suppressed_branch_challenge_armed
default_silentbranch_eligibility.branch.default_silentbranch_eligibility.state.silent_default_pendingfuture_route.silent_branch_suppression_pending

Each run must leave exactly one of each category true. default_silent alone sets the four pending flags; all other branches clear them.

Default gate and terminals

The event requires default_silent, rejects all seven other branch flags, and requires exactly these pending flags:

  • branch_eligibility.silent_default_pending
  • event.silent_branch_suppression.armed
  • future_route.silent_branch_suppression_pending
  • broadcast_reality.branch_falsely_absent

It exposes exactly these three terminal mappings:

Option IDState flagFuture flag
reconstruct_eligibility_receiptbranch_eligibility.state.eligibility_receipt_reconstruction_requiredfuture_route.future_routes_require_eligibility_receipt
publish_hidden_beneficiarybranch_eligibility.state.hidden_lock_beneficiary_exposedfuture_route.public_or_lawful_challenge_required
freeze_false_unavailable_routebranch_eligibility.state.false_unavailable_route_frozenfuture_route.recovery_only_until_blocker_served

Every terminal clears the four pending flags and pending state, sets branch_eligibility.default_resolved plus branch_eligibility.silent_suppression_scar, and leaves exactly one terminal state/future pair.

Adjacency and authority

The lens must distinguish a visible declined offer from a pre-selection unavailable branch. It observes only local option-set eligibility, blocker custody, and future-reader consequences. It must keep all claims of consent, waiver, settlement, route clearance, archive release, proof truth, sponsor authority, fan authority, inspector authority, editor authority, and universal broadcast authority false.

Executable evidence

lens/replays/branch-eligibility-receipts.replay.json must be a deterministic, lens-scoped gameplay export that actually resolves storyteller.rite.branch_eligibility_readback.v1 with the nine assignments, selects default_silent, observes the four pending flags, and resolves reconstruct_eligibility_receipt. The focused runtime test covers all eight branch mappings and all three event terminals from equivalent reset states. Runtime source, the runtime test, the replay, and public rollups must agree on IDs, slots, options, states, futures, pending flags, source storyteller, and the local authority boundary.

Must pass

1. Entry is state-triggered by material unavailable branch

Required evidence:

entry_state_required:
  trigger_kind: state_pressure
  source_option_set_present: true
  candidate_branch_present: true
  candidate_branch_material_to_future_play: true
  eligibility_state_any:
    - locked
    - suppressed
    - downgraded
    - hidden_by_claimant
    - recovery_only
    - explicit_absence
  blocking_surface_visible_or_explicit_absence: true
  missing_or_contested_requirement_visible_or_explicit_absence: true
  lock_beneficiary_visible_or_explicit_absence: true
  harmed_reader_if_silent_visible_or_explicit_absence: true
  future_reader_or_route_consumes_lock_state: true
  player_can_fulfill_assign_downgrade_bond_publish_accept_suppress_or_default: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_week_trigger: true
  no_raw_choice_count_trigger: true
  no_dashboard_or_lens_health_trigger: true

The lens fails if eligibility comes from fixed turn count, day/week interval, chapter quota, raw option count, tutorial state, dashboard state, or lens health.

2. Receipt records branch identity and blocker

分支资格回执 or equivalent must record the unavailable branch as a route object.

receipt_required:
  receipt_id: <stable id>
  source_option_set_id: <choice set, rite, docket, route surface, or package>
  candidate_branch_id: <branch id, branch family, or explicit_hidden>
  candidate_branch_label: <player-facing branch name or explicit_hidden>
  eligibility_state_before: locked | suppressed | downgraded | hidden_by_claimant | recovery_only | explicit_absence
  blocker:
    blocking_surface: capacity | callback | notice | proof | carrier | handler | witness | sponsor | public | lawful | archive | route_asset | producer_license | management_compression | broadcast_reality | equivalent
    blocking_row_id_or_absence: <row id or explicit_absence>
    missing_requirement_or_absence: <requirement or explicit_absence>
    contested_requirement_or_absence: <requirement or explicit_absence>
    exhausted_capacity_or_absence: <capacity or explicit_absence>

The lens fails if the branch is identified only by generic UI label, hidden without reason, or blocked by generic resource shortage with no live row.

3. Beneficiary, harmed reader, and future reader are visible

A valid receipt must name who gains from silence and who is harmed by it, or record explicit absence.

reader_required:
  lock_beneficiary: sponsor | archive | inspector | management | route_asset | public_table | lawful_reader | artist | fan_public | handler | broadcast_reality | explicit_absence | equivalent
  harmed_reader_if_silent: sponsor | archive | inspector | management | route_asset | public_table | lawful_reader | artist | fan_public | handler | broadcast_reality | explicit_absence | equivalent
  future_reader: <reader route package proof window ending scar broadcast_reality or explicit_absence>

The lens fails if lock state cannot be consumed by a future reader.

4. Explanation is in-world and acted on

The receipt may provide player-facing text, but the text is not the mechanic. It must point to an in-world proof bridge, recovery surface, or explicit absence.

explanation_required:
  shown_to_player: true
  reason_text: <short in-world explanation>
  proof_bridge_or_absence: receipt | seal | checksum | witness | docket | carrier | bond | notice | explicit_absence | equivalent
  recovery_posture: fulfill_requirement | assign_carrier | downgrade_branch | pay_bond | publish_absence | accept_recovery_only | suppress_lock | default_silent
  required_recovery_surface_or_absence: <surface or explicit_absence>
  future_route_effect: branch_eligible_with_named_cost | eligibility_carrier_required | downgraded_branch_only | eligibility_bond_required | public_absence_receipt_required | branch_recovery_only | suppressed_branch_challenge_armed | silent_branch_suppression_pending

The lens fails if the explanation is only a hint, tooltip, tutorial note, or debug annotation.

5. Readback assignment is concrete

分支资格回读 must require concrete assignment before resolving.

assignment_required:
  receipt: storyteller.card.branch_eligibility_receipt.v1
  source_option_set_id: <id>
  candidate_branch_id: <id_or_hidden>
  eligibility_state_before: <state>
  blocking_surface: <surface_or_absence>
  blocking_row_id_or_absence: <row_or_absence>
  missing_requirement_or_absence: <requirement_or_absence>
  contested_requirement_or_absence: <requirement_or_absence>
  lock_beneficiary: <actor_or_absence>
  harmed_reader_if_silent: <actor_or_absence>
  proof_bridge_or_absence: <proof_or_absence>
  future_reader: <reader_or_route>
  selected_posture: fulfill_requirement | assign_carrier | downgrade_branch | pay_bond | publish_absence | accept_recovery_only | suppress_lock | default_silent

The lens fails if a famous handler, sponsor payment, legal order, archive seal, edit checksum, or public sympathy unlocks a branch without naming the blocker, requirement, beneficiary, harmed reader, proof bridge, and future effect.

The fields above are rows distributed across the nine exact evidence cards; they are not extra rite slots.

6. Branch families diverge

At least six constructive postures plus a suppression/default posture must be playable or explicitly blocked by state:

  • fulfill requirement;
  • assign carrier;
  • downgrade branch;
  • pay bond;
  • publish absence;
  • accept recovery-only;
  • suppress lock;
  • default silent.

They must differ by eligibility state after, relief surface, cost surface, harmed-reader state, beneficiary state, and future route effect.

7. Constructive branches have relief, cost, and future effect

Any branch that makes an option selectable, partially playable, or cleanly recovery-only must mutate at least three durable surfaces.

constructive_result_required:
  selected_posture: fulfill_requirement | assign_carrier | downgrade_branch | pay_bond | publish_absence | accept_recovery_only
  eligibility_state_after: eligibility_restored_with_cost | carrier_assigned | branch_downgraded | bond_posted | absence_published | recovery_only_accepted
  counter_deltas:
    relief: at_least_one
    cost: at_least_one
    future: at_least_one

Accepted cost surfaces include proof debt, capacity pressure, notice pressure, carrier burden, sponsor stop-loss pressure, producer-license pressure, public distrust, lawful access burden, archive debt, route-asset pressure, management pressure, broadcast-reality contradiction, and recovery-only narrowing.

8. Silent suppression default is durable

default_silent must arm 静默分支压下 after it receipts that a material unavailable branch previously had no adequate receipt, only generic lock text, a hidden blocker/reader/beneficiary, the wrong blocker, or a false recovery-only posture.

Required default evidence:

default_event_required:
  event: storyteller.event.silent_branch_suppression.v1
  source_option_set_id: <id>
  candidate_branch_id_or_absence: <branch id or hidden>
  candidate_branch_label_or_absence: <label or hidden>
  missing_receipt_reason: missing | underfilled | generic_reason_only | hidden_blocker | hidden_harmed_reader | hidden_beneficiary | wrong_blocker | false_recovery_only | equivalent
  suppressed_blocker:
    blocking_surface_hidden_or_absent: capacity | callback | notice | proof | carrier | handler | witness | sponsor | public | lawful | archive | route_asset | producer_license | management_compression | broadcast_reality | hidden | explicit_absence
    blocking_row_hidden_or_absent: <row id, hidden, or explicit_absence>
    missing_requirement_hidden_or_absent: <requirement, hidden, or explicit_absence>
  false_unavailable_claim: prerequisite_never_existed | route_not_viable | claimant_waived | carrier_absent_by_choice | proof_spoiled | capacity_exhausted_cleanly | sponsor_blocked_cleanly | public_notice_unneeded | lawful_reader_closed | management_removed_cleanly | equivalent
  default_actor: sponsor | archive | inspector | management | route_asset | public_table | lawful_reader | artist | fan_public | handler | broadcast_reality | equivalent
  harmed_reader_state_after: hostile | excluded | silenced | public_counter | lawful_challenge | sponsor_capture | recovery_only | explicit_absence
  pending_future_route_effect: silent_branch_suppression_pending
  terminal_future_route_effect: future_routes_require_eligibility_receipt | public_or_lawful_challenge_required | recovery_only_until_blocker_served
  counter_deltas_min: 3

The default fails if it changes only flavor, mood, tutorial state, generic difficulty, or a hidden UI flag.

9. Future reader consumes receipt or default

Passing evidence must show at least one downstream surface reading the receipt or silent default.

Valid future consumers include route-asset custody, declined-offer afterbid, capacity notice service, route discontinuance, management compression, public receipt, lawful annex, sponsor unwind, archive seal, ending scar, or broadcast reality.

The lens fails if the receipt ends at explanation text.

10. No clean silent branch disappearance

The implementation must explicitly fail, default, or route-cost any branch that becomes unavailable while hiding its blocker, harmed reader, beneficiary, or future effect.

Allowed outcomes:

  • false-unavailable pressure;
  • blocked or hostile route;
  • public-only, lawful-only, sponsor-only, carrier-required, or bond-required path;
  • contradiction pending;
  • recovery-only route;
  • late readback with scar.

A clean disappearance is never valid when the candidate branch was material to future play.

Branch assertions

The following relief and cost labels are design categories. Runtime identity is always the exact state and future flag shown in each block.

Fulfill requirement assertion

selected_posture: fulfill_requirement
runtime_state_flag: branch_eligibility.state.eligibility_restored_with_cost
runtime_future_flag: future_route.branch_eligible_with_named_cost
relief_any:
  - named_requirement_served
  - false_unavailable_pressure_down
cost_any:
  - proof_bridge_integrity_down
  - capacity_pressure_up
  - notice_service_pressure_up

Assign carrier assertion

selected_posture: assign_carrier
runtime_state_flag: branch_eligibility.state.carrier_assigned
runtime_future_flag: future_route.eligibility_carrier_required
relief_any:
  - blocker_named
  - branch_path_preserved
cost_any:
  - carrier_burden_up
  - handler_capture_risk_up

Downgrade branch assertion

selected_posture: downgrade_branch
runtime_state_flag: branch_eligibility.state.branch_downgraded
runtime_future_flag: future_route.downgraded_branch_only
relief_any:
  - lesser_branch_playable
cost_any:
  - clean_branch_lost
  - harmed_reader_state: delayed_or_excluded

Pay bond assertion

selected_posture: pay_bond
runtime_state_flag: branch_eligibility.state.bond_posted
runtime_future_flag: future_route.eligibility_bond_required
relief_any:
  - temporary_eligibility_restored
cost_any:
  - bond_debt_up
  - producer_license_pressure_up

Publish absence assertion

selected_posture: publish_absence
runtime_state_flag: branch_eligibility.state.absence_published
runtime_future_flag: future_route.public_absence_receipt_required
relief_any:
  - harmed_reader_erasure_down
  - public_or_lawful_legibility_up
cost_any:
  - sponsor_stop_loss_pressure_up
  - inspection_heat_up

Recovery-only assertion

selected_posture: accept_recovery_only
runtime_state_flag: branch_eligibility.state.recovery_only_accepted
runtime_future_flag: future_route.branch_recovery_only
relief_any:
  - false_clean_route_blocked
cost_any:
  - route_narrows_permanently

Suppression assertion

selected_posture: suppress_lock
runtime_state_flag: branch_eligibility.state.lock_suppressed
runtime_future_flag: future_route.suppressed_branch_challenge_armed
relief_any:
  - immediate_pressure_down_or_option_surface_simplified
cost_any:
  - harmed_reader_challenge_armed

Silent-default assertion

selected_posture: default_silent
runtime_state_flag: branch_eligibility.state.silent_default_pending
runtime_future_flag: future_route.silent_branch_suppression_pending
event_armed: storyteller.event.silent_branch_suppression.v1
pending_flags:
  - branch_eligibility.silent_default_pending
  - event.silent_branch_suppression.armed
  - future_route.silent_branch_suppression_pending
  - broadcast_reality.branch_falsely_absent

Progress metric

branchEligibilityReceiptProgress = 0..10:

  • 0: material unavailable branch disappears without receipt or default.
  • 1: source option set and candidate branch are identifiable.
  • 2: eligibility state and blocking surface are recorded.
  • 3: missing or contested requirement and blocking row are recorded or explicitly absent.
  • 4: lock beneficiary and harmed reader are recorded or explicitly absent.
  • 5: 分支资格回执 enters with recovery posture and future reader.
  • 6: 分支资格回读 requires assignment and offers non-equivalent postures.
  • 7: at least one constructive branch mutates relief, cost, and future route effect.
  • 8: suppress/default branch fires or arms 静默分支压下.
  • 9: a downstream reader consumes receipt or default state.
  • 10: the focused runtime test proves all eight branches and all three terminals, while the durable replay proves the exact nine-assignment default_silent reconstruct_eligibility_receipt target path and absence of fixed turn/day/week/raw-count/dashboard/lens-health triggers.

Minimal replay evidence shape

lens_id: storyteller.lens.branch_eligibility_receipts.v1
result: pass | fail
session_id: lens-branch-eligibility-receipts-v1-<timestamp>
seed: <deterministic-seed>
entry_state:
  trigger_kind: state_pressure
  source_option_set_present: true
  candidate_branch_present: true
  candidate_branch_material_to_future_play: true
  eligibility_state_before: locked | suppressed | downgraded | hidden_by_claimant | recovery_only | explicit_absence
  blocking_surface_visible_or_explicit_absence: true
  missing_or_contested_requirement_visible_or_explicit_absence: true
  lock_beneficiary_visible_or_explicit_absence: true
  harmed_reader_if_silent_visible_or_explicit_absence: true
  future_reader_or_route_consumes_lock_state: true
  no_fixed_turn_trigger: true
receipt:
  offered_card: storyteller.card.branch_eligibility_receipt.v1
  receipt_id: <id>
  source_option_set_id: <id>
  candidate_branch_id: <id_or_hidden>
  blocking_surface: <surface_or_absence>
  missing_requirement_or_absence: <requirement_or_absence>
  lock_beneficiary: <actor_or_reader>
  harmed_reader_if_silent: <actor_or_reader>
  future_reader: <reader_or_route>
target_readback:
  offered_rite: storyteller.rite.branch_eligibility_readback.v1
  assigned_slots: 9
  selected_posture: default_silent
  state_after: branch_eligibility.state.silent_default_pending
  pending_flags: 4
target_event:
  event: storyteller.event.silent_branch_suppression.v1
  selected_terminal: reconstruct_eligibility_receipt
  state_after: branch_eligibility.state.eligibility_receipt_reconstruction_required
  future_after: future_route.future_routes_require_eligibility_receipt
  pending_flags_cleared: 4
focused_runtime_test:
  branch_mappings_covered: 8
  event_terminals_covered: 3
assertions:
  - primary_links_exist
  - entry_is_state_triggered_by_material_unavailable_branch
  - receipt_records_candidate_branch_blocker_beneficiary_harmed_reader_and_future_reader
  - readback_assignment_requires_blocker_missing_requirement_proof_bridge_recovery_posture_and_future_effect
  - branch_families_diverge_across_fulfill_carrier_downgrade_bond_publish_recovery_suppress_and_default
  - constructive_branch_has_relief_cost_and_future_route_effect
  - silent_branch_suppression_default_records_false_unavailable_claim_actor_harmed_reader_and_future_effect
  - future_reader_consumes_receipt_or_default_state
  - no_clean_silent_branch_disappearance
  - no_fixed_turn_day_week_raw_choice_count_dashboard_or_lens_health_trigger

Failure cases

The lens must fail if any of these are true:

  • entry is triggered by fixed turn, day, week, chapter quota, raw choice count, dashboard state, or lens health;
  • unavailable branch has no stable identity or explicit hidden-identity reason;
  • lock reason is generic and does not name a live row or explicit absence;
  • lock beneficiary or harmed reader is hidden without default;
  • branch becomes unavailable but no future reader consumes the absence;
  • recovery unlocks the branch without cost;
  • suppressing the lock does not arm false-unavailable pressure;
  • future play treats the branch as if it was never materially present.

Non-goals

  • Not a tutorial, hint overlay, UI debug layer, analytics dashboard, or governance page.
  • Not a route unlock schedule.
  • Not a raw count lens.
  • Not a duplicate of declined offers, route discontinuance, capacity service, counterreceipts, or management compression.
  • Not valid unless unavailable branch state changes future play.