Second Chair is a team of Strands Agents that reviews criminal discovery for an overloaded public defender.
Live demo: https://second-chair-zeta.vercel.app · Code: https://github.com/chinesepowered/second-chair · Pitch deck: https://second-chair-zeta.vercel.app/slides.html
The problem
The 2023 National Public Defense Workload Study (RAND, NCSC, ABA) recommends 35 hours per felony case; the 1973 standards many systems still use effectively allowed 13.9. More than 460,000 people are held in U.S. jails pretrial (Prison Policy Initiative, 2024). Details that decide cases, like an arrest time that doesn't match the body cam, only show up when documents are cross-checked line by line, and that is the first thing lost to caseloads.
Who it's for
Deputy public defenders, their investigators and paralegals, and the clients waiting in jail.
How it works
- Six Strands reader agents run in parallel, one per document (dispatch log, body cam, arrest report, witness statement, booking record, evidence receipt). They record events and facts through typed Zod tools, each with a line number and an exact quote.
- A citation guard runs in a Strands
BeforeToolCallEventhook. It rejects any record whose quote isn't on that line, whose time isn't written there, or whose value doesn't match. The agent must fix it. ABeforeModelCallEventhook caps steps. - Deterministic code parses times from the cited text (never from the model), builds a timeline, and flags contradictions: events 3+ minutes apart across sources, events logged before any unit was dispatched, and facts that disagree.
- A Strands drafter agent writes the memo through guarded tools. Every contradiction must reference a detected conflict and cite at least two documents.
- The attorney decides. Every citation is clickable and jumps to the source line. Nothing is filed or sent.
In the fictional demo case it finds: arrest at 22:42 in the report vs 22:56 on the body cam (and before dispatch at 22:47); Miranda at 22:44 vs 23:09; a red hoodie vs a gray jacket per body cam, booking and witness; $1,240 and 14 baggies vs $840 and 9 in evidence.
Strands + AWS
Strands Agents SDK (TypeScript): Agent, tool() with Zod, BeforeToolCallEvent and BeforeModelCallEvent hooks, OpenAIModel, running in a Next.js route on Vercel with NDJSON streaming. We run Qwen3.8-27B through an OpenAI-compatible endpoint. Strands is model-agnostic, so moving to Amazon Bedrock is a provider swap with the same tools and hooks. Not deployed to AgentCore.
All case data is fictional. Claude Code was used as a coding assistant; ElevenLabs voiced the demo video narration.
Built With
- elevenlabs
- next.js
- openai-compatible-api
- qwen
- react
- strands-agents-sdk
- tailwindcss
- typescript
- vercel
- weights-and-biases-inference
- zod
Log in or sign up for Devpost to join the conversation.