Audience Grievance Merge Register Lens / 观众申诉并案登记 Lens

This lens observes whether 观众申诉并案登记线 and 观众申诉并案登记机制 make grievance merging a playable route object instead of a support-ticket shortcut.

A pass cannot be achieved by adding a duplicate label, sentiment score, issue tag, or generic queue reason. The implementation must prove that similar grievances have cohort scope, harm scope, proof scope, beneficiary scope, harmed-reader scope, and a future route effect.

Executable runtime oracle

The 2026-07-18 runtime proves one fixed Storyteller row inside the broader Wiki design envelope:

fixed_runtime_row:
  register_id: audience.merge.blackout.09
  source_surface: crisis_ledger
  incident_key_or_absence: blackout.incident.09
  candidate_cohorts:
    - [caption_access_row_09, caption_user, miscaption, caption_log_09, named_scope]
    - [fan_oxygen_row_09, oxygen_holder, oxygen_loss, oxygen_row_09, batch_scope]
  clean_merge_beneficiary: stability_table
  harmed_if_merged_cleanly: caption_user
  future_reader_or_route: public_contrition
  future_route_effect: public_addendum_required
  default_risk: proof_carrier_contamination

The current rite requires exactly nine in-hand assignments:

SlotExact accepted card
registerstoryteller.card.audience_grievance_merge_register.v1
source_surfacestoryteller.card.audience_grievance_source_surface.v1
incident_keystoryteller.card.audience_grievance_incident_key.v1
cohort_onestoryteller.card.audience_grievance_caption_cohort_row.v1
cohort_twostoryteller.card.audience_grievance_oxygen_cohort_row.v1
beneficiarystoryteller.card.audience_grievance_clean_merge_beneficiary.v1
harmed_readerstoryteller.card.audience_grievance_harmed_reader.v1
future_readerstoryteller.card.audience_grievance_future_reader.v1
handlerstoryteller.card.audience_grievance_merge_handler.v1

It exposes exactly eight explicit choices:

IndexOption IDState afterFuture effect
0merge_as_one_scopedmerge_as_one_scopedpublic_addendum_required
1split_by_harmsplit_by_harmmultiple_remedies_visible
2split_by_readersplit_by_readerreader_specific_routes_required
3representative_leadrepresentative_lead_scopedcounterreceipt_rights_reserved
4reject_duplicate_with_scarrejected_duplicate_with_scarcounterreceipt_armed
5publish_conflictconflict_publishedcorrection_conflict_note_required
6quarantine_proofquarantined_for_proof_recheckoxygen_and_caption_recheck_required
7default_clean_mergefalse_clean_pendingrecovery_only

Only index 7 arms the pending triple audience_grievance_merge.default_pending, storyteller.event.overmerged_grievance_default.v1.armed, and future_route.overmerged_grievance_recovery_pending. Missing, substituted, off-hand, choiceless, and repeated reviews fail without arming it. The event has exactly five exclusive terminals: false_duplicate_denial, universal_representative_closure, public_apology_overreach, proof_carrier_contamination, and broadcast_reality_false_closure.

The runtime sources are game-content/storyteller/cards/audience-grievance-merge-register-runtime.json5, game-content/storyteller/rites/audience-grievance-merge-review.json5, and game-content/storyteller/events/overmerged-grievance-default.json5. Exhaustive proof is lens/storyteller-audience-grievance-merge-register.runtime.test.ts; durable target proofs are lens/replays/audience-grievance-merge-register.split-by-harm.replay.json and lens/replays/audience-grievance-merge-register.overmerged-default.replay.json.

The packet decides only incident-key grouping while preserving cohort/harm/proof rows. It does not perform claimant intake, convert ledger relief or debt, stabilize audience attention, audit proof lineage, grant or audit representative mandate, decide route-asset ownership, assign an answerability seat, or resolve a downstream counterreceipt challenge. It grants no universal merge, representation, proof equivalence, clean closure, consent, or universal route authority.

This lens observes:

It is observed through:

Observable promise

Storyteller must not let a management shortcut turn unlike grievances into one clean truth.

The lens passes only when the game can answer:

Which cohorts are being merged, what harm each carries, what proof each uses, who benefits from a clean merge, who is harmed by it, what merge posture is chosen, and which future route or reader consumes the resulting merge state?

The lens fails if a grievance cluster produces only duplicate, same issue, handled, spam, resolved, merged ticket, low priority, public sentiment, or a hidden queue flag.

Must pass

1. Entry is state-triggered by grievance merge pressure

Required evidence:

