Reader Rebuttal Notice Lens / 读者反驳通知 Lens

This lens observes whether 读者反驳通知线 and 读者反驳通知机制 correctly make future-reader citation of prior rows playable instead of silent authority transfer.

A passing implementation proves that when a transcript row, rehearsal trace, delegate mandate, recovery-discharge row, default-recovery row, asset provenance row, public contrition receipt, protected-witness row, archive custody row, or equivalent route asset is cited by a future reader, the game exposes the affected party or explicit absence, notice carrier or explicit absence, rebuttal proof or explicit absence, selected boundary, future reader effect, and durable no-notice default.

The lens fails if future readers can consume cited rows as clean proof, route unlock, public receipt, lawful fact, sponsor release, final cut, discharge record, consent record, or contradiction closure without notice or explicit absence.

This lens observes:

It is observed through:

Observable promise

Storyteller must make authority reuse answerable. Whenever a later route asks to cite an earlier row, the game must answer:

What row is being cited, who is citing it, what is it being used for, who is affected or explicitly absent, what notice boundary is chosen, what rebuttal proof exists or is absent, and how does the future reader change because of that boundary?

Must pass

1. Entry is state-triggered by future-reader citation

Required evidence:

entry_state:
  trigger_kind: state_pressure
  cited_authority_row_present: true
  future_reader_present: true
  intended_use_present: true
  affected_party_or_explicit_absence_present: true
  notice_boundary_unresolved: true
  route_or_proof_would_change_if_rebuttal_exists: true
  player_can_record_notice_or_default: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_week_trigger: true
  no_raw_count_trigger: true
  no_dashboard_or_lens_health_trigger: true

The lens fails if entry depends on fixed turn number, day/week interval, chapter quota, raw cited-row count, dashboard state, lens-health state, or generic unrest.

2. Cited row, reader, intended use, and affected party are visible

Reader Rebuttal Notice Ledger must record:

citation_context:
  source_row_id: <stable cited row id>
  source_surface: transcript | rehearsal_trace | delegate_mandate | recovery_discharge | default_recovery | asset_provenance | contrition | witness | archive_custody | equivalent
  citing_reader: archive | inspector | sponsor | editor | fan_public | pirate_relay | route_asset | broadcast_reality | lawful_body | management | equivalent
  intended_use: proof | public_receipt | lawful_fact | sponsor_release | final_cut | route_unlock | consent_record | discharge_record | contradiction_close | equivalent
  affected_party_or_absence: <speaker subject witness claimant delegate artist handler fan public or explicit_absence>
  affected_party_state: reachable | protected | recovering | hostile | missing | captured | proxy_only | explicit_absence | equivalent

The lens fails if a replay records only row_used: true, notice_sent: true, or generic claimant pressure.

3. Notice carrier, rebuttal proof, boundary, and future reader are recorded

The ledger must expose:

notice_record:
  notice_carrier_or_absence: ruan_chi | yu_lan | han_yanshuang | baiya | shen_luo | fan_delegate | archive_clerk | pirate_relay | handler | explicit_absence | equivalent
  rebuttal_proof_or_absence: counter_oath | raw_minutes | checksum_note | medical_boundary | public_counterline | lawful_annex | sponsor_exception | pirate_packet | explicit_absence | equivalent
  notice_boundary: private_notice | lawful_annex | public_counterline | editor_mask | sponsor_silence | archive_objection | split_notice | no_notice
  response_window_state: open | narrowed | waived_with_receipt | blocked | false_noticed | expired_by_reader_action | equivalent
  future_reader: <future reader id>

The lens fails if a famous handler, sponsor preference, legal stamp, public post, or editor note satisfies notice by implication.

4. Hearing assignment slots are explicit

Reader Rebuttal Notice Hearing must require:

hearing_assignment:
  rite: storyteller.rite.reader_rebuttal_notice_hearing.v1
  ledger: storyteller.card.reader_rebuttal_notice_ledger.v1
  source_row_id: <stable cited row id>
  citing_reader: <reader id>
  intended_use: <use id>
  affected_party_or_absence: <party or explicit_absence>
  affected_party_state: <state>
  notice_carrier_or_absence: <carrier or explicit_absence>
  rebuttal_proof_or_absence: <proof or explicit_absence>
  selected_notice_boundary: private_notice | lawful_annex | public_counterline | editor_mask | sponsor_silence | archive_objection | split_notice | no_notice
  protected_boundary_or_absence: <boundary or explicit_absence>
  waived_or_blocked_reason_or_absence: <reason or explicit_absence>
  future_reader: <future reader id>
  accepted_cost_or_absence: <cost or explicit_absence>

