Availability Reader Collision Lens / 可用性读者冲突 Lens

This lens observes whether 可用性读者冲突线 prevents scarred encounter or slot availability from becoming a clean universal access key.

A passing implementation proves that a source availability state is preserved, at least two future readers disagree, the selected branch scopes recognition, reader states diverge, and a future reader consumes the result. It fails if private_only, lawful_only, public_only, sponsor_only, relay_only, floor_locked, ward_held, delayed_with_receipt, substitute_only, missed, or recovery_only can be reused by every route without reader-specific cost.

This lens observes:

It is observed through:

Gap this lens targets

The existing green corpus can make encounters and slots scarce. The uncovered regression risk is downstream: one reader treats that scarce access as broader than it is.

Examples that must now fail unless scoped:

  • lawful interview reused as public testimony;
  • public call reused as admissible custody;
  • sponsor-arranged access reused as neutral access;
  • private/editor encounter reused as public receipt;
  • pirate relay reused as clean chain of custody;
  • displaced slot with receipt reused as free availability;
  • substitute route reused as original recruitment;
  • ward-held or floor-locked target moved without custody or crew scar.

Must pass

1. Entry is state-triggered availability reuse

Required evidence:

entry_state:
  trigger_kind: state_pressure
  source_availability_row_present: true
  source_availability_state_present: true
  source_history_preserved: true
  future_readers_min: 2
  incompatible_access_demands: true
  one_reader_controls_route_or_encounter_progress: true
  player_can_scope_or_record_default: 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 fixed turn number, day/week interval, chapter count, raw content count, dashboard state, lens health, or generic social availability.

2. Source availability row and state are visible

The replay must name the source row and state.

source:
  source_availability_row_id: <stable id>
  source_system: encounter_availability | schedule_preemption | live_floor_load | recovery_ward | fan_delegate | facility_lockdown | route_asset | equivalent
  source_availability_state: private_only | lawful_only | public_only | sponsor_only | relay_only | floor_locked | ward_held | delayed_with_receipt | hostile | substitute_only | missed | recovery_only | equivalent
  target_or_slot: <character npc role slot route asset or explicit_absence>
  source_history_preserved: true

The lens fails if the implementation rewrites the source result to avoid the conflict.

3. At least two future readers are named

可用性读者冲突案卷 must show at least two readers.

readers:
  - reader_id: <reader-a>
    reader_type: public | lawful | sponsor | editor | ward | floor | fan_delegate | archive | route_asset | producer_license | pirate_relay | equivalent
    wants: <access demand>
    minimum_acceptance_surface: <surface>
  - reader_id: <reader-b>
    reader_type: public | lawful | sponsor | editor | ward | floor | fan_delegate | archive | route_asset | producer_license | pirate_relay | equivalent
    wants: <access demand>
    minimum_acceptance_surface: <surface>
incompatibility: public_vs_lawful | sponsor_vs_neutral | private_vs_proof | relay_vs_admissible | off_slot_vs_available | substitute_vs_original | ward_vs_floor | equivalent

One reader plus flavor commentary fails.

4. Reader minimum acceptance surfaces differ

The replay must prove why the readers cannot accept the same availability state cleanly.

Acceptable collisions include:

CollisionRequired distinction
public_vs_lawfulpublic legitimacy is not admissible custody
sponsor_vs_neutralsponsor-controlled access is not neutral access
private_vs_proofprivate contact is not public receipt
relay_vs_admissiblerelay reach is not lawful chain of custody
off_slot_vs_availabledisplaced claim is not still available
substitute_vs_originalsubstitute route is not original target access
ward_vs_floorprotected body and live floor need incompatible custody/load states

The lens fails if incompatibility is implied but not encoded.

5. Assignment slots are explicit

可用性读者冲突听证 must require:

assignment:
  docket: storyteller.card.availability_reader_collision_docket.v1
  collision_row: <row id>
  source_availability_row_id: <stable id>
  source_availability_state: <state>
  target_or_slot: <target slot route asset or explicit_absence>
  reader_a: <reader id>
  reader_b: <reader id>
  incompatibility: <kind>
  selected_recognition_surface: <surface>
  handler_or_explicit_absence: <handler or explicit_absence>
  proof_bridge_or_explicit_absence: <proof bridge or explicit_absence>
  state_boundary: <in-world state boundary>
  future_route_or_reader_effect: <effect>

