Route Loadout Compatibility Lens / 路线装配兼容 Lens

This lens observes whether 路线装配兼容线 and 路线装配兼容机制 correctly make multi-asset route bundles playable.

The oracle is: individual asset validity is not bundle validity. If a route, rite, correction, public table, lawful bridge, sponsor package, recovery lane, or broadcast slot needs two or more route assets, the implementation must expose slot state, custodian, reader scope, compatibility conflict, harmed reader or claimant, branch posture, cost, and future route effect.

This lens observes:

It is observed through:

Observable promise

A passing implementation proves that a route cannot unlock from raw asset count or isolated asset readiness. A sponsor release, public receipt, lawful seal, archive copy, editor checksum, protected witness, carrier, fan ledger, or recovery marker may be valid alone and still poison the requested bundle.

The implementation must answer:

  • what route or rite is asking for a bundle;
  • which slots are required;
  • which asset fills each slot, or why absence is explicit;
  • what state and custodian each asset has;
  • what compatibility conflict exists, or why explicit no-risk is recorded;
  • which reader or claimant is harmed by the combination;
  • which posture the player selects;
  • what cost and future route effect follow.

The lens fails if the game stores only route_ready, assets_selected, proof_bundle_valid, all_slots_filled, or inventory_check_passed.

Entry oracle

entry_state_required:
  trigger_kind: state_pressure
  requested_route_or_rite_present: true
  required_asset_slots_min: 2
  asset_candidates_present_or_explicit_absence: true
  asset_states_visible: true
  asset_custodians_visible_or_explicit_absence: true
  compatibility_risk_or_explicit_no_risk_visible: true
  harmed_reader_or_claimant_visible_or_explicit_absence: true
  future_route_or_reader_consumes_loadout_state: true
  player_can_reconcile_swap_narrow_split_quarantine_sacrifice_or_default: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_week_trigger: true
  no_raw_asset_count_trigger: true
  no_dashboard_or_lens_health_trigger: true

The lens fails if entry opens from a fixed sequence, upkeep phase, raw unlocked-asset count, dashboard status, lens health, or generic route-readiness check.

Manifest oracle

路线装配清单 or an equivalent object must record:

manifest_required:
  row_id: <stable id>
  requested_use:
    requested_route_or_rite: <route rite slot correction recovery lane public table lawful bridge sponsor package or equivalent>
    requested_clean_claim: <claim>
    future_reader: public | lawful | sponsor | archive | inspector | editor | fan_public | artist | route_asset | broadcast_reality | producer_license | equivalent
  asset_slots:
    - slot_id: <stable slot>
      required_role: proof_anchor | carrier | public_cover | lawful_cover | sponsor_cover | editor_checksum | witness | fan_receipt | archive_copy | route_asset | handler | equivalent
      candidate_asset: <asset id or explicit_absence>
      asset_state_before: fresh | scoped | protected | route_asset | stale | lawful_only | public_only | sponsor_only | split_required | recovery_only | hostile | captured | false_owner | explicit_absence | equivalent
      custodian_or_absence: <custodian or explicit_absence>
      source_surface: <source card event rite storyline or explicit_absence>
      accepted_scope: <scope or explicit_absence>
  compatibility:
    conflict_kind: reader_scope_mismatch | custody_owner_mismatch | proof_truth_mismatch | checksum_vs_archive | sponsor_vs_public | lawful_vs_artist_boundary | witness_protection_vs_publicity | carrier_capacity_mismatch | stale_asset_loaded_as_fresh | false_owner_loadout | explicit_no_risk | equivalent
    conflicting_slots: [<slot ids>]
    claimant_or_reader_harmed_by_combination: <reader claimant or explicit_absence>
    loadout_state_before: draft | proposed_clean | incompatible | contested | underfilled | captured | explicit_absence
  decision:
    selected_posture: reconcile_with_scope | swap_asset | narrow_route_use | split_loadout | quarantine_combination | sacrifice_slot | allow_incompatible_default
    loadout_state_after: compatible_with_scope | substituted | narrowed | split_required | quarantined | slot_sacrificed | false_compatible | captured | blocked | recovery_only | equivalent
    future_route_effect: accepted_with_scope | costlier | public_only | lawful_only | sponsor_only | split_required | bridge_required | hostile | blocked | recovery_only | contradiction_pending | equivalent

The lens fails if the row names assets without state, custodian, scope, conflict, harmed reader, posture, and future effect.

Reconciliation rite oracle

路线装配对表 or equivalent must require concrete assignment:

assignment_required:
  manifest: storyteller.card.route_loadout_manifest.v1
  selected_row_id: <row id>
  requested_route_or_rite: <route rite slot correction recovery lane public table lawful bridge sponsor package or equivalent>
  future_reader: <reader>
  asset_slots_min: 2
  slot_rows:
    - slot_id: <slot>
      candidate_asset: <asset or explicit_absence>
      asset_state_before: <state>
      custodian_or_absence: <custodian or explicit_absence>
      accepted_scope: <scope or explicit_absence>
  conflicting_slots: [<slot ids>]
  conflict_kind: <kind>
  harmed_reader_or_claimant: <reader claimant or explicit_absence>
  selected_posture: reconcile_with_scope | swap_asset | narrow_route_use | split_loadout | quarantine_combination | sacrifice_slot | allow_incompatible_default
  handler_or_absence: <handler or explicit_absence>
  proof_bridge_or_absence: <proof bridge or explicit_absence>
  cost_or_scar_or_absence: <cost scar or explicit_absence>
  future_route_effect: <effect>