Generic notify, legalize, apologize, pay, publish, redact, or approve choices cannot satisfy this lens.

5. Branch families diverge

At least six branch families must be playable or explicitly blocked by state, including one default/no-notice branch:

  • private_notice;
  • lawful_annex;
  • public_counterline;
  • editor_mask;
  • sponsor_silence;
  • archive_objection;
  • split_notice;
  • no_notice_or_false_notice.

Each resolved branch must differ by:

branch_non_equivalence:
  notice_state_after: <different state>
  affected_party_state_after: <different state>
  cited_row_state_after: <different state>
  cost_profile: <different cost>
  future_reader_effect: <different effect>

The lens fails if all branches produce clean acceptance, clean public legitimacy, or a universal route unlock.

6. Boundary-specific assertions

Private notice assertion

selected_branch: private_notice
relief_any: [surprise_citation_down, affected_party_hostility_down, rebuttal_legibility_up]
cost_any: [handler_burden_up, schedule_pressure_up, future_route_cost_up]
future_effect_any: [accepts_with_rebuttal, accepts_with_cost, response_window_open]
forbidden: [private_notice_as_consent]

Lawful annex assertion

selected_branch: lawful_annex
relief_any: [archive_fraud_risk_down, legal_body_risk_down, custody_clarity_up]
cost_any: [inspection_heat_up, bureau_favor_debt_up, public_receipt_distrust_up]
future_effect_any: [lawful_only, audit_required, public_addendum_required]
forbidden: [lawful_annex_as_public_truth]

Public counterline assertion

selected_branch: public_counterline
relief_any: [private_capture_down, public_receipt_legitimacy_up, contradiction_legibility_up]
cost_any: [sponsor_stop_loss_pressure_up, witness_exposure_up, public_contradiction_up]
future_effect_any: [public_only, lawful_bridge_required, contradiction_pending]
forbidden: [public_counterline_as_lawful_admissibility]

Editor mask assertion

selected_branch: editor_mask
relief_any: [source_exposure_down, witness_retaliation_risk_down, checksum_legibility_up]
cost_any: [edit_debt_up, source_ambiguity_up, future_raw_proof_cost_up]
future_effect_any: [checksum_required, editor_required, split_record]
forbidden: [editor_mask_as_raw_text]
selected_branch: sponsor_silence
relief_any: [sponsor_stop_loss_pressure_down, immediate_slot_pressure_down]
cost_any: [contract_capture_up, false_notice_risk_up, public_receipt_distrust_up]
future_effect_any: [sponsor_only, sponsor_unwind_required, default_armed]
forbidden: [sponsor_silence_as_clean_closure]

Archive objection assertion

selected_branch: archive_objection
relief_any: [custody_clarity_up, archive_fraud_risk_down, contradiction_legibility_up]
cost_any: [archive_debt_up, claimant_resentment_up, future_hearing_required]
future_effect_any: [split_record, contradiction_pending, accepts_with_cost]
forbidden: [archive_objection_as_repair]

Split notice assertion

selected_branch: split_notice
relief_any: [route_survival_up, reader_scope_legibility_up]
cost_any: [handler_burden_up, contradiction_pending_up, future_recovery_cost_up]
future_effect_any: [split_public_lawful_routes, sponsor_only_branch, public_only_branch]
forbidden: [split_notice_as_universal_acceptance]

No-notice assertion

selected_branch: no_notice_or_false_notice
event_seen_or_armed: storyteller.event.rebuttal_notice_default.v1
state_after_any: [false_authority, disputed_authority, hostile, captured, blocked, recovery_only]
future_effect_any: [blocked, hostile, captured, contradiction_pending, lawful_annex_required, public_receipt_required, checksum_required, sponsor_unwind_required, recovery_only]

7. Future reader acceptance changes

At least one future route, rite, package, proof test, public statement, lawful hold, sponsor release, final cut, discharge record, or route asset must accept, reject, narrow, surcharge, split, or block based on the notice boundary.

Required evidence:

future_acceptance_check:
  future_reader: <reader id>
  cited_row_state_before: <state>
  notice_boundary: <boundary>
  accepted_boundary_states: []
  rejected_or_costlier_boundary_states: []
  future_reader_effect: <effect>

The lens fails if counters move but future offers, blocked reasons, and reader acceptance remain identical.

8. Hard boundary misfilings arm default

