Salvage Floor Assignment Lens / 残存底线指派 Lens

This lens observes whether 残存底线指派线 and 残存底线指派机制 correctly turn a discontinued route’s salvage_floor into scoped, assignable, replay-visible state.

The oracle is: a salvage floor is not a universal clean key. If a route has been stopped, paused, transferred, abandoned, converted to recovery-only, reopened with bond, or defaulted, and a later reader wants to cite, pledge, reopen, memorialize, refund, call back, delete, or consume the remaining floor, the implementation must expose a docket, fillable assignment, divergent branch outcomes, and a foreclosure default.

This lens observes:

It is observed through:

Gap this lens targets

The current mesh already proves that a partially recoverable route cannot disappear cleanly: route discontinuance must record source pressure, claimant or owed reader, carrier or proof anchor, salvage floor, posture, state after, and future effect.

The uncovered regression risk is downstream: after a valid discontinuance row exists, the remaining salvage_floor can still be consumed as if it were clean proof. A public notice can be treated as lawful seal; a lawful seal can be treated as public consent; a worker carrier can be treated as silent holder; a retired scar can be treated as reopen proof; a quarantined floor can be treated as clearance.

This lens closes that gap by requiring future use of the floor to go through assignment, scope, holder, harmed reader, cost, and future-reader mutation.

Must pass

1. Entry is state-triggered by future floor use

Required evidence:

entry_state:
  trigger_kind: state_pressure
  discontinued_or_recovery_only_route_visible: true
  source_discontinuance_row_visible_or_explicit_absence: true
  salvage_floor_present_or_explicit_absence: true
  future_reader_or_route_requests_use: true
  requesting_reader_visible: true
  harmed_or_owed_reader_visible_or_explicit_absence: true
  holder_visible_or_explicit_absence: true
  player_can_assign_split_escrow_bond_retire_quarantine_or_default: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_week_trigger: true
  no_raw_route_count_trigger: true
  no_dashboard_or_lens_health_trigger: true

The lens fails if entry depends on fixed chronology, raw route count, cleanup quota, dashboard state, lens health, generic legal review, generic route abandonment, or late-game pressure.

2. Source discontinuance row and floor are visible

残存底线案卷 or equivalent must preserve the upstream row and the floor kind.

source_and_floor_required:
  discontinuance_register_row: <row id or explicit_absence>
  source_route_or_asset_id: <route proof receipt lane room route asset or explicit_absence>
  source_state_after: registered | paused_under_notice | transferred | recovery_only | publicly_abandoned | privately_suppressed | reopened_with_bond | defaulted | equivalent
  salvage_floor_kind: evidence_stub | public_notice | lawful_seal | callback_receipt | fan_refund_path | witness_payroll | route_asset_hold | recovery_only_marker | explicit_absence | equivalent
  floor_state_before: unassigned | carried | escrowed | public_only | lawful_only | sponsor_only | split_required | pledged | retired | suppressed | captured | recovery_only | equivalent
  floor_holder_before: producer | archive | inspector | sponsor | fan_public | worker_carrier | claimant | route_asset | public_table | explicit_absence | equivalent

The lens fails if a later route only says proof remains, can reopen, notice exists, route paused, or route deleted.

3. Reader, harmed reader, holder, and future route are visible

The docket must name the current reader and the reader or claimant harmed by the chosen use.

reader_required:
  requesting_reader: sponsor | lawful_reader | archive | public_fan | artist_boundary | worker_carrier | claimant | route_asset | producer_license | broadcast_reality | equivalent
  harmed_or_owed_reader: <reader or explicit_absence>
  future_reader_or_route: <reader route rite ending memorial correction slot appeal or explicit_absence>
  floor_minimum_use: preserve_claim | enable_reopen | support_refund | support_callback | lawful_reference | public_notice | memorial_receipt | ending_scar | no_use_explicit

One reader plus flavor commentary fails. A holder that exists only by implication also fails.

4. Hearing assignments are explicit

残存底线指派听证 or equivalent must require concrete assignments or explicit absence.

