Remove the blanket .agent/ gitignore so the phase roadmap, user stories, reports, and PLAN.md are versioned with the code. Only runtime artifacts (.agent/phase-sessions/, .agent/pipeline.log) remain ignored. Update AGENTS.md git protocol rule to match.
1.7 KiB
1.7 KiB
Phase 06 complete and committed (e5810b0).
Implemented
app.js: singlesetUiState(state)state machine (idle → thinking → streaming → done|error → idle) driving typing indicator, button disabled/spinner/label, and#send-status; 10s elapsed-seconds aria-label hint; exportedTURN_TIMEOUT_MS = 120000guard (cleared on first delta); error banner with actionable hint; reduced-motion-aware scrolling; ad-hocsetBusyremoved- Server:
ChatErrorEventschema (exact{type, detail}SSE error wire shape) used in all 3 chat error branches;embed_ms/total_msadded to error-path logs (per-turn line already had both — confirmed) - Mock LLM: additive
POST /__shutdown__hook; E2Ellm_downfixture stops the mock and restores a fresh instance for later tests - Tests: SSE error-event serialization (unit + integration), frontend contract unit tests,
tests/e2e/test_loading_feedback.py(5 tests: slow-think indicator, button machine, live streaming, reduced motion, LLM-down recovery)
Results
uv run ruff check .→ all checks passed;uv run pyright→ 0 errorsuv run pytest --cov=app --cov-report=term-missing→ 123 passed, coverage 99% (>90% gate)uv run pytest tests/e2e/test_loading_feedback.py -v --no-cov→ 5 passed in isolation- Regression check: all 5 prior story E2E suites re-run in isolation → 16 passed
Decisions: no CSS changes needed (tokens + reduced-motion fallbacks already met spec); error→idle settles in the turn handler's finally so the banner persists while the button always recovers; committed only phase-06 files (.agent/ file moves are harness-managed; the unrecorded phase-05 move predates this phase).
Next pending phase: .agent/phases/todo/07_story_responsive_polish.md