Generic options like make it public, ask legal, call sponsor, or use substitute fail unless these fields are present.

6. Branch families diverge

A satisfying implementation must expose at least six branch families plus a default:

  • recognize_public_surface;
  • recognize_lawful_surface;
  • recognize_sponsor_surface;
  • split_reader_table;
  • quarantine_availability;
  • accept_substitute_reader;
  • default_capture.

The lens fails if the branches collapse to identical counter deltas or all readers accept the same state.

7. Branch assertions

Public recognition assertion

selected_branch: recognize_public_surface
reader_state_any: [accepted_public_only, accepted_with_public_addendum, neutrality_contested]
relief_any: [public_receipt_legitimacy_up, fan_delegate_visibility_up, private_capture_down]
cost_any: [inspection_heat_up, lawful_access_integrity_down, witness_exposure_up, sponsor_stop_loss_pressure_up]
future_effect_any: [public_route_open_lawful_addendum_required, lawful_route_costlier, sponsor_route_costlier]

Lawful recognition assertion

selected_branch: recognize_lawful_surface
reader_state_any: [accepted_lawful_only, accepted_with_scope, route_asset_narrowed]
relief_any: [lawful_access_integrity_up, proof_chain_integrity_up, archive_legibility_up]
cost_any: [public_receipt_distrust_up, bureau_favor_debt_up, fan_mandate_fracture_up, schedule_pressure_up]
future_effect_any: [lawful_route_open_public_addendum_required, public_reader_scoped, route_asset_narrowed]
selected_branch: recognize_sponsor_surface
reader_state_any: [sponsor_captured, neutrality_contested, accepted_with_scope]
relief_any: [sponsor_stop_loss_pressure_down, immediate_slot_pressure_down, management_pressure_down]
cost_any: [contract_capture_up, public_receipt_distrust_up, route_asset_pressure_up, future_recovery_cost_up]
future_effect_any: [sponsor_route_open_with_capture, public_route_costlier, neutrality_dispute_armed]

Split table assertion

selected_branch: split_reader_table
reader_state_any: [accepted_with_scope, proof_requires_disclosure, accepted_with_public_addendum]
relief_any: [future_route_acceptance_scoped, contradiction_pressure_down, selected_reader_can_proceed]
cost_any: [source_ambiguity_up, handler_fatigue_up, correction_pressure_up, inspection_heat_up]
future_effect_any: [split_public_lawful_routes, proof_disclosure_required, scoped_acceptance_only]

Quarantine assertion

selected_branch: quarantine_availability
reader_state_any: [reader_blocked, target_recovery_only, route_asset_narrowed]
relief_any: [false_availability_reuse_down, breach_risk_down, witness_exposure_down]
cost_any: [route_blocked_up, missed_encounter_pressure_up, sponsor_stop_loss_pressure_up, future_recovery_cost_up]
future_effect_any: [reader_blocked_until_scope, recovery_only, substitute_required]

Substitute assertion

selected_branch: accept_substitute_reader
reader_state_any: [substitute_only, accepted_with_scope, reader_hostile]
relief_any: [immediate_route_unblocked, overload_pressure_down, lawful_exposure_down]
cost_any: [original_target_access_down, public_receipt_legitimacy_down, route_asset_pressure_up, future_recovery_cost_up]
future_effect_any: [route_unlocked_with_weaker_proof, original_reader_hostile, recovery_route_required]

Default capture assertion

selected_branch: default_capture
event_seen_or_armed: storyteller.event.availability_reader_collision_default.v1
reader_state_any: [default_capture_armed, reader_hostile, sponsor_captured, target_recovery_only]
relief_any: [immediate_assignment_burden_down]
cost_any: [availability_reader_collision_up, excluded_reader_hostility_up, future_route_acceptance_down, future_recovery_cost_up]
future_effect_any: [hostile_reader_armed, route_blocked_until_scope, recovery_only]

8. Success has relief, cost, and future reader effect

Every non-default branch must mutate at least:

counter_contract:
  relief_min: 1
  cost_min: 1
  future_reader_or_route_effect_min: 1

A branch that simply grants access or cleans availability fails.

9. Reader states must diverge