The lens fails if a famous handler, sponsor payment, lawful seal, editor checksum, public outrage, or management instruction can accept the bundle without naming conflict, harmed reader, bridge, cost, and future effect.

Branch divergence oracle

A satisfying implementation must expose at least five non-equivalent constructive branch families plus default or explicit blocked state.

BranchRequired reliefRequired costRequired future effect
Reconcile with scoperoute access, proof legibility, or custody clarity improveshandler burden, inspection heat, public distrust, sponsor pressure, or proof exposureaccepted_with_scope, bridge_required, reader_scope_required
Swap assetincompatibility falls or route openssubstitute wear, old asset staleness, route asset pressure, or notice costcostlier, substitute_required, old_asset_recovery_or_notice_required
Narrow route useone reader/use proceeds and contradiction fallsexcluded-reader resentment, future reconciliation cost, route narrowingpublic_only, lawful_only, sponsor_only, route_costlier
Split loadoutincompatible readers proceed separatelyschedule pressure, source ambiguity, carrier burden, correction costsplit_required, reconciliation_required
Quarantine combinationfalse compatibility, fraud, or drift fallsroute delay, sponsor pressure, fan resentment, recovery costbridge_required, blocked_until_manifest_update, recovery_only
Sacrifice slothigher-value route survivesasset lost, hostile, captured, claimant retaliation, integrity losscostlier, recovery_only_for_sacrificed_asset, hostile_claim_armed
Incompatible defaultshort pressure may drop or fastest desk files firstfalse-clean bundle, public distrust, drift, hostile claimanthostile, captured, blocked, recovery_only, contradiction_pending

The lens fails if every branch returns route_ready, asset_bundle_valid, or one generic pressure delta.

No individual-validity shortcut

A passing implementation must explicitly prove:

no_individual_validity_shortcut:
  asset_states_visible: true
  slot_scope_visible: true
  custodians_visible_or_explicit_absence: true
  compatibility_conflict_or_explicit_no_risk_visible: true
  bundle_state_not_inferred_from_asset_count: true
  future_route_effect_uses_bundle_state: true

The lens fails if all required assets are available is enough to unlock a route.

Default oracle

不兼容装配默认 must fire or arm when:

  • a multi-asset route has no manifest;
  • conflicting slots are hidden;
  • harmed reader or claimant is hidden;
  • proof bridge is absent without explicit absence;
  • stale, recovery-only, captured, hostile, false-owner, public-only, lawful-only, or sponsor-only assets are loaded as fresh universal assets;
  • sponsor release is loaded as public truth;
  • lawful seal is loaded as artist, voice, or memorial consent;
  • editor checksum is loaded against archive copy without bridge;
  • witness exposure is loaded as witness protection;
  • one carrier is assigned incompatible custody duties;
  • future route consumes bundle without loadout state.

Required default payload:

default_required:
  event: storyteller.event.incompatible_loadout_default.v1
  manifest_row_or_absence: <row id or explicit_absence>
  requested_route_or_rite: <route rite slot correction recovery lane public table lawful bridge sponsor package or equivalent>
  requested_clean_claim: <claim>
  conflicting_slots_or_absence: [<slot ids or explicit_absence>]
  conflict_kind: reader_scope_mismatch | custody_owner_mismatch | proof_truth_mismatch | checksum_vs_archive | sponsor_vs_public | lawful_vs_artist_boundary | witness_protection_vs_publicity | carrier_capacity_mismatch | stale_asset_loaded_as_fresh | false_owner_loadout | hidden_conflict | equivalent
  omitted_reader_or_claimant: <reader claimant or explicit_absence>
  default_actor: sponsor | inspector | archive | editor | fan_public | public_audience | route_claimant | management | producer_absence | broadcast_reality | equivalent
  false_compatibility_claim: assets_all_valid_so_bundle_clean | release_covers_public_truth | lawful_seal_covers_artist_boundary | checksum_covers_archive_truth | witness_publicity_equals_protection | stale_asset_still_fresh | carrier_can_hold_both | false_owner_is_owner | equivalent
  loadout_state_after: false_compatible | captured | hostile | blocked | contradiction_pending | recovery_only | equivalent
  future_route_effect: hostile | captured | blocked | costlier | public_table_required | lawful_bridge_required | sponsor_unwind_required | split_required | recovery_only | contradiction_pending | equivalent
  counter_deltas_min: 3

The default fails if it only displays warning text, increments generic danger, or changes mood without mutating future play.

Future consumption oracle