assignment_required:
  docket: storyteller.card.salvage_floor_docket.v1
  selected_row_or_new_row: <row id>
  selected_posture: archive_escrow | public_notice_floor | carrier_hold | bond_and_reopen | split_floor | retire_as_scar | quarantine_floor | suppress_or_default
  handler_or_absence: <handler clerk runner custodian producer or explicit_absence>
  proof_bridge_or_absence: <archive copy public receipt lawful seal callback receipt checksum fan ledger route asset hold or explicit_absence>
  holder_or_absence: <archive inspector sponsor public table worker carrier claimant route asset producer license or explicit_absence>
  cost_or_collateral_or_absence: <debt heat bond public notice carrier burden ending scar or explicit_absence>
  future_reader_or_route: <reader route rite ending or explicit_absence>

The lens fails if sponsor money, archive stamp, lawful wording, public anger, management priority, or a famous handler can assign the floor without these slots.

5. Branch families diverge

A satisfying implementation must expose at least six constructive branch families plus a default, or explicitly block unavailable families with state reasons:

  • archive_escrow;
  • public_notice_floor;
  • carrier_hold;
  • bond_and_reopen;
  • split_floor;
  • retire_as_scar;
  • quarantine_floor;
  • suppress_or_default.

Branches must differ by floor state after, holder after, reader state, relief, cost, and future route effect.

6. Branch assertions

Archive escrow assertion

selected_posture: archive_escrow
floor_state_after_any: [escrowed, lawful_only]
relief_any: [false_route_deletion_blocked, lawful_reference_preserved, source_trace_legibility_up]
cost_any: [archive_debt_up, inspection_heat_up, public_notice_delay_up, correction_slot_pressure_up]
future_effect_any: [lawful_only, archive_gate_required, public_addendum_required]

Public notice floor assertion

selected_posture: public_notice_floor
floor_state_after_any: [public_only, public_notice_attached]
relief_any: [private_capture_blocked, fan_refund_path_visible, memorial_receipt_legible]
cost_any: [sponsor_stop_loss_pressure_up, lawful_ambiguity_up, fan_oxygen_resentment_up, public_grief_pressure_up]
future_effect_any: [public_only, lawful_addendum_required, sponsor_route_costlier]

Carrier hold assertion

selected_posture: carrier_hold
floor_state_after_any: [carried, carrier_required]
relief_any: [callback_possible, recovery_route_kept_callable, immediate_route_pressure_down]
cost_any: [carrier_exposure_up, handler_burden_up, witness_reprisal_risk_up, claimant_leverage_up]
future_effect_any: [carrier_required, hostile_if_carrier_breaks, protection_required]

Bond and reopen assertion

selected_posture: bond_and_reopen
floor_state_after_any: [pledged, reopened_with_bond]
relief_any: [route_reopen_possible, immediate_block_down, remedy_path_preserved]
cost_any: [producer_license_encumbrance_up, sponsor_capture_up, recovery_indemnity_pressure_up, future_recall_cost_up]
future_effect_any: [bond_required, accepted_with_cost, costlier_reopen]

Split floor assertion

selected_posture: split_floor
floor_state_after_any: [split_required, scoped_to_readers]
relief_any: [selected_reader_can_proceed, contradiction_pressure_down]
cost_any: [source_ambiguity_up, omitted_reader_hostility_up, future_proof_addendum_up]
future_effect_any: [split_required, reader_specific_acceptance, costlier]

Retire as scar assertion

selected_posture: retire_as_scar
floor_state_after_any: [retired, ending_scar_pending]
relief_any: [false_clean_reopen_blocked, claimant_notice_preserved]
cost_any: [route_reopen_blocked, memorial_scar_up, ending_scar_pressure_up]
future_effect_any: [ending_scar_pending, recovery_only, route_blocked_with_notice]

Quarantine floor assertion

