---ci---
phase: 3
milestone: v0.2
status: verify
persona: ci-lead-developer
task: T-3.8
requirements:
covered: [REQ-25, REQ-26]
---/ci---
P0: NEXT_PUBLIC_RESEARCHX_API_MODE - the mode flag was invisible
to the browser bundle (process.env non-NEXT_PUBLIC vars are
stripped), silently pinning every client-side action to mock while
/choose server-rendered live data (split-brain). Now the flag is
NEXT_PUBLIC_ (server value still honored); README + boundary
comments updated.
P1s: SSE replay->subscribe race fixed with a seq watermark
(EventBus now numbers events; subscribe happens before replay;
terminal streams drain run_done/run_error with a bounded 0.5s
wait instead of returning early and dropping the terminal event);
EventBus.unsubscribe added + finally-block cleanup (no more dead
subscriber/queue leaks on client disconnect); unknown/invalid dial
overrides now return 422 (was an unhandled 500); dial override keys
mapped camelCase->snake_case at the live boundary (the REQ-56
drawer will not 500); live exportReport overridden to export REAL
run report+ledger data (was silently exporting mock content);
EventSource closes on run_done/run_error (no auto-reconnect loop);
run_error messages extracted into trace lines. openapi.json
regenerated from the updated app (snapshot discipline G-005);
schema.d.ts regenerated. 115 backend + 95 frontend tests green.
---ci---
phase: 3
milestone: v0.2
status: execute
persona: backend-engineer
task: T-3.2
requirements:
covered: [REQ-25]
---/ci---
FastAPI app: POST /api/runs (201, fake adapters default, env-ready
for live), GET /api/methodologies (cards with ETA minutes, token
cost estimates labeled as estimates, why-recommended, resolved
dials), GET /api/runs/{id} + approve/pause/cancel/resume lifecycle,
GET /api/runs/{id}/events (sse-starlette; state replay on connect;
stream terminates at terminal states - finished runs never hang a
reconnecting client), GET /api/config (adapter status + G-007 cost
counters), GET report + ledger artifacts. CORS localhost:3000 only.
In-memory run registry, single uvicorn worker (single-user). Route
tests via httpx ASGITransport on the same loop: full lifecycle over
HTTP, SSE replay assertion, pause/resume/cancel, 404s, unknown-
methodology rejection. 115 backend tests green.