Encounter Availability Routing Lens / 遇见可用性分流 Lens

This lens observes whether 遇见可用性分流线 makes route-critical encounters a playable management/RPG resource instead of leaving every character permanently available.

A passing implementation proves that state pressure from schedule, law, facility access, sponsor capture, editor custody, recovery ward, floor crew, fan mandate, relay, archive custody, or broadcast reality can create a contested encounter window. The replay must show a target or explicit absence, source pressure, at least two access gates, rival or lost encounter, state boundary, future reader, branch choice, costed result, and durable missed/default path.

The lens fails if the package opens from fixed turn number, day count, chapter quota, raw content count, dashboard/lens-health state, or generic relationship availability.

This lens observes:

It is observed through:

Observable promise

The player must not be allowed to treat a route-critical person as globally available after state choices change access. The game must ask:

  • who is needed;
  • why they are needed;
  • which source pressure created the need;
  • which gates now control access;
  • what encounter is rival, narrower, or lost;
  • which route reader consumes the result;
  • what default happens if availability is falsely cleaned.

Must pass

1. Entry is state-driven

Required entry evidence:

entry_state:
  trigger_kind: state_pressure
  route_critical_target_present: true
  target_or_explicit_absence_present: true
  source_pressure_present: true
  access_gate_count_min: 2
  rival_or_lost_encounter_present: true
  future_reader_or_route_consumes_result: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_week_trigger: true
  no_raw_count_trigger: true

The lens fails if entry depends on turn count, day/week interval, chapter quota, raw content count, lens health, or generic social availability.

2. Target and encounter need are visible

The replay must name the person, NPC, role, or explicit absence and why the encounter matters.

target:
  target_entity: <character npc role or explicit_absence>
  target_kind: recruitable | witness | handler | inspector | editor | sponsor_bridge | fan_delegate | ward_patient | floor_captain | pirate_relay | archive_clerk | equivalent
  encounter_need: recruit | interview | testimony | custody_handoff | apology | counterproof | route_unlock | safety_signoff | discharge_hold | correction_slot | equivalent

A generic talk to someone or meet the contact action cannot satisfy this lens.

3. Source pressure preserves prior relief and cost

The availability row must show which prior branch created the encounter pressure and what that branch already changed.

source_pressure:
  source_system: schedule_contract | broadcast_reality_drift | facility_lockdown | recovery_discharge | fan_delegate_mandate | live_floor_load | proxy_posture | sponsor_capture | archive_custody | equivalent
  source_row_or_result_id: <stable id>
  preserved_relief: <relief already earned>
  preserved_cost: <cost already created>

The lens fails if the encounter resets the prior pressure or uses a generic availability flag.

4. At least two access gates are recorded

遇见可用性账本 must record at least two active or absent gates.

Valid gates include:

  • schedule;
  • legal;
  • facility;
  • public;
  • sponsor;
  • editor;
  • ward;
  • floor;
  • relay;
  • handler.

The lens fails if one gate cleanly decides access by itself without a rival gate or explicit absence.

5. Rival or lost encounter is named

The implementation must record what becomes narrower, lost, substitute-only, or recovery-only.

rival_or_lost_encounter: <target route or explicit_absence>
availability_before: available | contested | private_only | lawful_only | public_only | sponsor_only | relay_only | ward_held | floor_locked | substitute_only | missed | recovery_only

Opening an encounter without naming the cost to another route fails.

6. State boundary is not fixed time

The row must name an in-world state boundary:

state_boundary: before_air | before_discharge_signoff | before_route_asset_spent | before_witness_exposed | before_slot_reassigned | before_default_narrator | equivalent

The lens fails if this is encoded as turn N, after X days, chapter number, daily timer, or content-count milestone.

7. Arbitration assignment slots are explicit

遇见窗口仲裁 must require:

assignment:
  ledger: storyteller.card.encounter_availability_ledger.v1
  selected_row: <row id>
  target_entity: <character npc role or explicit_absence>
  encounter_need: <need>
  source_pressure_id: <stable id>
  primary_gate: <gate>
  secondary_gate: <gate>
  availability_before: <state>
  rival_or_lost_encounter: <target route or explicit_absence>
  handler_or_absence: <handler or explicit_absence>
  state_boundary: <state boundary>
  future_reader_or_route: <stable id>

