feat: compress Scene 11 storyboard beats

This commit is contained in:
lda
2026-07-12 09:00:56 +07:00 Verified
parent 2b4914f21c
commit 3efb51672b
3 changed files with 17 additions and 5 deletions
+1 -1
View File
@@ -289,7 +289,7 @@ separate activity after these surfaces are stable.
scope the truth badge to demo scenes, move the prepared-run action to Scene scope the truth badge to demo scenes, move the prepared-run action to Scene
10, and correct the Scene 10 graph/proof projection. 10, and correct the Scene 10 graph/proof projection.
4. **Scene 11 compression:** reduce the typed-human-boundary scene to two 4. **Scene 11 compression:** reduce the typed-human-boundary scene to two
beats: interrupt context and approval decision. Cancellation remains a beats: interrupt context and approval decision. Cancellation remains a
decision outcome rather than a near-duplicate presentation beat. decision outcome rather than a near-duplicate presentation beat.
Implementation plan: Implementation plan:
[`Scene 11 decision beat compression`](superpowers/plans/2026-07-12-scene-11-decision-beat-compression.md). [`Scene 11 decision beat compression`](superpowers/plans/2026-07-12-scene-11-decision-beat-compression.md).
@@ -57,7 +57,6 @@ describe("defense storyboard catalog", () => {
expect(findBeat("run-from-deployment", "input")?.chatMode).toBe("hidden"); expect(findBeat("run-from-deployment", "input")?.chatMode).toBe("hidden");
expect(findBeat("run-from-deployment", "graph")?.chatMode).toBe("hidden"); expect(findBeat("run-from-deployment", "graph")?.chatMode).toBe("hidden");
expect(findBeat("typed-human-boundary", "approval")?.chatMode).toBe("hidden"); expect(findBeat("typed-human-boundary", "approval")?.chatMode).toBe("hidden");
expect(findBeat("typed-human-boundary", "cancel")?.chatMode).toBe("hidden");
expect(findBeat("resume-output-evidence", "resume")?.chatMode).toBe("hidden"); expect(findBeat("resume-output-evidence", "resume")?.chatMode).toBe("hidden");
expect(findBeat("resume-output-evidence", "output")?.chatMode).toBe("hidden"); expect(findBeat("resume-output-evidence", "output")?.chatMode).toBe("hidden");
expect(findBeat("resume-output-evidence", "trace")?.chatMode).toBe("hidden"); expect(findBeat("resume-output-evidence", "trace")?.chatMode).toBe("hidden");
@@ -86,12 +85,21 @@ describe("defense storyboard catalog", () => {
expect(findBeat("run-from-deployment", "graph")).toBeDefined(); expect(findBeat("run-from-deployment", "graph")).toBeDefined();
expect(findBeat("typed-human-boundary", "interrupt")).toBeDefined(); expect(findBeat("typed-human-boundary", "interrupt")).toBeDefined();
expect(findBeat("typed-human-boundary", "approval")).toBeDefined(); expect(findBeat("typed-human-boundary", "approval")).toBeDefined();
expect(findBeat("typed-human-boundary", "cancel")).toBeDefined();
expect(findBeat("resume-output-evidence", "resume")).toBeDefined(); expect(findBeat("resume-output-evidence", "resume")).toBeDefined();
expect(findBeat("resume-output-evidence", "output")).toBeDefined(); expect(findBeat("resume-output-evidence", "output")).toBeDefined();
expect(findBeat("resume-output-evidence", "trace")).toBeDefined(); expect(findBeat("resume-output-evidence", "trace")).toBeDefined();
}); });
it("compresses Scene 11 into interrupt context and one operator decision beat", () => {
expect(findScene("typed-human-boundary")?.beats.map((beat) => beat.id)).toEqual([
"interrupt",
"approval",
]);
expect(findBeat("typed-human-boundary", "interrupt")?.caption).toMatch(/boundary|interrupt/i);
expect(findBeat("typed-human-boundary", "approval")?.caption).toMatch(/decision|resume/i);
expect(findBeat("typed-human-boundary", "cancel")).toBeUndefined();
});
it("defines discussion branches across multiple scenes", () => { it("defines discussion branches across multiple scenes", () => {
expect(discussionBranches.length).toBeGreaterThanOrEqual(5); expect(discussionBranches.length).toBeGreaterThanOrEqual(5);
const positioningBranches = discussionBranches.filter((b) => b.parentSceneId === "positioning"); const positioningBranches = discussionBranches.filter((b) => b.parentSceneId === "positioning");
@@ -199,8 +199,12 @@ export const mainScenes = defineScenes([
view: "demo", view: "demo",
beats: [ beats: [
sceneBeat("interrupt", "Interrupt payload", "Execution reaches a declared issue-review boundary.", { chatMode: "hidden", chatTheme: "light" }), sceneBeat("interrupt", "Interrupt payload", "Execution reaches a declared issue-review boundary.", { chatMode: "hidden", chatTheme: "light" }),
sceneBeat("approval", "Approval", "The operator reviews a schema-backed resume request.", { chatMode: "hidden", chatTheme: "light" }), sceneBeat(
sceneBeat("cancel", "Cancel path", "Replay cancellation stays honest and does not show submitted evidence.", { chatMode: "hidden", chatTheme: "light" }), "approval",
"Approval",
"The operator makes a decision by choosing a submitted or revision-requested outcome for the paused run.",
{ chatMode: "hidden", chatTheme: "light" },
),
], ],
}, },
{ {