selected_posture: quarantine_floor
floor_state_after_any: [quarantined, recovery_only]
relief_any: [false_owner_pressure_down, unsafe_use_blocked, contradiction_risk_down]
cost_any: [route_delay_up, schedule_pressure_up, recovery_only_pressure_up]
future_effect_any: [blocked_until_review, recovery_only, proof_required]

Suppress or default assertion

selected_posture: suppress_or_default
event_seen_or_armed: storyteller.event.salvage_floor_foreclosure_default.v1
floor_state_after_any: [captured, false_clean, hostile, blocked, contradiction_pending, recovery_only]
relief_any: [immediate_assignment_burden_down, clean_report_possible]
cost_any: [hidden_floor_pressure_up, omitted_reader_hostility_up, broadcast_reality_drift_up]
future_effect_any: [hostile, captured, blocked, contradiction_pending, recovery_only]

7. No salvage floor universal clean key

Required evidence:

no_universal_clean_key:
  floor_state_after_not_clean_universal: true
  at_least_one_reader_scoped_harmed_costed_or_blocked: true
  source_discontinuance_row_preserved_or_explicit_absence: true
  future_route_effect_not_clean_universal: true

The lens fails if one salvage floor satisfies sponsor, lawful/archive, public/fan, artist boundary, worker carrier, claimant, route asset, producer license, memorial, ending, and broadcast-reality readers cleanly.

8. Foreclosure default mutates future play

残存底线扣押默认 must fire or arm when the floor is hidden, under-assigned, falsely universalized, pledged without collateral, consumed by the wrong reader, or filed first by another narrator.

Required event evidence:

foreclosure_default_required:
  event: storyteller.event.salvage_floor_foreclosure_default.v1
  source_discontinuance_register_row_or_absence: <row or explicit_absence>
  salvage_floor_kind_or_absence: <kind or explicit_absence>
  floor_state_before_or_absence: <state or explicit_absence>
  missing_or_failed_assignment:
    handler: present | absent
    proof_bridge: present | absent
    holder: present | absent
    cost_or_collateral: present | absent
    harmed_or_owed_reader: present | absent
    future_reader: present | absent
  default_narrator: sponsor | inspector | archive | editor | fan_public | artist_boundary | worker_carrier | claimant | route_asset | management | producer_absence | blackout_system | broadcast_reality | equivalent
  false_claim: <claim>
  floor_state_after: captured | false_clean | sponsor_only | lawful_only | public_only | hostile | blocked | contradiction_pending | recovery_only | equivalent
  future_reader_or_route_effect: blocked | hostile | captured | costlier_reopen | lawful_appeal_required | public_addendum_required | carrier_required | bond_required | ending_scar_pending | recovery_only | contradiction_pending | equivalent
  counter_deltas_min: 3

The default fails if it changes only mood, budget, reputation, route difficulty, or a generic pressure number.

9. Future reader consumes the result

Passing evidence must show at least one downstream route, rite, memorial, ending, correction, callback, refund, archive, public, sponsor, worker, claimant, route asset, producer-license, or broadcast-reality reader consuming the floor state.

future_reader_consumption_required:
  future_reader_or_route_present: true
  reads_floor_state_before_unlock: true
  accepted_states: []
  rejected_or_costlier_states: []
  required_bridge_or_absence: <bridge or explicit_absence>
  future_route_effect: accepted_with_scope | lawful_only | public_only | carrier_required | bond_required | split_required | ending_scar_pending | blocked | hostile | captured | recovery_only | contradiction_pending | equivalent

The lens fails if a future route unlocks from salvage_floor_present without reading floor state, holder, reader scope, and cost.

10. Replay provenance is evidence, not trigger logic

Replay evidence may include source session id, source seed, source row id, current session id, branch choice, counter deltas, and future reader check. Eligibility still depends on current state: a floor exists or should be explicit, and a future reader wants to use it.

Progress metric