Generic choices like call them, ask legal, use sponsor, or send editor fail unless these slots are present.

8. Branches diverge

A satisfying implementation must expose at least six branch families, including one preservation branch and one missed/default branch:

  • reserve_private_meeting;
  • seat_lawful_interview;
  • broadcast_public_call;
  • trade_sponsor_access;
  • route_through_editor_or_relay;
  • overload_access;
  • defer_substitute_or_default.

Branches must not collapse to the same counter deltas.

9. Branch assertions

Private branch assertion

selected_branch: reserve_private_meeting
availability_after_any: [private_only, available, contested]
relief_any: [witness_exposure_down, route_asset_access_up, source_ambiguity_down, ward_custody_integrity_up]
cost_any: [public_receipt_distrust_up, sponsor_stop_loss_pressure_up, handler_fatigue_up, lawful_access_costlier]
future_effect_any: [private_route_open_with_public_cost, public_route_costlier, follow_up_disclosure_required]

Lawful branch assertion

selected_branch: seat_lawful_interview
availability_after_any: [lawful_only, available, recovery_only]
relief_any: [legal_admissibility_up, inspection_contradiction_down, archive_legibility_up]
cost_any: [bureau_favor_debt_up, public_addendum_pressure_up, fan_mandate_fracture_up, schedule_pressure_up]
future_effect_any: [lawful_route_open, public_route_requires_addendum, sponsor_route_costlier]

Public branch assertion

selected_branch: broadcast_public_call
availability_after_any: [public_only, relay_only, contested]
relief_any: [public_receipt_legitimacy_up, private_capture_down, fan_delegate_visibility_up]
cost_any: [witness_exposure_up, inspection_heat_up, pirate_exposure_up, sponsor_stop_loss_pressure_up]
future_effect_any: [public_route_open_with_retaliation, lawful_appeal_required, relay_protection_required]
selected_branch: trade_sponsor_access
availability_after_any: [sponsor_only, available, substitute_only]
relief_any: [sponsor_stop_loss_pressure_down, immediate_slot_pressure_down, schedule_pressure_down]
cost_any: [contract_capture_up, public_receipt_distrust_up, route_asset_capture_up, future_recovery_cost_up]
future_effect_any: [sponsor_route_open_with_capture, public_route_costlier, default_event_armed]

Editor or relay branch assertion

selected_branch: route_through_editor_or_relay
availability_after_any: [relay_only, private_only, contested]
relief_any: [retaliation_risk_down, route_asset_access_up, immediate_exposure_down]
cost_any: [edit_debt_up, source_ambiguity_up, relay_custody_risk_up, inspection_heat_up]
future_effect_any: [source_disclosure_required, split_public_lawful_routes, contradiction_pending]

Overload branch assertion

selected_branch: overload_access
availability_after_any: [available, recovery_only, substitute_only]
relief_any: [immediate_route_unblocked, slot_saved, proof_contact_made]
cost_any: [crew_load_up, blackout_risk_up, ward_custody_integrity_down, handler_fatigue_up, proxy_hostility_up]
future_effect_any: [access_scar_armed, hostile_followup_armed, recovery_route_required]

Miss/default branch assertion

selected_branch: defer_substitute_or_default
availability_after_any: [substitute_only, missed, recovery_only]
event_seen_or_armed: storyteller.event.missed_encounter_default.v1
relief_any: [immediate_overload_down, legal_exposure_down, sponsor_noise_down]
cost_any: [missed_encounter_risk_up, route_asset_access_down, future_recovery_cost_up, public_contradiction_risk_up]
future_effect_any: [route_blocked_until_substitute, recovery_only, hostile_encounter_armed]

10. Success has cost

Every successful branch must open or preserve one encounter while increasing, spending, narrowing, or exposing another surface.

