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:
- the storyline becomes active from security/archive/oxygen/audit pressure;
- at least two materially different clearance branches are offered or exercised across fixtures;
- those branches use different named cards or authorities;
- evidence is bound, contested, suppressed, or left as residue;
- counter deltas differ by branch;
- 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_cordonsaint_crowd_calmingblack_box_relief_cutcontested_witness_clearanceoxygen_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.