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_contaminationThe current rite requires exactly nine in-hand assignments:
| Slot | Exact accepted card |
|---|---|
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 |
It exposes exactly eight explicit choices:
| Index | Option ID | State after | Future effect |
|---|---|---|---|
0 | merge_as_one_scoped | merge_as_one_scoped | public_addendum_required |
1 | split_by_harm | split_by_harm | multiple_remedies_visible |
2 | split_by_reader | split_by_reader | reader_specific_routes_required |
3 | representative_lead | representative_lead_scoped | counterreceipt_rights_reserved |
4 | reject_duplicate_with_scar | rejected_duplicate_with_scar | counterreceipt_armed |
5 | publish_conflict | conflict_published | correction_conflict_note_required |
6 | quarantine_proof | quarantined_for_proof_recheck | oxygen_and_caption_recheck_required |
7 | default_clean_merge | false_clean_pending | recovery_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.
Primary observation link
This lens observes:
- 观众申诉并案登记线;
- 观众申诉并案登记机制;
- adjacent surfaces that can produce or consume grievance clusters: 认领人现场接待线, 危机台账对表线, Audience Stability Floor Storyline, 被排除者反回执挑战线, 应援凭证羁押线, 公开悔过账本, 黑屏残留认领线, and Receipt Counterclaim False Owner Recovery;
- shared systems Fan Oxygen, Broadcast Reality, and Route Assets and Custody.
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: trueThe 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_absenceThe 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 | equivalentThe 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: trueThe 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_oneAccepted 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: 3The 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_requiredSplit 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_costlierSplit 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_onlyRepresentative 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_reservedReject 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_onlyPublish 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_requiredQuarantine 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_onlyDefault 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_onlyProgress 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_existsRuntime 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.