Recovery Inventory Triage / 复原库存分诊机制

Recovery Inventory Triage is the mechanism that prevents crisis recovery from becoming an invisible universal resource. It makes correction slots, ward air, fan oxygen reserves, crew rest, archive proof windows, edit checksum lanes, public contrition minutes, sponsor makegood frames, and custody handlers finite rows that can be allocated, split, reserved, borrowed, quarantined, refused, or captured by default.

The mechanism sits between existing single-surface systems. 赞助补偿库存线 prices sponsor replacement demands. 复原病房出院压迫线 protects bodies from becoming availability toggles. 认领人现场接待线 protects the physical receiving edge. 经营压缩台 prevents costly successes from becoming clean KPI. This mechanism asks the cross-cutting question: when two of those systems want the same finite recovery row, who receives it, who is excluded, and what future reader records the scar?

This mechanism observes pressure from Sponsor Makegood Inventory, Management Compression Desk, Recovery Ward Discharge Pressure, Claimant Floor Intake, Live Floor Crew Load, Cutroom Priority Queue, Broadcast Schedule, Fan Oxygen, and Route Assets and Custody.

It is observed through 复原库存账本, 复原库存分配, and 复原库存夺取默认.

Entry contract

Open this mechanism only when state pressure proves all required inputs:

entry_state:
  trigger_kind: state_pressure
  finite_inventory_row_present_or_explicit_absence: true
  competing_demands_min: 2
  shared_inventory_or_absence_visible: true
  future_readers_min: 2
  player_can_allocate_split_reserve_borrow_quarantine_refuse_or_default: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_week_trigger: true
  no_raw_count_trigger: true

Invalid entry sources:

  • fixed turn count;
  • fixed day/week interval;
  • chapter quota;
  • raw number of crises;
  • dashboard state;
  • lens health;
  • generic low resources with no named inventory row;
  • a single demand with no competing reader and no explicit absence.

Inventory row model

inventory_row:
  inventory_id: <stable row id>
  inventory_kind: correction_slot | ward_air | oxygen_reserve | crew_rest_shift | archive_proof_window | edit_checksum_lane | sponsor_makegood_frame | public_contrition_minute | custody_handler | security_lane | equivalent
  quantity_state: free | claimed | split | reserved | exhausted | absent | contested
  current_owner_or_absence: <reader/handler/faction/explicit_absence>
  protected_boundary_or_absence: <boundary or explicit_absence>
  source_pressure: sponsor_makegood | recovery_ward | claimant_floor | live_floor | cutroom | fan_oxygen | archive_custody | management_compression | broadcast_reality | equivalent

The mechanism fails if the implementation stores only a numeric pool such as recovery_points, budget, morale, or available_slots without a row, owner, boundary, and future reader.

Demand row model

demand_row:
  demand_id: <stable row id>
  requester: sponsor | fan_public | archive | inspector | artist_boundary | claimant | editor | management | schedule_board | live_floor | equivalent
  requested_inventory: <inventory id or explicit_absence>
  demanded_use: makegood | recovery | correction | proof | floor_safety | public_receipt | oxygen_refund | route_unlock | metric_report | equivalent
  minimum_acceptance_surface: <surface>
  future_reader: <reader id>
  default_if_excluded: <named default or scar>

At least two demand rows must be present, or one demand row plus explicit absence of the inventory owner/handler/gate that changes the default.

Allocation modes

ModeRequired effect
priority_allocateprimary demand accepts with cost; excluded demand changes state
split_escrowboth demands become scoped; ambiguity/proof/handler cost rises
reserve_boundaryfuture reader or body boundary protected; current pressure worsens
borrow_forwardcurrent crisis stabilized; future inventory row becomes costlier or blocked
convert_to_public_oxygenpublic/fan surface improves; sponsor/lawful/inspection cost rises
convert_to_sponsor_makegoodsponsor surface improves; public/artist/claimant route narrows
convert_to_lawful_proofarchive/inspection/custody reader improves; public/sponsor/edit cost rises
refuse_and_recordfalse double-spend blocked; immediate pressure and handler burden rise
quarantineunsafe spend prevented; current route delayed or recovery-only
default_selectscapture default records actor, hidden demand, excluded reader, and future scar

