Du Mian Call-Sheet Captain Lens / 杜眠通告单长 Lens

This lens observes whether Call-Sheet Captain and 杜眠通告单长线 turn live-floor truth into a concrete RPG state.

A pass requires a pressured live-floor lane, an official call-sheet claim, a contradictory real floor state, the actual 杜眠 card, assignable reassignment, divergent recruit/public/proxy/skeleton/silence/default outcomes, durable hostile or deliberately missed states, and a future reader that consumes the person-state.

Executable evidence boundary

Page existence and Du Mian-shaped flags are not enough. The runtime oracle requires all eleven exact assignments listed by Call Sheet Reassignment, including card.du_mian_call_sheet_captain, the selected runner lane, the scope-only unselected board row, and storyteller.card.call_sheet_branch_cost_surface.v1. That generic cost card proves the selected branch’s accepted cost, not universal overtime. accept_absence is a choice made after assigning Du Mian, not an alternate captain input. Recruit proof must end with route_asset.du_mian_call_sheet_captain; hostile proof must truly resolve event.crew_refusal_default, clear du_mian.default_pending, event.crew_refusal_default.armed, and future_route.du_mian_recovery_pending, and retain no clean route asset.

Passing durable evidence is:

  • lens/replays/du-mian-call-sheet-captain.recruit.replay.json;
  • lens/replays/du-mian-call-sheet-captain.hostile-default.replay.json;
  • lens/storyteller-du-mian-call-sheet-captain.runtime.test.ts.

This lens observes:

It is observed through:

Gap this lens targets

The live-floor mechanism already proves that a slot needs real crew coverage. This lens targets the character seam: the captain who knows the floor can still be reduced to a boolean helper unless the implementation records what happened to her warning.

The lens fails if:

  • the official call sheet equals real safe coverage;
  • legal, archive, sponsor, or edit success substitutes for a pressured crew lane;
  • 杜眠 only grants a generic safety bonus;
  • her warning can be silenced without hostile or recovery cost;
  • management proxy state counts as clean safety;
  • a future route consumes the floor state 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_slot_or_operation_present: true
  source_slot_family: live_broadcast | rehearsal | security_clearance | memorial | correction | emergency_patch | public_testimony | fan_oxygen_queue | route_asset_handoff | equivalent
  pressured_crew_lane_present: true
  official_call_sheet_claim_visible: true
  real_floor_contradiction_visible: true
  du_mian_card_and_person_state_visible: true
  harmed_reader_if_suppressed_visible: true
  future_slot_or_route_reads_floor_state: true
  player_can_trust_recruit_pay_publicize_force_silence_or_record_absence: true
  non_neutral_default_exists: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_phase_trigger: true
  no_raw_staff_count_trigger: true
  no_dashboard_or_lens_health_trigger: true

The lens fails if entry comes from fixed chronology, raw staff count, chapter quota, lens health, generic affinity, or a management dashboard.

2. Official claim and real contradiction are separate

Call Sheet Load Ledger must record the official claim separately from the real floor contradiction.

floor_truth_required:
  official_call_sheet_claim: safe | staffed | sponsor_paid | legally_ordered | editor_ready | archive_cleared | schedule_priority | equivalent
  real_floor_contradiction: runner_thin_while_board_is_exhausted
  selected_lane: runner
  lane_state_before: thin
  unselected_board: scope_only
  risk_if_warning_silenced_or_absence_accepted: crew_refusal | blackout_skeleton | hostile_leak | absent_captain

The lens fails if the implementation only stores slot_staffed: true or crew_problem: true.

3. The actual 杜眠 card and person-state are visible

captain_state_required:
  captain: card.du_mian_call_sheet_captain
  du_mian_state_before: unseen | call_sheet_warning | floor_crew_advocate | neutral_call_sheet_captain | management_pressure_proxy | public_safety_witness | blackout_skeleton_lead | suppressed_floor_voice | hostile_call_sheet_leak | missed_by_clean_ruling
  absence_semantics: accept_absence_is_a_selected_disposition_not_an_input_card
  warning_scope: selected_lane | slot_safety | public_safety | route_asset_movement | blackout_risk | proof_delivery | audience_gate | oxygen_floor | equivalent
  harmed_reader_if_suppressed: crew_lane | public_safety | witness | route_asset | fan_public | archive_reader | schedule_board | broadcast_reality | equivalent
  future_reader: live_floor_crew_load | broadcast_schedule | blackout_incident | production_triage | stale_dispatch | route_asset_reader | management_compression | equivalent

The lens fails if she is only a helper tag, flavor witness, affinity state, or nameless worker token.

4. Ledger keeps captain state separate from lane state

The ledger must keep four locks separate:

