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