No mode can produce universal clean acceptance across public, lawful, sponsor, artist boundary, editor, management, schedule, and route asset readers.

Default contract

复原库存夺取默认 must fire or arm when:

  • the ledger is absent but inventory is required;
  • one row is spent twice;
  • absent inventory is filed as available;
  • a sponsor, schedule board, management table, archive queue, fan oxygen queue, ward queue, editor auto-patch, inspector, floor manager, or handler absence files first;
  • the future reader is hidden;
  • the excluded reader is unnamed;
  • management calls allocation a clean KPI;
  • sensitive inventory such as ward air, fan oxygen, public contrition, archive proof, or artist recovery is treated as clean sponsor or schedule inventory.

The default must name the capturing actor and excluded reader.

Branch output contract

Every branch must output:

branch_output:
  selected_inventory_or_absence: <inventory id or explicit_absence>
  selected_primary_demand: <demand id>
  excluded_or_scoped_demand: <demand id or explicit_absence>
  inventory_state_after: allocated | split | reserved | borrowed_forward | quarantined | exhausted | captured_default | equivalent
  primary_reader_state_after: accepted_with_cost | narrowed | pending | blocked | recovery_only | equivalent
  excluded_reader_state_after: hostile | blocked | narrowed | sponsor_only | public_only | lawful_only | recovery_only | contradiction_pending | explicit_absence | equivalent
  future_route_effect: blocked | costlier | sponsor_only | public_only | lawful_only | split_required | recovery_only | collision_ready | equivalent
  counter_deltas:
    relief: []
    cost: []
    future: []

A branch is invalid if it only lowers pressure, spends money, or marks a resource consumed without creating future reader state.

Counter surfaces

Recommended durable values:

  • recovery_inventory_pressure
  • recovery_inventory_double_spend_risk
  • correction_slot_capacity
  • ward_air_capacity
  • fan_oxygen_reserve
  • crew_rest_capacity
  • archive_proof_window_integrity
  • edit_checksum_lane_integrity
  • sponsor_makegood_inventory
  • public_contrition_capacity
  • custody_handler_burden
  • management_pressure
  • schedule_pressure
  • inspection_heat
  • public_receipt_distrust
  • contract_capture
  • route_recovery_cost

Every resolved row mutates at least one relief, one cost, and one future route or reader effect.

Replay evidence shape

mechanic_id: storyteller.mechanic.recovery_inventory_triage.v1
session_id: lens-recovery-inventory-triage-v1-<timestamp>
seed: <deterministic-seed>
entry_state:
  trigger_kind: state_pressure
  finite_inventory_row_present_or_explicit_absence: true
  competing_demands_min: 2
  future_readers_min: 2
  no_fixed_turn_trigger: true
ledger: storyteller.card.recovery_inventory_ledger.v1
rite: storyteller.rite.recovery_inventory_allocation.v1
branch_runs:
  valid_allocation:
    allocation_mode: priority_allocate | split_escrow | reserve_boundary | borrow_forward | convert_to_public_oxygen | convert_to_sponsor_makegood | convert_to_lawful_proof | refuse_and_record | quarantine
    selected_inventory_or_absence: <inventory>
    primary_reader_state_after: <state>
    excluded_reader_state_after: <different state>
    future_route_effect: <effect>
    counter_deltas: {}
  default_capture:
    event_seen_or_armed: storyteller.event.recovery_inventory_capture_default.v1
    capture_actor: <actor>
    hidden_or_excluded_demand: <demand>
    future_route_effect: <effect>

Non-goals

  • Not a raw resource economy.
  • Not a global inventory dashboard.
  • Not a governance checklist.
  • Not a fixed upkeep phase.
  • Not sponsor makegood alone.
  • Not recovery ward discharge alone.
  • Not valid if scarce rows can be double-spent cleanly.
  • Not valid if future readers do not consume the allocation result.