Salvage Loadout Recall / 残存装配召回机制
Salvage Loadout Recall makes a salvage floor reappear as a binding constraint when a later route loadout tries to use it as one asset slot.
残存底线指派机制 already decides who can hold the minimum remaining floor of a stopped, recovery-only, or discontinued route. 路线装配兼容机制 already decides whether several assets can coexist in one future route bundle.
This mechanism covers their intersection: a floor can be validly assigned and still be invalid as a clean route slot unless its floor state is recalled into the loadout manifest.
Design promise
A valid implementation proves that:
- a route loadout cannot consume a salvage floor as generic
asset_available; - the floor state, floor holder, requesting route slot, harmed or owed reader, and previous assignment posture are visible;
- the loadout manifest records which slot is using the floor and what scope travels with it;
- the player can re-scope, bridge, substitute, split, bond, retire, quarantine, or default;
- every constructive outcome changes floor state, loadout state, and future reader effect;
- no trigger depends on a fixed turn, fixed day/week, raw asset count, raw route count, dashboard state, or lens health.
State-triggered entry
Open only from live state pressure:
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: trueValid entry is not “a route has enough assets.” Valid entry is a loadout slot trying to use a salvage floor whose floor restrictions can change the route.
Canonical state object
The mechanism is read through both 残存底线案卷 and 路线装配清单.
salvage_loadout_state:
source_floor:
salvage_floor_docket: storyteller.card.salvage_floor_docket.v1
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
loadout_use:
route_loadout_manifest: storyteller.card.route_loadout_manifest.v1
requested_route_or_rite: <route rite package or explicit_absence>
slot_id: <slot>
requested_clean_claim: <claim>
future_reader: <reader>
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
resolution:
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>Compatibility risk families
floor_scope_mismatch— the floor is public-only, lawful-only, sponsor-only, recovery-only, or scar-only while the route claims wider acceptance.holder_absent— the floor has no holder but the loadout treats it as held.retired_floor_loaded_as_fresh— a floor retired as scar becomes route fuel.public_floor_in_sponsor_package— a public notice or refund path is claimed as sponsor release.lawful_floor_as_public_truth— a lawful seal is used as public consent.carried_floor_without_protection— a worker, witness, claimant, or route asset carries the floor without protection.recovery_only_floor_as_route_key— a recovery-only marker unlocks a fresh route.split_floor_collapsed— a split floor is merged into one clean bundle.pledged_floor_without_bond— a bond/reopen floor is used after collateral disappears.false_clean_floor_slot— a default actor claims the floor was clean enough all along.
Playable operations
| Operation | Immediate relief | Required cost | Future effect |
|---|---|---|---|
| Re-scope floor slot | loadout remains possible with visible boundary | excluded reader or sponsor/public friction rises | accepted with scope, public-only, lawful-only, or sponsor-only |
| Bridge floor to loadout | route can consume floor with proof bridge | handler burden, archive debt, inspection heat, or public receipt debt rises | bridge required or costlier |
| Substitute floor slot | false use of floor is avoided | substitute wears; old floor becomes scar, notice, or recovery-only | substituted slot and floor residue remain |
| Split floor from loadout | incompatible readers stop sharing one floor | schedule pressure, source ambiguity, carrier burden | split required or route forked |
| Bond reopen slot | floor can reopen a limited route | producer license, sponsor capture, or indemnity pressure rises | bond required and recallable |
| Retire floor from loadout | false clean reuse is blocked | route blocked or narrowed; ending/memorial scar pressure rises | recovery-only or scar-inherited |
| Quarantine floor slot | unsafe floor cannot be consumed | delay, sponsor/fan pressure, route asset pressure rises | blocked until review or recovery-only |
| False loadout default | fastest narrator files the floor as clean slot | floor foreclosure and incompatible loadout default harden | captured, blocked, hostile, contradiction-pending, or recovery-only |
Transition rules
1. Floor assignment travels into loadout state
If a floor was escrowed, public-only, carried, pledged, split, retired, quarantined, or recovery-only, the loadout manifest must inherit that state. It cannot load only the floor’s existence.
2. The holder remains visible
A floor holder can be archive, inspector, public table, sponsor desk, worker, claimant, route asset, memorial reader, broadcast reality, or explicit absence. A loadout cannot imply the holder consented.
3. Substitution leaves residue
When a floor is removed from a loadout, it becomes retired, notice-required, recovery-only, hostile, escrowed, or still assigned with a named reason. It cannot disappear.
4. Bond and collateral are not flavor
A reopened-with-bond floor must keep collateral, underwriter, protected reader, and recall reader visible. Missing collateral arms default.
5. Default is dual
When a false floor slot reaches play, both 残存底线扣押默认 and 不兼容装配默认 may fire or remain armed. The implementation must record which one fired, which one remains armed, and why.
Counter contract
Every branch must mutate at least three durable surfaces:
- one
floor_state_afterorfloor_holder_state_after; - one
loadout_state_afteror route-slot state; - one future reader, route, scar, debt, pressure, or recovery effect.
Suggested surfaces:
salvage_floor_pressurefloor_holder_exposurefloor_foreclosure_pressureloadout_integrityasset_slot_pressurecompatibility_conflictroute_reopen_costrecovery_only_pressurearchive_debtinspection_heatpublic_notice_delayfan_oxygen_resentmentsponsor_stop_loss_pressurecontract_capturecarrier_exposurewitness_reprisal_risksource_ambiguityomitted_reader_hostilityproducer_license_encumbranceending_scar_pressurebroadcast_reality_drift
Replay evidence shape
mechanic_id: storyteller.mechanic.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
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
objects:
salvage_floor_docket: storyteller.card.salvage_floor_docket.v1
route_loadout_manifest: storyteller.card.route_loadout_manifest.v1
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:
- floor_assignment_travels_into_loadout_state
- asset_available_is_not_enough
- holder_and_harmed_reader_visible_or_explicit_absence
- branch_postures_diverge
- substitution_leaves_floor_residue
- default_is_dual_and_durable
- future_route_consumes_floor_slot_state
- no_fixed_turn_day_week_raw_count_dashboard_or_lens_health_triggerNon-goals
- Not another route cancellation line.
- Not an inventory optimizer.
- Not a raw asset-count gate.
- Not a generic maintenance check.
- Not a fixed late-game phase.
- Not valid if a salvage floor can become a clean route slot without recalling holder, scope, harmed reader, and future effect.