Stale Dispatch Recall Lens / 过期派发召回 Lens
This lens observes whether 过期派发召回线 and 过期派发召回机制 prevent changed truth from magically rewriting old local instructions.
A passing implementation proves that when a boundary, ruling, redaction, availability state, rehearsal decision, custody order, or route asset handoff changes, any old instruction already in circulation remains visible until recalled, acknowledged, executed, or explicitly absent.
The lens fails if updated truth silently reaches every recipient for free.
Primary observation link
This lens observes:
It is observed through:
Observable promise
When the correct state changes after an old instruction is already queued, Storyteller must answer:
What changed, what old instruction still exists, who can execute it, who will read the wrong execution, how can the player recall it, what proves acknowledgement, who remains stale, and what happens if the old instruction acts first?
Gap this lens targets
Existing green surfaces cover adjacent pressure but not this exact failure mode:
- 预播排练污染 Lens checks whether a draft trace becomes pseudo-real before final air.
- 阮尺删改速记员 Lens checks whether post-hearing transcript rows survive and are read.
- 认领告知顺序 Lens checks who learns first and what excluded claimants do.
- 裁定读者冲突 Lens checks whether future readers interpret a valid row differently.
- 可用性读者冲突 Lens checks whether scoped access is reused too broadly.
This lens checks whether already-issued local instructions can still execute after those systems changed the world.
Must pass
1. Entry is state-triggered by changed source plus actionable old instruction
Required evidence:
entry_state:
trigger_kind: state_pressure
source_decision_or_boundary_changed: true
source_history_preserved: true
stale_instruction_issued_under_old_state: true
stale_instruction_still_actionable: true
holder_or_recipient_present_or_explicit_absence: true
future_reader_or_route_can_be_affected: true
player_can_recall_or_record_default: true
no_fixed_turn_trigger: true
no_fixed_day_or_week_trigger: true
no_raw_count_trigger: trueValid source changes include preair boundary correction, transcript redaction, availability collision, ruling reader scope, call-sheet reassignment, sponsor retraction, public addendum, ward order, route asset handoff, artist or witness custody boundary, or equivalent stateful change.
The lens fails if entry comes from a fixed turn number, day/week interval, chapter quota, raw content count, dashboard state, lens health, or generic maintenance phase.
2. Source history is preserved
The replay must preserve both old and new states.
source_history:
source_decision_or_boundary: <source id>
source_state_before: <old state>
source_state_after: <new state>
old_instruction_issued_under_state: <old state>
old_instruction_not_erased: trueThe lens fails if the implementation rewrites history so the stale instruction never existed.
3. Stale instruction is concrete
过期派发案卷 must record a concrete instruction.
stale_instruction:
instruction_id: <stable id>
instruction_kind: call_sheet | cutroom_mark | sponsor_copy | public_script | ward_order | corridor_runner_note | pirate_relay_packet | proof_handoff | route_asset_handoff | equivalent
issued_under_state: <old state>
now_conflicts_with_state: <new state>
holder_or_recipient: floor_crew | editor | sponsor | inspector | archive | fan_delegate | ward | runner | pirate_relay | artist_proxy | witness_proxy | explicit_absence
stale_action_if_executed: <wrong_move_wrong_cut_wrong_body_wrong_quote_wrong_gate_wrong_airing_or_equivalent>The lens fails if a replay only records needs_update: true, notice_sent: true, or a generic communication counter.
4. Affected readers are visible
The docket must show at least two affected readers, or one reader plus explicit absence.
readers:
- reader_id: <reader-a>
wants: <acceptance demand>
harmed_if_stale: true
- reader_id: <reader-b-or-explicit-absence>
wants: <acceptance demand or explicit_absence>
harmed_if_stale: true | falseThe lens fails if the stale instruction can execute without naming who reads or suffers the wrong version.
5. Acknowledgement surface is visible
The implementation must distinguish a sent recall from an acknowledged recall.
Valid acknowledgement surfaces include:
- signed stub;
- checksum;
- voice acknowledgement;
- public line;
- docket stamp;
- witness receipt;
- route asset tag;
- explicit absence.
recall_requirements:
recall_channel: live_floor_bulletin | lawful_notice | cutroom_patch | sponsor_retraction | public_addendum | runner_relay | quarantine_order | split_recall | explicit_absence
acknowledgement_surface: signed_stub | checksum | voice_ack | public_line | docket_stamp | witness_receipt | route_asset_tag | explicit_absence
handler_or_absence: <handler or explicit_absence>The lens fails if a sent message automatically counts as received.
6. Recall rite is assignable
过期派发召回 must require:
assignment:
docket: storyteller.card.stale_dispatch_docket.v1
source_decision_or_boundary: <source id>
source_state_after: <state>
stale_instruction: <instruction id>
stale_holder_or_recipient: <recipient or explicit_absence>
selected_recall_channel: live_floor_bulletin | lawful_notice | cutroom_patch | sponsor_retraction | public_addendum | runner_relay | quarantine_order | split_recall | accept_stale_default
handler_or_explicit_absence: <handler or explicit_absence>
acknowledgement_surface_or_explicit_absence: <surface or explicit_absence>
reader_to_protect: <reader id>
reader_left_stale_or_explicit_absence: <reader id or explicit_absence>
accepted_cost: <cost id>
future_reader_or_route_effect: <effect id>Generic options such as notify everyone, fix the call sheet, tell legal, send memo, or update route asset fail unless they fill these fields.
7. Branch families diverge
At least five branch families plus a default must be playable or explicitly blocked by state:
live_floor_bulletin;cutroom_patch;lawful_notice;sponsor_retraction;public_addendum;runner_relay;split_recall;quarantine_order;stale_execution_default.
Each resolved branch must differ by:
branch_non_equivalence:
recall_channel: <channel>
acknowledgement_surface: <surface or explicit_absence>
protected_reader: <reader>
stale_or_scoped_reader: <reader or explicit_absence>
cost_profile: <different cost>
future_route_effect: <different effect>The lens fails if all branches become clean global update or all future readers accept the same state.
8. Universal update is not free
A branch that recalls every affected reader may pass only if all are true:
universal_recall_allowed_only_if:
all_affected_recipients_named: true
acknowledgement_surface_for_each_required_reader: true
cost_min: 2
future_reader_or_route_effect_present: true
no_clean_erase_of_old_instruction: trueThe lens fails if high-rank authority, sponsor money, law, archive stamp, public popularity, or editor skill updates all recipients without acknowledgement and cost.
9. Partial recall is supported
A satisfying implementation must allow or explicitly block partial recall.
partial_recall:
protected_reader: <reader>
reader_left_stale_or_scoped: <reader>
reason_not_global: <cost impossibility contradiction or explicit_absence>
future_effect: split_acceptance | costlier | blocked | public_addendum_required | lawful_bridge_required | recovery_onlyThe lens fails if the only non-default success is a clean global recall.
10. Stale execution default is durable
过期派发执行 must fire or be armed when recall is hidden, underfilled, unacknowledged, falsely acknowledged, intentionally skipped, or executed first.
Required event evidence:
stale_execution_event:
event: storyteller.event.stale_dispatch_execution.v1
source_decision_or_boundary: <source id>
source_state_after: <state>
instruction_id: <id>
instruction_kind: <kind>
executed_by: <holder or recipient>
capturing_reader: <reader>
harmed_reader_or_claimant: <reader claimant or explicit_absence>
execution_kind: wrong_body_moved | wrong_cut_aired | wrong_quote_filed | wrong_gate_opened | wrong_proof_delivered | wrong_public_promise | wrong_route_asset_handoff | equivalent
state_after: stale_executed | false_execution | captured_by_old_instruction | route_asset_misdelivered | recovered_with_scar | recovery_only
future_route_effect: blocked | captured | costlier | public_addendum_required | lawful_bridge_required | checksum_required | quarantine_required | recovery_onlyThe lens fails if stale execution is only narration, generic reputation loss, or generic money damage.
11. Recovery keeps a scar
If stale execution is repaired, the route cannot return to a clean unmarked state.
Accepted scars:
- public addendum required;
- lawful bridge required;
- checksum required;
- route asset narrowed;
- stale holder becomes hostile, exposed, absent, or expensive;
- future recall requires stronger acknowledgement;
- recovery-only label persists;
- schedule, proof, handler, runner, crew, or edit load remains consumed.
12. Future reader consumes the result
At least one future route, rite, public statement, proof test, lawful hold, broadcast slot, recovery ward, cutroom action, or route asset must accept, reject, narrow, surcharge, or block based on the recall or stale execution state.
future_acceptance_check:
future_reader: <reader id>
state_before: recall_open | partially_acknowledged | recalled | stale_executed | recovered_with_scar
state_after: <state>
accepted_states: []
rejected_or_costlier_states: []
future_route_effect: <effect>The lens fails if only counters move and future offers remain identical.
Branch assertions
Live-floor bulletin assertion
selected_branch: live_floor_bulletin
relief_any: [false_execution_blocked, wrong_body_moved_blocked, wrong_gate_opened_blocked, custody_clarity_up]
cost_any: [crew_load_up, schedule_pressure_up, public_confusion_up, handler_burden_up]
future_effect_any: [accepts_with_floor_acknowledgement, route_blocked_until_floor_ack, route_narrowed]Cutroom patch assertion
selected_branch: cutroom_patch
relief_any: [final_air_integrity_up, stale_cut_rejected, continuity_hazard_down]
cost_any: [edit_debt_up, source_ambiguity_up, proof_burden_up]
future_effect_any: [checksum_required, stale_cut_costlier, raw_proof_bridge_required]Lawful notice assertion
selected_branch: lawful_notice
relief_any: [custody_clarity_up, lawful_acceptance_up, proof_chain_integrity_up]
cost_any: [inspection_heat_up, bureau_favor_debt_up, public_delay_up, public_confusion_up]
future_effect_any: [lawful_bridge_required, public_addendum_required, lawful_only_until_acknowledged]Sponsor retraction assertion
selected_branch: sponsor_retraction
relief_any: [false_public_promise_blocked, sponsor_copy_scoped, private_capture_down]
cost_any: [sponsor_stop_loss_pressure_up, contract_capture_up, public_receipt_distrust_up, sponsor_retaliation_up]
future_effect_any: [sponsor_only_scar, public_route_costlier, public_correction_required]Public addendum assertion
selected_branch: public_addendum
relief_any: [public_receipt_legitimacy_up, public_confusion_down, private_capture_blocked]
cost_any: [public_panic_up, witness_exposure_up, sponsor_stop_loss_pressure_up, inspection_heat_up]
future_effect_any: [public_addendum_required, lawful_bridge_required, future_public_reader_accepts_with_scar]Runner relay assertion
selected_branch: runner_relay
relief_any: [route_asset_misdelivery_blocked, stale_note_recovered, custody_clarity_up]
cost_any: [runner_risk_up, payroll_leak_up, favor_debt_up, custody_noise_up]
future_effect_any: [route_asset_tag_required, runner_hostility_armed, substitute_required]Split recall assertion
selected_branch: split_recall
relief_any: [selected_reader_can_proceed, contradiction_pressure_down, false_execution_partly_blocked]
cost_any: [source_ambiguity_up, handler_burden_up, correction_pressure_up, future_recovery_cost_up]
future_effect_any: [split_acceptance, scoped_reader_table, costlier_or_blocked_secondary_reader]Quarantine assertion
selected_branch: quarantine_order
relief_any: [false_execution_blocked, breach_risk_down, route_asset_misdelivery_blocked]
cost_any: [route_delay_up, missed_encounter_pressure_up, sponsor_stop_loss_pressure_up, schedule_pressure_up]
future_effect_any: [blocked_until_recall, recovery_only_if_unresolved, substitute_required]Default assertion
selected_branch: stale_execution_default
event_seen_or_armed: storyteller.event.stale_dispatch_execution.v1
relief_any: [immediate_assignment_burden_down]
cost_any: [false_execution_up, harmed_reader_hostility_up, public_confusion_up, inspection_heat_up, route_asset_pressure_up]
future_effect_any: [captured_by_old_instruction, route_blocked_until_recall, route_costlier, recovery_only]Oracle assertions
A binding check should fail unless all assertions below are true.
- Primary links exist —
observesandobserved_throughpoint to concrete Storyteller pages. - Entry is state-triggered — the surface opens from changed source state plus actionable old instruction, not from fixed sequence position.
- Source history is preserved — old state, new state, and issued-under state are all visible.
- Stale instruction exists — the old instruction has id, kind, holder, conflict, and stale action.
- Readers are visible — at least two affected readers or one reader plus explicit absence are named.
- Acknowledgement matters — sent recall is not received recall unless an acknowledgement surface or explicit absence is recorded.
- Assignment slots exist — the rite requires docket, source, stale instruction, holder, channel, handler, acknowledgement, protected reader, stale/scoped reader, cost, and future effect.
- Branches diverge — at least five recall branch families plus default produce different channel, acknowledgement, cost, and future effect.
- No free universal update — global recall requires named recipients, acknowledgement for each required reader, cost, and preservation of old instruction history.
- Partial recall exists or is explicitly blocked — one reader can proceed while another is stale, scoped, delayed, or recorded as explicit absence.
- Default is durable — unacknowledged or hidden stale instruction produces executor, capturing reader, harmed reader, execution kind, and future consequence.
- Recovery keeps scar — repair leaves addendum, bridge, checksum, narrowed route asset, hostile/exposed holder, stronger future recall, recovery-only tag, or consumed load.
- Future reader consumes result — later route acceptance changes based on acknowledgement or stale execution state.
- Replay provenance exists — evidence includes session id, seed, entry state, source history, stale instruction, offered choices, assignments, branch results, event/default if any, counter deltas, future acceptance check, and no fixed trigger flags.
Progress metric
staleDispatchRecallProgress = 0..8:
0: no changed source plus stale instruction provenance.1: source old/new state and issued-under old instruction are visible.2: 过期派发案卷 or equivalent records holder, stale action, readers, acknowledgement requirement, and default.3: 过期派发召回 or equivalent offers assignment slots.4: one recall branch produces relief, cost, and future reader/route effect.5: partial recall or split recognition is visible.6: at least three recall branch families produce non-equivalent acknowledgement states, costs, and future effects.7: 过期派发执行 or equivalent fires/arms on unacknowledged, hidden, or executed stale instruction.8: at least five branch families plus one default are proven with replay/session evidence, including future reader consumption and recovery scar.
Evidence shape
lens_id: storyteller.lens.stale_dispatch_recall.v1
result: pass | fail
session_id: lens-stale-dispatch-recall-v1-<timestamp>
seed: <deterministic-seed>
entry_state:
trigger_kind: state_pressure
source_decision_or_boundary_changed: true
source_history_preserved: true
stale_instruction_issued_under_old_state: true
stale_instruction_still_actionable: true
holder_or_recipient_present_or_explicit_absence: true
future_reader_or_route_can_be_affected: true
no_fixed_turn_trigger: true
no_fixed_day_or_week_trigger: true
source_history:
source_decision_or_boundary: <id>
source_state_before: <state>
source_state_after: <state>
old_instruction_issued_under_state: <old state>
old_instruction_not_erased: true
offered:
card: storyteller.card.stale_dispatch_docket.v1
rite: storyteller.rite.stale_dispatch_recall.v1
docket:
instruction_id: <id>
instruction_kind: <kind>
holder_or_recipient: <holder or explicit_absence>
stale_action_if_executed: <action>
readers:
- reader_id: <reader-a>
harmed_if_stale: true
- reader_id: <reader-b-or-explicit-absence>
harmed_if_stale: true | false
recall_channel: <channel>
acknowledgement_surface: <surface or explicit_absence>
branch_runs:
recall_branch:
selected_recall_channel: live_floor_bulletin | lawful_notice | cutroom_patch | sponsor_retraction | public_addendum | runner_relay | split_recall | quarantine_order
handler_or_explicit_absence: <handler or explicit_absence>
acknowledgement_surface_or_explicit_absence: <surface or explicit_absence>
reader_to_protect: <reader>
reader_left_stale_or_explicit_absence: <reader or explicit_absence>
state_after: recalled | partially_acknowledged | split_recall | quarantined | recovered_with_scar
future_route_effect: <effect>
counter_deltas:
relief: []
cost: []
future: []
stale_default:
event_seen_or_armed: storyteller.event.stale_dispatch_execution.v1
executed_by: <holder>
capturing_reader: <reader>
harmed_reader_or_claimant: <reader or claimant>
execution_kind: wrong_body_moved | wrong_cut_aired | wrong_quote_filed | wrong_gate_opened | wrong_proof_delivered | wrong_public_promise | wrong_route_asset_handoff | equivalent
state_after: stale_executed | false_execution | captured_by_old_instruction | route_asset_misdelivered | recovery_only
future_route_effect: <effect>
future_acceptance_check:
future_reader: <reader id>
accepted_states: []
rejected_or_costlier_states: []
future_route_effect: <effect>
assertions:
- primary_links_exist
- entry_is_state_triggered_by_changed_source_and_actionable_old_instruction
- source_history_preserved
- stale_instruction_holder_and_stale_action_visible
- affected_readers_visible
- acknowledgement_surface_or_explicit_absence_visible
- recall_rite_has_assignment_slots
- branch_families_diverge_by_channel_acknowledgement_cost_and_future_effect
- universal_notify_all_is_not_free
- partial_recall_is_supported
- stale_execution_default_is_durable
- recovery_keeps_scar
- future_reader_consumes_acknowledgement_or_stale_execution_state
- no_fixed_turn_trigger
- no_fixed_day_or_week_triggerFailure examples
The lens fails if any of these are true:
- a changed source state automatically updates every local instruction;
- the old instruction is deleted rather than preserved as issued-under old state;
- a sent recall counts as acknowledged without a surface;
- the holder or recipient is hidden instead of named or explicitly absent;
notify allhas no recipient list, acknowledgement, cost, or future effect;- partial recall cannot exist and no explicit blocked reason is recorded;
- stale execution only creates flavor confusion;
- recovery erases the stale execution scar;
- future route offers remain identical after recall, partial recall, and stale execution;
- entry depends on a numbered turn, day, week, chapter quota, content count, or lens health.
Non-goals
- Not a governance page.
- Not a communication-methodology note.
- Not a fixed upkeep phase.
- Not raw count satisfaction.
- Not a duplicate of claimant briefing order, ruling reader collision, availability reader collision, preair contamination, or field logistics custody.
- Not valid unless the replay proves an old instruction can be recalled, partly recalled, or executed with durable consequences.