phase
planned (SPEC §5 / §14)
→
delivered
when
P0
Infisical project, machine identities, AWS+S3 buckets, GitLab repos with baseline CI.
→
All 6 sub-tasks done. PF.1–PF.6 reconciliation block added up-front to bridge spec assumptions vs live infra (Infisical already existed, S3 buckets already named).
2026-05-08 · 2d
P1
Terraform S3 backend; Contabo+homelab bootstrapped via Ansible (Docker, Tailscale, Alloy, Infisical agent).
→
All 6 sub-tasks done in one push. Contabo firewall captured as Ansible role (no Contabo TF firewall resource exists), iptables-nft chains preserved verbatim.
2026-05-10 · 1d
P2
Alloy on both hosts → Grafana Cloud (logs/metrics/traces). Dashboards committed. Discord alerts wired.
→
Pipeline up 2026-05-11. P2.5 alerts & P2.6 dashboards deferred per "no alerts before stack is live" policy; finally landed 2026-05-14 via Grafana Cloud LLM-assist (4 alerts, 4 dashboards — spec called for 3).
05-11→14
P3
Settings, providers, OTel tracing, docker-compose boot, infisical-run wrapper.
→
All 7 sub-tasks done. Default model corrected gemma4:2b → gemma4:e2b (the real Ollama tag); discovered during execution.
05-10→11 · 2d
P4
Atomic queue poller, executor, text/chain/research handlers, Discord on success/fail, OTel spans.
→
All 6 done. Spec said "Discord final-step only" — turned out to be a UX regression vs old runner. Fixed later via P-QoL.2: widened return type to JobOutcome(text, tokens, model), executor owns notifications, chain's inline notify deleted.
2026-05-11 · 1d
P5
FastAPI factory, /health, SSE chat, queue submit/list, HTMX UI, SQLite chat history, Cloudflare tunnel swap.
→
All 7 done; HTMX UI live behind control.davidcockson.com. But this UI was thrown away twice — first by Phase UI (Terminal/TUI redesign), then by Phase UI-2 (React port). Net: ~3,200 lines of UI code deleted in P-UI2.9.
2026-05-11 · 1d
P6
FastMCP server, tools: search (ddgs+Tavily), fetch (trafilatura), vault, sandboxed code-exec. Research mode wired into chat.
→
All 6 done. /health route was missing — `curl -s` was masking 404 as healthy because curl exits 0 on 404. Fixed in P-QoL.7 with FastMCP `custom_route` decorator + `curl -fsS`.
05-11→14 · 3d
P7
Qdrant collections; graphiti-core KG over Neo4j; vector_indexer+kg_indexer; LangGraph hybrid pipeline; nightly re-index cron.
→
graphiti DROPPED 2026-05-14 after 3 failed cloud-provider attempts (Groq llama 400 on json_schema; Groq gpt-oss 413 TPM; Gemini OpenAI-compat 404 on /responses). Root cause: graphiti requires OpenAI Responses API + structured outputs — no viable free tier. Replaced with hand-rolled Ollama extractor (~150 LoC, (:Entity)-[:RELATES_TO {fact}]→(:Entity) + fulltext index).
05-13→14
P7.8
(implicit) worker's research handler calls the local RAG service.
→
Surfaced mid-Phase: the RAG service had no upstream caller. Wiring it up exposed a 240s latency bottleneck on Contabo CPU — worker discards RAG's answer field by design (uses its own cloud model). Fixed by P-QoL.11: added mode=context-only to skip RAG's two LLM nodes — round-trip ~120s → <1s.
2026-05-14
P8
4 tasks: per-provider token tracker + briefing / research / memory agents.
→
3 of 4 HELD indefinitely 2026-05-14 — "none of the three has a concrete trigger right now; building on spec alone risks rework." Only P8.4 token tracker shipped.
2026-05-14
P9
Vault snapshot to S3, decommission old Contabo runner, runbook, security audit.
→
P9.1 snapshot skipped (vault already covered by Gitea + Syncthing + prior nightly S3). Old runner stopped+disabled; Langfuse torn down; monitoring stack archived; §7 security audit pass; obsidian-llm-runner repo archived.
2026-05-15 · 1d
+QoL
— not in spec —
→
18 polish tasks filed during execution: UI link to outputs, Discord success regression fix, deploy wrapper, registry dedup, qdrant version drift, Gemini prefix comment, MCP health, Davas-via-Tailscale, CF Access bypass, chat sessions, required-secrets manifest, RAG context-only mode, Neo4j auto-bootstrap, single canonical deploy command, executable bit, logger config, Davas e2e verification.
05-13→14
+Skills
— not in spec —
→
Agent Skills (§17, added 2026-05-14): user-authored skill packages selectable per job. 6 tasks: loader, /skills endpoint + Job.skill_id, worker prompt injection + pin-model, UI picker, Python script path via P6.5 sandbox, live reload + echo-shout/hash-calc examples. Explicit-selection, not LLM-routed.
2026-05-14
+UI-1
— not in spec —
→
Terminal/TUI redesign (§18, added 2026-05-14): phosphor green, JetBrains Mono, scanlines, 3-pane grid. 9 tasks (tokens, top-bar+footer, queue, detail, inspector, model picker, keyboard layer, empty/loading/error, live progress %/ETA/tok-s). HTMX preserved. Done 2026-05-14. + 9 hotfixes during live use 2026-05-15.
05-14→15
+UI-2
— not in spec —
→
Full React port (decision 2026-05-16): Vite + React 18 + TypeScript. 17 tasks (P-UI2.0–P-UI2.16): backend JSON endpoints, shell+tokens+chrome, virtualised queue, single/compare/stacked/tournament views, inspector, ModelPicker+DispatchOverlay+Cheatsheet, ChatView re-port, Dockerfile multi-stage, old-UI delete pass (≥3,000 LOC deleted), prompt_hash+siblings, daily_stats SQLite, SSE reconnect with seq, responsive collapse. Done 2026-05-17.
05-16→17