Overturn

Discovery & lifecycle

Agent registry

7 agents in the fleet, derived from the running code — not maintained by hand.

The fleet, as it actually runs today

One row per agent this system runs. Every cell is computed from the source the running pipeline itself reads — nothing here is typed in a second time.
Agent Purpose Version Definition Service account May read May write Model Invocation
Overturn Sentinel
Untrusted input
Screens inbound documents for injection and unexpected PII 0.1.0 af5326e2cb1a… overturn-sentinel@overturn-506402.iam.gserviceaccount.com audit_events, cases, quarantine audit_events, quarantine gemma-4-26b-a4b-it-maas orchestrated
Overturn Intake
Untrusted input
Extracts structured fields from a denial letter 0.1.0 4cf72f221089… overturn-intake@overturn-506402.iam.gserviceaccount.com audit_events, cases audit_events, cases gemini-3.5-flash orchestrated
Overturn Retrieval Finds governing policy sections with a calibrated lexical index 0.1.0 66467f2911b3… overturn-retrieval@overturn-506402.iam.gserviceaccount.com audit_events, cases, policy_sections audit_events, cases gemini-3.5-flash orchestrated
Overturn Mapping Maps chart evidence against each policy criterion 0.1.0 f02026ead99b… overturn-mapping@overturn-506402.iam.gserviceaccount.com audit_events, cases audit_events, cases gemini-3.5-flash orchestrated
Overturn Drafting Writes the appeal letter from satisfied criteria only 0.1.0 70fb15a7bb84… overturn-drafting@overturn-506402.iam.gserviceaccount.com audit_events, cases audit_events, cases gemini-3.7-flash orchestrated
Overturn Verification Checks every citation before a draft can be approved 0.1.0 939824809b10… overturn-verification@overturn-506402.iam.gserviceaccount.com audit_events, cases, policy_sections audit_events gemini-3.5-flash orchestrated
Overturn Lifecycle Escalates overdue cases on a schedule 0.1.0 d9dcc075ca01… overturn-lifecycle@overturn-506402.iam.gserviceaccount.com actions, audit_events, case_memory, cases actions, audit_events, case_memory, cases gemini-3.5-flash scheduled

How discovery works here

This page is not a document somebody updates when an agent changes. It calls core.registry.build_catalogue() on every request, and that function reads the same three sources the running fleet reads: identity and purpose from infra/agents.env, the file the IAM setup script uses to create these service accounts; model and output contract from the ADK definitions in agents/adk_fleet.py, the same definitions the pipeline executes; and what each agent may read or write from core.gateway.POLICY, the dict the gateway actually enforces on every datastore call. The service account column is Agent Identity — a distinct account per agent, not one shared credential. The read and write columns are Agent Gateway — the access matrix a security review would ask for, printed rather than described.

A catalogue that is maintained by hand is a catalogue that drifts the moment somebody forgets to update it, and a wrong catalogue about who may touch patient data is worse than no catalogue at all. This one cannot drift: change what an agent reads or writes and the definition_sha256 column changes with it, because it is a hash of the same fields the row shows. There is no separate publishing step to skip.

Tracing

Every agent invocation in this fleet runs inside an OpenTelemetry span, and core/audit.py stamps the trace id and span id onto every audit event it writes — the same events a reader can open on any case page, under its audit trail disclosure. That is what makes an agent's behaviour on one case reconstructable after the fact rather than merely logged.

There is deliberately no Cloud Trace link on this page. Cloud Trace sits behind a Google sign-in and a project a reader here almost certainly cannot see, and a link that returns a permissions error is worse than no link at all — it reads as something hidden rather than something a judge simply is not signed in to view. The trace and span ids are printed instead, on the case pages that carry them, as identifiers a reader can paste into their own tooling rather than a link that fails for everyone but us. The absence is a decision, not a gap.