Implements the §P1 acceptance gate from plan-migration.md: a single
POST /api/devloop/projects produces a runnable todo-demo project with
multi-page PRD/SDD sites, units.json, integration spec, agent-state,
and history snapshots — all via mock agents (no real Claude CLI cost).
Code additions:
- packages/acp-core/protocol/ClaudeCliProtocol.js
* mock mode now emits an extra `mock/files` acp_event when the fixture
contains a files[] array. LoopController applies it to the project
root, letting mock agents produce real outputs.
- server/src/core/devloop/loop-controller.js (now ~280 lines)
* callAgent(pid, agentName, prompt, opts) — single-agent invocation:
reads system/templates/{agent}/prompt.md, runs mock protocol,
applies fixture files[], timeline-logs, auto-commits.
* runDocsPhase(pid, requirement) — orchestrates PM → Architect with
`docs.complete` timeline marker.
* getProjectState(pid) — returns project.json + units + prd_rev/sdd_rev
+ timeline tail for the GET /state endpoint.
- server/routes/devloop.js (new)
* POST /api/devloop/projects — createProject + runDocsPhase
* GET /api/devloop/projects
* GET /api/devloop/projects/:pid/state
- server/index.js / server/agent-server.js — mount /api/devloop.
Mock fixtures (drive the full acceptance file tree):
- fixtures/devloop-mock/devloop-pm.json
* 14 files: prd/{index,reading-guide,product/*,feature/*,flow/*,prototype/*}.html,
prd/assets/{shell.css,shell.js,search-index.json},
agent-state/{pm.json,pm-todo.json}, history/prd-rev-001.html.
- fixtures/devloop-mock/devloop-architect.json
* 13 files: sdd/{index,mvcp/*}.html, sdd/assets/*,
units.json (3 units, DAG), integration/spec.json,
agent-state/{architect.json,architect-todo.json}, history/sdd-rev-001.html.
Acceptance:
- scripts/phase1-verify.js — spins ephemeral express app, POSTs the
todo-demo project, asserts 23 expected paths exist + 3 units with
l2_rounds/l2_budget + git ≥4 commits + timeline events.
Tests (12 new cases):
- server/tests/devloop/loop-controller.test.js (7) — callAgent +
runDocsPhase + state.
- server/tests/devloop/routes.test.js (5) — POST validation, full
POST, GET state, 404 on unknown pid.
Results:
- phase0-verify: 8/8
- phase0-test-call: 7/7
- phase1-verify: 7/7
- vitest devloop+acp-core: 174/174 (was 162 → +12)
Specs: docs/prd/newfunction/_spec/plan-migration.md · P1 Docs MVP
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>