ledger_locks_required:
  slot_lock:
    source_slot: <slot_or_operation_id>
    slot_family: <family>
    future_route_risk_if_explicitly_unworked: blocked | costlier | narrowed | blackout_risk | recovery_only | equivalent
  lane_lock:
    selected_lane: runner
    lane_state_before: thin
    unselected_board: scope_only
    refusal_risk_before: none | low | armed | live | defaulted
    blackout_risk_before: none | low | armed | live
  captain_lock:
    du_mian_state_before: <state>
    warning_scope: <scope>
    trust_or_pressure_state: trusted | neutral | pressured | suppressed | hostile | missed
  reader_lock:
    harmed_reader_if_suppressed: <reader>
    future_reader: <reader>
    state_if_silenced_or_absent: suppressed_floor_voice | hostile_call_sheet_leak | crew_refusal_default | blackout_skeleton_default | route_recovery_only | equivalent

The lens fails if captain state is overwritten by lane state or if her warning disappears after the lane resolves.

5. Reassignment has full slots

Call Sheet Reassignment must require all eleven exact assignments:

assignment_required:
  ledger: card.call_sheet_load_ledger
  source_slot: storyteller.card.call_sheet_memorial_correction_source_slot.v1
  selected_lane: storyteller.card.call_sheet_runner_lane_input.v1
  lane_state_before: storyteller.card.call_sheet_runner_thin_state.v1
  call_sheet_captain_or_absence: card.du_mian_call_sheet_captain
  handler_or_absence: storyteller.card.call_sheet_production_desk_handler.v1
  support_or_absence: storyteller.card.call_sheet_branch_cost_surface.v1
  response: storyteller.card.call_sheet_selected_response.v1
  selected_option: rest_rotate | pay_overtime | recruit_captain | publicize_safety | management_proxy | force_skeleton | silence_warning | accept_absence
  unselected_lane_or_absence: storyteller.card.call_sheet_board_lane_unselected.v1
  unselected_board_semantics: scope_only
  harmed_reader_if_suppressed: storyteller.card.call_sheet_harmed_floor_reader.v1
  future_reader: storyteller.card.call_sheet_future_slot_reader.v1

Generic choices such as listen to her, pay staff, call legal, run the show, or mark safe fail unless these slots are present.

6. Branches diverge by person-state

A satisfying implementation must expose these branch families or block unavailable families with state reasons:

  • recruit_captain;
  • neutral_rotation;
  • pay_overtime;
  • publicize_safety;
  • management_proxy;
  • force_skeleton;
  • silence_warning;
  • accept_absence.

Branches must differ by 杜眠 state, selected lane state, slot state, harmed reader state, counter deltas, and future route effect.

Branch assertions

branch_assertions:
  recruit_captain:
    du_mian_state_after: floor_crew_advocate
    relief_any: [crew_refusal_risk_visible, blackout_risk_down, future_floor_truth_available]
    cost_any: [management_deniability_down, inspection_heat_up, schedule_pressure_up]
    future_effect_any: [safer_route_unlocked_with_cost]
  neutral_rotation:
    du_mian_state_after: neutral_call_sheet_captain
    selected_runner_lane_after: rested | rotated | narrowed
    unselected_board_after: scope_only
    relief_any: [crew_refusal_risk_down, blackout_risk_down]
    cost_any: [schedule_pressure_up, overtime_debt_up, other_lane_load_up]
    future_effect_any: [future_slot_costlier_not_hostile]
  pay_overtime:
    du_mian_state_after: neutral_call_sheet_captain | floor_crew_advocate
    relief_any: [slot_cancellation_risk_down, broadcast_reliability_up]
    cost_any: [overtime_debt_up, payroll_pressure_up, staff_fatigue_up, sponsor_capture_up]
    future_effect_any: [debt_due, future_refusal_risk]
  publicize_safety:
    du_mian_state_after: public_safety_witness
    relief_any: [crew_trust_up, public_safety_legitimacy_up]
    cost_any: [inspection_heat_up, sponsor_stop_loss_pressure_up, public_exposure_up]
    future_effect_any: [public_only, lawful_only, costlier]
  management_proxy:
    du_mian_state_after: management_pressure_proxy
    relief_any: [immediate_slot_dispute_down, sponsor_or_schedule_pressure_down]
    cost_any: [crew_trust_down, false_safety_armed, public_distrust_up]
    future_effect_any: [captured_by_management_or_sponsor]
  force_skeleton:
    du_mian_state_after: blackout_skeleton_lead
    relief_any: [immediate_schedule_pressure_down]
    cost_any: [skeleton_crew_scar_up, blackout_risk_up, staff_fatigue_up]
    future_effect: recovery_only
  silence_warning:
    du_mian_state_after: suppressed_floor_voice
    relief_any: [immediate_slot_dispute_down]
    cost_any: [crew_trust_down, hostile_call_sheet_leak_up, inspection_heat_armed]
    future_effect_any: [default_ready, hostile, recovery_only]
  accept_absence:
    emitted_event: event.crew_refusal_default
    exact_default_pairs:
      - crew_refusal / slot_delayed
      - sponsor_schedule / blackout_skeleton_default
      - hostile_leak / public_safety_leak
      - absent_captain / slot_blocked
    du_mian_state_after_any: [public_safety_witness, blackout_skeleton_lead, hostile_call_sheet_leak, missed_by_clean_ruling]
    selected_runner_lane_after: defaulted
    unselected_board_after: scope_only
    cost_any: [crew_refusal_live, blackout_skeleton_default, public_safety_leak, route_recovery_only]
    future_effect_any: [blocked, costlier, hostile, recovery_only]