entry_state_required:
  trigger_kind: state_pressure
  source_surface_present: true
  source_surface_any:
    - crisis_ledger
    - claimant_floor
    - fan_oxygen
    - audience_stability
    - blackout_residue
    - fan_token
    - public_contrition
    - receipt_counterclaim
    - caption_access
    - route_asset
    - equivalent
  grievance_cohorts_min: 2
  incident_key_or_explicit_absence_present: true
  proposed_merge_would_change_future_play: true
  future_reader_or_route_consumes_merge_state: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_week_trigger: true
  no_raw_complaint_count_trigger: true
  no_dashboard_or_lens_health_trigger: true

The lens fails if entry comes from a fixed turn, day/week interval, chapter quota, raw complaint count, generic volume threshold, dashboard state, sentiment score alone, or lens health.

2. Cohorts and harm types are visible

观众申诉并案登记 or equivalent must record at least two cohort rows.

cohort_rows_required:
  - cohort_id: <stable id>
    cohort_surface: fan_public | oxygen_holder | access_holder | caption_user | witness | claimant | sponsor_audience | lawful_reader | archive_reader | artist_public | equivalent
    grievance_claim: <short in-world claim>
    harm_type: oxygen_loss | access_loss | miscaption | witnessed_erasure | refund_loss | false_stability | public_silencing | lawful_exclusion | sponsor_substitution | route_asset_capture | equivalent
    proof_carrier_or_absence: fan_token | oxygen_row | caption_log | witness_stub | egress_row | receipt_packet | crisis_docket | explicit_absence | equivalent
    represented_count_posture: named_scope | batch_scope | delegated_scope | disputed_scope | explicit_absence

The lens fails if cohorts are only a number, mood, popularity score, or anonymous complaint pile.

3. Proof carriers are visible or explicitly absent

Every cohort must have a proof carrier or explicit absence. A single proof carrier cannot close unlike harms unless the rite records scope and future effect.

Accepted carriers include fan token, oxygen row, caption log, witness stub, egress row, receipt packet, crisis docket, public contrition row, archive seal, or explicit absence.

4. Beneficiary and harmed cohort are visible

A valid register must name who benefits from a clean merge and who is harmed if the merge is accepted too cleanly.

merge_question_required:
  proposed_merge_state: unmerged | merge_as_one | split_by_harm | split_by_reader | representative_lead | reject_duplicate | publish_conflict | quarantine
  clean_merge_beneficiary: sponsor | management | archive | public_table | stability_table | lawful_reader | route_asset | fan_delegate | explicit_absence | equivalent
  harmed_if_merged_cleanly: fan_public | oxygen_holder | caption_user | witness | claimant | lawful_reader | archive_reader | artist | route_asset | explicit_absence | equivalent

The lens fails if the merge only records operational convenience.

5. Selected merge posture is concrete

观众申诉并案复核 must record a concrete posture before resolving.

assignment_required:
  register: storyteller.card.audience_grievance_merge_register.v1
  source_surface: storyteller.card.audience_grievance_source_surface.v1
  incident_key: storyteller.card.audience_grievance_incident_key.v1
  cohort_one: storyteller.card.audience_grievance_caption_cohort_row.v1
  cohort_two: storyteller.card.audience_grievance_oxygen_cohort_row.v1
  beneficiary: storyteller.card.audience_grievance_clean_merge_beneficiary.v1
  harmed_reader: storyteller.card.audience_grievance_harmed_reader.v1
  future_reader: storyteller.card.audience_grievance_future_reader.v1
  handler: storyteller.card.audience_grievance_merge_handler.v1
  exact_required_slot_count: 9
  exact_accepts_and_in_hand_required: true
  selected_choice_required: true

The selected posture comes from one of the eight explicit rite choices, not from a synthetic tenth slot. The lens fails if a sponsor payment, handler assignment, public apology, stability table, or support queue shortcut resolves the cluster without those nine exact assignments. Missing, substituted, off-hand, choiceless, and repeated attempts must fail without arming default.

6. Branch families diverge

The current runtime exposes exactly seven constructive/scarred postures plus one explicit harmful default posture:

  • merge as one with scope;
  • split by harm;
  • split by reader;
  • representative lead;
  • reject duplicate with scar;
  • publish conflict;
  • quarantine proof;
  • default clean merge.

They must differ by merge state after, relief surface, cost surface, harmed cohort state, beneficiary state, and future route effect.

7. Constructive branches have relief, cost, and future effect

Any branch that makes a cluster simpler, truer, public, quarantined, or partially closed must mutate at least three durable surfaces.

constructive_result_required:
  selected_posture: merge_as_one | split_by_harm | split_by_reader | representative_lead | reject_duplicate | publish_conflict | quarantine
  merge_state_after: merge_as_one_scoped | split_by_harm | split_by_reader | representative_lead_scoped | rejected_duplicate_with_counterreceipt_risk | conflict_published | quarantined_for_proof_recheck | equivalent
  counter_deltas:
    relief: at_least_one
    cost: at_least_one
    future: at_least_one

