Route Asset Maintenance Triage Lens / 路线资产维护分诊 Lens
This lens observes whether 路线资产维护分诊线 and 路线资产维护分诊机制 correctly make prior route-asset victories degrade, recover, rotate, freeze, or cannibalize through executable play.
A pass cannot be achieved by an inventory list, a fixed upkeep phase, a generic priority scene, or a free refresh button. The implementation must show at least two prior assets, one live maintenance pressure, an assignable triage rite, branch divergence, changed future route acceptance, and a default event or armed default when maintenance fails.
Primary observation link
This lens observes:
It is observed through:
Observable promise
When the player has more than one usable route asset, the game must be able to ask: which asset stays fresh, which asset takes wear, and which future route now reads that choice?
The answer must be visible in state. Prior success remains historical, but asset quality is no longer free.
Must pass
1. Entry is state-triggered
Required entry evidence:
entry_state:
trigger_kind: state_pressure
roster_assets_min: 2
maintenance_due_min: 1
future_route_depends_on_asset_state: true
no_fixed_turn_trigger: trueThe lens fails if eligibility is based on fixed numbered timing, chapter quota, day interval, dashboard status, or raw count of unlocked assets.
2. Roster contains at least two prior route assets
Route Asset Maintenance Roster must list at least two assets from prior play or explicit equivalent state.
Valid asset families:
- witness row;
- public receipt;
- lawful copy;
- editor cut;
- sponsor package;
- fan ledger;
- archive docket;
- permit;
- memorial copy;
- scarred right;
- proof object;
- derivative copy;
- equivalent route asset.
Required row shape:
roster_row:
asset_id: <stable asset id>
source_surface: <source storyline, rite, event, or card>
source_session_id: <session id or explicit_absence>
asset_kind: <kind>
asset_state_before: <state>
custodian: <holder or explicit_absence>
maintenance_pressure: <pressure or explicit_absence>
accepted_routes: []
rejected_or_costlier_routes: []The lens fails if the roster is only an inventory list with no source, custodian, state, or route acceptance.
3. At least one asset has live maintenance pressure
At least one row must be in a pressured state:
maintenance_due;overexposed_asset;stale_asset;degraded_asset;frozen_asset;recovery_only_asset;false_fresh_asset;- equivalent.
Valid pressure reasons include payroll due, public doubt, lawful expiry, edit ambiguity, sponsor capture, archive opacity, overexposure, false-owner risk, route wear, recovery cost, claimant hostility, or scar restriction.
The lens fails if every asset is always fresh or if pressure is only flavor text.
4. Rite is assignable
Route Asset Maintenance Triage or equivalent must require concrete assignments.
Required assignment evidence:
assignments:
roster: storyteller.card.route_asset_maintenance_roster.v1
selected_asset_row: <row id>
intended_future_use: <route use>
response: refresh_custody | rotate_use | accept_degraded_use | freeze_for_recovery | cannibalize | default_selects
handler_or_absence: <handler or explicit_absence>
proof_bridge_or_absence: <bridge or explicit_absence>
cost_or_scar: <cost or scar>
unselected_asset_row_any: <row or explicit_absence>The lens fails if the asset refreshes automatically, if absence is hidden, or if a famous handler can clear pressure without a bridge/cost/scar.
5. Branches diverge
At least four branch families must be playable or explicitly blocked by state.
Valid branch families:
- refresh custody;
- rotate use;
- accept degraded use;
- freeze for recovery;
- cannibalize asset;
- default selects.
Each branch must produce different asset state, cost, and future route effect. The lens fails if every branch returns the same asset_available state.
6. Unselected asset state changes
The maintenance choice must affect at least one unselected or substitute asset unless the branch explicitly records why no other row can change.
Required evidence:
other_asset_effect:
unselected_asset_row: <row or explicit_absence>
state_before: <state or explicit_absence>
state_after: <state or explicit_absence>
reason: rotated_out | substitute_took_wear | cannibalized | frozen | unaffected_with_proof | explicit_absenceThe lens fails if the selected asset changes while the rest of the roster remains magically fresh in every branch.
7. Future route acceptance changes
At least one future route, rite, or event must read the resulting asset state.
Required evidence:
future_route_acceptance_check:
route_or_rite: <id>
accepted_states: []
rejected_or_costlier_states: []
required_bridge_or_absence: <bridge>
route_effect_after_branch: unlocked | accepted_with_cost | narrowed | blocked | recovery_only | contradiction_pendingThe lens fails if fresh, stale, degraded, frozen, cannibalized, and false-fresh assets all unlock the same future route.
8. Degradation has recovery or loss consequence
A degraded asset must not be a cosmetic status.
Accepted consequences:
- future route costs more;
- route becomes narrower;
- route requires named bridge;
- asset becomes recovery-only;
- asset becomes captured, hostile, or lost;
- default event fires or arms;
- recovery branch exists with visible scar.
The lens fails if degradation neither changes options nor enables recovery/loss.
9. Default event records actor and mutation
Route Asset Maintenance Default must fire or be armed when the roster is hidden, stale is treated as fresh, required inputs are absent, or another faction selects the asset by default.
Required event evidence:
default_event:
event: storyteller.event.route_asset_maintenance_default.v1
asset_id: <asset>
actor: archive_default | inspector_default | sponsor_default | fan_public_default | editor_default | claimant_default | route_asset_default
reason: false_freshness | missing_handler | missing_bridge | no_cost | wrong_substitute | hidden_roster | unselected_asset_unchanged
asset_state_after: <state>
future_route_effect: <effect>The lens fails if default is only narration and does not mutate the asset.
10. Success has cost
Any successful refresh, rotation, recovery, or freeze must carry a visible cost or route restriction.
Valid costs include:
inspection_heat_up;archive_debt_up;edit_debt_up;handler_burden_up;witness_payroll_due_up;fan_oxygen_resentment_up;sponsor_stop_loss_pressure_up;contract_capture_up;public_receipt_distrust_up;bureau_favor_debt_up;future_route_restricted;other_asset_degraded;asset_frozen_current_route_blocked.
The lens fails if maintenance creates a clean universal refresh.
11. At least three deltas exist
Every resolved branch must mutate at least three counters or durable states. One must be relief, one must be cost, and one must be future route effect.
Expected surfaces:
route_asset_freshness;route_asset_wear;asset_maintenance_due;asset_staleness;asset_recovery_cost;future_route_acceptance;custody_clarity;lawful_admissibility;public_receipt_legitimacy;public_receipt_distrust;inspection_heat;archive_debt;edit_debt;handler_burden;witness_payroll_due;sponsor_stop_loss_pressure;contract_capture;fan_oxygen_resentment;false_owner_pressure;reality_drift.
12. Replay provenance is not trigger logic
Replay evidence may record seed, session id, prior source session, and asset source surface. Eligibility still depends on state: at least two assets, one live pressure, assignable triage, and future route dependency.
Replay evidence expectation
lens_id: storyteller.lens.route_asset_maintenance_triage.v1
session_id: lens-route-asset-maintenance-triage-v1-<timestamp>
seed: <deterministic-seed>
entry_state:
trigger_kind: state_pressure
roster_assets_min: 2
maintenance_due_min: 1
future_route_depends_on_asset_state: true
no_fixed_turn_trigger: true
offered:
card: storyteller.card.route_asset_maintenance_roster.v1
rite: storyteller.rite.route_asset_maintenance_triage.v1
roster_rows:
- asset_id: <asset_a>
source_surface: <source>
asset_state_before: <state>
custodian: <custodian>
maintenance_pressure: <pressure>
- asset_id: <asset_b>
source_surface: <source>
asset_state_before: <state>
custodian: <custodian>
maintenance_pressure: <pressure or explicit_absence>
branch_result:
selected_asset_row: <row>
selected_response: refresh_custody | rotate_use | accept_degraded_use | freeze_for_recovery | cannibalize | default_selects
handler_or_absence: <handler or explicit_absence>
proof_bridge_or_absence: <bridge or explicit_absence>
cost_or_scar: <cost or scar>
asset_state_after: <state>
other_asset_state_after: <state or explicit_absence>
event_seen_or_armed: storyteller.event.route_asset_maintenance_default.v1 | none
future_route_effect: <effect>
counter_deltas: {}
assertions:
- primary_links_exist
- entry_is_state_triggered
- roster_assets_min_two
- maintenance_due_min_one
- roster_rows_have_source_and_custodian
- rite_requires_selected_asset_handler_bridge_cost_or_absence
- branches_diverge
- unselected_asset_state_changes
- future_route_acceptance_changes
- degradation_has_recovery_or_loss
- default_event_records_actor_and_asset_mutation
- success_has_cost
- no_fixed_turn_triggerProgress metric
- 20%: roster opens from state pressure with at least two prior route assets.
- 40%: at least one asset has live maintenance pressure and route acceptance differences.
- 60%: triage rite accepts selected asset, intended use, handler/absence, bridge/absence, cost/scar, and unselected asset row.
- 80%: at least four branches diverge by asset state, cost, and future route effect.
- 100%: replay evidence proves one successful maintenance branch and one degraded/default/recovery branch with seed/session, deltas, and changed future route acceptance.
Non-goals
- Not a fixed upkeep phase.
- Not an abstract maintenance tax.
- Not an inventory count lens.
- Not a dashboard or governance lens.
- Not a replacement for production triage, witness payroll, provenance afterlife, dormant resurfacing, dividend claim, or ending scar systems.
- Not valid if all prior victories remain permanently fresh.
- Not valid if degraded assets have no recovery or loss consequence.