12 KiB
Continuous Authoring Workspace Implementation Plan
Status: Completed on 2026-07-11.
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: Rebuild Scenes 8 and 9 as one continuous assistant conversation that synchronizes prepared tool activity with five factual workflow-authoring projections.
Architecture: The prepared authoring recording remains the single source of truth. A pure projector emits stable assistant messages and identifies the active phase tool group; Scene 8 renders that thread full-stage, while Scene 9 renders the same thread in a bottom dock beneath one phase-specific product visual. The separate trace modal and presentation receipt are removed.
Tech Stack: React 19, TypeScript, Vitest, Testing Library, existing assistant-ui tool fallback/group primitives, React Flow where graph structure earns it, CSS, Vite, Playwright CLI.
Global Constraints
- Keep the authoring evidence deterministic and explicitly prepared; do not add an LLM backend or authoring RPC calls.
- Use only verified public
wfCLI syntax. - Preserve stable message IDs and tool-call IDs across Scene 8 and Scene 9.
- Scene 9 chat occupies at most 30 percent of the 1280 by 720 stage.
- Do not use a modal, detached receipt, blur transition, pan transition, or scale transition for the thread.
- Use source-owned assistant-ui primitives for chat and tool-call interactions.
- Respect reduced motion and the existing presentation motion toggle.
- Preserve Scenes 10 through 12.
Task 1: Project One Stable Authoring Conversation
Files:
- Modify:
web/apps/console/src/demo/agent/tools.ts - Modify:
web/apps/console/src/presentation/authoring/authoring-recording.ts - Modify:
web/apps/console/src/presentation/authoring/authoring-recording.test.ts - Modify:
web/apps/console/src/presentation/authoring/authoring-projection.ts - Modify:
web/apps/console/src/presentation/authoring/authoring-projection.test.ts
Interfaces:
-
Add
runWorkflowCommandtoAgentToolName. -
Produce
projectPreparedAuthoringThread(throughPhase?: AuthoringPhaseId): readonly AgentMessage[]. -
Produce
authoringToolGroupId(phase: AuthoringPhaseId): string. -
Step 1: Write failing stable-ID and phase-boundary tests
const full = projectPreparedAuthoringThread("deployment");
const draft = projectPreparedAuthoringThread("draft");
expect(draft.map(({ id }) => id)).toEqual(full.slice(0, draft.length).map(({ id }) => id));
expect(draft.flatMap(({ parts }) => parts).some((part) =>
part.type === "tool-call" && part.call.name === "runWorkflowCommand"
)).toBe(true);
expect(authoringToolGroupId("validate")).toBe("authoring-validate");
- Step 2: Run the focused tests and confirm they fail
Run: pnpm --dir web --filter @lda/console test -- src/presentation/authoring/authoring-recording.test.ts src/presentation/authoring/authoring-projection.test.ts
Expected: FAIL because the thread projector and authoring tool are absent.
- Step 3: Implement the projection from the existing recording
For each phase, emit one assistant message containing narration followed by paired tool-call/tool-result parts for every recorded command. Use IDs derived only from phase and command index, for example authoring-draft-command-1. Tool input is { command, summary }; result is { status, detail }. Keep the request and operator constraint as user messages.
- Step 4: Run tests and typecheck
Run: pnpm --dir web --filter @lda/console test -- src/presentation/authoring/authoring-recording.test.ts src/presentation/authoring/authoring-projection.test.ts
Run: pnpm --dir web --filter @lda/console typecheck
Expected: PASS.
- Step 5: Commit
git add web/apps/console/src/demo/agent/tools.ts web/apps/console/src/presentation/authoring
git commit -m "feat: project prepared authoring conversation"
Task 2: Give the Assistant Thread a Controlled Dock Mode
Files:
- Modify:
web/apps/console/src/presentation/chat/AssistantOperatorThread.tsx - Modify:
web/apps/console/src/presentation/chat/AssistantOperatorThread.test.tsx - Create:
web/apps/console/src/presentation/authoring/AuthoringConversation.tsx - Create:
web/apps/console/src/presentation/authoring/AuthoringConversation.test.tsx - Modify:
web/apps/console/src/presentation/presentation.css
Interfaces:
-
Add optional
activeToolGroupId?: stringandsurface?: "stage" | "dock"props toAssistantOperatorThread. -
Produce
AuthoringConversation({ throughPhase, surface, activePhase }). -
Step 1: Write failing full-thread and dock tests
render(<AuthoringConversation throughPhase="validate" surface="dock" activePhase="validate" />);
expect(screen.getByRole("log", { name: "prepared authoring conversation" })).toHaveAttribute("data-surface", "dock");
expect(screen.getByRole("button", { name: /validate.*tool calls/i })).toHaveAttribute("aria-expanded", "true");
expect(screen.getByRole("button", { name: /draft.*tool calls/i })).toHaveAttribute("aria-expanded", "false");
- Step 2: Run tests and verify red
Run: pnpm --dir web --filter @lda/console test -- src/presentation/chat/AssistantOperatorThread.test.tsx src/presentation/authoring/AuthoringConversation.test.tsx
- Step 3: Implement controlled phase groups
Group tool pairs by their authoring-<phase> prefix. Use controlled open on ToolGroupRoot only for the active phase; preserve manual expansion in component state after initial synchronization. Label group triggers with phase plus count, not only N tool calls. Keep individual tool fallbacks collapsed by default.
- Step 4: Implement full-stage and dock CSS
The stage surface fills its region and reads like a normal assistant thread. The dock uses a fixed-height internal viewport, compact message spacing, and a top rule rather than another card. Transition only height/grid track over 200 ms; reduced motion sets transition duration to effectively zero.
- Step 5: Verify and commit
Run the two focused test files and typecheck. Commit:
git add web/apps/console/src/presentation/chat web/apps/console/src/presentation/authoring web/apps/console/src/presentation/presentation.css
git commit -m "feat: add synchronized authoring chat dock"
Task 3: Render Five Factual Phase Visuals
Files:
- Create:
web/apps/console/src/presentation/authoring/AuthoringPhaseVisual.tsx - Create:
web/apps/console/src/presentation/authoring/AuthoringPhaseVisual.test.tsx - Modify:
web/apps/console/src/presentation/authoring/authoring-projection.ts - Modify:
web/apps/console/src/presentation/authoring/authoring-projection.test.ts - Modify:
web/apps/console/src/presentation/presentation.css
Interfaces:
-
Extend
AuthoringPhaseProjectionwith a discriminatedvisualunion fordiscover,draft,validate,artifact, anddeployment. -
Produce
AuthoringPhaseVisual({ projection })withrole="region"and phase-specific accessible labels. -
Step 1: Write failing tests for all five visual contracts
expect(projectPreparedAuthoringPhase("discover").visual).toMatchObject({ kind: "inventory" });
expect(projectPreparedAuthoringPhase("draft").visual).toMatchObject({ kind: "graph" });
expect(projectPreparedAuthoringPhase("validate").visual).toMatchObject({ kind: "repair" });
expect(projectPreparedAuthoringPhase("artifact").visual).toMatchObject({ kind: "artifact" });
expect(projectPreparedAuthoringPhase("deployment").visual).toMatchObject({ kind: "bindings" });
Render tests must assert source/capability/schema facts, graph nodes and route labels, diagnostic and corrected projection, immutable artifact ID/version, and all three concrete bindings.
- Step 2: Run tests and verify red
Run: pnpm --dir web --filter @lda/console test -- src/presentation/authoring/authoring-projection.test.ts src/presentation/authoring/AuthoringPhaseVisual.test.tsx
- Step 3: Implement the discriminated projection and visuals
Use familiar product forms rather than five matching cards: inventory rows for discovery; compact directed graph for draft; before/after diagnostic for validation; identity plate for artifact; binding table for deployment. Use icons from the existing Lucide dependency for source, schema, route, artifact, and binding cues. Keep cyan limited to the active fact or route.
- Step 4: Verify and commit
Run the focused tests and typecheck. Commit:
git add web/apps/console/src/presentation/authoring web/apps/console/src/presentation/presentation.css
git commit -m "feat: visualize prepared authoring phases"
Task 4: Compose Scenes 8 And 9 as One Workspace
Files:
- Modify:
web/apps/console/src/presentation/authoring/AgentHandoffScene.tsx - Modify:
web/apps/console/src/presentation/authoring/AgentHandoffScene.test.tsx - Modify:
web/apps/console/src/presentation/authoring/PreparedAuthoringLifecycleScene.tsx - Modify:
web/apps/console/src/presentation/authoring/PreparedAuthoringLifecycleScene.test.tsx - Delete:
web/apps/console/src/presentation/authoring/AuthoringTracePanel.tsx - Delete:
web/apps/console/src/presentation/authoring/AuthoringTracePanel.test.tsx - Modify:
web/apps/console/src/presentation/SceneBody.test.tsx - Modify:
web/apps/console/src/presentation/presentation.css
Interfaces:
-
Scene 8 renders
AuthoringConversationwithsurface="stage". -
Scene 9 renders
AuthoringPhaseVisualaboveAuthoringConversationwithsurface="dock"and the current beat asactivePhase. -
Step 1: Write failing composition tests
Assert Scene 8 contains user, assistant, and tool-call content. Assert every Scene 9 beat contains exactly one phase visual and the same conversation log. Assert no Agent trace button or Authoring trace dialog exists.
- Step 2: Run focused scene tests and verify red
Run: pnpm --dir web --filter @lda/console test -- src/presentation/authoring/AgentHandoffScene.test.tsx src/presentation/authoring/PreparedAuthoringLifecycleScene.test.tsx src/presentation/SceneBody.test.tsx
- Step 3: Implement the continuous composition
Replace the receipt and modal with a two-row Scene 9 workspace. Keep the phase rail as a small orientation control above the visual. Ensure the full-stage and dock thread receive the exact same projected message IDs.
- Step 4: Remove obsolete trace code and selectors
Run rg -n 'AuthoringTracePanel|prepared-lifecycle-scene__receipt|authoring-trace' web/apps/console/src. Delete only obsolete files and CSS after the search confirms no remaining caller.
- Step 5: Verify and commit
Run focused tests, console typecheck, and console build. Commit:
git add web/apps/console/src/presentation
git commit -m "feat: compose continuous authoring workspace"
Task 5: Browser Acceptance, Documentation, And Cleanup
Files:
-
Modify:
web/README.md -
Modify:
docs/current_roadmap.md -
Move: this plan to
docs/historical/superpowers/plans/2026-07-11-continuous-authoring-workspace.md -
Step 1: Run the complete presentation verification
Run: pnpm --dir web --filter @lda/console test -- src/presentation
Run: pnpm --dir web --filter @lda/console typecheck
Run: pnpm --dir web --filter @lda/console build
Run: git diff --check
- Step 2: Browser-smoke the required routes
Capture Scene 8 request/handoff and all five Scene 9 phases at 1280 by 720 and 1024 by 768. Store screenshots only under the ignored web/apps/console/.visual-smoke/ directory. Verify no body overflow, no clipped dock, active tool group synchronization, and no console error other than the known favicon 404.
- Step 3: Update live documentation
Describe the continuous thread/dock behavior and distinguish prepared authoring evidence from live run execution. Mark the correction slice complete in the roadmap.
- Step 4: Archive the plan and commit
git add web/README.md docs/current_roadmap.md docs/superpowers/plans docs/historical/superpowers/plans
git commit -m "docs: complete continuous authoring workspace"
Self-Review
- The plan replaces the modal/receipt contract rather than layering another surface over it.
- Stable IDs and one recording guarantee Scene 8/9 continuity.
- Each Scene 9 beat has a distinct factual product visual and one synchronized chat group.
- Tests cover data projection, assistant interaction, scene composition, routes, responsive layout, and the absence of obsolete modal behavior.
- No task introduces live LLM, composer, or authoring RPC behavior.