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.

This lens observes:

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: true

The 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_absence

The 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_risk

The 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: 3

The 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_trigger

Progress 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.