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

Valid 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

OperationImmediate reliefRequired costFuture effect
Re-scope floor slotloadout remains possible with visible boundaryexcluded reader or sponsor/public friction risesaccepted with scope, public-only, lawful-only, or sponsor-only
Bridge floor to loadoutroute can consume floor with proof bridgehandler burden, archive debt, inspection heat, or public receipt debt risesbridge required or costlier
Substitute floor slotfalse use of floor is avoidedsubstitute wears; old floor becomes scar, notice, or recovery-onlysubstituted slot and floor residue remain
Split floor from loadoutincompatible readers stop sharing one floorschedule pressure, source ambiguity, carrier burdensplit required or route forked
Bond reopen slotfloor can reopen a limited routeproducer license, sponsor capture, or indemnity pressure risesbond required and recallable
Retire floor from loadoutfalse clean reuse is blockedroute blocked or narrowed; ending/memorial scar pressure risesrecovery-only or scar-inherited
Quarantine floor slotunsafe floor cannot be consumeddelay, sponsor/fan pressure, route asset pressure risesblocked until review or recovery-only
False loadout defaultfastest narrator files the floor as clean slotfloor foreclosure and incompatible loadout default hardencaptured, 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_after or floor_holder_state_after;
  • one loadout_state_after or route-slot state;
  • one future reader, route, scar, debt, pressure, or recovery effect.

Suggested surfaces:

  • salvage_floor_pressure
  • floor_holder_exposure
  • floor_foreclosure_pressure
  • loadout_integrity
  • asset_slot_pressure
  • compatibility_conflict
  • route_reopen_cost
  • recovery_only_pressure
  • archive_debt
  • inspection_heat
  • public_notice_delay
  • fan_oxygen_resentment
  • sponsor_stop_loss_pressure
  • contract_capture
  • carrier_exposure
  • witness_reprisal_risk
  • source_ambiguity
  • omitted_reader_hostility
  • producer_license_encumbrance
  • ending_scar_pressure
  • broadcast_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_trigger

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