Lens: Storyteller baseline combat 02:安保清场 pressure branches must resolve with visible evidence

Scope

This lens defines the executable contract for the second security-clearance pressure rite, display name Storyteller baseline combat 02:安保清场, proposed stable rite id storyteller.rite.baseline_combat_02.security_clearance_pressure_branches.

The rite is a pressure-branch expansion of Storyteller baseline combat 01:安保清场, not a generic combat sequel. It should test whether the player clears a room by public calming, audit cordon, black-box edit, unauthorized witness custody, or ration review, and whether that clearance leaves replay-visible state.

The source hand is anchored by Storyteller active hand snapshot — 2026-05-30. The continuity/evidence precedent is 安保清场 binds security resolution to continuity evidence.

Design intent

安保清场 02 should make clearing/security pressure materially branchy. The player is not merely deciding whether a clearance succeeds; the player chooses whose authority makes it succeed, what gets archived, what gets suppressed, who remembers the room, and which future danger becomes visible.

A passing implementation must produce at least two materially different outcomes from the same pressure family inside a 30-turn replay horizon:

  • clean audit cordon: the room clears through 白手套/continuity authority; public panic falls, but an audit trace and continuity lock remain.
  • contested witness clearance: the room physically clears, but 郁蓝 or audience evidence preserves a counter-record; clearance success creates future miss/failure visibility instead of clean deletion.

Optional additional branch:

  • black-box relief cut: 白鸦 edits the clearance into broadcast compliance; room clears quickly, but black-box residue and archive debt increase.

Affected cards

Primary current-hand cards:

  • 白昼圣女 — converts panic into devotional compliance; may reduce immediate crowd pressure while creating memorial debt.
  • 黑箱剪辑师 — edits the visible event; may clear broadcast pressure while creating black-box residue.
  • 未授权史官 — preserves counter-history; may turn a clean clear into a contested witness branch.
  • 白手套监察 — authorizes or challenges the cordon; creates audit trace on suppress/clean branches.
  • 观众裂缝证词 — witness evidence that must be bound, contested, suppressed, or preserved as residue.
  • 呼吸配给复核钥 — oxygen/ration authority; opens ration-review clearance and prevents free oxygen deletion.
  • 安全连续性版本 — official continuity surface; records whether the clearance is bound, split, or contested.

Secondary useful cards/assets:

Affected rites

  • Existing precedent: storyteller.rite.baseline-combat-01.security-clearance, display Storyteller baseline combat 01:安保清场.
  • New target for worker binding: storyteller.rite.baseline_combat_02.security_clearance_pressure_branches, display Storyteller baseline combat 02:安保清场.

Affected counters

The sibling test should accept project-native counter names if they already exist, but the branch payload must expose equivalent deltas:

  • securityClearanceResolved
  • securityClearanceBranchCount
  • publicPanic
  • auditPressure
  • whiteGloveAuditTrace
  • oxygenMargin
  • oxygenReviewUsed
  • archiveTrust
  • archiveDebt
  • blackBoxResidue
  • continuityHazard
  • audienceCrackEvidenceBound
  • unauthorizedWitnessHeat
  • suppressedWithoutTrace must stay 0 in passing clean/suppress fixtures.

Offered choices requirement

Within turns 31–61, when the current hand contains at least three of the primary cards, the replay must offer Storyteller baseline combat 02:安保清场 with at least two choices from this set:

  1. 白手套安全封线 — assign 白手套监察 or 白手套审计章 with 安全连续性版本.
  2. 圣女安抚清场 — assign 白昼圣女 with oxygen or crowd pressure present.
  3. 黑箱减压剪辑 — assign 黑箱剪辑师 with 未归档黑箱残片 or witness evidence.
  4. 未授权见证清场 — assign 未授权史官 with 观众裂缝证词.
  5. 呼吸配给复核 — assign 呼吸配给复核钥 with 粉丝氧气积分账 or oxygen pressure.

A passing fixture may offer more than two choices, but at least two offered choices must lead to different branch names and different counter deltas.

Oracle assertions

Assertion 1 — combat 02 offer appears from active-hand provenance

A replay seeded from the active Storyteller source at or after turn 31 must show the offered rite within the horizon:

expect(replay.session).toEqual(expect.objectContaining({
  source: "storyteller",
  provenance: expect.stringMatching(/active-hand-2026-05-30|turn31|f8cf7d45324a/),
}));
 
expect(replay.offers).toContainEqual(expect.objectContaining({
  riteId: "storyteller.rite.baseline_combat_02.security_clearance_pressure_branches",
  title: "Storyteller baseline combat 02:安保清场",
  turn: expect.any(Number),
}));

The offer turn must be >= 31 and <= 61.

Assertion 2 — at least two branch choices are materially distinct

For the offered rite instance, the choice list must contain at least two branch choices with distinct branchKey values and distinct required assignments:

