Lens: Archive and memorial claims remain contested, capped, and replayable

Purpose

Ensure archive, memorial, disaster-naming, refusal-to-remember, and bootleg-recursion cards become bounded replay evidence. These cards should not silently overwrite artist memory, audience testimony, or continuity state.

This lens is especially focused on the turn 31 archive cluster: 郁蓝 / 未授权史官, 观众归档署名, 灾难命名权合约, 归档权认领桌, 艺人拒忆回执, 纪念物临时牌照草案, and 盗播归档回环.

Linked canon/source pages

Create or update:

  • wiki/content/storyteller/turns/turn-031.md
  • wiki/content/storyteller/cards/current-hand-turn-031.md
  • wiki/content/storyteller/factions/continuity-archive-white-glove.md
  • wiki/content/storyteller/rites/baseline-combat-01-anbao-qingchang.md
  • wiki/content/storyteller/public-manifest.md

Optional future page:

  • wiki/content/storyteller/mechanics/archive-claims-and-memorial-licenses.md

Affected cards

Primary:

  • 郁蓝 / 未授权史官
  • 观众归档署名
  • 灾难命名权合约
  • 未归档黑箱残片
  • 归档权认领桌
  • 未归档法律身体豁免
  • 双层归档副本
  • 连续性租赁许可
  • 余物风险登记表
  • 未授权纪念贴纸
  • 盗播归档回环
  • 艺人拒忆回执
  • 纪念物临时牌照草案

Secondary:

  • 白鸦 / 黑箱剪辑师
  • 前任清算录像
  • 第七穹顶连续性案卷
  • 安全连续性版本
  • 韩砚霜 / 白手套监察
  • 白手套审计章
  • 冠名方止损令
  • 白昼圣殿舞台许可
  • 黎星瞳 / 白昼圣女

Affected rites

  • storyteller.rite.baseline_combat_01.security_clearance, as the likely trigger rite.
  • Any future archive_claim, memorial_license, or continuity_lease rites.

Affected events

Expected implementation event types:

  • storyteller.archive.claim_opened
  • storyteller.archive.claim_resolved
  • storyteller.archive.double_copy_created
  • storyteller.archive.recursion_tick
  • storyteller.archive.recursion_capped
  • storyteller.memorial.license_drafted
  • storyteller.memorial.unauthorized_sticker_created
  • storyteller.artist.refusal_recorded
  • storyteller.artist.refusal_overridden
  • storyteller.continuity.lease_bound
  • storyteller.legal_body.exemption_attached
  • storyteller.historian.unauthorized_recruited

Affected counters

  • archiveClaimOpened
  • archiveClaimResolved
  • unauthorizedMemorial
  • piratedArchiveRecursion
  • piratedArchiveRecursionCapped
  • artistRefusalRecorded
  • artistRefusalOverridden
  • doubleArchiveCopy
  • continuityLeaseBound
  • legalBodyExemptionAttached
  • unarchivedResidue

Affected factions

  • 观众归档署
  • 未授权史官
  • 白手套监察
  • 黑箱剪辑室
  • 白昼圣殿
  • 冠名方
  • 第七穹顶连续性机关, if represented separately

Oracle assertions

Assertion 1 — archive claim must name claimant, subject, and artifact

Any use of 归档权认领桌, 观众归档署名, 灾难命名权合约, or 纪念物临时牌照草案 within the horizon must emit an archive or memorial claim event:

expect(events).toContainEqual(expect.objectContaining({
  type: expect.stringMatching(
    /^storyteller\.(archive\.claim_opened|memorial\.license_drafted)$/
  ),
  claimant: expect.any(String),
  subject: expect.any(String),
  artifact: expect.any(String),
}));

Failure condition: archive/memorial card is consumed with no corresponding event.

Assertion 2 — artist refusal cannot be overwritten silently

If 艺人拒忆回执 is present in the hand, slotted, revealed, or referenced by an archive/memorial event, it must produce one of:

  • storyteller.artist.refusal_recorded
  • storyteller.artist.refusal_upheld
  • storyteller.artist.refusal_overridden

Override must include cost/consequence:

if (event.type === "storyteller.artist.refusal_overridden") {
  expect(event.cost ?? event.consequence).toBeDefined();
  expect(event.actorResponsible).toBeDefined();
}

Assertion 3 — double archive copy preserves split continuity

If 双层归档副本 is used, the replay must contain distinct public/private or official/unofficial continuity identifiers:

expect(event).toEqual(expect.objectContaining({
  type: "storyteller.archive.double_copy_created",
  publicContinuityId: expect.any(String),
  privateContinuityId: expect.any(String),
}));
 