Accepted cost surfaces include excluded cohort pressure, false duplicate risk, counterreceipt risk, fan oxygen resentment, caption/access pressure, handler burden, notice pressure, mandate pressure, sponsor stop-loss pressure, archive debt, lawful annex pressure, broadcast-reality contradiction, and future recovery cost.

8. Default overmerge is durable

过度并案默认 must fire only after the complete nine-card review explicitly selects choice index 7, default_clean_merge. Missing, substituted, off-hand, choiceless, and repeated reviews must not arm it.

Required default evidence:

default_event_required:
  event: storyteller.event.overmerged_grievance_default.v1
  source_surface: crisis_ledger
  false_clean_incident_key: blackout.incident.09
  armed_only_by_rite_choice: 7
  pending_flag_count: 3
  terminal_ids:
    - false_duplicate_denial
    - universal_representative_closure
    - public_apology_overreach
    - proof_carrier_contamination
    - broadcast_reality_false_closure
  terminal_count: 5
  counterreceipt_gained_on_every_terminal: true
  counter_deltas_min: 3

The default fails if it changes only flavor, mood, tutorial text, queue size, or a hidden UI flag.

9. Future reader consumes merge state

Passing evidence must show at least one downstream surface reading the merge result or default.

Valid future consumers include public contrition restatement, correction route, oxygen recheck, access or caption recheck, claimant-floor escalation, crisis ledger reconciliation, excluded counterreceipt, fan token custody, blackout residue claiming, route-asset custody, broadcast reality contradiction, or ending scar.

The lens fails if the register ends at explanation text.

10. No clean universal merge

The implementation must explicitly fail, default, split, scope, quarantine, or route-cost any clean merge that would erase a materially different cohort, harm type, proof carrier, harmed reader, or future route effect.

Allowed outcomes:

  • scoped incident key;
  • split by harm;
  • split by reader;
  • representative lead with notice;
  • rejected duplicate with counterreceipt risk;
  • conflict publication;
  • proof quarantine;
  • overmerged default;
  • recovery-only route.

A clean universal merge is never valid when future play can consume a merged-out cohort.

Branch assertions

The branch vocabulary below is the broader design envelope. For the fixed v1 row, the exact option IDs, states, and future effects in the executable runtime table above are authoritative.

Merge as one assertion

selected_posture: merge_as_one
relief_any:
  - grievance_queue_pressure_down
  - audience_stability_up
cost_any:
  - excluded_cohort_pressure_up
  - public_receipt_distrust_up
future_effect_any:
  - scoped_incident_key
  - public_addendum_required

Split by harm assertion

selected_posture: split_by_harm
relief_any:
  - erasure_risk_down
  - public_receipt_legitimacy_up
cost_any:
  - handler_burden_up
  - remedy_cost_up
future_effect_any:
  - multiple_remedies_visible
  - future_route_costlier

Split by reader assertion

selected_posture: split_by_reader
relief_any:
  - reader_confusion_down
cost_any:
  - route_complexity_up
  - archive_debt_up
future_effect_any:
  - lawful_only
  - public_only
  - fan_only
  - archive_contested
  - sponsor_only

Representative lead assertion

selected_posture: representative_lead
relief_any:
  - hearing_speed_up
  - claimant_floor_pressure_down
cost_any:
  - mandate_pressure_up
  - notice_service_pressure_up
future_effect_any:
  - representative_statement_scoped
  - counterreceipt_rights_reserved

Reject duplicate assertion

selected_posture: reject_duplicate
relief_any:
  - grievance_queue_pressure_down
cost_any:
  - false_duplicate_risk_up
  - hostile_cohort_pressure_up
future_effect_any:
  - counterreceipt_armed
  - hostile_route
  - recovery_only

Publish conflict assertion

selected_posture: publish_conflict
relief_any:
  - public_receipt_legitimacy_up
  - archive_legibility_up
cost_any:
  - sponsor_stop_loss_pressure_up
  - audience_churn_up
future_effect_any:
  - apology_conflict_note_required
  - correction_conflict_note_required

Quarantine assertion

selected_posture: quarantine
relief_any:
  - proof_integrity_up
  - route_asset_integrity_up
cost_any:
  - route_delay_up
  - future_recovery_cost_up
future_effect_any:
  - oxygen_recheck
  - access_recheck
  - recovery_only

Default clean merge assertion

selected_posture: default_clean_merge
choice_index: 7
merge_state_after: false_clean_pending
relief_exact:
  - short_term_stability_up
cost_exact:
  - broadcast_reality_contradiction_up
  - counterreceipt_risk_up
pending_flags_exact:
  - audience_grievance_merge.default_pending
  - storyteller.event.overmerged_grievance_default.v1.armed
  - future_route.overmerged_grievance_recovery_pending
future_effect_exact: recovery_only

Progress metric

