Implement Phase 1: LangGraph backend MVP

Sets up the full backend foundation for CouncilOS:

- CouncilState TypedDict with all required fields and LangGraph reducers
- Three agent nodes: master_agent (drafts), critic_agent (scores + routes),
  writer_agent (final polish)
- LangGraph graph with cyclic rework loop: Master → Critic → (score < 8:
  back to Master | score ≥ 8: Writer → END)
- Safety valve: MAX_ITERATIONS=5 prevents infinite loops
- FastAPI app with REST endpoints (POST /api/councils/run, GET /api/councils/run/{id})
  and WebSocket endpoint (/ws/council/{run_id}) for real-time agent status events
- In-memory RunStore for Phase 1 (PostgreSQL-backed in Phase 3)
- pytest test suite: state, routing logic, critic parser, agent nodes, API endpoints
- .env.example, .gitignore, docker-compose.yml, Dockerfile

https://claude.ai/code/session_01RfMpt3TbMjZEtK3CAyP5iQ
This commit is contained in:
Claude 2026-02-20 16:33:39 +00:00
parent 34dcfb3dcd
commit 797f02c74d
No known key found for this signature in database
24 changed files with 1472 additions and 0 deletions

54
docker-compose.yml Normal file
View file

@ -0,0 +1,54 @@
version: "3.9"
# CouncilOS — local development environment
# Usage:
# docker compose up -d # Start all services
# docker compose down # Stop all services
# docker compose logs -f api # Follow API logs
services:
# ---------------------------------------------------------------------------
# PostgreSQL — stores council blueprints (used from Phase 2)
# ---------------------------------------------------------------------------
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: councilOS
POSTGRES_USER: user
POSTGRES_PASSWORD: password
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d councilOS"]
interval: 5s
timeout: 5s
retries: 5
# ---------------------------------------------------------------------------
# CouncilOS API — FastAPI + LangGraph backend
# ---------------------------------------------------------------------------
api:
build:
context: ./backend
dockerfile: Dockerfile
restart: unless-stopped
ports:
- "8000:8000"
env_file:
- .env
environment:
DATABASE_URL: postgresql+asyncpg://user:password@db:5432/councilOS
volumes:
- ./backend:/app
- chroma_data:/app/chroma_db
depends_on:
db:
condition: service_healthy
command: uvicorn main:app --host 0.0.0.0 --port 8000 --reload
volumes:
postgres_data:
chroma_data: