Project
Meeting Notes Agent
LLM-powered meeting summarization with deterministic rendering and audit trails
- Role
- Solo
- Focus
- Structured extraction, Schema validation, Traceability
- Testing
- Golden-case eval, Invariant assertions, Regression suite
- Key patterns
- LLM, Reliability, Fastify, Zod
- TypeScript
- Fastify
- Zod
- LLM (OpenAI)
- React
What it does
- Ingests meeting transcripts (or audio via STT) and produces structured summaries
- Outputs agenda items, action items, decisions, and key quotes in canonical format
- Validates all outputs via Zod before they reach consumers
- Renders deterministically for consistent downstream use
Architecture
┌──────────────────┐ ┌───────────────────┐ ┌──────────────────┐
│ Transcript / │────►│ Extraction │────►│ Schema │
│ Audio (STT) │ │ Pipeline (LLM) │ │ Validation │
└──────────────────┘ └───────────────────┘ │ (Zod) │
│ │ └─────────┬────────┘
│ │ │
▼ ▼ ▼
┌──────────────────┐ ┌───────────────────┐ ┌──────────────────┐
│ Trace / │ │ Deterministic │ │ JSON / Web │
│ Audit Log │ │ Renderer │ │ Output │
└──────────────────┘ └─────────┬─────────┘ └──────────────────┘
│
▼Reliability and guardrails
- Zod schema validation catches malformed LLM outputs before they reach consumers
- Eval harness runs golden-case and invariant checks (e.g., all action items have owners, no empty sections) on every change
- Trace artifacts support audit and debugging
Key engineering decisions
Zod for schema validation instead of manual parsing
Catches malformed LLM outputs at parse time; single source of truth for types and runtime checks.
Deterministic renderer before JSON output
Downstream consumers get stable formatting; avoids drift from prompt changes or model variance.
Trace artifacts stored per extraction run
Audit trail for compliance; enables debugging without re-running the LLM.
Failure modes handled
- LLM returns invalid JSON or missing required fields — caught by Zod parse
- Hallucinated action-item owners — invariant check fails in eval harness
- Empty sections when transcript is sparse — default fallbacks + invariant for non-empty
- Model downgrade introduces new failure modes — golden cases catch regressions
How to demo in 2 minutes
- 1Clone the repo and install deps: npm install
- 2Set OPENAI_API_KEY in .env
- 3Run the dev server: npm run dev
- 4POST a sample transcript to /api/extract or use the web UI
- 5Inspect the structured output and trace artifacts in the response