Skip to main content

Architecture Decisions and Open Gaps

This page is the Docusaurus decision index. It summarizes the governing choice and links to the full record or source design. Implementation status remains on Current State and Target State.

Status: the decision index is Implemented; each unresolved item below is Planned architecture work and must not be presented as an operational capability.

Governing decisions

DecisionConsequenceSource
Go services are the platform architectureAll component, workflow, deployment, and developer guidance describes the Go fleetPlatform architecture
Each service owns its business capability and dataPublic contracts and data ownership follow service boundaries; shared infrastructure does not create shared domain ownershipService architecture
Workloads are first-class identitiesEach service obtains a short-lived, asymmetric, audience-bound token; receiving services authorize caller identity separately from user identityADR-06
Internal service calls use gRPCClient-facing APIs remain HTTP/REST; shared interceptors carry the same workload and subject model over gRPCADR-14
Authorization is compositedx-authz-go orchestrates relationship, contextual, delegation, and trust inputs behind one Authorize contractAuthorization target
Relationships and contextual policy have separate enginesOpenFGA answers graph relationships. OPA evaluates contextual and attribute policy and returns typed obligations. The composite PDP combines them.Platform-owner direction reflected in this documentation; canonical ADR update required
Decisions are centralized; enforcement is distributedThe gateway or application PEP obtains a decision. The decision and obligations travel to the data service; data planes do not call the PDP again.ADR-10/A1
Policy administration is separate from decision evaluationdx-acl-go owns grant authoring and history; dx-authz-go owns request-time decisions; neither bypasses the otherAuthorization target
Grant changes use durable asynchronous projectionDomain write and outbox append are atomic; consumers are idempotent; incompatible messages are quarantined; reconciliation repairs projectionsMessaging design
Agent authority is derivativeAn agent action requires the user's own right, the agent's delegated right, an active grant, and an active agent; HITL is mandatory for high-risk toolsAgent Plane
Deployment is configuration-selectedThe same images support central and, when enabled, federated topologies. GitOps selects components and injects environment configuration and secrets.GitOps

OPA and OpenFGA boundary

The OPA direction is newer than the current canonical authorization target's contextual-evaluator choice. This documentation treats OPA as the intended contextual engine because that is the requested platform direction, while preserving the stable boundaries from the target design:

  • OpenFGA owns relationship reachability, not arbitrary conditions, filters, masks, or quotas.
  • OPA receives normalized input and policy data from dx-authz-go; policy code does not perform ad-hoc database or OpenFGA calls.
  • dx-authz-go owns orchestration, final combination, decision IDs, cache semantics, reason codes, and attestation issuance.
  • PEPs enforce the returned decision and the obligations they support. An unsupported obligation is a deny.

The full ADR set must be updated before implementation so the OPA choice has one canonical source.

Open decisions

GapWhy it mattersRequired owner/evidence
OPA deployment modeSidecar, embedded runtime, or remote service changes latency, failure domains, and bundle rolloutArchitecture and operations decision with a measured latency/failure test
Policy bundle authoritySigning keys, repository, revision naming, promotion, rollback, and emergency disable are not fixedSecurity/platform ownership decision
Decision-attestation lifetime and revocationA carried decision was made in the past; its safe staleness bound is a product and security decisionProduct risk tier plus security review
Operation and permission registryStable operation IDs, permission names, resource types, and extraction rules must be canonical before /v1/authorizeAPI governance decision and generated registry
Default contextual profileThe policy profile for operations without an explicit profile must not be inferredSecurity decision; default should remain deny until ratified
Organization hierarchy modelOrganization membership exists; group membership production and hierarchy semantics are incompleteIdentity/domain model and event producer ownership
Multi-tenant SaaS isolationCurrent target assumes one exchange tenant with organizations inside itExplicit tenancy architecture before hosting unrelated exchange operators together
Decision-cache TTLsCache safety depends on token expiry, grant expiry, bundle revision, and revocation SLOLoad tests and security-approved bounds
Federated authorization contractRemote decision provenance, trust anchors, failure behavior, and policy ownership need a versioned contractFederation ADR and conformance suite
Agent sender constraintDelegated tokens are bearer credentials until DPoP or equivalent binding is implementedAgent security work item and threat test

Until an open decision is closed, implementations must choose the safe direction: default deny, no silent fallback, and no statement that the capability is operational.