const choices = offer.choices.filter(c => c.riteId === "storyteller.rite.baseline_combat_02.security_clearance_pressure_branches");
expect(new Set(choices.map(c => c.branchKey)).size).toBeGreaterThanOrEqual(2);
expect(choices.some(c => c.requiredCards?.includes("韩砚霜 / 白手套监察") || c.requiredCards?.includes("白手套审计章"))).toBe(true);
expect(choices.some(c => c.requiredCards?.includes("郁蓝 / 未授权史官") || c.requiredCards?.includes("白鸦 / 黑箱剪辑师") || c.requiredCards?.includes("黎星瞳 / 白昼圣女"))).toBe(true);

Assertion 3 — clean audit cordon creates trace, not silent success

When assigned 白手套监察 or 白手套审计章 with 安全连续性版本, the resolution must be a clean/audit branch with visible trace and continuity lock:

expect(resolution).toEqual(expect.objectContaining({
  type: "storyteller.security_clearance.resolved",
  riteId: "storyteller.rite.baseline_combat_02.security_clearance_pressure_branches",
  branch: "clean_audit_cordon",
  assignedCards: expect.arrayContaining([expect.stringMatching(/韩砚霜|白手套审计章/), "安全连续性版本"]),
  audit: expect.objectContaining({
    authority: expect.stringMatching(/白手套|white_glove/),
    traceId: expect.any(String),
  }),
  continuity: expect.objectContaining({
    publicVersionId: "安全连续性版本",
    status: expect.stringMatching(/bound|locked|audit_bound/),
  }),
}));
 
expect(resolution.deltas).toEqual(expect.objectContaining({
  securityClearanceResolved: 1,
  whiteGloveAuditTrace: expect.any(Number),
  suppressedWithoutTrace: 0,
}));

Minimum expected deltas for this branch:

{
  "securityClearanceResolved": 1,
  "publicPanic": -1,
  "whiteGloveAuditTrace": 1,
  "auditPressure": 1,
  "continuityHazard": -1,
  "suppressedWithoutTrace": 0
}

Assertion 4 — contested witness clearance preserves evidence and future pressure

When assigned 未授权史官 with 观众裂缝证词, the room may clear, but the evidence cannot be deleted or converted into a clean state:

expect(resolution).toEqual(expect.objectContaining({
  type: "storyteller.security_clearance.resolved",
  riteId: "storyteller.rite.baseline_combat_02.security_clearance_pressure_branches",
  branch: "contested_witness_clearance",
  assignedCards: expect.arrayContaining(["郁蓝 / 未授权史官", "观众裂缝证词"]),
  evidence: expect.objectContaining({
    contested: expect.arrayContaining(["观众裂缝证词"]),
  }),
  followUp: expect.arrayContaining([
    expect.objectContaining({
      type: expect.stringMatching(/miss|encounter|archive_claim|risk/),
    }),
  ]),
}));
 
expect(resolution.evidence.discardedWithoutTrace ?? []).toHaveLength(0);

Minimum expected deltas for this branch:

{
  "securityClearanceResolved": 1,
  "publicPanic": -1,
  "audienceCrackEvidenceBound": 1,
  "unauthorizedWitnessHeat": 1,
  "archiveTrust": -1,
  "continuityHazard": 1
}

Assertion 5 — black-box branch clears broadcast but increases residue

If 黑箱剪辑师 is used, success must not be equivalent to the audit branch. It must show editing residue:

if (resolution.assignedCards.includes("白鸦 / 黑箱剪辑师")) {
  expect(resolution.branch).toBe("black_box_relief_cut");
  expect(resolution.evidence.residue.length).toBeGreaterThanOrEqual(1);
  expect(resolution.deltas.blackBoxResidue).toBeGreaterThan(0);
  expect(resolution.deltas.archiveDebt).toBeGreaterThanOrEqual(1);
}

Assertion 6 — failure/miss is visible, not absence

If no valid authority or witness-bearing assignment is made before horizon expiry, the replay must emit a miss/failure event rather than simply omitting resolution:

expect(replay.events).toContainEqual(expect.objectContaining({
  type: expect.stringMatching(/storyteller.security_clearance.(missed|failed)/),
  riteId: "storyteller.rite.baseline_combat_02.security_clearance_pressure_branches",
  visibility: expect.stringMatching(/dashboard|timeline|hand_log|replay/),
  followUp: expect.arrayContaining([
    expect.objectContaining({ type: expect.stringMatching(/risk|residue|audit|witness/) })
  ]),
}));

Suggested miss/failure deltas:

{
  "publicPanic": 1,
  "auditPressure": 1,
  "continuityHazard": 1,
  "securityClearanceResolved": 0
}

Progress metric

security_clearance_02_branch_evidence_ratio =
  count(combat_02 security clearance resolutions with branch + assignedCards + evidence disposition + counter deltas)
  /
  count(combat_02 security clearance resolutions)

Passing target for committed fixtures: 1.0.