At least one downstream surface must consume loadout state:

  • route accepts bundle only with scope;
  • public table requires a bridge or footnote;
  • lawful route requires annex or rehearing;
  • sponsor route requires unwind or remains sponsor-only;
  • archive or editor route requires checksum/source bridge;
  • protected witness requires protection before public use;
  • route asset becomes costlier, hostile, captured, blocked, split-required, or recovery-only;
  • broadcast reality receives contradiction-pending, false-compatible, or recovery-only state;
  • producer license reads the loadout as pressure, scar, or required explanation.

If the loadout result never changes future play, the lens is incomplete.

Replay evidence shape

lens_id: storyteller.lens.route_loadout_compatibility.v1
session_id: lens-route-loadout-compatibility-v1-<timestamp>
seed: <deterministic-seed>
entry_state:
  trigger_kind: state_pressure
  requested_route_or_rite_present: true
  required_asset_slots_min: 2
  asset_states_visible: true
  asset_custodians_visible_or_explicit_absence: true
  compatibility_risk_or_explicit_no_risk_visible: true
  harmed_reader_or_claimant_visible_or_explicit_absence: true
  future_route_or_reader_consumes_loadout_state: true
  no_fixed_turn_trigger: true
offered:
  card: storyteller.card.route_loadout_manifest.v1
  rite: storyteller.rite.route_loadout_reconciliation.v1
manifest_row:
  row_id: <row>
  requested_route_or_rite: <id>
  requested_clean_claim: <claim>
  future_reader: <reader>
  asset_slots:
    - slot_id: <slot>
      candidate_asset: <asset or explicit_absence>
      asset_state_before: <state>
      custodian_or_absence: <custodian or explicit_absence>
      accepted_scope: <scope or explicit_absence>
    - slot_id: <slot>
      candidate_asset: <asset or explicit_absence>
      asset_state_before: <state>
      custodian_or_absence: <custodian or explicit_absence>
      accepted_scope: <scope or explicit_absence>
  conflict_kind: <kind or explicit_no_risk>
  conflicting_slots: []
  harmed_reader_or_claimant: <reader claimant or explicit_absence>
branch_result:
  selected_posture: reconcile_with_scope | swap_asset | narrow_route_use | split_loadout | quarantine_combination | sacrifice_slot | allow_incompatible_default
  handler_or_absence: <handler or explicit_absence>
  proof_bridge_or_absence: <bridge or explicit_absence>
  loadout_state_after: <state>
  future_route_effect: <effect>
  emitted_event: storyteller.event.incompatible_loadout_default.v1 | none
  counter_deltas:
    relief: []
    cost: []
    future: []
assertions:
  - primary_links_exist
  - entry_is_state_triggered_by_requested_multi_asset_route
  - manifest_records_slots_assets_states_custodians_and_scope
  - compatibility_conflict_or_explicit_no_risk_is_visible
  - harmed_reader_or_claimant_visible_or_explicit_absence
  - rite_assignment_requires_conflict_posture_handler_bridge_cost_and_future_effect
  - branches_diverge_by_loadout_state_cost_and_future_route_effect
  - no_individual_asset_validity_as_bundle_validity
  - incompatible_default_records_narrator_false_claim_conflict_omitted_reader_and_future_effect
  - future_route_consumes_loadout_state
  - no_fixed_turn_day_week_raw_asset_count_dashboard_or_lens_health_trigger

Progress metric

routeLoadoutCompatibilityProgress = 0..8:

  • 0: no requested route/rite or fewer than two required slots.
  • 1: requested route/rite and at least two required slots are visible.
  • 2: candidate assets, asset states, custodians, source surfaces, and accepted scopes are visible or explicitly absent.
  • 3: compatibility conflict or explicit no-risk row is visible with harmed reader or claimant.
  • 4: 路线装配清单 enters play.
  • 5: 路线装配对表 offers explicit assignment slots.
  • 6: at least two constructive branches produce distinct loadout states, costs, and future effects.
  • 7: incompatible default fires or arms and mutates future play.
  • 8: replay proves future route consumption of loadout state with seed/session, manifest row, selected posture, deltas, and future effect.

Failure cases

The lens must fail if any of these are true:

  • entry is fixed-turn, fixed-day, raw asset count, route-volume quota, dashboard state, or lens-health state;
  • the requested route or rite is absent;
  • fewer than two slots are present;
  • candidate asset state, custodian, accepted scope, or explicit absence is hidden;
  • compatibility risk is neither checked nor explicitly cleared;
  • harmed reader or claimant is hidden;
  • branch outcomes collapse into the same route_ready state;
  • swap deletes the old asset without residue;
  • split loadout is consumed as universal clean compatibility;
  • quarantine removes all future pressure;
  • sacrifice has no route-asset loss, hostility, or recovery cost;
  • default changes only narration;
  • future route ignores the loadout state.

Non-goals

  • Not an inventory optimizer.
  • Not a raw asset-count gate.
  • Not a fixed checklist.
  • Not a dashboard or governance lens.
  • Not a replacement for asset maintenance, discontinuance, ledger reconciliation, scar convergence, feed ranking, alibi recall, claimant collision, reader collision, or management compression.
  • Not valid if every individually valid asset can be bundled into a clean route for free.