Lens: 安保清场压力支线 must remain branchy, replay-visible, and evidence-bound

Target

This lens tests 安保清场压力支线, not a single rite.

Individual rites and events may support the storyline, including Storyteller baseline combat 01:安保清场, proposed Storyteller baseline combat 02:安保清场, audit cordon events, witness events, oxygen review events, and black-box edit consequences. The tested subject is the route-level behavior: clearing/security pressure must become a branching storyline with persistent evidence and route consequences.

Core property

A passing implementation must prove that 安保清场压力支线 does not collapse into one generic success/failure verb.

Within a 30-turn horizon from turn 31 active-hand provenance, the replay evidence must show:

  1. the storyline becomes active from security/archive/oxygen/audit pressure;
  2. at least two materially different clearance branches are offered or exercised across fixtures;
  3. those branches use different named cards or authorities;
  4. evidence is bound, contested, suppressed, or left as residue;
  5. counter deltas differ by branch;
  6. failure or miss states are visible when requirements are unmet.

Provenance expectation

Replay fixtures should start from Storyteller turn 31 or equivalent source provenance:

expect(replay.session).toEqual(expect.objectContaining({
  source: "storyteller",
  provenance: expect.stringMatching(/active-hand-2026-05-30|turn31|f8cf7d45324a/),
}));

The active hand should include enough relevant cards to make the branchline meaningful. At minimum, a fixture should include three or more of:

  • 黎星瞳 / 白昼圣女
  • 白鸦 / 黑箱剪辑师
  • 郁蓝 / 未授权史官
  • 韩砚霜 / 白手套监察
  • 观众裂缝证词
  • 呼吸配给复核钥
  • 安全连续性版本
  • 未归档黑箱残片
  • 粉丝氧气积分账
  • 白手套审计章

Oracle assertions

Assertion 1 — storyline activation is explicit

The replay must expose that the storyline became active, either as a storyline state, route tag, dashboard entry, or equivalent event:

expect(replay).toHaveStorylineState("storyteller.storyline.security_clearance_pressure_branchline.v1");
 
expect(replay.events).toContainEqual(expect.objectContaining({
  type: expect.stringMatching(/security_clearance|audit_cordon|witness_clearance|oxygen_review|black_box_edit/),
  storylineId: "storyteller.storyline.security_clearance_pressure_branchline.v1",
}));

A rite-only event without storyline membership is insufficient.

Assertion 2 — at least two materially different branches exist

Across committed fixtures or within a single replay, the storyline must expose at least two distinct branch keys:

const branchEvents = replay.events.filter(e =>
  e.storylineId === "storyteller.storyline.security_clearance_pressure_branchline.v1" &&
  e.branchKey
);
 
expect(new Set(branchEvents.map(e => e.branchKey)).size).toBeGreaterThanOrEqual(2);

Accepted branch keys include:

  • clean_audit_cordon
  • saint_crowd_calming
  • black_box_relief_cut
  • contested_witness_clearance
  • oxygen_ration_review

Assertion 3 — branches differ by authority and card assignment

The two branches may not be aliases of the same action. They must use different authorities or different named cards:

expect(branchEvents).toEqual(expect.arrayContaining([
  expect.objectContaining({ assignedCards: expect.arrayContaining([expect.stringMatching(/韩砚霜|白手套审计章/)]) }),
  expect.objectContaining({ assignedCards: expect.arrayContaining([expect.stringMatching(/郁蓝|白鸦|黎星瞳|呼吸配给复核钥/)]) }),
]));

Assertion 4 — evidence disposition is mandatory

If the branchline touches a witness/evidence card, the event must include one or more evidence dispositions:

for (const event of branchEvents) {
  if ((event.assignedCards ?? []).some(card => /观众裂缝证词|未归档黑箱残片|粉丝氧气积分账|安全连续性版本/.test(card))) {
    expect(event.evidence).toEqual(expect.objectContaining({
      bound: expect.any(Array),
      contested: expect.any(Array),
      suppressed: expect.any(Array),
      residue: expect.any(Array),
    }));
    expect(event.evidence.discardedWithoutTrace ?? []).toHaveLength(0);
  }
}

The arrays may be empty except for the relevant disposition, but the evidence object must exist and discardedWithoutTrace must be empty.

Assertion 5 — branch deltas differ

At least two branch outcomes must have different counter-delta signatures:

const signatures = branchEvents.map(e => JSON.stringify(e.deltas ?? {}));
expect(new Set(signatures).size).toBeGreaterThanOrEqual(2);

Expected delta examples:

{
  "clean_audit_cordon": {
    "publicPanic": -1,
    "whiteGloveAuditTrace": 1,
    "auditPressure": 1,
    "continuityHazard": -1,
    "suppressedWithoutTrace": 0
  },
  "contested_witness_clearance": {
    "publicPanic": -1,
    "audienceCrackEvidenceBound": 1,
    "unauthorizedWitnessHeat": 1,
    "archiveTrust": -1,
    "continuityHazard": 1
  },
  "black_box_relief_cut": {
    "publicPanic": -1,
    "blackBoxResidue": 1,
    "archiveDebt": 1,
    "archiveTrust": -1
  }
}

Assertion 6 — miss/failure remains visible

If the storyline is activated but no valid clearance branch resolves within the horizon, the replay must show a visible miss or failure state:

expect(replay.events).toContainEqual(expect.objectContaining({
  storylineId: "storyteller.storyline.security_clearance_pressure_branchline.v1",
  type: expect.stringMatching(/missed|failed|unhandled/),
  visibility: expect.stringMatching(/dashboard|timeline|hand_log|replay/),
  reason: expect.stringMatching(/authority|witness|oxygen|continuity|evidence/),
}));

Silence is not a valid miss.

Progress metrics

security_clearance_storyline_branch_count =
  count(distinct branchKey where storylineId = storyteller.storyline.security_clearance_pressure_branchline.v1)

Passing target: >= 2.

security_clearance_storyline_evidence_disposition_ratio =
  count(branchline events touching evidence with bound/contested/suppressed/residue disposition)
  /
  count(branchline events touching evidence)

Passing target: 1.0.

security_clearance_storyline_distinct_delta_ratio =
  count(distinct counter-delta signatures)
  /
  count(branchline resolved branch events)

Passing target: at least two distinct signatures in committed fixtures.

Replay evidence shape

Fixture A — audit branch

{
  "session": {
    "source": "storyteller",
    "provenance": "active-hand-2026-05-30",
    "startTurn": 31,
    "seed": "security-clearance-branchline-audit"
  },
  "storyline": {
    "id": "storyteller.storyline.security_clearance_pressure_branchline.v1",
    "status": "active"
  },
  "events": [
    {
      "turn": 32,
      "type": "storyteller.audit_cordon.resolved",
      "storylineId": "storyteller.storyline.security_clearance_pressure_branchline.v1",
      "branchKey": "clean_audit_cordon",
      "assignedCards": ["韩砚霜 / 白手套监察", "安全连续性版本", "呼吸配给复核钥"],
      "evidence": {
        "bound": ["安全连续性版本"],
        "contested": [],
        "suppressed": [],
        "residue": [],
        "discardedWithoutTrace": []
      },
      "deltas": {
        "publicPanic": -1,
        "whiteGloveAuditTrace": 1,
        "auditPressure": 1,
        "continuityHazard": -1,
        "suppressedWithoutTrace": 0
      }
    }
  ]
}

Fixture B — witness branch

{
  "session": {
    "source": "storyteller",
    "provenance": "active-hand-2026-05-30",
    "startTurn": 31,
    "seed": "security-clearance-branchline-witness"
  },
  "storyline": {
    "id": "storyteller.storyline.security_clearance_pressure_branchline.v1",
    "status": "active"
  },
  "events": [
    {
      "turn": 33,
      "type": "storyteller.witness_clearance.resolved",
      "storylineId": "storyteller.storyline.security_clearance_pressure_branchline.v1",
      "branchKey": "contested_witness_clearance",
      "assignedCards": ["郁蓝 / 未授权史官", "观众裂缝证词", "安全连续性版本"],
      "evidence": {
        "bound": [],
        "contested": ["观众裂缝证词"],
        "suppressed": [],
        "residue": [],
        "discardedWithoutTrace": []
      },
      "followUp": [
        { "type": "archive_claim", "title": "观众归档权要求认领清场证词" },
        { "type": "miss_risk", "title": "未授权史实进入后续审计" }
      ],
      "deltas": {
        "publicPanic": -1,
        "audienceCrackEvidenceBound": 1,
        "unauthorizedWitnessHeat": 1,
        "archiveTrust": -1,
        "continuityHazard": 1
      }
    }
  ]
}

Boundaries

  • Do not test only whether Storyteller baseline combat 02:安保清场 resolves.
  • Do not require all supporting rites/events to exist as separate pages before the storyline can be tested.
  • Do require every supporting event to identify the storyline it advances.
  • Do require at least two materially different branch outcomes.
  • Do require evidence disposition and visible deltas.

The lens passes only when the player-facing route behavior is visible, not when one isolated rite succeeds.