salvageFloorAssignmentProgress = 0..8:

  • 0: no future use request or no floor row.
  • 1: source discontinuance row and floor kind are visible or explicit absence is recorded.
  • 2: requesting reader, harmed reader, holder, and future route are visible.
  • 3: 残存底线案卷 records floor state and future effect.
  • 4: 残存底线指派听证 offers explicit assignment slots.
  • 5: at least two constructive branches produce different floor states and future effects.
  • 6: at least six branch families are playable or explicitly blocked by state.
  • 7: 残存底线扣押默认 mutates future route or reader state.
  • 8: replay proves source row, floor row, assignment branch, holder movement, relief, cost, future effect, and downstream reader consumption.

Minimal replay evidence shape

lens_id: storyteller.lens.salvage_floor_assignment.v1
result: pass | fail
session_id: lens-salvage-floor-assignment-v1-<timestamp>
seed: <deterministic-seed>
entry_state:
  trigger_kind: state_pressure
  discontinued_or_recovery_only_route_visible: true
  source_discontinuance_row_visible_or_explicit_absence: true
  salvage_floor_present_or_explicit_absence: true
  future_reader_or_route_requests_use: true
  requesting_reader_visible: true
  harmed_or_owed_reader_visible_or_explicit_absence: true
  holder_visible_or_explicit_absence: true
  no_fixed_turn_trigger: true
floor_docket:
  card: storyteller.card.salvage_floor_docket.v1
  row_id: <row>
  source_discontinuance_register_row: <row or explicit_absence>
  source_route_or_asset_id: <route>
  salvage_floor_kind: <kind>
  floor_state_before: <state>
  floor_holder_before: <holder or explicit_absence>
  requesting_reader: <reader>
  harmed_or_owed_reader: <reader or explicit_absence>
assignment:
  rite: storyteller.rite.salvage_floor_assignment_hearing.v1
  selected_posture: archive_escrow | public_notice_floor | carrier_hold | bond_and_reopen | split_floor | retire_as_scar | quarantine_floor | suppress_or_default
  handler_or_absence: <handler or explicit_absence>
  proof_bridge_or_absence: <proof or explicit_absence>
  holder_or_absence: <holder or explicit_absence>
  cost_or_collateral_or_absence: <cost or explicit_absence>
result:
  floor_state_after: <state>
  assigned_holder_after: <holder or explicit_absence>
  future_reader_or_route_effect: <effect>
  emitted_event: storyteller.event.salvage_floor_foreclosure_default.v1 | none_if_valid
  counter_deltas:
    relief: []
    cost: []
    future: []
future_reader_check:
  reader_or_route: <reader or route>
  reads_floor_state_before_unlock: true
  route_effect_after_branch: <effect>
assertions:
  entry_state_triggered_by_future_floor_use: true
  docket_row_concrete: true
  branch_non_equivalence: true
  no_universal_clean_floor: true
  foreclosure_mutates_future_play: true
  future_reader_consumes_floor_state: true
  no_fixed_turn_day_week_raw_route_count_dashboard_or_lens_health_trigger: true

Failure cases

The lens must fail if any of these are true:

  • entry is fixed-turn, fixed-day, fixed-week, raw route count, cleanup quota, dashboard state, or lens-health triggered;
  • the source discontinuance row or explicit absence is not recorded;
  • a salvage floor lacks floor kind, holder, reader, harmed reader, selected posture, relief, cost, and future effect;
  • the hearing lacks handler, proof bridge, holder, cost/collateral, future reader, or explicit absence;
  • branches collapse to the same floor state;
  • success creates universal clean use;
  • a worker, claimant, route asset, public table, archive, sponsor, or producer license becomes silent holder;
  • a retired or quarantined floor can reopen a route cleanly;
  • foreclosure default is flavor-only;
  • future routes read only salvage_floor_present and not floor state, holder, reader scope, and cost;
  • replay provenance replaces in-world floor state.

Non-goals

  • Not route cancellation.
  • Not route-count cleanup.
  • Not generic appeal, finance, or governance.
  • Not a replacement for 路线停办登记线.
  • Not a replacement for 复原追偿搁架线.
  • Not an ending-only scar check.
  • Not valid unless the floor can be assigned, scoped, costed, defaulted, and consumed by a future reader.