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.
Primary observation link
This lens observes:
- 分支资格回执线;
- 分支资格回执机制;
- adjacent state producers including 未采纳报价回执线, 路线停办登记线, 容量告知送达队列线, 被排除者反回执挑战线, and 经营压缩台机制;
- shared state systems Route Assets and Custody, Broadcast Reality, and Producer License and Pressure.
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:
| Slot | Card ID |
|---|---|
receipt | storyteller.card.branch_eligibility_receipt.v1 |
source_option_set | storyteller.card.branch_eligibility_source_option_set.v1 |
candidate_branch | storyteller.card.branch_eligibility_candidate_branch.v1 |
blocker_row | storyteller.card.branch_eligibility_blocker_row.v1 |
missing_requirement | storyteller.card.branch_eligibility_missing_requirement.v1 |
lock_beneficiary | storyteller.card.branch_eligibility_lock_beneficiary.v1 |
harmed_reader | storyteller.card.branch_eligibility_harmed_reader.v1 |
proof_bridge | storyteller.card.branch_eligibility_proof_bridge.v1 |
future_reader | storyteller.card.branch_eligibility_future_reader.v1 |
Eight exact branch results
| Branch ID | Branch flag | State flag | Future flag |
|---|---|---|---|
fulfill_requirement | branch_eligibility.branch.fulfill_requirement | branch_eligibility.state.eligibility_restored_with_cost | future_route.branch_eligible_with_named_cost |
assign_carrier | branch_eligibility.branch.assign_carrier | branch_eligibility.state.carrier_assigned | future_route.eligibility_carrier_required |
downgrade_branch | branch_eligibility.branch.downgrade_branch | branch_eligibility.state.branch_downgraded | future_route.downgraded_branch_only |
pay_bond | branch_eligibility.branch.pay_bond | branch_eligibility.state.bond_posted | future_route.eligibility_bond_required |
publish_absence | branch_eligibility.branch.publish_absence | branch_eligibility.state.absence_published | future_route.public_absence_receipt_required |
accept_recovery_only | branch_eligibility.branch.accept_recovery_only | branch_eligibility.state.recovery_only_accepted | future_route.branch_recovery_only |
suppress_lock | branch_eligibility.branch.suppress_lock | branch_eligibility.state.lock_suppressed | future_route.suppressed_branch_challenge_armed |
default_silent | branch_eligibility.branch.default_silent | branch_eligibility.state.silent_default_pending | future_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_pendingevent.silent_branch_suppression.armedfuture_route.silent_branch_suppression_pendingbroadcast_reality.branch_falsely_absent
It exposes exactly these three terminal mappings:
| Option ID | State flag | Future flag |
|---|---|---|
reconstruct_eligibility_receipt | branch_eligibility.state.eligibility_receipt_reconstruction_required | future_route.future_routes_require_eligibility_receipt |
publish_hidden_beneficiary | branch_eligibility.state.hidden_lock_beneficiary_exposed | future_route.public_or_lawful_challenge_required |
freeze_false_unavailable_route | branch_eligibility.state.false_unavailable_route_frozen | future_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: trueThe 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_pendingThe 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_silentThe 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_oneAccepted 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: 3The 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_upAssign 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_upDowngrade 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_excludedPay 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_upPublish 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_upRecovery-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_permanentlySuppression 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_armedSilent-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_absentProgress 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-assignmentdefault_silent→reconstruct_eligibility_receipttarget 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_triggerFailure 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.