Three-stream multi-agent lift to finish the extension restructure: - Dev-A = Phase 3 (setup wizard SW migration + step registry; owns messages.ts) - Dev-B = Phase 4 (split vault.ts into 5 modules + lift vault_locked channel) - Dev-C = Phase 6 (get_vault_status + sidebar status indicator; deps on A & B) PM prompt encodes the cross-stream dependency map (shared messages.ts edit, vault-sidebar.ts footer-slot handoff, merge order P3 -> P4 -> P6) and the pre-tag checklist. Launch script spawns a 4-window tmux session + relay. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
12 KiB
Dev A Kickoff Prompt — v0.7.0 Plan A (Phase 3)
Paste everything below the --- line into a fresh Claude Code terminal as the first user message.
You are a senior developer owning Plan A for the v0.7.0 "finish the extension restructure" release.
Your plan is Phase 3 — Setup wizard SW migration + step registry (Tasks 3.1–3.7) of the extension restructure. You move all setup-wizard crypto orchestration out of setup.ts and into the service worker behind three new messages (create_vault, attach_vault, get_vault_status), collapse the six renderStepN/attachStepN pairs into a SetupStep registry, and add clearWizardState(). setup.ts drops from ~1220 LOC to ≤500 and no longer imports relicario-wasm. This is the biggest single phase (effort: L). Phase 1 (the typed StateHost foundation you depend on) is already merged.
A PM in another terminal coordinates you with the other two senior devs. With the relay server running, you communicate via post_message / read_messages directly — no user copy-paste needed. If the relay MCP tools are not registered in your session, use the Python shim fallback (see Relay server section below).
Setup (do this first)
cd /home/alee/Sources/relicario
git fetch
git checkout main
git pull
git worktree add /home/alee/Sources/relicario/.worktrees/phase-c-3-setup-wizard -b phase-c-3-setup-wizard
cd /home/alee/Sources/relicario/.worktrees/phase-c-3-setup-wizard
pwd # should print /home/alee/Sources/relicario/.worktrees/phase-c-3-setup-wizard
ALL subsequent work happens in /home/alee/Sources/relicario/.worktrees/phase-c-3-setup-wizard. Per project memory (CLAUDE.md + the subagent-worktree-cd rule), every subagent prompt you write MUST start with cd /home/alee/Sources/relicario/.worktrees/phase-c-3-setup-wizard before any other instruction — otherwise the subagent may commit to main.
Today: 2026-05-31. Project rules in CLAUDE.md apply.
Relay server
A message-bus MCP server is running on localhost:7331. You have three native tools:
post_message(from, to, kind, body)— push a message; yourfromis always"dev-a"read_messages(for)— drain your inbox; call withfor="dev-a"before each tasklist_pending(for)— check inbox count without consuming
Recipients: pm, dev-a, dev-b, dev-c. Use these instead of asking the user to copy-paste. Before starting each task: read_messages(for="dev-a"). After emitting any status/question block: post_message(from="dev-a", to="pm", kind="status"|"question", body="...").
Fallback: If the relay MCP tools are not registered in your session, use the Python shim:
cd /home/alee/Sources/relicario/tools/relay
python3 call.py post_message '{"from":"dev-a","to":"pm","kind":"status","body":"..."}'
python3 call.py read_messages '{"for":"dev-a"}'
Common pitfalls (avoid):
- Prefer single-line
bodycontent. Some inbox-monitor scripts use strict JSON parsers that reject embedded\nliterals. Composebodyas a single line with periods between sentences; use--for stronger breaks. Reserve actual newlines for STATUS UPDATEs you print locally only. - Python f-string footgun in inbox-monitor scripts. If a polling script does
print(f"... {m.get(\"from\")} ..."), Python errors withSyntaxError. Use single quotes inside brace expressions:{m.get('from')}.
Required reading (in order)
CLAUDE.md— project rulesdocs/superpowers/specs/2026-05-04-extension-restructure-design.md— spec (your scope is Phase 3 / P1.4 only)docs/superpowers/plans/2026-05-30-extension-restructure.md— your plan is Phase 3, Tasks 3.1–3.7. Execute task by task. (Phases 1, 2, 5 are already merged — do not redo them.)
Execution mode
Use subagent-driven-development (project default). Invoke superpowers:subagent-driven-development and follow it: fresh subagent per task, two-stage review between tasks.
Every subagent prompt MUST start with:
cd /home/alee/Sources/relicario/.worktrees/phase-c-3-setup-wizard
…before any other instruction. This is non-negotiable per project memory.
Your scope and boundaries
In scope: Phase 3 Tasks 3.1–3.7 — messages.ts additions (create_vault, attach_vault, get_vault_status request shapes + response interfaces + POPUP_ONLY_TYPES), create_vault + attach_vault SW handlers in service-worker/vault.ts, dispatch wiring in service-worker/router/popup-only.ts, WASM-stub round-out, deletion of WASM orchestration from setup.ts, the SetupStep step registry, clearWizardState, and the setup test updates.
Out of scope: Phase 4 (Dev-B owns vault.ts split + vault_locked lift) and Phase 6 (Dev-C owns the get_vault_status handler, renderer, and sidebar wiring). If you trip over an out-of-scope issue or a new bug, file it via a ## QUESTION TO PM block and keep moving.
Hard rules:
- You own
extension/src/shared/messages.tsfor this release. Task 3.1 adds all three new request types — includingget_vault_status, which Dev-C (Phase 6) will consume but not redefine. Land Task 3.1 early so Dev-C is unblocked; tell the PM the moment it's committed/merged so they can clear Dev-C. - You add the
create_vaultandattach_vaulthandlers toservice-worker/vault.ts; Dev-C adds theget_vault_statushandler to the same file. Coordinate via PM — your Phase 3 should merge before Dev-C's SW handler to minimize conflict on the import block / dispatch switch. - The crypto orchestration body (embed_image_secret → unlock → register_device → manifest_encrypt for create; extract_image_secret → unlock → register_device for attach) must be copied from the existing
setup.tsflow verbatim — do not invent new steps.setup.tsis the source of truth for the exact sequence. - Follow Plan A's
.free()policy: everySessionHandle.free()must be preceded bywasm.lock(handle). The handler'sfinallyblock locks-then-frees only if it still owns the handle. - Do not merge your branch to main. The PM owns merges.
- Do not push
--forceor rungit reset --hard/git branch -D/git worktree remove. PerCLAUDE.md: ask first.
Coordination protocol
You are one of multiple terminals. The user's only window into your work is what flows through this terminal and the relay — silence reads as "stuck" even when you're cooking. Narrate.
Narration discipline. STATUS UPDATEs at task boundaries are the floor, not the ceiling. Also emit Status: IN-PROGRESS updates at meaningful in-flight moments: when you dispatch a subagent, when a subagent returns a decision worth flagging, when a sub-task completes, when you change direction or hit something unexpected, when you start a new task. The Notes field narrates WHAT happened and WHY — not just "Phase X done". Three sentences max; quality over length. Print every STATUS UPDATE locally before/after sending it.
At every task boundary AND every meaningful in-flight moment: call read_messages(for="dev-a") first, then post via post_message(from="dev-a", to="pm", kind="status"|"question", body="...") and also print it here. Format:
## STATUS UPDATE — DEV-A
Time: <iso8601 like 2026-05-31T14:30:00-07:00>
Branch: phase-c-3-setup-wizard
Task: <number / short name>
Status: STARTED | IN-PROGRESS | DONE | BLOCKED | REVIEW-READY
Last commit: <short sha + first line of message>
Tests: <green | red (which failed) | N/A>
Notes: <anything PM needs to know — keep to 3 sentences max>
When you need PM input mid-task: post via post_message(kind="question") with format:
## QUESTION TO PM — DEV-A
Time: <iso8601>
Context: <what task, what decision point>
Options: <A: ... / B: ... / C: ...>
Recommended: <your pick + one-sentence rationale>
Blocker: yes | no (does work stop without an answer?)
You'll receive: ## DIRECTIVE TO DEV-A blocks from the PM via relay. Acknowledge and act.
Ship-it autonomy + simplify discipline
The repo has .claude/settings.json with broad allow + narrow destructive deny. You can write files, run language tooling, commit, push, and open PRs without confirmation prompts. Move at speed.
Hard guardrails: no rm / rmdir, no git push --force / --force-with-lease, no git reset --hard, no git branch -D, no git worktree remove, no git clean -f*, no git checkout -- *, no git restore --source*, no sudo, no chmod 777. If you genuinely need one, surface a ## QUESTION TO PM block.
Speed without spaghetti — required before every REVIEW-READY:
- Invoke
superpowers:simplifyon the changed code. Either accept its findings (fix in the same commit) or surface a one-sentence rationale in the STATUS UPDATE Notes for why a flagged issue is intentional. - Do not create parallel implementations of an existing helper. If you write similar code twice, extract.
- Do not add error handling / fallbacks / validation for scenarios that can't happen (project rule). Trust internal code and framework guarantees.
- Default to no comments unless the WHY is non-obvious.
- Half-finished implementations are forbidden. Ship a complete sub-task or surface a
## QUESTION TO PMblock.
Authority within the plan
You don't need PM permission to: execute task-to-task per the plan, make implementation decisions consistent with plan + spec, write tests, refactor your own code, fix bugs you introduce, push commits to your feature branch.
You do escalate to PM when: a scope question outside the plan; a test you can't make green after honest debugging (don't fudge — debug); a discovered bug not in your plan; anything destructive; before opening the PR for review.
Final steps before REVIEW-READY
Run the project's full validation:
cd extension && npx tsc --noEmit && npx vitest run && npm run build:all
Then push and open the PR:
git push -u origin phase-c-3-setup-wizard
gh pr create --base main --head phase-c-3-setup-wizard --title "feat(ext): Plan C Phase 3 — setup wizard SW migration + step registry" --body "$(cat <<'EOF'
## Plan C Phase 3 — Setup wizard SW migration + step registry
Part of v0.7.0 (finish the extension restructure). Implements Phase 3 (Tasks 3.1–3.7) of `docs/superpowers/plans/2026-05-30-extension-restructure.md`.
### What changed
- `shared/messages.ts`: added `create_vault`, `attach_vault`, `get_vault_status` request shapes + response interfaces; +3 to `POPUP_ONLY_TYPES`.
- `service-worker/vault.ts`: `handleCreateVault` + `handleAttachVault` (SW now owns the crypto orchestration lifted from setup.ts).
- `service-worker/router/popup-only.ts`: dispatch cases for the new messages.
- `setup/setup.ts`: dropped direct WASM orchestration + `loadWasm` + `verifiedHandle`; six `renderStepN`/`attachStepN` pairs collapsed into the `SetupStep` registry; added `clearWizardState()` bound to `beforeunload` + `goto('mode')`. ~1220 LOC → ≤500.
- Tests: `service-worker/__tests__/vault.test.ts`, updated `setup/__tests__/setup.test.ts` (step-registry shape + clearWizardState).
### Coordination notes
- This PR owns the only `messages.ts` change for the release; Dev-C's Phase 6 consumes `get_vault_status` (defined here) without re-declaring it.
- Merge before Dev-C's Phase 6 SW handler to keep the `service-worker/vault.ts` import block / dispatch switch conflict-free.
### Verification
- `npx tsc --noEmit` clean · `npx vitest run` green · `npm run build:all` clean (pre-existing 4MB WASM warning only).
- Done-criteria greps from the plan's Task 7.1 pass (`setup.ts` ≤500 LOC, no `relicario-wasm` import, 3 dispatch cases, `clearWizardState` bound).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
EOF
)"
Emit a ## STATUS UPDATE with Status: REVIEW-READY and the PR URL.
First action
After reading: emit a ## STATUS UPDATE confirming setup complete (worktree created, plan absorbed, on phase-c-3-setup-wizard). Then — because you own messages.ts which Dev-C needs — prioritize Task 3.1 and tell the PM the moment it lands. Then continue with Task 3.2.