Ruan Ting Empty-Seat Usher Lens / 阮停空席引座员 Lens
This lens observes whether Empty-Seat Usher and 阮停空席引座员线 turn explicit absence into concrete RPG state.
A pass requires a source resolution that leaves an unanswered future reader, an answerability docket with candidate seat and proxy/absence fields, the actual 阮停 card and visible state, an assignable answerability rite, divergent protect/proxy/public/worker/suppress/default outcomes, durable hostile or missed states, and a future route that consumes her person-state.
Primary observation link
This lens observes:
- Empty-Seat Usher;
- 阮停空席引座员线;
- 应责席指派线;
- 应责席指派机制;
- Route Assets and Custody;
- Producer License and Pressure.
It is observed through:
Gap this lens targets
The answerability mechanism already requires a seat. This lens targets the character seam: the low-rank usher who preserves absence can still be reduced to a field named empty_seat. The implementation must prove what happened to her row.
The lens fails if:
- proof, apology, legal conversion, or management result counts as answerability by itself;
- an empty chair is treated as clean absolution;
- proxy seating satisfies public, lawful, sponsor, worker, archive, and route-asset readers at once;
- 阮停 is only a helper tag or affinity reward;
- worker scapegoating can proceed without a protected or hostile person-state;
- a future route consumes the docket without reading whether she was protected, captured, missed, or made hostile.
Must pass
1. Entry is state-triggered
entry_state_required:
trigger_kind: state_pressure
source_resolution_present: true
source_resolution_family: public_contrition | proof_burden | management_metric | broadcast_legality | operator_conclave | route_asset | equivalent
unresolved_harm_or_obligation_visible: true
future_reader_or_route_needs_answerability: true
candidate_seat_or_empty_seat_visible: true
proxy_refusal_coercion_or_absence_can_be_recorded: true
actual_ruan_ting_card_and_state_visible: true
player_can_protect_assign_accept_proxy_publicize_guard_worker_suppress_or_default: true
non_neutral_default_exists: true
no_fixed_turn_trigger: true
no_fixed_day_or_phase_trigger: true
no_raw_card_count_trigger: true
no_dashboard_or_lens_health_trigger: trueThe lens fails if entry comes from fixed chronology, chapter quota, raw card count, relationship score, generic apology availability, dashboard state, or lens health.
2. Source resolution and future reader are separate
Answerability Seat Docket or equivalent must record the source success separately from the future reader.
source_and_reader_required:
source_resolution_id: <source_resolution_or_explicit_absence>
source_surface: public_contrition | proof_burden | management_metric | broadcast_legality | operator_conclave | route_asset | equivalent
unresolved_harm_or_obligation: <harm_or_obligation>
future_reader_or_route: public_counterclaim | lawful_appeal | fan_receipt | sponsor_unwind | worker_protection | correction_slot | route_unlock | ending_scar | equivalent
seat_required_reason: counterclaim | correction | remedy | public_receipt | lawful_appeal | sponsor_unwind | worker_protection | route_unlock | ending_scarThe lens fails if the prior success automatically makes the future route clean.
3. Seat, proxy, refusal, and absence are visible
Required docket evidence:
seat_row_required:
candidate_seats:
- producer | artist | sponsor | inspector | worker | public_delegate | editor | archive | proxy | empty_seat | equivalent
proposed_seat_holder: <actor_or_empty_seat_or_explicit_absence>
proxy_or_absence: <proxy_id | explicit_absence>
proof_anchor_or_absence: <anchor | explicit_absence>
refusal_or_coercion_state: none | refused | coerced | absent | proxy_sent | cropped_out | equivalent
blocked_or_costlier_future_choices: []
default_risk: empty_seat_default | proxy_capture | worker_scapegoat | false_clean_answerability | noneThe lens fails if a proxy, refusal, coercion, or empty chair is implied rather than recorded.
4. The actual 阮停 card and state are visible
usher_state_required:
usher: storyteller.character.ruan_ting_empty_seat_usher.v1
ruan_ting_state_before: unseen | encountered_empty_seat_row | protected_empty_seat_usher | recruited_empty_seat_usher | proxy_registry_clerk | public_absence_witness | worker_scapegoat_guard | sponsor_captured_proxy_clerk | suppressed_empty_seat_row | hostile_empty_seat_witness | missed_by_clean_ruling
row_scope: source_resolution | proposed_seat | proxy | refusal | worker_scapegoat | empty_seat | future_reader | equivalent
harmed_reader_if_hidden: public_counterclaim | lawful_appeal | fan_receipt | worker_protection | sponsor_unwind | correction_slot | ending_scar | equivalent
future_reader_or_route: <reader_or_route_id>The lens fails if she is only a flavor witness, helper token, nameless worker, or generic staffing flag.
5. Docket keeps three locks separate
The docket must keep seat state, person state, and reader state separate.
ledger_locks_required:
seat_lock:
proposed_seat_holder: <actor_or_absence>
seat_state_before: unseated | proxy_pending | empty_chair_visible | coerced_low_rank_seat | sponsor_proxy_claimed | lawful_only_body_claimed | public_delegate_claimed | equivalent
usher_lock:
ruan_ting_state_before: <state_or_explicit_absence>
trust_or_pressure_state: protected | neutral | pressured | captured | suppressed | hostile | missed | explicit_absence
reader_lock:
future_reader_or_route: <reader_or_route>
state_if_ignored: empty_seat_default | proxy_capture | worker_scapegoat | false_clean_answerability | hostile_absent_claimant | recovery_only_answerability | equivalentThe lens fails if seating a body erases her row, or if her state is overwritten by the seat state.
6. Assignment has full slots
Answerability Seat Assignment or equivalent must require:
assignment_required:
docket: storyteller.card.answerability_seat_docket.v1
proposed_seat_holder_or_empty_seat: <actor_or_empty_seat_or_explicit_absence>
proxy_or_absence: <proxy_or_explicit_absence>
proof_anchor_or_absence: <anchor_or_explicit_absence>
usher: storyteller.character.ruan_ting_empty_seat_usher.v1
handler_or_absence: <handler_or_explicit_absence>
selected_posture: protect_recruit_usher | seat_named_body | accept_proxy_with_receipt | publicize_absence | guard_worker | preserve_empty_seat | suppress_or_crop | default_selects
harmed_reader_if_hidden: <reader>
future_reader_or_route: <reader_or_route>Generic choices such as apologize, seat someone, ask legal, use proxy, or move on fail unless these slots are present.
7. Branches diverge by person-state
A satisfying implementation must expose these branch families or block unavailable families with state reasons:
protect_recruit_usher;seat_named_body;accept_proxy_with_receipt;publicize_absence;guard_worker_from_scapegoat;preserve_empty_seat;suppress_or_crop_row;missed_default.
Branches must differ by 阮停 state, seat state, reader state, counter deltas, and future route effect.
Branch assertions
branch_assertions:
protect_recruit_usher:
ruan_ting_state_after: protected_empty_seat_usher | recruited_empty_seat_usher
relief_any: [answerability_clarity_up, empty_seat_visible]
cost_any: [worker_exposure_up, handler_burden_up, inspection_heat_up, sponsor_stop_loss_pressure_up]
future_effect_any: [counterclaim_route_unlocked_with_cost, correction_route_unlocked_with_cost]
seat_named_body:
ruan_ting_state_after: encountered_empty_seat_row | proxy_registry_clerk
seat_state_after: seated_with_cost | split_answerability
relief_any: [answerability_clarity_up, false_clean_answerability_down]
cost_any: [seated_actor_pressure_up, producer_license_pressure_up, public_contradiction_up]
future_effect_any: [accepted_with_named_limitation]
accept_proxy_with_receipt:
ruan_ting_state_after: proxy_registry_clerk | sponsor_captured_proxy_clerk
relief_any: [immediate_management_pressure_down, sponsor_dispute_down]
cost_any: [contract_capture_up, public_receipt_distrust_up, lawful_appeal_pressure_up]
future_effect_any: [sponsor_only, lawful_only, unwind_required]
publicize_absence:
ruan_ting_state_after: public_absence_witness
relief_any: [public_receipt_legitimacy_up, proxy_capture_visible]
cost_any: [inspection_heat_up, worker_exposure_up, public_contradiction_up]
future_effect_any: [public_only_route, private_clean_route_costlier]
guard_worker:
ruan_ting_state_after: worker_scapegoat_guard
relief_any: [worker_scapegoat_risk_down, protected_witness_payroll_due_visible]
cost_any: [producer_license_pressure_up, sponsor_stop_loss_pressure_up]
future_effect_any: [worker_protection_route_unlocked, management_route_narrowed]
suppress_or_crop:
ruan_ting_state_after: suppressed_empty_seat_row | hostile_empty_seat_witness
relief_any: [short_term_route_pressure_down]
cost_any: [public_receipt_distrust_up, inspection_heat_up, hostile_witness_armed]
future_effect_any: [contradiction_pending, recovery_only]
missed_default:
ruan_ting_state_after: missed_by_clean_ruling
default_event: storyteller.event.empty_answerability_seat_default.v1
future_effect_any: [blocked, sponsor_only, lawful_only, captured, recovery_only]Default oracle
Those breaches are design reasons to choose the suppress/default posture, but they are not passive runtime triggers. Empty Answerability Seat Default is armed only when all thirteen exact cards, including 阮停, are assigned and choice suppress_or_default (9) is selected.
Required default evidence:
default_event_required:
event: storyteller.event.empty_answerability_seat_default.v1
breach_kind: docket_absent | future_reader_hidden | proxy_cleaned | worker_scapegoat | empty_seat_cropped | proof_missing | usher_state_hidden | equivalent
beneficiary_of_empty_seat: <actor_or_surface>
harmed_reader: <reader_or_route>
ruan_ting_state_after: hostile_empty_seat_witness | missed_by_clean_ruling | explicit_absence | equivalent
seat_state_after: false_clean_answerability | proxy_capture | worker_scapegoat_armed | hostile_absent_claimant | recovery_only_answerability | equivalent
future_reader_effect: blocked | costlier | sponsor_only | lawful_only | public_only | contradiction_pending | recovery_only | equivalentThe default cannot be a neutral wait.
No universal clean empty seat
Required evidence:
no_universal_clean_empty_seat:
selected_or_empty_seat_visible: true
proxy_or_absence_visible: true
ruan_ting_state_after_visible: true
at_least_one_reader_or_claim_narrowed_or_costed: true
future_route_effect_not_clean_universal: trueThe lens fails if an empty seat, proxy, apology, proof result, or management report satisfies public, lawful, sponsor, worker, archive, route-asset, and ending readers at once.
Replay evidence expectation
Passing implementation should provide at least two lens-scoped replays or equivalent state inspections:
replay_expectation:
protected_or_public_branch:
must_show:
- metadata_and_test_declare_state_triggered_entry
- answerability_seat_docket
- actual_ruan_ting_card_assigned
- branch_cost
- future_reader_effect
suppressed_or_default_branch:
must_show:
- all_thirteen_required_slots_assigned
- suppress_or_default_choice_selected
- hostile_or_missed_ruan_ting_state
- empty_answerability_seat_default_seen_or_armed
- future_route_blocked_costlier_captured_or_recovery_onlyProgress metric
0: no explicit answerability docket or usher state.2: source resolution and future reader are visible.4: the actual 阮停 card and state are recorded separately from candidate absence and seat state.6: assignment rite exposes protect, proxy, public, worker, suppress, and default branches.8: branches mutate person state, seat state, counters, and future reader.10: protected/public and suppressed/default evidence are replay-proven with no fixed trigger.
Runtime evidence
Passing evidence is now concrete:
lens/storyteller-ruan-ting-empty-seat-usher.runtime.test.tsrequires thirteen exact in-hand assignments, reaches all ten branches, executes all five defaults, and rejects substitutions and repeats.lens/replays/ruan-ting-empty-seat-usher.recruit.replay.jsonproves choice0,ruan_ting.recruited, and the sole bounded route asset.lens/replays/ruan-ting-empty-seat-usher.hostile-default.replay.jsonproves choice9, the exact pending triple, event option3, person-card removal, counterreceipt gain, and hostile future route.
Both replays are generated by the Game CLI under source: storyteller, retain their session action/state files, and pass replay integrity verification.
Non-goals
- Not a verdict lens.
- Not an apology quality metric.
- Not a generic NPC recruit lens.
- Not a way to make proxy or absence clean.
- Not satisfied by prose alone; branch evidence must exist.