STACK
Boring on purpose
The stack is selected to expose production primitives, not to maximize framework count. Every piece is either free, boring, or the thing that makes a specific Failure Lab reproducible.
- Python
- Modules 00 to 02 stay close to ordinary Python so you can see the agent loop and state transitions directly.
- LangGraph
- Graph execution, persistence, checkpoints, and interrupts, adopted after the failure modes are understood, not before.
- Deep Agents
- Introduced late as a higher-level harness for planning, filesystem-backed work, subagents, and context management. You compare it against your explicit implementation instead of treating it as magic.
- FastAPI
- Run creation, run status, review endpoints, dashboard, health and readiness.
- PostgreSQL / Neon
- Application-owned run state, leases, event log, side-effect records, artifacts, and LangGraph checkpoint persistence. The course keeps application tables explicitly separate from framework-owned checkpoint tables.
- HTMX
- A deliberately small server-rendered operator and reviewer UI. No frontend framework is required to learn runtime engineering.
- LangSmith or Langfuse
- Traces. The course contract is tool-independent: exact model input and output, tool spans, tokens, cost, latency, and run correlation must be inspectable.
Why not a message queue from day one?
Because you should first build one small PostgreSQL-backed lease scheduler and understand, in your own code:
claim lease heartbeat retry timer orphan recovery cancellation
After that, you can replace it with a managed queue or a durable workflow engine and know exactly which guarantees moved. The course teaches what to demand from the replacement, not brand loyalty.
Free public deployment
The reference deployment uses a free web service (Render) plus serverless Postgres (Neon). One caveat matters enough to state as a rule:
Free infrastructure is a teaching and portfolio target, not a production-SLA claim.
Idle spin-down and restarts are useful failure injectors. The application must recover from durable state, which is the whole point of Modules 03 to 07, and Module 14 proves it with a redeploy mid-run.
Pin the environment
A production course should be reproducible six months later. The repo contains:
pyproject.toml uv.lock (or equivalent lockfile) .env.example Makefile docker-compose.yml for local dependencies where useful
And every gauntlet result records the course repo commit, Python version, package lock hash, model identifier, fixture profile version, and database migration version, so a reliability claim can be re-run against the exact system that made it.
Optional advanced substitutions
| Need | Alternative |
|---|---|
| stronger durable workflow semantics | Temporal |
| different trace backend | Langfuse / OpenTelemetry stack |
| managed agent deployment | LangSmith deployment |
| container hosting | Cloud Run / paid Render / Kubernetes |
| durable queue | cloud queue, Redis/Celery, Postgres queue |
| object store | S3-compatible storage |