docs: complete scene 11-12 evidence and live activation
This commit is contained in:
@@ -177,11 +177,11 @@ Implementation order:
|
|||||||
that never calls workflow authoring RPC operations during Scene 9
|
that never calls workflow authoring RPC operations during Scene 9
|
||||||
navigation. Implementation:
|
navigation. Implementation:
|
||||||
[`presentation agent authoring story`](historical/superpowers/plans/2026-07-11-presentation-agent-authoring-story.md).
|
[`presentation agent authoring story`](historical/superpowers/plans/2026-07-11-presentation-agent-authoring-story.md).
|
||||||
26. Active: compress Scene 11 typed approval and Scene 12 resume/output/trace
|
26. Completed: compress Scene 11 typed approval and Scene 12 resume/output/trace
|
||||||
evidence into a decision-led, continuation-led presentation, and restore
|
evidence into a decision-led, continuation-led presentation, and restore
|
||||||
live prepared-run activation against the configured JSON-RPC target.
|
live prepared-run activation against the configured JSON-RPC target.
|
||||||
Implementation plan:
|
Implementation plan:
|
||||||
[`Scene 11-12 evidence and live activation`](superpowers/plans/2026-07-11-scene-11-12-live-evidence.md).
|
[`Scene 11-12 evidence and live activation`](historical/superpowers/plans/2026-07-11-scene-11-12-live-evidence.md).
|
||||||
|
|
||||||
Presentation visual audit, July 11:
|
Presentation visual audit, July 11:
|
||||||
|
|
||||||
@@ -189,10 +189,11 @@ Presentation visual audit, July 11:
|
|||||||
unless a later rehearsal exposes a concrete problem.
|
unless a later rehearsal exposes a concrete problem.
|
||||||
- Completed: Scenes 1, 2, 6, and 7 now have concrete focal artifacts, and
|
- Completed: Scenes 1, 2, 6, and 7 now have concrete focal artifacts, and
|
||||||
Scenes 8-10 share a prepared authoring/run spine.
|
Scenes 8-10 share a prepared authoring/run spine.
|
||||||
- Active: Scenes 11-12 need evidence compression so approval, resume, output,
|
- Completed: Scenes 11-12 now use decision-led approval, continuation-led
|
||||||
|
resume/output, and compact factual trace rows so approval, resume, output,
|
||||||
and trace remain factual without competing panels or repeated low-signal
|
and trace remain factual without competing panels or repeated low-signal
|
||||||
values. The prepared live target must also remain live instead of being reset
|
values. A healthy prepared target remains live; failed health probes switch
|
||||||
to replay during route initialization.
|
the presentation back to the offline recording.
|
||||||
- Completed: Scenes 13 and 14 now close with a bounded evaluation board,
|
- Completed: Scenes 13 and 14 now close with a bounded evaluation board,
|
||||||
contribution boundary/future-work map, and canonical defense-question index.
|
contribution boundary/future-work map, and canonical defense-question index.
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,374 @@
|
|||||||
|
# Scene 11-12 Evidence And Live Activation Implementation Plan
|
||||||
|
|
||||||
|
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox syntax for tracking.
|
||||||
|
|
||||||
|
**Goal:** Make Scenes 11 and 12 present compact, factual interrupt/resume/trace evidence while restoring live prepared-workflow execution against the configured JSON-RPC target.
|
||||||
|
|
||||||
|
**Architecture:** Keep the existing canonical DemoRunFacts projection and useDemoTimeline live executor. Remove the route-level replay reset that currently defeats live mode, then use presentation-specific projections and CSS composition changes rather than introducing another state store or transport. Scene 11 remains decision-led; Scene 12 becomes continuation-led, with trace fields rendered as compact factual values.
|
||||||
|
|
||||||
|
**Tech Stack:** React 19, TypeScript, Valibot projections, Vite, Vitest, existing React Flow and source-owned assistant-ui-style chat primitives.
|
||||||
|
|
||||||
|
## Global Constraints
|
||||||
|
|
||||||
|
- Keep one warm Editorial Canvas; do not reintroduce whole-stage theme switching.
|
||||||
|
- Live mode must call the existing executeLiveDemoStep operations against the resolved target; replay mode remains deterministic and offline.
|
||||||
|
- Scene 8 and Scene 9 continue using the reviewed prepared authoring recording; live execution applies to the prepared run flow in Scenes 10-12.
|
||||||
|
- Do not invent output, trace frames, issue IDs, or resume outcomes when the live response is absent or invalid.
|
||||||
|
- Preserve existing hash routes, approval/cancel behavior, evidence recording, and hidden internal scrollbars.
|
||||||
|
- Do not add another state store, RPC client, or chat transport.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 1: Document The Current Presentation Contract Before Code Changes
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Create: docs/superpowers/plans/2026-07-11-scene-11-12-live-evidence.md
|
||||||
|
- Modify: docs/current_roadmap.md
|
||||||
|
- Modify: web/README.md
|
||||||
|
|
||||||
|
- [x] **Step 1: Add the active roadmap item**
|
||||||
|
|
||||||
|
Add item 26 after the current presentation items:
|
||||||
|
|
||||||
|
~~~md
|
||||||
|
26. Active: compress Scene 11 typed approval and Scene 12 resume/output/trace
|
||||||
|
evidence into a decision-led, continuation-led presentation, and restore
|
||||||
|
live prepared-run activation against the configured JSON-RPC target.
|
||||||
|
Implementation plan:
|
||||||
|
[Scene 11-12 evidence and live activation](superpowers/plans/2026-07-11-scene-11-12-live-evidence.md).
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Replace the stale visual-audit statements that still say Scenes 1, 2, 6, and 7
|
||||||
|
need their primary visual treatment. State that those scenes have been
|
||||||
|
recomposed and that the remaining active presentation gap is Scene 11-12
|
||||||
|
evidence compression plus live activation.
|
||||||
|
|
||||||
|
- [x] **Step 2: Correct the user-facing presentation description**
|
||||||
|
|
||||||
|
In web/README.md, replace act themes with one editorial canvas, and replace the
|
||||||
|
claim that Scenes 10-12 only use canonical replay with:
|
||||||
|
|
||||||
|
~~~md
|
||||||
|
Scenes 10 through 12 use the canonical replay by default when no live target is
|
||||||
|
available. When the resolved target is healthy, the same prepared run flow can
|
||||||
|
execute through the public JSON-RPC operations and record live evidence using
|
||||||
|
the same DemoRunFacts projection.
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Keep the explicit note that Scenes 8-9 consume prepared authoring data and do
|
||||||
|
not call authoring RPC operations.
|
||||||
|
|
||||||
|
- [x] **Step 3: Verify the documentation baseline**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
rg -n -i 'act themes|stageTheme|night.*scenes|scenes 10 through 12.*replay only' docs/current_roadmap.md web/README.md
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Expected: no stale whole-stage-theme or replay-only claims remain in the live
|
||||||
|
roadmap or README. Historical documents may retain historical wording.
|
||||||
|
|
||||||
|
- [x] **Step 4: Commit the documented baseline**
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
git add docs/current_roadmap.md web/README.md docs/superpowers/plans/2026-07-11-scene-11-12-live-evidence.md
|
||||||
|
git commit -m "docs: plan scene 11-12 evidence and live activation"
|
||||||
|
~~~
|
||||||
|
|
||||||
|
### Task 2: Restore Live Timeline Activation
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: web/apps/console/src/presentation/PresentationRoute.tsx
|
||||||
|
- Test: web/apps/console/src/presentation/PresentationRoute.test.tsx
|
||||||
|
- Test: web/apps/console/src/demo/agent/timelineAgent.test.tsx
|
||||||
|
|
||||||
|
**Interfaces:**
|
||||||
|
- Consumes PresentationTargetState.mode from resolvePresentationTarget.
|
||||||
|
- Produces a startup mode that is live for a valid HTTP target and replay for an invalid or unavailable target.
|
||||||
|
|
||||||
|
- [x] **Step 1: Add the route regression test**
|
||||||
|
|
||||||
|
With a valid session target and a mocked successful health response, assert that
|
||||||
|
the live target status is rendered and the prepared-workflow action remains
|
||||||
|
live-capable. Use the existing route test mocks and do not perform a real
|
||||||
|
network request from Vitest.
|
||||||
|
|
||||||
|
~~~tsx
|
||||||
|
it("keeps a healthy configured target in live mode", async () => {
|
||||||
|
window.sessionStorage.setItem("lda.workflowConsole.target", "http://127.0.0.1:8765/rpc");
|
||||||
|
mockedCallOperation.mockResolvedValue({
|
||||||
|
ok: true,
|
||||||
|
operation: "workflow.health",
|
||||||
|
label: "Health",
|
||||||
|
interpreted: { status: "ok" },
|
||||||
|
exchange: { request: {}, response: {} },
|
||||||
|
equivalentCli: "uv run wf status",
|
||||||
|
durationMs: 2,
|
||||||
|
});
|
||||||
|
|
||||||
|
const { PresentationRoute } = await import("./PresentationRoute.js");
|
||||||
|
render(<PresentationRoute />);
|
||||||
|
|
||||||
|
expect(await screen.findByText(/Live target is ready/i)).toBeInTheDocument();
|
||||||
|
expect(screen.getByRole("button", { name: /Run prepared workflow/i })).toBeEnabled();
|
||||||
|
});
|
||||||
|
~~~
|
||||||
|
|
||||||
|
- [x] **Step 2: Run the regression test**
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
pnpm --dir web --filter @lda/console test -- src/presentation/PresentationRoute.test.tsx
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Expected: the new test exposes the current ready-state effect that forces
|
||||||
|
demo.setMode("replay") even when the resolved target is live.
|
||||||
|
|
||||||
|
- [x] **Step 3: Synchronize to the resolved target mode**
|
||||||
|
|
||||||
|
Replace the unconditional replay reset with:
|
||||||
|
|
||||||
|
~~~tsx
|
||||||
|
useEffect(() => {
|
||||||
|
if (demo.state.phase !== "ready") return;
|
||||||
|
const desiredMode = targetStatus.kind === "failed" ? "replay" : presentationTarget.mode;
|
||||||
|
if (demo.state.mode !== desiredMode) demo.setMode(desiredMode);
|
||||||
|
}, [demo.setMode, demo.state.mode, demo.state.phase, presentationTarget.mode, targetStatus.kind]);
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Keep replay startup guarded by demo.state.mode === "replay". Never call
|
||||||
|
primeReplayToStage while live.
|
||||||
|
|
||||||
|
- [x] **Step 4: Verify both boundaries**
|
||||||
|
|
||||||
|
Run the route and timeline-agent tests. Healthy targets must remain live,
|
||||||
|
invalid targets must select replay, and failed health probes must retain replay
|
||||||
|
fallback labels.
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
pnpm --dir web --filter @lda/console test -- src/presentation/PresentationRoute.test.tsx src/demo/agent/timelineAgent.test.tsx
|
||||||
|
~~~
|
||||||
|
|
||||||
|
- [x] **Step 5: Commit the live activation fix**
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
git add web/apps/console/src/presentation/PresentationRoute.tsx web/apps/console/src/presentation/PresentationRoute.test.tsx web/apps/console/src/demo/agent/timelineAgent.test.tsx
|
||||||
|
git commit -m "fix: keep configured presentation target live"
|
||||||
|
~~~
|
||||||
|
|
||||||
|
### Task 3: Project Trace Values For Compact Factual Rendering
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: web/apps/console/src/presentation/demo-run-facts.ts
|
||||||
|
- Modify: web/apps/console/src/presentation/RunFactsPanel.tsx
|
||||||
|
- Test: web/apps/console/src/presentation/demo-run-facts.test.ts
|
||||||
|
- Test: web/apps/console/src/presentation/RunFactsPanel.test.tsx
|
||||||
|
|
||||||
|
**Interfaces:**
|
||||||
|
- Keep RunFactsTraceFrame data factual and backward-compatible.
|
||||||
|
- Add a pure factValueKind(value: string) classifier returning value, empty-object, or missing.
|
||||||
|
|
||||||
|
- [x] **Step 1: Add classifier tests**
|
||||||
|
|
||||||
|
~~~ts
|
||||||
|
it.each([
|
||||||
|
["captured as empty object", "empty-object"],
|
||||||
|
["not captured in this recording", "missing"],
|
||||||
|
['{"issue_ids":["risk-1"]}', "value"],
|
||||||
|
])("classifies trace value %s", (value, expected) => {
|
||||||
|
expect(factValueKind(value)).toBe(expected);
|
||||||
|
});
|
||||||
|
~~~
|
||||||
|
|
||||||
|
- [x] **Step 2: Implement the classifier**
|
||||||
|
|
||||||
|
Use exact equality against the two existing projection labels and return value
|
||||||
|
for every other string. Do not change the underlying facts.
|
||||||
|
|
||||||
|
- [x] **Step 3: Add trace-row structure tests**
|
||||||
|
|
||||||
|
Assert that each trace frame renders one compact article with node, step type,
|
||||||
|
outcome, and three labelled factual values. Assert data-value-kind on empty and
|
||||||
|
missing values and assert that the old No trace frames captured fallback is not
|
||||||
|
rendered when frames exist.
|
||||||
|
|
||||||
|
- [x] **Step 4: Implement compact trace rows**
|
||||||
|
|
||||||
|
Replace the nested repeated dl layout in RunTraceFacts with one article per
|
||||||
|
frame:
|
||||||
|
|
||||||
|
~~~tsx
|
||||||
|
<article className="run-trace-frame" data-trace-node={frame.nodeId}>
|
||||||
|
<header>node, step type, and outcome</header>
|
||||||
|
<dl className="run-trace-frame__facts">
|
||||||
|
<TraceFact label="Resolved input" value={frame.resolvedInputLabel} />
|
||||||
|
<TraceFact label="Output" value={frame.outputLabel} />
|
||||||
|
<TraceFact label="State changes" value={frame.stateChangesLabel} />
|
||||||
|
</dl>
|
||||||
|
</article>
|
||||||
|
~~~
|
||||||
|
|
||||||
|
TraceFact uses factValueKind and renders empty/missing values as compact
|
||||||
|
monospace tokens while preserving the original factual text in the accessible
|
||||||
|
description and DOM.
|
||||||
|
|
||||||
|
- [x] **Step 5: Verify the projection and panel tests**
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
pnpm --dir web --filter @lda/console test -- src/presentation/demo-run-facts.test.ts src/presentation/RunFactsPanel.test.tsx
|
||||||
|
~~~
|
||||||
|
|
||||||
|
- [x] **Step 6: Commit the trace projection**
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
git add web/apps/console/src/presentation/demo-run-facts.ts web/apps/console/src/presentation/RunFactsPanel.tsx web/apps/console/src/presentation/demo-run-facts.test.ts web/apps/console/src/presentation/RunFactsPanel.test.tsx
|
||||||
|
git commit -m "feat: compress factual trace rows"
|
||||||
|
~~~
|
||||||
|
|
||||||
|
### Task 4: Make Scene 11 Decision-Led
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: web/apps/console/src/presentation/GuidedProductMoment.tsx
|
||||||
|
- Modify: web/apps/console/src/presentation/InterruptDecisionForm.tsx
|
||||||
|
- Modify: web/apps/console/src/presentation/RunFactsPanel.tsx
|
||||||
|
- Modify: web/apps/console/src/presentation/styles/demo-workflow.css
|
||||||
|
- Test: web/apps/console/src/presentation/GuidedProductMoment.test.tsx
|
||||||
|
- Test: web/apps/console/src/presentation/InterruptDecisionForm.test.tsx
|
||||||
|
|
||||||
|
- [x] **Step 1: Add composition assertions**
|
||||||
|
|
||||||
|
Assert that approval has data-approval-focus="decision", a compact input
|
||||||
|
region, a primary interrupt-report region, and an operator decision region.
|
||||||
|
Assert output and trace regions are absent.
|
||||||
|
|
||||||
|
- [x] **Step 2: Implement decision-led markup**
|
||||||
|
|
||||||
|
Add data-approval-focus="decision" to the approval moment and give the decision
|
||||||
|
form an explicit region label without changing submit/cancel handlers. Keep
|
||||||
|
report markdown and proposed issue facts in the interrupt region.
|
||||||
|
|
||||||
|
- [x] **Step 3: Rebalance the approval grid**
|
||||||
|
|
||||||
|
Use a 14rem input rail, a dominant report column, and a decision column sized
|
||||||
|
for the existing schema form. Make the decision form header and actions
|
||||||
|
visually primary; keep run IDs and typed/outcome metadata compact. At 720p,
|
||||||
|
the report scrolls internally and the outer stage has no visible scrollbar.
|
||||||
|
|
||||||
|
- [x] **Step 4: Verify approval interactions**
|
||||||
|
|
||||||
|
Run GuidedProductMoment, InterruptDecisionForm, and route tests. Confirm submit
|
||||||
|
and cancel callbacks still receive selected IDs and comment, and cancelled
|
||||||
|
replay remains terminal.
|
||||||
|
|
||||||
|
- [x] **Step 5: Commit Scene 11**
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
git add web/apps/console/src/presentation/GuidedProductMoment.tsx web/apps/console/src/presentation/RunFactsPanel.tsx web/apps/console/src/presentation/styles/demo-workflow.css web/apps/console/src/presentation/GuidedProductMoment.test.tsx
|
||||||
|
git commit -m "feat: focus scene 11 on operator decision"
|
||||||
|
~~~
|
||||||
|
|
||||||
|
### Task 5: Make Scene 12 Read As One Continuation
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: web/apps/console/src/presentation/GuidedProductMoment.tsx
|
||||||
|
- Modify: web/apps/console/src/presentation/styles/demo-workflow.css
|
||||||
|
- Modify: web/apps/console/src/presentation/RunFactsPanel.tsx
|
||||||
|
- Test: web/apps/console/src/presentation/GuidedProductMoment.test.tsx
|
||||||
|
- Test: web/apps/console/src/presentation/RunFactsPanel.test.tsx
|
||||||
|
|
||||||
|
- [x] **Step 1: Add continuation assertions**
|
||||||
|
|
||||||
|
Assert that resume exposes one continuation region containing resume operation
|
||||||
|
and decision facts beside a report-priority output region. Assert trace exposes
|
||||||
|
a dominant trace region and compact output summary, with one article per trace
|
||||||
|
frame.
|
||||||
|
|
||||||
|
- [x] **Step 2: Implement resume/output hierarchy**
|
||||||
|
|
||||||
|
Add data-continuation-focus="output" to resume. Keep operation receipt and
|
||||||
|
resume payload in a compact support column; make the markdown report the
|
||||||
|
dominant scroll region. The output beat uses the same report card without
|
||||||
|
duplicating the operation receipt.
|
||||||
|
|
||||||
|
- [x] **Step 3: Implement trace hierarchy and spacing**
|
||||||
|
|
||||||
|
Add data-continuation-focus="trace" to trace. Give trace rows a clear
|
||||||
|
node/status header and compact value grid, and keep the output summary as a
|
||||||
|
support surface. Do not repeat the same run identifier in every row.
|
||||||
|
|
||||||
|
- [x] **Step 4: Verify all Scene 12 beats at both target sizes**
|
||||||
|
|
||||||
|
Use these routes:
|
||||||
|
|
||||||
|
~~~text
|
||||||
|
http://127.0.0.1:5173/present#scene/resume-output-evidence/resume
|
||||||
|
http://127.0.0.1:5173/present#scene/resume-output-evidence/output
|
||||||
|
http://127.0.0.1:5173/present#scene/resume-output-evidence/trace
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Capture 1280x720 and 1024x768 screenshots. Confirm report and trace regions
|
||||||
|
scroll internally, no document scrollbar is visible, and no factual panel says
|
||||||
|
output or trace is missing when the recording contains it.
|
||||||
|
|
||||||
|
- [x] **Step 5: Commit Scene 12**
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
git add web/apps/console/src/presentation/GuidedProductMoment.tsx web/apps/console/src/presentation/styles/demo-workflow.css web/apps/console/src/presentation/RunFactsPanel.tsx web/apps/console/src/presentation/GuidedProductMoment.test.tsx web/apps/console/src/presentation/RunFactsPanel.test.tsx
|
||||||
|
git commit -m "feat: make scene 12 a continuation proof"
|
||||||
|
~~~
|
||||||
|
|
||||||
|
### Task 6: Full Verification, Review, And Documentation Closeout
|
||||||
|
|
||||||
|
**Files:**
|
||||||
|
- Modify: docs/current_roadmap.md
|
||||||
|
- Move: docs/superpowers/plans/2026-07-11-scene-11-12-live-evidence.md to docs/historical/superpowers/plans/2026-07-11-scene-11-12-live-evidence.md
|
||||||
|
|
||||||
|
- [x] **Step 1: Run the full verification gate**
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
pnpm --dir web test
|
||||||
|
pnpm --dir web typecheck
|
||||||
|
pnpm --dir web build
|
||||||
|
git diff --check
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Expected: all workspace tests, typechecks, and build pass. The only accepted
|
||||||
|
build note is the existing Vite chunk-size warning.
|
||||||
|
|
||||||
|
- [x] **Step 2: Run live and replay browser smoke**
|
||||||
|
|
||||||
|
With the prepared RPC server at http://127.0.0.1:8765/rpc, verify that the
|
||||||
|
target badge reports live readiness and that the live prepared-workflow action
|
||||||
|
sends deployment inspect, run start, resume, and trace operations. Repeat with
|
||||||
|
an invalid target and verify replay fallback starts without network calls.
|
||||||
|
|
||||||
|
- [x] **Step 3: Review the diff**
|
||||||
|
|
||||||
|
Check for stale replay-only claims, accidental live calls during replay, lost
|
||||||
|
approval/cancel behavior, visible overflow, and duplicated factual state. Fix
|
||||||
|
concrete findings before archival.
|
||||||
|
|
||||||
|
- [x] **Step 4: Complete roadmap and archive the plan**
|
||||||
|
|
||||||
|
Change item 26 from Active to Completed, link the historical plan, and move
|
||||||
|
the plan to docs/historical/superpowers/plans/.
|
||||||
|
|
||||||
|
- [x] **Step 5: Commit the closeout**
|
||||||
|
|
||||||
|
~~~powershell
|
||||||
|
git add docs/current_roadmap.md docs/historical/superpowers/plans/2026-07-11-scene-11-12-live-evidence.md
|
||||||
|
git commit -m "docs: complete scene 11-12 evidence and live activation"
|
||||||
|
~~~
|
||||||
|
|
||||||
|
## Self-Review Checklist
|
||||||
|
|
||||||
|
- [x] Scene 11 has one decision-led primary surface and no output/trace preview.
|
||||||
|
- [x] Scene 12 has a dominant report on resume/output and compact trace rows on trace.
|
||||||
|
- [x] Empty/missing trace values remain truthful and visually distinguishable.
|
||||||
|
- [x] A healthy configured target stays live; an invalid target falls back to replay.
|
||||||
|
- [x] Replay never calls callOperation.
|
||||||
|
- [x] One editorial canvas remains the only stage theme.
|
||||||
|
- [x] README and roadmap no longer claim act-level themes or replay-only Scenes 10-12.
|
||||||
|
- [x] Full tests, typecheck, build, browser smoke, and review complete before archival.
|
||||||
Reference in New Issue
Block a user