expect(event.publicContinuityId).not.toEqual(event.privateContinuityId);

Assertion 4 — pirated archive recursion must be capped

盗播归档回环 can recurse, but not infinitely. Within turns 31–61:

expect(counters.piratedArchiveRecursion).toBeLessThanOrEqual(2);
expect(events).toContainEqual(expect.objectContaining({
  type: "storyteller.archive.recursion_capped"
}));

If the engine uses a different cap, the lens should read it from config, but it must assert that replay event count remains bounded.

Assertion 5 — unauthorized historian recruit preserves residue

If 郁蓝 / 未授权史官 is recruited, one residue or protected testimony must remain:

if (events.some(e => e.type === "storyteller.historian.unauthorized_recruited")) {
  expect(events).toContainEqual(expect.objectContaining({
    type: expect.stringMatching(
      /^storyteller\.(archive\.claim_opened|continuity\.residue_registered|artist\.refusal_recorded)$/
    ),
  }));
}

Assertion 6 — memorial license must bind to continuity or become unauthorized

If 纪念物临时牌照草案 or 未授权纪念贴纸 appears, exactly one of these outcomes must be visible:

  • memorial license bound to a continuity case;
  • unauthorized memorial counter increments;
  • suppress branch creates risk/residue.
expect([
  event.continuityCaseId !== undefined,
  counters.unauthorizedMemorial > 0,
  counters.unarchivedResidue > 0
]).toContain(true);

Progress metric

archive_claim_bound_coverage =
  count(archive/memorial claim events with claimant + subject + artifact + disposition)
  /
  count(archive/memorial claim events)

Additional guard metric:

pirated_archive_loop_bounded =
  piratedArchiveRecursion <= configuredCap

Passing fixture target:

  • archive_claim_bound_coverage = 1.0
  • pirated_archive_loop_bounded = true
  • artistRefusalSilentlyOverwritten = 0

Dashboard evidence may show:

{
  "lensId": "storyteller.archive_memorial_claims.v1",
  "status": "unbound|failing|passing",
  "horizon": { "fromTurn": 31, "toTurn": 61 },
  "metrics": {
    "archive_claim_bound_coverage": 0,
    "pirated_archive_loop_bounded": false,
    "artistRefusalSilentlyOverwritten": 0,
    "unauthorizedMemorial": 0,
    "unarchivedResidue": 0
  },
  "sampleEvents": []
}

Expected replay evidence shape

{
  "turn": 38,
  "sourceRiteId": "storyteller.rite.baseline_combat_01.security_clearance",
  "playedCards": [
    "归档权认领桌",
    "郁蓝 / 未授权史官",
    "双层归档副本",
    "艺人拒忆回执",
    "纪念物临时牌照草案"
  ],
  "events": [
    {
      "type": "storyteller.archive.claim_opened",
      "claimant": "观众归档署",
      "subject": "安保清场后的观众裂缝证词",
      "artifact": "双层归档副本",
      "contestedBy": ["郁蓝 / 未授权史官", "艺人拒忆回执"],
      "disposition": "contested"
    },
    {
      "type": "storyteller.archive.double_copy_created",
      "publicContinuityId": "安全连续性版本",
      "privateContinuityId": "未授权史官残本",
      "sourceEvidence": ["观众裂缝证词", "未归档黑箱残片"]
    },
    {
      "type": "storyteller.artist.refusal_recorded",
      "sourceCard": "艺人拒忆回执",
      "protectedAgainst": ["灾难命名权合约", "纪念物临时牌照草案"]
    }
  ],
  "counters": {
    "archiveClaimOpened": 1,
    "doubleArchiveCopy": 1,
    "artistRefusalRecorded": 1,
    "artistRefusalSilentlyOverwritten": 0
  }
}

Branch notes

encounter

An archive encounter should surface a claimant: 观众归档署, 冠名方, 白昼圣殿, 白手套监察, 郁蓝, 白鸦, or the artist whose memory is being claimed.

miss

A miss should generate 未授权纪念贴纸, 余物风险登记表, or 未归档黑箱残片. It should not simply discard a failed archive claim.

recruit

Recruiting 郁蓝 should preserve an unofficial version. Recruiting 白鸦 should enable editing but leave black-box trace. Recruiting 韩砚霜 should enable lawful audit but constrain silent suppression.

suppress

Suppressing archive claims requires authority and must leave either audit trace, sponsor stop-loss trace, legal-body exemption, or unarchived residue.

consequence

Consequences should alter continuity state: split copy, leased continuity, unauthorized memorial, capped recursion, refusal upheld/overridden, or a new claim opened.