Daniel has been in jail for 12 days.
His lawyer hasn't read his file yet.

Second Chair is a team of Strands Agents that reads a case's discovery, builds a timeline, catches the contradictions, and drafts a memo for an overloaded public defender. Every claim cites the exact line.

INCIDENT / ARREST REPORT · LINE 9
At approximately 2242 hours I placed RIVERA under arrest without incident.
BODY-CAM TRANSCRIPT · LINE 10
[22:56:10] HALE: Put your hands behind your back. You're under arrest.
✕ +14 min · before any unit was dispatched
Demo case and people are fictional.1 / 4
The problem · who it's for

Public defenders don't have the hours to read everything. Their clients wait in jail while they try.

35 hrs
recommended per felony case by the 2023 National Public Defense Workload Study. The 1973 standards effectively allowed 13.9.
RAND · NCSC · ABA, via ABA Journal (2023)
460,000+
people held in U.S. jails pretrial: legally innocent, waiting for their case to move.
Prison Policy Initiative (2024)
6+ sources
per arrest to cross-check line by line: dispatch logs, body-cam, reports, statements, booking, evidence receipts. Body cameras and phones keep adding more.
Typical discovery packet

Who it's for: deputy public defenders, their investigators and paralegals, and ultimately the people they represent. Inconsistencies like a shifted arrest time, a missing $400, or a witness who says police stopped the wrong man are exactly what gets missed when there is no time.

Sources: abajournal.com (Sep 2023) · prisonpolicy.org/blog/2024/04/15/jails_update2 / 4
The solution · how it works

Agents read. Code verifies. The attorney decides.

Strands agents

6 readers in parallel

One scoped agent per document calls record_event and record_fact with a line number and an exact quote.

Strands hook

Citation guard

BeforeToolCallEvent 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.

plain code

Contradiction engine

Times are parsed from the cited line, not the model. Events ≥3 min apart, events logged before dispatch, and facts that disagree are flagged.

Strands agent

Drafter + human

Writes the memo; each contradiction must cite 2+ documents. Nothing is filed. The attorney clicks every citation and approves.

Built with
Strands Agents SDK (TypeScript)Agent · tool() + ZodBeforeToolCallEvent guard hookBeforeModelCallEvent step capOpenAIModel · model-agnosticNext.js on Vercel · NDJSON streamingQwen3.8-27B via W&B Inference
Swap to Amazon Bedrock by changing the Strands model provider. Tools and hooks stay the same.3 / 4
Why it matters

Hours of cross-checking, done in minutes, with every claim traceable.

  • ✕ Arrest time in the report is 14 minutes before the body cam, and before any unit was dispatched
  • ✕ Report says a red hoodie; body cam, witness, and booking say a gray jacket
  • ✕ $1,240 and 14 baggies in the report; $840 and 9 in the evidence room
FOR THE DEFENDER

The time you get back goes where it matters: the client, the investigation, the hearing.

✓ Every claim cites a line a human can check
✓ Guardrails are deterministic, not prompts
✓ Nothing is filed without the attorney
github.com/chinesepowered/second-chair4 / 4