Every constructive branch must have relief, cost, and future mutation.

7. Default event is durable

Crew Refusal Default arms only after the explicit silence_warning or accept_absence choice writes all three pending flags. Merely leaving the quick rite unassigned does not fire an event in the current engine. Hidden ledgers, absent lanes, and false management safety remain narrative risks until one of those explicit default branches is selected.

Required default record:

default_required:
  event: event.crew_refusal_default
  source_slot: slot.live.memorial_correction_floor_01
  selected_lane: runner
  unselected_board: scope_only
  du_mian_arming_state: suppressed_floor_voice | missed_by_clean_ruling
  arming_choice: silence_warning | accept_absence
  default_actor: crew_refusal | sponsor_schedule | hostile_leak | absent_captain
  default_state: slot_delayed | blackout_skeleton_default | public_safety_leak | slot_blocked
  harmed_reader: crew_lane_and_public_safety
  future_route_effect: costlier | recovery_only | hostile
  counter_deltas_min: 3

The default fails if it changes only mood, money, generic staffing, generic reputation, or hidden relationship value.

No universal safe call sheet

No branch may make one captain state satisfy every schedule, sponsor, archive, public, crew, route-asset, legal, and broadcast-reality reader cleanly.

no_universal_safe_call_sheet:
  official_claim_visible: true
  real_floor_contradiction_visible: true
  actual_du_mian_card_and_post_choice_state_visible: true
  harmed_reader_if_suppressed_visible: true
  at_least_one_reader_narrowed_or_costed: true
  future_reader_effect_not_clean_universal: true

Replay evidence shape

lens_id: storyteller.lens.character.du_mian_call_sheet_captain.v1
session_id: lens-du-mian-call-sheet-captain-v1-<timestamp>
seed: <deterministic-seed>
entry_state:
  trigger_kind: state_pressure
  source_slot_or_operation_present: true
  pressured_crew_lane_present: true
  official_call_sheet_claim_visible: true
  real_floor_contradiction_visible: true
  du_mian_card_and_person_state_visible: true
  harmed_reader_if_suppressed_visible: true
  future_slot_or_route_reads_floor_state: true
  no_fixed_turn_trigger: true
offered:
  npc_card: card.du_mian_call_sheet_captain
  card: card.call_sheet_load_ledger
  rite: rite.call_sheet_reassignment
branch_result:
  selected_posture: recruit_captain | neutral_rotation | pay_overtime | publicize_safety | management_proxy | force_skeleton | silence_warning | accept_absence
  du_mian_state_after: <state>
  selected_runner_lane_after: <state>
  unselected_board_after: scope_only
  slot_state_after: <state>
  future_reader_effect: <effect>
  counter_deltas:
    relief: []
    cost: []
    future: []
default_branch:
  event_seen_or_armed: event.crew_refusal_default
  accepted_absence_is_branch_state_not_input: true
  default_actor: crew_refusal | sponsor_schedule | hostile_leak | absent_captain
  default_state: slot_delayed | blackout_skeleton_default | public_safety_leak | slot_blocked
assertions:
  - primary_links_exist
  - entry_is_state_triggered
  - official_claim_and_real_floor_contradiction_visible
  - actual_du_mian_card_and_person_state_visible
  - ledger_locks_separate
  - all_eleven_exact_assignment_slots_present
  - branch_outcomes_diverge
  - every_success_has_relief_cost_and_future_effect
  - suppression_proxy_miss_hostile_are_durable
  - default_event_is_durable
  - no_universal_safe_call_sheet
  - no_generic_affinity_staff_count_or_dialogue_only_resolution
  - no_fixed_turn_day_phase_raw_staff_dashboard_or_lens_health_trigger

Progress metric

duMianCallSheetCaptainProgress = 0..10: floor pressure visible, official claim visible, contradiction visible, 杜眠 state visible, ledger locks separate, reassignment offered, constructive branches diverge, suppression/default mutates future play, future reader consumes her person-state, and replay proves recruit/miss/hostile/captured outcomes without universal safe call sheet.

Non-goals

  • Not a generic crew morale check.
  • Not a fixed-turn recruitment scene.
  • Not a staff-count dashboard.
  • Not a free mitigation button.
  • Not another live-floor mechanism; this is the character lens for the captain inside that mechanism.
  • Not valid if 杜眠’s state is only dialogue, affinity, or a one-time safety modifier.