feat: split presentation demo story
This commit is contained in:
@@ -9,8 +9,8 @@ import {
|
|||||||
} from "./storyboard.js";
|
} from "./storyboard.js";
|
||||||
|
|
||||||
describe("defense storyboard catalog", () => {
|
describe("defense storyboard catalog", () => {
|
||||||
it("defines twelve ordered main scenes with unique scene and beat ids", () => {
|
it("defines fourteen ordered main scenes with unique scene and beat ids", () => {
|
||||||
expect(mainScenes).toHaveLength(12);
|
expect(mainScenes).toHaveLength(14);
|
||||||
expect(mainScenes.map((scene) => scene.id)).toEqual([
|
expect(mainScenes.map((scene) => scene.id)).toEqual([
|
||||||
"thesis",
|
"thesis",
|
||||||
"problem",
|
"problem",
|
||||||
@@ -20,8 +20,10 @@ describe("defense storyboard catalog", () => {
|
|||||||
"architecture",
|
"architecture",
|
||||||
"authoring",
|
"authoring",
|
||||||
"agent-handoff",
|
"agent-handoff",
|
||||||
"workflow-demo",
|
"prepared-lifecycle",
|
||||||
"interrupt-evidence",
|
"run-from-deployment",
|
||||||
|
"typed-human-boundary",
|
||||||
|
"resume-output-evidence",
|
||||||
"evaluation",
|
"evaluation",
|
||||||
"conclusion",
|
"conclusion",
|
||||||
]);
|
]);
|
||||||
@@ -35,20 +37,49 @@ describe("defense storyboard catalog", () => {
|
|||||||
|
|
||||||
it("uses act-level stage themes and independent chat composition", () => {
|
it("uses act-level stage themes and independent chat composition", () => {
|
||||||
expect(mainScenes.slice(0, 3).every((scene) => scene.stageTheme === "paper")).toBe(true);
|
expect(mainScenes.slice(0, 3).every((scene) => scene.stageTheme === "paper")).toBe(true);
|
||||||
expect(mainScenes.slice(3, 10).every((scene) => scene.stageTheme === "night")).toBe(true);
|
expect(mainScenes.slice(3, 12).every((scene) => scene.stageTheme === "night")).toBe(true);
|
||||||
expect(mainScenes.slice(10).every((scene) => scene.stageTheme === "paper")).toBe(true);
|
expect(mainScenes.slice(12).every((scene) => scene.stageTheme === "paper")).toBe(true);
|
||||||
expect(findBeat("agent-handoff", "request")?.chatMode).toBe("full");
|
expect(findBeat("agent-handoff", "request")?.chatMode).toBe("full");
|
||||||
expect(findBeat("interrupt-evidence", "trace")?.chatMode).toBe("dock");
|
expect(findBeat("resume-output-evidence", "trace")?.chatMode).toBe("dock");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("keeps chat out of the way during proof-heavy demo beats", () => {
|
it("keeps chat out of the way during proof-heavy demo beats", () => {
|
||||||
expect(findBeat("workflow-demo", "operation")?.chatMode).toBe("full");
|
expect(findBeat("prepared-lifecycle", "draft")?.chatMode).toBe("hidden");
|
||||||
expect(findBeat("workflow-demo", "graph")?.chatMode).toBe("hidden");
|
expect(findBeat("prepared-lifecycle", "deployment")?.chatMode).toBe("hidden");
|
||||||
expect(findBeat("workflow-demo", "interrupt")?.chatMode).toBe("hidden");
|
expect(findBeat("run-from-deployment", "input")?.chatMode).toBe("hidden");
|
||||||
expect(findBeat("interrupt-evidence", "approval")?.chatMode).toBe("hidden");
|
expect(findBeat("run-from-deployment", "graph")?.chatMode).toBe("hidden");
|
||||||
expect(findBeat("interrupt-evidence", "resume")?.chatMode).toBe("hidden");
|
expect(findBeat("typed-human-boundary", "approval")?.chatMode).toBe("hidden");
|
||||||
expect(findBeat("interrupt-evidence", "output")?.chatMode).toBe("hidden");
|
expect(findBeat("typed-human-boundary", "cancel")?.chatMode).toBe("hidden");
|
||||||
expect(findBeat("interrupt-evidence", "trace")?.chatMode).toBe("dock");
|
expect(findBeat("resume-output-evidence", "resume")?.chatMode).toBe("hidden");
|
||||||
|
expect(findBeat("resume-output-evidence", "trace")?.chatMode).toBe("dock");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("splits the demo climax into lifecycle, run, interrupt, and evidence scenes", () => {
|
||||||
|
expect(findScene("prepared-lifecycle")?.number).toBe(9);
|
||||||
|
expect(findScene("run-from-deployment")?.number).toBe(10);
|
||||||
|
expect(findScene("typed-human-boundary")?.number).toBe(11);
|
||||||
|
expect(findScene("resume-output-evidence")?.number).toBe(12);
|
||||||
|
expect(findScene("evaluation")?.number).toBe(13);
|
||||||
|
expect(findScene("conclusion")?.number).toBe(14);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("defines the lifecycle story beats before run evidence", () => {
|
||||||
|
expect(findBeat("prepared-lifecycle", "draft")?.caption).toMatch(/prepared authoring/i);
|
||||||
|
expect(findBeat("prepared-lifecycle", "artifact")?.caption).toMatch(/artifact/i);
|
||||||
|
expect(findBeat("prepared-lifecycle", "deployment")?.caption).toMatch(/source/i);
|
||||||
|
expect(findBeat("prepared-lifecycle", "ready-run")?.caption).toMatch(/ready/i);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("defines focused run, interrupt, and evidence beats", () => {
|
||||||
|
expect(findBeat("run-from-deployment", "input")).toBeDefined();
|
||||||
|
expect(findBeat("run-from-deployment", "operation")).toBeDefined();
|
||||||
|
expect(findBeat("run-from-deployment", "graph")).toBeDefined();
|
||||||
|
expect(findBeat("typed-human-boundary", "interrupt")).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", "output")).toBeDefined();
|
||||||
|
expect(findBeat("resume-output-evidence", "trace")).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("defines discussion branches across multiple scenes", () => {
|
it("defines discussion branches across multiple scenes", () => {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export type SceneView =
|
|||||||
| "authoring"
|
| "authoring"
|
||||||
| "agent"
|
| "agent"
|
||||||
| "demo"
|
| "demo"
|
||||||
|
| "demo-lifecycle"
|
||||||
| "evaluation"
|
| "evaluation"
|
||||||
| "conclusion";
|
| "conclusion";
|
||||||
|
|
||||||
@@ -173,37 +174,65 @@ export const mainScenes = defineScenes([
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "workflow-demo",
|
id: "prepared-lifecycle",
|
||||||
number: 9,
|
number: 9,
|
||||||
title: "Workflow Takes the Stage",
|
title: "Prepared Workflow Lifecycle",
|
||||||
claimClass: "implemented",
|
claimClass: "implemented",
|
||||||
evidencePointer: "Prepared replay and examples/lda_report_workflow",
|
evidencePointer: "examples/lda_report_workflow; deployment inspect replay evidence",
|
||||||
stageTheme: "night",
|
stageTheme: "night",
|
||||||
view: "demo",
|
view: "demo-lifecycle",
|
||||||
beats: [
|
beats: [
|
||||||
sceneBeat("operation", "Start operation", "Raw and interpreted operation evidence enters from chat.", { chatMode: "full", chatTheme: "light" }),
|
sceneBeat("draft", "Prepared draft", "Prepared authoring context creates a reusable report workflow.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
sceneBeat("graph", "Reusable graph", "The graph becomes primary while chat moves out of the way.", { chatMode: "hidden", chatTheme: "light" }),
|
sceneBeat("artifact", "Saved artifact", "The workflow is preserved as a versioned artifact.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
sceneBeat("interrupt", "Typed interrupt", "Execution reaches the issue-review boundary.", { chatMode: "hidden", chatTheme: "light" }),
|
sceneBeat("deployment", "Deployment bindings", "Deployment binds workflow requirements to configured local sources.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
|
sceneBeat("ready-run", "Ready to run", "The deployment is ready to start a persisted run from workflow input.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "interrupt-evidence",
|
id: "run-from-deployment",
|
||||||
number: 10,
|
number: 10,
|
||||||
title: "Interrupt, Resume, Evidence",
|
title: "Run From Deployment",
|
||||||
claimClass: "implemented",
|
claimClass: "implemented",
|
||||||
evidencePointer: "Typed interrupt schemas, run inspection, and trace events",
|
evidencePointer: "workflow.runs.start replay evidence",
|
||||||
stageTheme: "night",
|
stageTheme: "night",
|
||||||
view: "demo",
|
view: "demo",
|
||||||
beats: [
|
beats: [
|
||||||
|
sceneBeat("input", "Workflow input", "The run starts from selected documents and an issue board path.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
|
sceneBeat("operation", "Start operation", "A public operation starts a durable workflow run.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
|
sceneBeat("graph", "Reusable graph", "The run follows a reusable workflow graph, not a chat transcript.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "typed-human-boundary",
|
||||||
|
number: 11,
|
||||||
|
title: "Typed Human Boundary",
|
||||||
|
claimClass: "implemented",
|
||||||
|
evidencePointer: "typed interrupt payload and resume contract",
|
||||||
|
stageTheme: "night",
|
||||||
|
view: "demo",
|
||||||
|
beats: [
|
||||||
|
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("approval", "Approval", "The operator reviews a schema-backed resume request.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
|
sceneBeat("cancel", "Cancel path", "Replay cancellation stays honest and does not show submitted evidence.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "resume-output-evidence",
|
||||||
|
number: 12,
|
||||||
|
title: "Resume, Output, Evidence",
|
||||||
|
claimClass: "implemented",
|
||||||
|
evidencePointer: "workflow.runs.resume, workflow output, and trace replay evidence",
|
||||||
|
stageTheme: "night",
|
||||||
|
view: "demo",
|
||||||
|
beats: [
|
||||||
sceneBeat("resume", "Resume", "The submitted payload resumes the same persisted run.", { chatMode: "hidden", chatTheme: "light" }),
|
sceneBeat("resume", "Resume", "The submitted payload resumes the same persisted run.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
sceneBeat("output", "Output", "The workflow produces the report and issue-board changes.", { chatMode: "hidden", chatTheme: "light" }),
|
sceneBeat("output", "Output", "The workflow produces the report and issue-board changes.", { chatMode: "hidden", chatTheme: "light" }),
|
||||||
sceneBeat("trace", "Evidence", "Trace frames and protocol evidence remain inspectable.", { chatMode: "dock", chatTheme: "light", evidencePresentation: "receipt" }),
|
sceneBeat("trace", "Trace evidence", "Trace frames and protocol evidence remain inspectable.", { chatMode: "dock", chatTheme: "light", evidencePresentation: "receipt" }),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "evaluation",
|
id: "evaluation",
|
||||||
number: 11,
|
number: 13,
|
||||||
title: "Evaluation",
|
title: "Evaluation",
|
||||||
claimClass: "evaluated",
|
claimClass: "evaluated",
|
||||||
evidencePointer: "Thesis Evaluation and Appendix C",
|
evidencePointer: "Thesis Evaluation and Appendix C",
|
||||||
@@ -217,7 +246,7 @@ export const mainScenes = defineScenes([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "conclusion",
|
id: "conclusion",
|
||||||
number: 12,
|
number: 14,
|
||||||
title: "Limits and Conclusion",
|
title: "Limits and Conclusion",
|
||||||
claimClass: "future-work",
|
claimClass: "future-work",
|
||||||
evidencePointer: "Thesis Limitations, Future Work, and Conclusion",
|
evidencePointer: "Thesis Limitations, Future Work, and Conclusion",
|
||||||
@@ -411,7 +440,7 @@ export const discussionBranches = defineDiscussionBranches([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "typed-interrupts",
|
id: "typed-interrupts",
|
||||||
parentSceneId: "interrupt-evidence",
|
parentSceneId: "typed-human-boundary",
|
||||||
title: "Typed interrupt contracts",
|
title: "Typed interrupt contracts",
|
||||||
claimClass: "implemented",
|
claimClass: "implemented",
|
||||||
evidencePointer: "Thesis Typed Interrupts; interrupt schemas",
|
evidencePointer: "Thesis Typed Interrupts; interrupt schemas",
|
||||||
@@ -461,7 +490,7 @@ export const discussionBranches = defineDiscussionBranches([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "replay-provenance",
|
id: "replay-provenance",
|
||||||
parentSceneId: "workflow-demo",
|
parentSceneId: "run-from-deployment",
|
||||||
title: "Replay provenance",
|
title: "Replay provenance",
|
||||||
claimClass: "implemented",
|
claimClass: "implemented",
|
||||||
evidencePointer: "Thesis Prepared Replay; replay evidence chain",
|
evidencePointer: "Thesis Prepared Replay; replay evidence chain",
|
||||||
@@ -469,7 +498,7 @@ export const discussionBranches = defineDiscussionBranches([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "demo-reliability",
|
id: "demo-reliability",
|
||||||
parentSceneId: "workflow-demo",
|
parentSceneId: "run-from-deployment",
|
||||||
title: "Live demo reliability",
|
title: "Live demo reliability",
|
||||||
claimClass: "implemented",
|
claimClass: "implemented",
|
||||||
evidencePointer: "Prepared lda_report_workflow; replay recording; defense presentation runbook",
|
evidencePointer: "Prepared lda_report_workflow; replay recording; defense presentation runbook",
|
||||||
@@ -480,7 +509,7 @@ export const discussionBranches = defineDiscussionBranches([
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "prepared-replay-boundary",
|
id: "prepared-replay-boundary",
|
||||||
parentSceneId: "workflow-demo",
|
parentSceneId: "run-from-deployment",
|
||||||
title: "Prepared replay boundary",
|
title: "Prepared replay boundary",
|
||||||
claimClass: "evaluated",
|
claimClass: "evaluated",
|
||||||
evidencePointer: "Demo recording fixture; replay provenance branch; runbook fallback wording",
|
evidencePointer: "Demo recording fixture; replay provenance branch; runbook fallback wording",
|
||||||
|
|||||||
Reference in New Issue
Block a user