Arjun GaneshGoverned AI · Distributed systems
← All selected work
Case studyLive

BASTION

A governed institutional-agent fleet for continuous access review

Continuous access review needs more than an automated scan: it needs durable identity, minimized data, deterministic policy gates, and an agent fleet that remains unable to grant privilege.

SchematicOne durable identity carries the investigation. No IAM write path.
Scope

Independent system · architecture, implementation, deployment, and evidence

Outcome

The deployed evidence set demonstrates private, read-only access review across managed agents, durable state, event delivery, policy enforcement, redacted escalation, and payload-free audit records.

01

Failure mode

Access review is quarterly work performed on continuously changing permissions. Automating the scan isn't enough — an institutional agent must audit the real policy rather than fixture rows, survive asynchronous retries, prove why it acted, and remain unable to turn suspicious input into a privileged write.

02

Non-negotiable constraints

  • The fleet must remain read-only against IAM
  • Raw IAM bindings must not cross model or notification boundaries
  • One investigation must remain reconstructable across retries and A2A hops
  • Model and notification failures must fail closed rather than clear a finding
03

Architecture decisions

01

Detect and score outside the model

Deterministic Python reads the live project policy, classifies broad roles, derives an HMAC-backed opaque finding ID and computes a bounded risk score. A compliance product cannot answer “why was this flagged?” with “the model thought so”, so Gemini explains already-minimized categories and decides nothing.

02

Answer in a schema, not in prose

The auditor declares an output schema, so findings cross the A2A boundary as validated structured data: the finding ID must match a 24-hex pattern and the reason must be one of three deterministic codes. The scoring step downstream holds no model, so nothing retypes a finding on the way past.

03

Put the gates in the caller

A policy gate refuses to continue unless scoring left its own result behind, and an escalation gate refuses to report completion unless every routed department confirmed delivery. Both live in the orchestrator, not in the remote workers they check — a guard that travels over A2A is one the caller has to trust the callee to run.

04

Evidence, not adjectives

Verified evidence
Guarantees
  • Read-only IAM boundary with no privileged write path
  • Raw IAM bindings never cross the model or notification boundary
  • Three of the five orchestrator steps hold no model at all
  • An unscored investigation fails closed rather than escalating
05

What remains bounded

The operational fleet is private by design. What is public is a sanitized evidence console, the architecture, the code and the recorded demonstration — deliberately not a route into a live IAM endpoint.

Python 3.12Google ADK 2.8Gemini 3.5 FlashVertex AICloud RunAgent RuntimeMemory BankA2A GatewayFirestorePub/SubEventarcModel Armor
Discuss the decisions

Building a system with an audit boundary?

I’m always interested in the constraints that make an architecture worth explaining.