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.
Primary observation link
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: trueThe 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: trueThe 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 | equivalentOne 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:
| Collision | Required distinction |
|---|---|
public_vs_lawful | public legitimacy is not admissible custody |
sponsor_vs_neutral | sponsor-controlled access is not neutral access |
private_vs_proof | private contact is not public receipt |
relay_vs_admissible | relay reach is not lawful chain of custody |
off_slot_vs_available | displaced claim is not still available |
substitute_vs_original | substitute route is not original target access |
ward_vs_floor | protected 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]Sponsor recognition assertion
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: 1A 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: trueFail-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.