Salvage Loadout Recall Lens / 残存装配召回 Lens
This lens observes whether 残存装配召回线 and 残存装配召回机制 prevent a salvage floor from being laundered into a clean route asset slot.
The oracle is: a stopped route’s minimum floor can survive, but it cannot later become generic loadout readiness. The route must recall floor state, holder, original assignment posture, harmed or owed reader, slot use, compatibility risk, selected posture, cost, and future effect.
Primary observation link
This lens observes:
- 残存装配召回线;
- 残存装配召回机制;
- 残存底线指派线 and 残存底线指派机制;
- 路线装配兼容线 and 路线装配兼容机制;
- 路线停办登记线;
- Route Assets and Custody, Broadcast Reality, and Producer License and Pressure.
It is observed through:
Observable promise
Whenever a route loadout attempts to use a salvage floor as a route slot, the game must answer:
What is the source floor, what was its floor state, who holds it, what restriction or original assignment posture travels with it, which slot wants it, who is harmed if it is treated as fresh, and what future route changes after the producer resolves the recall?
The lens fails if a loadout can pass because a salvage floor exists.
Must pass
1. Entry is state-triggered by floor-slot use
Required evidence:
entry_state_required:
trigger_kind: state_pressure
route_loadout_manifest_present_or_requested: true
salvage_floor_present_or_explicit_absence: true
floor_source_route_discontinued_or_recovery_only: true
loadout_slot_attempts_to_use_floor: true
floor_state_before_visible: true
floor_holder_or_explicit_absence_visible: true
original_floor_assignment_posture_or_explicit_absence_visible: true
harmed_or_owed_reader_visible_or_explicit_absence: true
future_reader_or_route_consumes_floor_slot: true
player_can_rescope_bridge_substitute_split_bond_retire_quarantine_or_default: true
no_fixed_turn_trigger: true
no_fixed_day_or_week_trigger: true
no_raw_asset_count_trigger: true
no_raw_route_count_trigger: true
no_dashboard_or_lens_health_trigger: trueThe lens fails if entry depends on fixed turn, day/week interval, route volume, asset volume, generic late-game state, dashboard state, or lens health.
2. Floor state is visible before the slot is accepted
残存底线案卷 or equivalent must provide:
floor_state_required:
source_route_or_asset_id: <route asset or explicit_absence>
floor_kind: evidence_stub | public_notice | lawful_seal | callback_receipt | fan_refund_path | witness_payroll | route_asset_hold | recovery_only_marker | equivalent
floor_state_before: escrowed | lawful_only | public_only | carried | pledged | reopened_with_bond | split_required | retired | ending_scar_pending | quarantined | recovery_only | captured | false_clean | explicit_absence
floor_holder_or_absence: <holder or explicit_absence>
requesting_reader: <reader>
harmed_or_owed_reader_or_absence: <reader or explicit_absence>
original_assignment_posture_or_absence: archive_escrow | public_notice_floor | carrier_hold | bond_and_reopen | split_floor | retire_as_scar | quarantine_floor | suppress_or_default | explicit_absenceThe lens fails if the floor is summarized as available, registered, recoverable, or saved without state and holder.
3. Loadout manifest records the floor as a scoped slot
路线装配清单 or equivalent must record:
loadout_slot_required:
requested_route_or_rite: <route rite package or explicit_absence>
slot_id: <slot>
requested_clean_claim: <claim>
future_reader: <reader>
candidate_asset_is_salvage_floor: true
source_floor_docket_or_absence: storyteller.card.salvage_floor_docket.v1 | explicit_absence
floor_scope_inherited: true
paired_slots_or_absence: []
compatibility_risk: floor_scope_mismatch | holder_absent | retired_floor_loaded_as_fresh | public_floor_in_sponsor_package | lawful_floor_as_public_truth | carried_floor_without_protection | recovery_only_floor_as_route_key | split_floor_collapsed | pledged_floor_without_bond | false_clean_floor_slot | explicit_no_riskThe lens fails if asset_available, floor_present, or route_has_required_assets is enough for the route.
4. Branch postures diverge
A satisfying implementation offers these branch families, or blocks a family with visible state reason:
rescope_floor_slot;bridge_floor_to_loadout;substitute_floor_slot;split_floor_from_loadout;bond_reopen_slot;retire_floor_from_loadout;quarantine_floor_slot;accept_false_loadout_default.
Branches must differ by floor state after, loadout state after, cost/scar, harmed reader handling, and future route effect.
5. Branch assertions
rescope_floor_slot:
floor_state_after: scoped_for_slot
loadout_state_after: compatible_with_floor_scope
relief_any: [route_access_unlocked, false_floor_reuse_down, floor_holder_visibility_up]
cost_any: [excluded_reader_hostility_up, sponsor_or_public_friction_up, handler_burden_up]
future_effect_any: [accepted_with_scope, public_only, lawful_only, sponsor_only]
forbidden: [floor_scope_erased]
bridge_floor_to_loadout:
floor_state_after: bridged
loadout_state_after: bridge_required
relief_any: [route_bundle_legibility_up, custody_clarity_up]
cost_any: [archive_debt_up, inspection_heat_up, public_receipt_debt_up, handler_burden_up]
future_effect_any: [costlier, bridge_required, lawful_annex_or_public_addendum_required]
forbidden: [bridge_without_cost]
substitute_floor_slot:
floor_state_after: floor_residue_recorded
loadout_state_after: substituted
relief_any: [compatibility_conflict_down, route_access_unlocked]
cost_any: [substitute_wear_up, old_floor_scar_pressure_up, route_asset_pressure_up]
future_effect_any: [substituted_slot, old_floor_notice_required, old_floor_recovery_only]
forbidden: [substitution_deletes_floor]
split_floor_from_loadout:
floor_state_after: split_out
loadout_state_after: split_required
relief_any: [incompatible_readers_separated, private_capture_down]
cost_any: [schedule_pressure_up, source_ambiguity_up, carrier_burden_up]
future_effect_any: [route_forked, split_required, future_reconciliation_required]
forbidden: [split_as_universal_acceptance]
bond_reopen_slot:
floor_state_after: reopened_with_bond
loadout_state_after: bond_required
relief_any: [route_reopen_possible, floor_value_preserved]
cost_any: [producer_license_encumbrance_up, sponsor_capture_up, recovery_indemnity_pressure_up]
future_effect_any: [bond_required, recall_reader_armed, costlier]
forbidden: [bond_missing_collateral]
retire_floor_from_loadout:
floor_state_after: retired_as_scar
loadout_state_after: slot_removed_or_route_narrowed
relief_any: [false_reopen_blocked, ending_or_memorial_scar_legibility_up]
cost_any: [route_access_blocked_or_narrowed, fan_or_public_grief_pressure_up, sponsor_stop_loss_pressure_up]
future_effect_any: [recovery_only, scar_inherited, route_blocked_until_substitute]
forbidden: [retired_floor_as_fresh_slot]
quarantine_floor_slot:
floor_state_after: quarantined
loadout_state_after: blocked_until_floor_review
relief_any: [unsafe_reuse_down, false_owner_pressure_down]
cost_any: [route_delay_up, route_asset_pressure_up, management_pressure_up]
future_effect_any: [blocked, recovery_only, proof_review_required]
forbidden: [quarantine_as_free_deferral]Every constructive branch must satisfy relief, cost, and future effect.
6. False default is dual and durable
残存底线扣押默认 and 不兼容装配默认 must both be considered when a false floor slot reaches play.
Required evidence:
default_required:
selected_posture: accept_false_loadout_default
source_floor_docket_or_absence: <docket or explicit_absence>
route_loadout_manifest_or_absence: <manifest or explicit_absence>
default_actor: sponsor | archive | inspector | editor | public_audience | management | producer_absence | route_claimant | broadcast_reality | equivalent
false_floor_claim: floor_present_so_asset_ready | public_floor_closes_sponsor_slot | lawful_floor_counts_as_public_truth | carried_floor_needs_no_protection | recovery_only_floor_is_fresh | retired_floor_can_reopen | split_floor_is_universal | pledged_floor_has_implicit_bond | equivalent
harmed_or_owed_reader: <reader or explicit_absence>
floor_state_after: false_clean_floor_slot | captured | hostile | foreclosure_pending | recovery_only | equivalent
loadout_state_after: false_compatible | captured | contradiction_pending | blocked | recovery_only | equivalent
emitted_or_armed_any:
- storyteller.event.salvage_floor_foreclosure_default.v1
- storyteller.event.incompatible_loadout_default.v1
future_route_effect: blocked | hostile | contradiction_pending | sponsor_unwind_required | public_addendum_required | lawful_annex_required | recovery_only | equivalent
counter_deltas_min: 3The lens fails if the default is only a warning, UI mark, or generic reputation hit.
7. Future reader consumes floor-slot state
At least one downstream surface must read the floor-slot result:
- route accepts floor only with scope;
- public, lawful, sponsor, archive, worker, claimant, memorial, or ending reader requires addendum;
- substitute carries cost and old-floor residue;
- bond remains recallable;
- route becomes costlier, blocked, hostile, contradiction-pending, scar-inherited, or recovery-only;
- broadcast reality receives contradiction or floor foreclosure state.
The lens fails if the result never changes future play.
Replay evidence shape
lens_id: storyteller.lens.salvage_loadout_recall.v1
session_id: lens-salvage-loadout-recall-v1-<timestamp>
seed: <deterministic-seed>
entry_state:
trigger_kind: state_pressure
route_loadout_manifest_present_or_requested: true
salvage_floor_present_or_explicit_absence: true
floor_source_route_discontinued_or_recovery_only: true
loadout_slot_attempts_to_use_floor: true
floor_state_before_visible: true
floor_holder_or_explicit_absence_visible: true
future_reader_or_route_consumes_floor_slot: true
no_fixed_turn_trigger: true
offered:
floor_card: storyteller.card.salvage_floor_docket.v1
loadout_card: storyteller.card.route_loadout_manifest.v1
floor_rite: storyteller.rite.salvage_floor_assignment_hearing.v1
loadout_rite: storyteller.rite.route_loadout_reconciliation.v1
source_floor:
source_route_or_asset_id: <route asset or explicit_absence>
floor_kind: <kind>
floor_state_before: <state>
floor_holder_or_absence: <holder or explicit_absence>
original_assignment_posture_or_absence: <posture or explicit_absence>
harmed_or_owed_reader_or_absence: <reader or explicit_absence>
loadout_use:
requested_route_or_rite: <route rite package or explicit_absence>
slot_id: <slot>
requested_clean_claim: <claim>
future_reader: <reader>
compatibility_risk: <risk or explicit_no_risk>
branch_result:
selected_posture: rescope_floor_slot | bridge_floor_to_loadout | substitute_floor_slot | split_floor_from_loadout | bond_reopen_slot | retire_floor_from_loadout | quarantine_floor_slot | accept_false_loadout_default
floor_state_after: <state>
loadout_state_after: <state>
future_route_effect: <effect>
emitted_event_or_absence: storyteller.event.salvage_floor_foreclosure_default.v1 | storyteller.event.incompatible_loadout_default.v1 | both | explicit_absence
counter_deltas:
relief: []
cost: []
future: []
assertions:
- entry_is_state_triggered
- salvage_floor_is_not_clean_asset_slot
- floor_state_holder_assignment_and_harmed_reader_visible
- loadout_manifest_inherits_floor_scope
- branches_diverge
- success_has_cost
- substitution_or_retirement_leaves_residue
- default_is_dual_and_durable
- future_reader_consumes_floor_slot_state
- no_fixed_turn_day_week_raw_count_dashboard_or_lens_health_triggerProgress metric
salvageLoadoutRecallProgress = 0..10:
0: no salvage floor is involved in loadout.1: route loadout manifest exists or is requested.2: salvage floor or explicit absence is visible.3: source discontinuance or recovery-only state is visible.4: loadout slot attempting to use floor is visible.5: floor state, holder, original posture, and harmed reader are visible or explicitly absent.6: compatibility risk is named.7: player selects a divergent posture.8: branch produces relief, cost, and future effect.9: false default is dual and durable if the floor is misused.10: future route or reader consumes the floor-slot state.
Non-goals
- Not route cancellation.
- Not an asset-count optimizer.
- Not a generic aftershock.
- Not a dashboard or governance page.
- Not a fixed timing surface.
- Not valid if a salvage floor can unlock a future route without recalling floor state, holder, harmed reader, and future effect.