security_clearance_02_material_branch_count =
  count(distinct branch keys with distinct counter-delta signatures in the replay horizon)

Passing target for committed fixtures: >= 2.

Replay evidence shape

Fixture A — clean audit cordon

{
  "session": {
    "source": "storyteller",
    "provenance": "active-hand-2026-05-30",
    "startTurn": 31,
    "seed": "security-clearance-02-audit-cordon"
  },
  "offer": {
    "turn": 32,
    "riteId": "storyteller.rite.baseline_combat_02.security_clearance_pressure_branches",
    "title": "Storyteller baseline combat 02:安保清场",
    "choices": [
      { "branchKey": "clean_audit_cordon", "requiredCards": ["韩砚霜 / 白手套监察", "安全连续性版本"] },
      { "branchKey": "contested_witness_clearance", "requiredCards": ["郁蓝 / 未授权史官", "观众裂缝证词"] }
    ]
  },
  "assignment": {
    "turn": 32,
    "cards": ["韩砚霜 / 白手套监察", "安全连续性版本", "呼吸配给复核钥"]
  },
  "resolution": {
    "turn": 33,
    "type": "storyteller.security_clearance.resolved",
    "branch": "clean_audit_cordon",
    "audit": { "authority": "白手套监察", "traceId": "white_glove_trace_security_02_001" },
    "continuity": { "publicVersionId": "安全连续性版本", "status": "audit_bound" },
    "deltas": {
      "securityClearanceResolved": 1,
      "publicPanic": -1,
      "whiteGloveAuditTrace": 1,
      "auditPressure": 1,
      "continuityHazard": -1,
      "suppressedWithoutTrace": 0
    }
  }
}

Fixture B — contested witness clearance

{
  "session": {
    "source": "storyteller",
    "provenance": "active-hand-2026-05-30",
    "startTurn": 31,
    "seed": "security-clearance-02-contested-witness"
  },
  "offer": {
    "turn": 32,
    "riteId": "storyteller.rite.baseline_combat_02.security_clearance_pressure_branches",
    "title": "Storyteller baseline combat 02:安保清场",
    "choices": [
      { "branchKey": "clean_audit_cordon", "requiredCards": ["韩砚霜 / 白手套监察", "安全连续性版本"] },
      { "branchKey": "contested_witness_clearance", "requiredCards": ["郁蓝 / 未授权史官", "观众裂缝证词"] },
      { "branchKey": "black_box_relief_cut", "requiredCards": ["白鸦 / 黑箱剪辑师", "未归档黑箱残片"] }
    ]
  },
  "assignment": {
    "turn": 32,
    "cards": ["郁蓝 / 未授权史官", "观众裂缝证词", "安全连续性版本"]
  },
  "resolution": {
    "turn": 33,
    "type": "storyteller.security_clearance.resolved",
    "branch": "contested_witness_clearance",
    "evidence": {
      "contested": ["观众裂缝证词"],
      "discardedWithoutTrace": []
    },
    "continuity": { "publicVersionId": "安全连续性版本", "status": "contested" },
    "followUp": [
      { "type": "archive_claim", "title": "观众归档权要求认领清场证词" },
      { "type": "miss_risk", "title": "未授权史实进入后续审计" }
    ],
    "deltas": {
      "securityClearanceResolved": 1,
      "publicPanic": -1,
      "audienceCrackEvidenceBound": 1,
      "unauthorizedWitnessHeat": 1,
      "archiveTrust": -1,
      "continuityHazard": 1
    }
  }
}

Failure and miss visibility

A failed or missed 安保清场 02 must be visible in at least one of:

  • replay event log,
  • turn timeline,
  • dashboard lens evidence,
  • hand/card state inspection.

It must name the missing requirement. Examples:

  • missing authority: no 白手套/producer/license/oxygen review authority was assigned.
  • missing witness handling: 观众裂缝证词 was present but neither bound nor contested.
  • over-edit: 黑箱剪辑师 cleared the broadcast but produced unregistered 未归档黑箱残片.

Referenced wiki edits needed

Small source-of-truth edits for the worker, not implementation code:

  1. Create or update a rite page under wiki/content/storyteller/rites/ for Storyteller baseline combat 02:安保清场 with stable id storyteller.rite.baseline_combat_02.security_clearance_pressure_branches and link this lens in lens_contracts.
  2. On the existing Storyteller baseline combat 01:安保清场 page, add one sentence that combat 02 is the branch-pressure expansion focused on materially different clearance outcomes, not a replacement.
  3. On the active hand snapshot, preserve the provenance field active-hand-2026-05-30 or equivalent so replay fixtures can prove they started from the current hand.

Non-goals

  • Do not require implementation code in this page.
  • Do not collapse all outcomes into generic success or failure.
  • Do not allow evidence cards to disappear without a bound, contested, suppressed, or residue disposition.
  • Do not treat combat 02 as damage combat; it is a management/RPG clearance-pressure rite.