audienceGrievanceMergeRegisterProgress = 0..8:

  • 0: no cohort rows exist; grievances are raw count or generic sentiment.
  • 1: source cluster and future reader are visible.
  • 2: at least two cohorts have harm types and proof carriers or explicit absence.
  • 3: 观众申诉并案登记 is active.
  • 4: 观众申诉并案复核 offers merge, split, lead, reject, publish, quarantine, or default choices.
  • 5: chosen posture records clean-merge beneficiary, harmed cohort, future reader, and route effect.
  • 6: at least three constructive branch families produce different relief, cost, and future effects.
  • 7: 过度并案默认 creates durable hostile, counterreceipt, contradiction, recovery-only, or recheck state.
  • 8: replay/session evidence proves at least one constructive success and one split, quarantine, rejection, or overmerge default outcome.

Evidence shape

lens_id: storyteller.lens.audience_grievance_merge_register.v1
session_id: lens-storyteller-lens-audience-grievance-merge-register-v1-<run-id>
seed: <deterministic-seed>
state_context:
  trigger_kind: state_pressure
  source_surface: crisis_ledger | claimant_floor | fan_oxygen | audience_stability | blackout_residue | fan_token | public_contrition | receipt_counterclaim | caption_access | route_asset | equivalent
  incident_key_or_explicit_absence_present: true
  future_reader_or_route: <reader or route>
  no_fixed_turn_trigger: true
  no_raw_complaint_count_trigger: true
active_objects:
  register_card: storyteller.card.audience_grievance_merge_register.v1
  merge_rite: storyteller.rite.audience_grievance_merge_review.v1
cohort_rows:
  - cohort_id: <id>
    cohort_surface: <surface>
    harm_type: <harm or explicit_absence>
    proof_carrier_or_absence: <proof or explicit_absence>
  - cohort_id: <id>
    cohort_surface: <surface>
    harm_type: <harm or explicit_absence>
    proof_carrier_or_absence: <proof or explicit_absence>
offered_choices:
  - merge_as_one_scoped
  - split_by_harm
  - split_by_reader
  - representative_lead
  - reject_duplicate_with_scar
  - publish_conflict
  - quarantine_proof
  - default_clean_merge
branch_runs:
  merge_as_one:
    outcome: merge_as_one_scoped
    counter_deltas:
      relief: [grievance_queue_pressure_down]
      cost: [excluded_cohort_pressure_up]
      future: [public_addendum_required]
  split_by_harm:
    outcome: split_by_harm
    counter_deltas:
      relief: [erasure_risk_down]
      cost: [handler_burden_up]
      future: [multiple_remedies_visible]
  reject_duplicate:
    outcome: rejected_duplicate_with_counterreceipt_risk
    counter_deltas:
      relief: [grievance_queue_pressure_down]
      cost: [false_duplicate_risk_up]
      future: [counterreceipt_armed]
  default_clean_merge:
    outcome: default_overmerged
    event_seen_or_armed: storyteller.event.overmerged_grievance_default.v1
    merged_out_cohort: <cohort or explicit_absence>
    future_route_effect: <effect>
assertions:
  - primary_links_exist
  - entry_is_state_triggered_by_grievance_merge_pressure
  - grievance_cohorts_and_harm_types_visible
  - proof_carriers_visible_or_explicit_absence
  - clean_merge_beneficiary_and_harmed_cohort_visible_or_explicit_absence
  - selected_merge_posture_is_concrete
  - branch_families_diverge
  - constructive_branch_has_relief_cost_and_future_effect
  - default_overmerge_is_durable
  - future_reader_consumes_merge_state
  - no_clean_universal_merge
  - no_fixed_turn_day_week_raw_complaint_count_dashboard_or_lens_health_trigger
  - replay_provenance_exists

Runtime proof division

The focused test owns the exhaustive contract: nine-slot exactness; rejection of missing, substituted, off-hand, choiceless, and repeated reviews; all eight mutually exclusive rite outcomes; choice-7-only default arming; all five exclusive event terminals; Storyteller-only source metadata; public-rollup parity; and re-execution of both durable exports.

lens/replays/audience-grievance-merge-register.split-by-harm.replay.json proves all nine exact assignments with rite choice 1, and leaves the default markers false. lens/replays/audience-grievance-merge-register.overmerged-default.replay.json proves the same assignments with rite choice 7, then event option 3, proof_carrier_contamination; it clears pending state, preserves the overmerge scar, requires separate oxygen/caption recheck, and retains the counterreceipt. Neither replay claims to cover every branch in the broader design envelope.

Non-goals

  • Not customer support deduplication.
  • Not a sentiment dashboard.
  • Not raw complaint-count pressure.
  • Not a turn-count package.
  • Not governance or methodology.
  • Not valid if grievances can be merged, rejected, or closed without cohort scope, harm scope, proof scope, beneficiary, harmed reader, and future route effect.