Valid costs include:

  • public_receipt_distrust;
  • sponsor_stop_loss_pressure;
  • handler_fatigue;
  • bureau_favor_debt;
  • fan_mandate_fracture;
  • schedule_pressure;
  • witness_exposure;
  • inspection_heat;
  • pirate_exposure;
  • contract_capture;
  • route_asset_capture;
  • edit_debt;
  • source_ambiguity;
  • relay_custody_risk;
  • crew_load;
  • blackout_risk;
  • ward_custody_integrity_down;
  • future_recovery_cost.

The lens fails if the encounter opens cleanly and no rival encounter, gate, route, or future reader is harmed or narrowed.

11. Future reader consumes availability

The branch must mutate a future reader or route.

Valid effects include:

  • private_route_open_with_public_cost;
  • lawful_route_open;
  • public_route_requires_addendum;
  • public_route_open_with_retaliation;
  • sponsor_route_open_with_capture;
  • source_disclosure_required;
  • split_public_lawful_routes;
  • access_scar_armed;
  • route_blocked_until_substitute;
  • recovery_only.

Flavor-only meeting text fails.

12. Missed default is durable

错过遇见默认 must fire or be armed when:

  • availability ledger is missing;
  • rival/lost encounter is not named;
  • lawful-only access is reused as public availability;
  • sponsor access is filed as neutral;
  • private/editor route is reused as public proof;
  • public or relay access lacks exposure and lawful appeal cost;
  • ward, floor, facility, or handler capacity is spent without scar;
  • substitute replaces target without route weakening.

Required default payload:

default_payload:
  source_ledger: storyteller.card.encounter_availability_ledger.v1 | explicit_absence
  target_entity: <character npc role or explicit_absence>
  missing_gate_evidence_present: true
  rival_or_lost_encounter_present: true
  default_actor: sponsor | inspector_archive | floor_crew | ward_authority | facility_lock | fan_public | editor_mask | pirate_relay | blackout_system | absent_handler | equivalent
  availability_after: missed | substitute_only | recovery_only | public_only | lawful_only | sponsor_only | relay_only | equivalent
  branch_or_route_blocked: <stable id or none>
  substitute_or_recovery_hook: <hook or none>

Replay evidence expectation

lens_id: storyteller.lens.encounter_availability_routing.v1
session_id: lens-storyteller-encounter-availability-routing-v1-<timestamp>
seed: <deterministic-seed>
entry_state:
  trigger_kind: state_pressure
  target_or_explicit_absence_present: true
  source_pressure_present: true
  access_gate_count_min: 2
  rival_or_lost_encounter_present: true
  future_reader_or_route_consumes_result: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_week_trigger: true
offered:
  card: storyteller.card.encounter_availability_ledger.v1
  rite: storyteller.rite.encounter_window_arbitration.v1
branch_runs:
  preservation_branch:
    selected_branch: reserve_private_meeting | seat_lawful_interview | broadcast_public_call | trade_sponsor_access | route_through_editor_or_relay
    availability_before: <state>
    availability_after: <state>
    opened_encounter: <target or route>
    narrowed_or_lost_encounter: <target route or explicit_absence>
    future_reader_or_route_effect: <effect>
    counter_deltas:
      relief: [<relief>]
      cost: [<cost>]
  miss_branch:
    selected_branch: overload_access | defer_substitute_or_default
    event_seen_or_armed: storyteller.event.missed_encounter_default.v1
    availability_after: missed | substitute_only | recovery_only | public_only | lawful_only | sponsor_only | relay_only | equivalent
    future_reader_or_route_effect: <effect>
assertions:
  - primary_links_exist
  - entry_is_state_triggered
  - target_source_gates_rival_boundary_and_future_reader_visible
  - rite_assignment_slots_explicit
  - branches_diverge
  - success_has_cost
  - missed_default_is_durable
  - no_fixed_turn_or_day_trigger

Non-goals

  • Not raw count expansion.
  • Not a fixed-time missed scene.
  • Not a social hub selector.
  • Not a relationship meter.
  • Not a governance or dashboard page.
  • Not valid if legal, sponsor, editor, schedule, ward, floor, or public access makes every target freely available.