Security architecture
flowchart TB
client["Client browser"]
lawyer["Lawyer/admin browser"]
oidc["OIDC provider"]
edge["HTTPS Gateway"]
subgraph gke["GKE namespace"]
web["navigator-web\nportal, AIDA, APIs"]
worker["workflows-service\nDurable worker"]
end
subgraph data["Private data plane"]
pg["SurrealDB\nroles + project access"]
docs["GCS documents bucket\nprivate blobs"]
assets["GCS assets bucket\nprivate marketing objects\nserved through /assets"]
end
client --> edge
lawyer --> edge
edge --> web
web --> oidc
web --> pg
web --> docs
web --> assets
web --> worker
worker --> pg
worker --> docs
client -. "portal session only" .-> web
lawyer -. "portal session + lawyer role" .-> web
Clients never receive GCS IAM, bucket URLs, or object paths. A client request enters through navigator-web, resolves
identity through OIDC, reads authorization from persons and person_project_roles, and streams only the
portal-visible matter files back through the app. Lawyer and admin access is not a second door: it enters through the
same service and the same database access model, and differs only in what the role and participation checks allow.