Valid post-resolution reader states include:

  • accepted_with_scope;
  • accepted_with_public_addendum;
  • accepted_lawful_only;
  • accepted_public_only;
  • sponsor_captured;
  • neutrality_contested;
  • proof_requires_disclosure;
  • route_asset_narrowed;
  • target_recovery_only;
  • reader_hostile;
  • reader_blocked;
  • default_capture_armed.

The lens fails if all readers become accepted without scope.

10. Default capture names both readers

可用性读者冲突默认 must include:

default_payload:
  source_availability_row_id: <stable id>
  source_availability_state: <state>
  capturing_reader: <reader id>
  excluded_or_harmed_reader: <reader id>
  false_reuse_kind: <kind>
  default_narrator: <actor>
  future_route_effect: <effect>
  recovery_hook: <hook>

The event fails if it only says an encounter was missed, access was denied, or public trust fell.

11. Future reader consumes the result

The replay must show a future reader or route reading the scoped availability result.

Valid future effects include:

  • public_route_open_lawful_addendum_required;
  • lawful_route_open_public_addendum_required;
  • sponsor_route_open_with_capture;
  • split_public_lawful_routes;
  • proof_disclosure_required;
  • reader_blocked_until_scope;
  • route_unlocked_with_weaker_proof;
  • hostile_reader_armed;
  • recovery_only.

Flavor-only reader disagreement fails.

Replay/session contract

lens_id: storyteller.lens.availability_reader_collision.v1
progress_metric: availabilityReaderCollisionProgress
session_id: lens-availability-reader-collision-v1-<timestamp>
seed: <deterministic seed>
entry_state:
  trigger_kind: state_pressure
  source_availability_row_present: true
  source_availability_state_present: true
  source_history_preserved: true
  future_readers_min: 2
  incompatible_access_demands: true
  no_fixed_turn_trigger: true
source:
  source_availability_row_id: <stable id>
  source_system: <system>
  source_availability_state: <state>
  target_or_slot: <target slot route asset or explicit_absence>
offered:
  card: storyteller.card.availability_reader_collision_docket.v1
  rite: storyteller.rite.availability_reader_collision_hearing.v1
collision_row:
  readers:
    - reader_id: <reader-a>
      reader_type: <type>
      minimum_acceptance_surface: <surface>
    - reader_id: <reader-b>
      reader_type: <type>
      minimum_acceptance_surface: <surface>
  incompatibility: <kind>
branch_runs:
  resolved_branch:
    selected_branch: recognize_public_surface | recognize_lawful_surface | recognize_sponsor_surface | split_reader_table | quarantine_availability | accept_substitute_reader
    primary_reader: <reader>
    scoped_or_excluded_reader: <reader>
    reader_states_after: []
    future_route_effect: <effect>
    counter_deltas:
      relief: []
      cost: []
      future: []
  default_branch:
    selected_branch: default_capture
    event_seen_or_armed: storyteller.event.availability_reader_collision_default.v1
    capturing_reader: <reader>
    excluded_or_harmed_reader: <reader>
    false_reuse_kind: <kind>
    future_route_effect: <effect>
assertions:
  primary_links_exist: true
  entry_is_state_triggered_by_availability_reuse: true
  source_availability_row_and_state_are_visible: true
  source_availability_history_is_preserved: true
  future_readers_min_two: true
  incompatible_access_demands_are_visible: true
  reader_minimum_acceptance_surfaces_are_named: true
  branch_families_diverge: true
  resolved_branch_has_relief_cost_and_future_effect: true
  reader_states_diverge: true
  default_capture_names_capturing_and_excluded_readers: true
  default_has_recovery_hook: true
  future_reader_consumes_result: true
  no_universal_availability_key: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_week_trigger: true

Fail-fast checks

Fail immediately when any of these appear:

  • turn == N, after N days, fixed week, fixed chapter, raw content count, dashboard state, or lens-health gate;
  • one reader only;
  • source availability state absent;
  • source history rewritten instead of scoped;
  • excluded reader absent;
  • all readers accept cleanly;
  • default lacks capturing reader;
  • result is not consumed by a future reader or route.

Non-goals

  • Not a bulk expansion lens.
  • Not a generic character availability lens.
  • Not a schedule calendar lens.
  • Not a new verdict lens.
  • Not a replacement for 裁定读者冲突 Lens.
  • Not valid if scarred availability can be reused as clean consensus.