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.

This lens observes:

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: true

The 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_scar

The 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 | none

The 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 | equivalent

The 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 | equivalent

The 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: true

The 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_only

Progress 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.ts requires 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.json proves choice 0, ruan_ting.recruited, and the sole bounded route asset.
  • lens/replays/ruan-ting-empty-seat-usher.hostile-default.replay.json proves choice 9, the exact pending triple, event option 3, 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.