Rebuttal Notice Default must fire or arm when:

  • ledger is absent;
  • affected party is hidden;
  • explicit absence is missing;
  • notice carrier is missing;
  • rebuttal proof is missing;
  • private notice is filed as consent;
  • lawful annex is filed as public truth;
  • public counterline is filed as lawful admissibility;
  • editor mask is filed as raw text;
  • sponsor silence is filed as clean closure;
  • archive objection is filed as repair;
  • split notice is filed as universal acceptance;
  • no future reader effect changes.

The default must mutate future play.

9. Recovery keeps a scar

Late repair is valid only if no-notice remains legible to future readers.

Accepted scars:

  • late lawful annex;
  • late public counterline;
  • checksum correction;
  • sponsor unwind;
  • archive objection;
  • affected party receipt;
  • substitute-only route;
  • recovery-only route;
  • future reader surcharge;
  • contradiction-pending state.

Replay evidence shape

lens_id: storyteller.lens.reader_rebuttal_notice.v1
result: pass | fail
session_id: lens-reader-rebuttal-notice-v1-<timestamp>
seed: <deterministic-seed>
entry_state:
  trigger_kind: state_pressure
  cited_authority_row_present: true
  future_reader_present: true
  intended_use_present: true
  affected_party_or_explicit_absence_present: true
  notice_boundary_unresolved: true
  no_fixed_turn_trigger: true
  no_fixed_day_or_week_trigger: true
active_objects:
  card: storyteller.card.reader_rebuttal_notice_ledger.v1
  rite: storyteller.rite.reader_rebuttal_notice_hearing.v1
  event_default: storyteller.event.rebuttal_notice_default.v1
citation_context:
  source_row_id: <stable cited row id>
  source_surface: transcript | rehearsal_trace | delegate_mandate | recovery_discharge | default_recovery | asset_provenance | contrition | witness | archive_custody | equivalent
  citing_reader: <reader>
  intended_use: <use>
  affected_party_or_absence: <party or explicit_absence>
offered_choices:
  - private_notice
  - lawful_annex
  - public_counterline
  - editor_mask
  - sponsor_silence
  - archive_objection
  - split_notice
  - no_notice
branch_runs:
  valid_branch:
    selected_notice_boundary: <boundary>
    notice_carrier_or_absence: <carrier or explicit_absence>
    rebuttal_proof_or_absence: <proof or explicit_absence>
    affected_party_state_after: <state>
    cited_row_state_after: <state>
    future_reader_effect: <effect>
    counter_deltas:
      relief: []
      cost: []
      future: []
  default_branch:
    selected_notice_boundary: no_notice | false_notice
    emitted_or_armed_event: storyteller.event.rebuttal_notice_default.v1
    default_kind: <kind>
    default_narrator: <narrator>
    harmed_party_state_after: <state>
    cited_row_state_after: <state>
    future_reader_effect: <effect>
assertions:
  primary_links_exist: true
  entry_is_state_triggered_by_future_reader_citation: true
  cited_row_reader_intended_use_and_affected_party_are_visible: true
  notice_carrier_rebuttal_proof_boundary_and_future_reader_are_recorded: true
  hearing_assignment_slots_are_explicit: true
  branch_families_diverge: true
  future_reader_acceptance_changes_by_boundary: true
  hard_boundary_misfilings_arm_default: true
  no_notice_default_is_durable: true
  recovery_keeps_scar: true
  no_fixed_turn_day_week_raw_count_dashboard_or_lens_health_trigger: true

Progress metric

readerRebuttalNoticeProgress = 0..9:

  • 0: future reader cites prior row with no notice surface.
  • 1: cited row, future reader, and intended use are visible.
  • 2: affected party or explicit absence is visible.
  • 3: Reader Rebuttal Notice Ledger enters play.
  • 4: notice carrier, rebuttal proof, boundary, response-window state, and future reader are recorded.
  • 5: Reader Rebuttal Notice Hearing exposes assignment slots.
  • 6: at least three legitimate notice branches produce different reader acceptance and counter deltas.
  • 7: no-notice or false-notice arms/fires Rebuttal Notice Default.
  • 8: at least five branch families are proven, including one public/lawful/editor/sponsor/archive/split branch and one default branch.
  • 9: downstream route or reader consumes notice boundary and proves no universal clean authority reuse.

Non-goals

  • Not a governance or methodology page.
  • Not a notification UI.
  • Not a raw count target.
  • Not a fixed cleanup phase.
  • Not a replay of the original hearing, rehearsal, delegate, discharge, or recovery scene.
  • Not valid if cited rows have the same future-reader effect with and without rebuttal.