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.
Primary observation link
This lens observes:
- 残存底线指派线;
- 残存底线指派机制;
- upstream discontinuance surfaces: 路线停办登记线 and 路线停办登记机制;
- adjacent sinks: 复原追偿搁架线, 导出证据回流分岔线, and 可用性读者冲突线;
- Route Assets and Custody and Broadcast Reality.
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: trueThe 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 | equivalentThe 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_explicitOne 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: trueThe 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: 3The 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 | equivalentThe 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: trueFailure 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_presentand not floor state, holder, reader scope, and cost; - replay provenance replaces in-world floor state.