Skip to content

Sprints, epics & stories

44h of work split into 4 demo-able sprints. Story IDs QS-NNN are referenced in commits and PR titles for traceability.

Sprint cadence

SprintPhaseHoursGoal (demo-able outcome)
S1 — Foundation1, 2~12h"Sarah tape une commande sur le droplet et reçoit du DVF Lyon 7e via le MCP officiel."
S2 — RAG + Tools3~10h"QuartierScope produit un brief sourcé combinant corpus expert et données live."
S3 — Orchestration + Actions4, 5~12h"Le brief s'attache au deal HubSpot après confirmation [y/N]."
S4 — Quality + Frontend + Demo6, 7, 8~10h"Le démo tourne en ligne, tracé dans Langfuse, tests passent."

Definition of Done

A story is Done when:

  1. Acceptance criteria all green
  2. Code merged to main (PR squash-merge)
  3. Tests for new behaviour added (PRD §12 matrix where relevant: nominal / boundary / error)
  4. No new lint or type errors (ruff check && mypy)
  5. If user-visible: the routing trace shows the new behaviour or screenshot attached
  6. If a write tool: the confirmation gate is wired and exercised in a test

Epics

E1 — Infrastructure & DevOps (~8h)

IDStoryEstimateSprint
QS-001Provision DO droplet via Terraform (AMS3, 4GB)1hS1 ✅
QS-002Cloud-init bootstrap (Docker, ufw, fail2ban, non-root user)1hS1 ✅
QS-003docker-compose.yml with 6 services2hS1 ✅
QS-004Caddyfile reverse-proxy (HTTP-only since no domain)0.5hS1 ✅
QS-005GitHub Actions CI (ruff + pytest + docker build)2hS1 ✅ (CI) S3 (CI matrix)
QS-006Deploy script❌ Killed in favour of GH Actions deploy.yml

E2 — Foundation & Security (~4h)

IDStoryEstimateSprint
QS-010pyproject.toml + Dockerfile + dev tooling1hS1 ✅
QS-011Pydantic Settings (env loading)1hS1 ✅
QS-012Security middleware: secure headers, slowapi, CORS1hS1 ✅
QS-013Input validation (Pydantic + safe-regex check)1hS3

E3 — Tools Agent (~8h)

IDStoryEstimateSprint
QS-020data.gouv MCP client + smoke test (DVF Lyon 7e)3hS1 ✅
QS-021DVF tool: discovery via MCP search_dataservices → Cerema2hS2
QS-022DuckDB fallback over local dvf.csv.gz2hS2
QS-023Tavily web search wrapper + SSRF guard1hS2

E4 — RAG Agent (~8h)

IDStoryEstimateSprint
QS-030Corpus ingestion script: python -m app.ingest2hS2
QS-031Chunking + OpenAI embeddings + Qdrant upsert2hS2
QS-032Retrieval + similarity threshold + citation enforcement2hS2
QS-033Real corpus actually downloaded (11 sources)2hS2

E5 — Orchestration (~5h)

IDStoryEstimateSprint
QS-040LangGraph state machine (router → agents → synth)2hS3
QS-041Router agent (gpt-4o-mini classifier)1hS3
QS-042Synthesizer (combines RAG + Tools, enforces citations)1hS3
QS-043Redis-backed LangGraph checkpointer1hS3

E6 — Actions Agent / HubSpot (~4h)

IDStoryEstimateSprint
QS-050HubSpot client + read tools1hS3
QS-051Write tools (create_note, update_property, create_task)2hS3
QS-052Confirmation gate (CLI [y/N], API confirm:true)1hS3

E7 — Frontend (~3h)

IDStoryEstimateSprint
QS-060Typer CLI with Rich routing trace1hS4
QS-061FastAPI /query + /health1hS4 ✅ (skeleton)
QS-062Streamlit page calling /query1hS4

E8 — Observability (~1h)

IDStoryEstimateSprint
QS-070Langfuse v2 self-hosted + LangChain callback wired1hS4

E9 — Quality (~3h)

IDStoryEstimateSprint
QS-080pytest suite (RAG + Tools + Actions confirmation)2hS4
QS-081Security tests (prompt injection, CORS, SSRF)1hS4

E10 — Demo polish (~2h)

IDStoryEstimateSprint
QS-090README + demo script (Sarah & Marc scenario)1hS4
QS-091Recording + online URL1hS4

Backlog (out of v1)

  • BL-100 Multi-tenant deployment
  • BL-101 HubSpot OAuth (replacing Service Key)
  • BL-102 Mistral default for GDPR-strict CGP customers
  • BL-103 Langfuse v3 upgrade (needs droplet bump to 8GB)
  • BL-104 Event-driven RAG re-ingestion pipeline
  • BL-105 Next.js + Vercel AI Chat SDK frontend
  • BL-106 HubSpot 2-way sync
  • BL-107 Mortgage-broker pivot v2 (different RAG corpus, ACPR audit hook)
  • BL-108 Custom domain + Caddy auto-TLS
  • BL-109 DO Spaces for shared DVF cache
  • BL-110 Migrate to HubSpot MCP Auth Apps once it leaves beta

→ Full SPRINTS.md

Built as a 44h student project — multi-agent AI for CGP firms.