Skip to content

FDAI Architecture

FDAI is built from independent agents. Each agent owns one job and talks to the others only through schema-checked events, so the parts that observe, decide, approve, execute, and audit never collapse into a single component. The control plane runs headless, the console stays read-only, fixes arrive as pull requests, and approvals happen in chat.

A fixed organization of 15 agents makes those responsibilities explicit. Each agent owns typed objects and a lifecycle role inside the control plane. Agents add ownership on top of the control loop. They never replace it and never skip its deterministic safety checks.

Azure is the implemented target. Every cloud call goes through a provider contract, so the core never imports an Azure SDK and you can move to another host without rewriting decision logic.

Start with the conceptual view when you need to explain how an operator’s natural-language intent becomes a governed action. It separates language understanding, semantic context, policy judgment, action selection, execution, feedback, and durable stores without tying the explanation to Azure resource placement.

Six stages run from an operator question through language understanding, dynamic ontology, policy evaluation, action selection, and execution. Shared context supports an ontology, policy engine, action catalog, and execution targets. Results flow through a feedback loop into four governed data stores.

The numbered cards show the primary path. The lower surfaces expand the same concepts into shared context, typed semantics, deterministic policy, registered actions, execution targets, measured outcomes, and durable evidence. Use the reference architecture next when you need authority and deployment boundaries.

Use the reference view to identify system scope, authority boundaries, and governed dependencies before tracing an individual event. The headless control plane contains typed event choreography and the control stages owned by the 15 agents. Model providers, tools, policy and query engines, knowledge, evidence, and the Azure deployment foundation remain outside that inner boundary. The foundation lists AKS as the default runtime and Container Apps as the compatibility profile.

Connected Azure resources, telemetry, repositories, and connectors send typed signals to the headless FDAI control plane, and operators use the Web Console, CLI, and ChatOps. Fifteen agents coordinate through a schema-validated event bus. Events pass ingest and trust routing to T0 rules, T1 verified reuse, or T2 grounded reasoning; only T2 passes a quality gate, then every tier reaches the risk and authority gate. High-impact work needs independent human authority. Approved work reaches the privileged executor and produces governed changes; other work is held, denied, or closed as a no-op. Governed capabilities and the Azure foundation sit outside the control plane, and every outcome is audited and replayable.

The collective pantheon mark represents the fixed 15-agent organization, not a sixteenth agent. T2 alone uses the quality gate; every tier uses the common safety and authority check. Human approval returns as a typed event instead of calling the executor directly. OPA and Rego evaluate deterministic policy, while IQL performs bounded inventory queries. Use the system overview for one-event flow and the Azure views for deployment and resource-level connections.

FDAI has five loosely coupled layers. They share typed events, versioned contracts, and Git. They do not share one process or one identity.

Azure changes, telemetry, operator requests, and scheduled probes enter Event Hubs through its Kafka endpoint on port 9093. The FDAI control plane ingests each event, selects a trust tier, verifies the decision, applies the safety check, and either executes, requests approval, or holds. Outcomes are delivered through fix pull requests and recorded in PostgreSQL for the read-only console.

The console reads projections from the state and audit stores. It does not use the executor identity, it cannot approve a change, and it never calls an Azure API that changes anything.

Choose the view that matches the deployment runtime. AKS is the default for new installations; Container Apps remains a compatibility profile. The logical control loop and authority boundaries are the same in both.

This view shows the AKS profile with an authenticated public Console and postgres-flex. Azure Static Web Apps hosts the browser application outside the cluster. Azure API Management (APIM) provides its HTTPS API gateway and routes Operator requests and /ingestion requests to separate AKS services.

Read the diagram from left to right: authenticated access, the AKS runtime, then Azure data and operational services. Shared workload dependencies sit below the main flow. The API boundary excludes scheduled jobs, and the Event Hubs connection represents shared service transport, not a Core-only bus.

Operators authenticate with Microsoft Entra ID and use the Console on Azure Static Web Apps. Azure API Management routes browser requests to the Operator Service and Document Ingestion API on AKS. The cluster separates its managed API server, system and user node pools, five service Deployments, and CronJobs. Event Hubs carries schema-validated service events. PostgreSQL and document storage remain outside the cluster. Workload Identity and Key Vault keep service identities and secrets separate. Only the isolated Executor is eligible for approved resource effects. Container Registry supplies digest-pinned images; Azure OpenAI and monitoring are shared dependencies. This is a deployment profile, not live health or private-network evidence.
  • Service placement: Five independent Deployments run the Core Control Plane, Operator Service, Document Ingestion API, Document Processing Worker, and isolated Executor. The Worker includes a ClamAV sidecar. Scheduled work runs as CronJobs, not Container Apps Jobs.
  • API access: Externally exposed APIs use Kubernetes LoadBalancer Services; other services use ClusterIP. The API services validate Entra tokens. APIM is the browser gateway, not the Kubernetes management API.
  • Identity and images: Namespaced ServiceAccounts federate through AKS Workload Identity to separate managed identities. Key Vault supplies service-specific secret references through the CSI driver. Container Registry supplies digest-pinned images. Only the isolated Executor is eligible to hold approved resource-effect roles; runtime selection does not enable execution.
  • Data and events: Event Hubs carries schema-validated service events; there are no direct agent-to-agent calls. PostgreSQL uses service-owned roles, and Azure Storage holds documents and history. Group-level connections summarize these paths, not shared credentials or unrestricted data access. The common-dependency and operations areas list supporting services without repeating every identity, image, model, approval, and telemetry connection. Azure products use their product icons; Kubernetes Deployments, nodes, and CronJobs use their corresponding Kubernetes icons.
  • Network scope: AKS uses an application VNet, a node subnet, and a delegated API-server subnet with API Server VNet Integration. The basic profile restricts public management access by CIDR and Entra RBAC. Private cluster access, service private endpoints, peering, and private DNS depend on the selected networking profile; this picture does not assert they are enabled.

The diagram describes reusable deployment configuration, not a tenant inventory or live health report. Model access, approval channels, and diagnostic collection need their own configuration and verification. The optional postgres-aks profile places PostgreSQL inside AKS and is not depicted here. See runtime deployment profiles for placement and readiness requirements.

Container Apps remains a compatibility profile with the same five services, control loop, and authority boundaries. The resource network flow in the next section is its deployment view. It shows the five services in a VNet-integrated Container Apps environment, the private-endpoint paths to Azure services, and the delivery channels.

The view maps the parameterized Terraform deployment, not one tenant’s resource names. Azure OpenAI and some private endpoints remain optional. Human App Roles and the privileged executor managed identity stay separate in every profile.

This is the Container Apps private-network reference, not the AKS profile above.

Use this view to trace current and target-state connections at the Azure resource level. It separates the private Application Gateway, Container Apps infrastructure, and private endpoint subnets, then maps each private endpoint to its managed service backend. The diagram shows the FDAI Web Console path. The FDAI CLI uses the same Operator API but is omitted from this view for clarity.

An operator signs in with Microsoft Entra ID and uses the FDAI Web Console. A planned private Application Gateway with a WAF policy would route requests to the Operator Service and Document Ingestion API. Five FDAI services run in a VNet-integrated Container Apps environment, and only the Isolated Executor may hold approved effect roles. Event Hubs, Container Registry, Key Vault, Azure OpenAI, Microsoft Foundry, PostgreSQL, and optional ADLS Gen2 storage connect through private endpoints. Resource Graph, Application Insights and Log Analytics, a planned Managed Grafana, approval channels, and Git providers complete the paths.

The baseline portion shows the default private-networking profile, where enable_private_postgres=false adds a postgresqlServer private endpoint. Setting enable_private_postgres=true replaces that path with PostgreSQL Flexible Server in its delegated subnet and doesn’t create the endpoint. The document path separates its authenticated Ingestion API from the durable Processing Worker. Both use the optional Blob and DFS private endpoints and ADLS Gen2 account. One Event Hubs symbol represents both the primary and operational namespaces because they use the same Azure resource and private-link pattern. Case-history storage is documented but not repeated as another Storage Account and private-endpoint pair. The development operations gateway and APIM remain in their feature-specific profiles.

The same view overlays the intended gateway, model platform, observability, and delivery-provider topology. Elements that Terraform does not provision are drawn with dashed outlines and a “(planned)” label. The table below states the status of each target-state element.

Target-state elementTerraform statusDocumentation decision
Private Application Gateway subnet with Application Gateway and WAF policyNot provisionedKeep in the diagram as planned topology; add its Terraform profile before treating the path as deployable
Microsoft Foundry account, project, and private endpointOpt-in feature profileKeep in the diagram; availability depends on LLM and web-search settings
Azure Managed GrafanaNot provisionedKeep in the diagram as planned observability topology
Email, Teams, and Slack approval channelsEmail is opt-in; Teams and Slack are deployment adaptersKeep as provider choices; each deployment selects credentials, callback identity, and fallback policy
GitHub, GitLab, and Azure DevOps delivery providersDeployment adaptersKeep as provider choices; each deployment selects the Git host and review bindings

The diagram does not need every Terraform resource as a separate node. Use the following inclusion rule: draw a resource when it changes a network boundary, creates a distinct data path, or is a user-visible delivery endpoint. Group or document resources that only support those paths.

Terraform resource or resource groupDiagram treatmentReason
Operational Event Hubs namespace and its private endpointAggregate under Event HubsIt uses the same Event Hubs and private-link symbols; the node description covers primary and operational topics
Case-history Blob account and its private endpointKeep documentedIt uses the same Storage Account and Blob private-endpoint symbols, so repeating the pair adds clutter without a new interaction pattern
Container Apps environmentKeep aggregatedThe Container Apps subnet boundary and app/job nodes already communicate its hosting role
Private DNS zones and VNet linksKeep implicit in private-endpoint pathsDrawing each zone and link would duplicate every private endpoint without changing the workload flow
Action group, metric alerts, and diagnostic settingsKeep aggregated under App Insights and LogsThese resources implement observability routing rather than a separate workload data path
Event Grid realtime inventory topicExclude from this private profileTerraform enables it only when private networking is disabled

No extra nodes are required for these resources. They and the other supporting resources remain intentional abstractions rather than missing architecture.

Azure Resource Graph reads and observability writes are shown outside the private data-plane path because they use Azure control-plane and telemetry contracts. This Container Apps reference still doesn’t add an Application Gateway, WAF, Managed Grafana, or load balancer.

The validated five-service baseline and one candidate

Section titled “The validated five-service baseline and one candidate”

The 15 agents are logical responsibility owners inside the Core runtime. They are not 15 Azure services. FDAI retains five independently releasable services, each with its own image, Terraform state, migration branch, health contract, and workload identity. SD-10 adds a separately packaged System Knowledge Service candidate that remains undeployed until its graduation evidence exists.

ServiceResponsibilityEffect authority
Core Control PlaneAgent runtime, decisioning, approval joins, audit intent, and recovery coordinationNone
Operator ServiceAuthenticated queries, conversations, projections, and governed request submissionNone
Document Ingestion APIAuthenticated upload intake and API-owned document transitionsNone
Document Processing WorkerDurable inspection, extraction, indexing, claims, and reconciliationNone
Isolated ExecutorCommand validation, target locking, provider effect, rollback attempt, and execution receiptSole eligible holder
System Knowledge Service candidateRelease-bound FDAI reference search and a dedicated Teams mention botNone

The event bus and versioned service contracts connect the validated baseline. The candidate uses its own catalog, Teams HTTPS ingress, and service contract. No service imports another service’s implementation or shares mutable workflow state.

LayerResponsibilityPrimary boundary
Headless control planeNormalize events, pick a trust tier, verify proposals, classify risk, and coordinate executionNo UI logic and no direct cloud SDK imports
Action deliveryTurn approved actions into fix pull requests or registered provider callsEvery action keeps its typed safety contract and rollback reference
Operator consoleShow state, evidence, audit history, observation-mode results, and pending approvalsRead-only identity with no permission to execute
Human channelDeliver approval requests and operational alerts through ChatOpsThe approver is never the executor
Rule catalogKeep rules, policies, action types, prompts, and promotion evidence versioned as codeCatalog changes go through review, regression tests, and observation-mode evaluation

These layers fail and scale independently. If the console goes down, event processing keeps running. If ChatOps goes down, high-risk work waits in a queue instead of executing without approval.

Every event takes the same path, whether it comes from an Azure resource change, an SLO burn detector, a scheduled job, or an operator request.

The system overview under Design at a glance draws this path.

  1. Ingest and correlate: FDAI checks the event schema, drops repeats using a stable idempotency key (a key that makes a retry safe), and groups related signals into one incident.
  2. Pick the lowest tier that can decide: T0 (deterministic rules) handles the repeatable majority, T1 (lightweight reuse of similar past incidents) handles known patterns, and T2 (grounded LLM reasoning) handles only the new or ambiguous cases.
  3. Verify before you classify risk: a T2 proposal has to pass mixed-model agreement, an evidence check, and schema, policy, security, and what-if checks. A plausible answer is not enough.
  4. Apply the autonomy ceiling: the safety check weighs action risk, impact scope, system health, and policy. It answers auto, approval required, or deny.
  5. Execute once, record every path: the executor takes a per-resource lock, applies an action that is safe to retry, and writes the result. Rejections, timeouts, holds, rollbacks, and no-ops are audited the same way.

Read Deterministic first for the tier boundaries and Trust tiers for the autonomy decision.

The agent organization inside the control plane

Section titled “The agent organization inside the control plane”

FDAI’s 15 named agents are an ownership layer over the control loop. They are not 15 separate Azure services, and they are not chatbots making free-form decisions. Each agent is a runtime object with one mandate, a set of object types it owns, the topics it subscribes to, and bounded permissions.

All agents run inside the same Python control-plane process and talk through an injected event bus. Sharing a process does not soften the boundaries: an agent still publishes only what it owns. If you later split them into separate processes, the topics and the authority model stay the same.

Architecture functionAgentsOwnership in the control loop
Sense and observeHuginn, HeimdallHuginn owns normalized events and real-time resource discovery ingress. Heimdall owns anomaly, drift, and forecast detected issues.
Judge and arbitrateForseti, OdinForseti issues decisions. Odin resolves cross-vertical conflicts before Forseti finalizes a decision.
Execute, approve, recover, and explainThor, Var, Vidar, BragiThor is the sole privileged executor. Var carries human approval. Vidar owns rollback. Bragi translates operator conversations.
Govern evidence and knowledgeSaga, Mimir, Norns, MuninnSaga owns append-only audit. Mimir owns rules. Norns proposes inert learning candidates. Muninn owns state snapshots and context indexes.
Supply domain evidenceNjord, Freyr, LokiCost, capacity, and chaos specialists advise judgment. They never execute.

The 15 roles are fixed upstream, so a fork cannot merge two conflicting roles or rename an authority boundary. A fork can bind providers, tune thresholds, turn off optional agents, and add catalog entries. Saga and Vidar are hard dependencies, so you cannot turn off audit or rollback.

The table above is the organization chart. The diagram below is the data flow: which agent-owned object moves where.

The interactive view shows the topology at runtime: agents subscribe independently, work can fan out in parallel, and only the owning agent publishes each authoritative object. Gateways and workers relay events. They never become hidden decision makers.

External signals enter the shared typed event bus and reach Huginn. Huginn publishes normalized events that fan out to Heimdall and Forseti. Heimdall, Njord, Freyr, Loki, Mimir, and Muninn contribute findings, domain evidence, rules, and context without calling one another directly. Forseti owns decisions and asks Odin to arbitrate cross-domain conflicts. Eligible decisions reach Thor, while Var owns human approval and Vidar owns rollback. Forseti, Thor, Var, and Vidar publish audit evidence to Saga. Saga outcomes reach Norns, which proposes inert rule candidates to Mimir. Bragi reads context from Muninn and returns typed action proposals to Huginn so conversations use the same governed path.

The flow follows one simple rule: information can fan out to many readers, but each authoritative object type has exactly one writer. Many agents can read a decision, for example, and only Forseti can publish object.verdict. The publish-side registry checks that ownership. If a record declares a producer that does not match the topic owner, the event-bus bridge sends it to the dead letter queue. Records with no declared producer are reported separately so the boundary can be tightened. Knowing a topic name is not the same as holding authority over it.

Single-writer ownership turns an agent role into something the runtime can enforce, not just something the docs describe.

Object or topicSingle writerArchitectural effect
Event / object.eventHuginnA cloud adapter cannot pretend to be normalized control-plane ingress.
Verdict / object.verdictForsetiSpecialists and models can advise, but they cannot make an action eligible to run.
ArbitrationDecisionOdinCross-vertical trade-offs have one deterministic tie-breaker.
ActionRun / object.action-runThorOnly the executor can claim an attempted change and report how it ended.
Approval / object.approvalVarThe executor cannot fabricate its own approval.
Rollback / object.rollbackVidarRecovery stays a separate path you can test on its own.
AuditEntry / object.audit-entrySagaFinal evidence has one append-only owner.
RuleCandidate / object.rule-candidateNornsLearning proposes inactive data and cannot edit the catalog directly.
Rule and PolicyMimirTurning a rule on or off stays a governed catalog operation.

Agent modules never import one another to call a handler directly. They publish the objects they own and subscribe to the topics they declared, so the runtime wiring always matches the table above.

Every registered ActionType ties the action lifecycle to named agents:

initiator -> Forseti (judge) -> Thor (executor) -> Var (approver when required)
-> Saga (auditor on every terminal path)
-> Vidar (compensation when required)

The initiator changes from action to action. The judge, executor, approver, and auditor roles are fixed upstream. The binding also carries the rollback contract, the irreversibility flag, and the compensating action. That is what stops a fork from letting a domain specialist approve its own work, or from naming the component that made the change as its own auditor.

Every agent exposes two ports:

  • Typed pub/sub port: the authoritative machine path. It uses registered topics, schema-checked payloads, producer verification, and the deterministic-first control loop.
  • Conversational port: a bounded natural-language path for operator questions and agent-to-agent lookups. Bragi routes the question and writes the answer. Bragi never judges and never executes.

The two ports share only the correlation trace. If you ask Bragi to perform an action, Bragi builds a typed proposal and sends it through Huginn, so the request goes through validation, judgment, risk, approval, execution, and audit like any other event. A conversation can explain authority. It cannot become authority.

The runtime starts the agent organization beside the established control-loop consumer and measures the two against each other.

Current implementation status: The agents start with the control plane and run in observation mode, where they judge and log but apply no changes. Named ownership describes the authority contract. It does not mean every agent is cleared to make live changes. Enforcement mode stays blocked until every durable safety binding is in place.

  • Shared ingress, separate consumers: both paths read the same Kafka topic under different consumer groups, so the agents observe events instead of taking them away from the established loop.
  • Observation mode by default: Thor records what the agents would have done but cannot change anything, so nothing executes twice while you compare the two paths. Set FDAI_START_PANTHEON=0 only when you need to stop the agent runtime for maintenance.
  • Enforcement is a separate promotion: starting in enforcement mode requires a live Thor executor, durable action-run storage, a durable Saga audit chain, registered Vidar rollback executors, and a deployment-level authority ceiling in the startup readiness report. If any one is missing, startup stops.
  • Failure isolation: the agent runtime is watched separately. If it fails, the failure is reported and the established event consumer keeps running.

This layout lets you compare stage-level and agent-owned outcomes before you move execution authority. The architecture stays stable while the implementation is promoted step by step.

In FDAI, separation of authority is an architecture property. It is not a user interface convention that a later change can quietly undo.

BoundaryWhy it existsEnforced behavior
Judgment vs executionWhoever proposes or judges a change should not apply itForseti judges, and Thor executes the accepted typed action
Approval vs executionA privileged executor cannot approve its own workVar carries approval through a separately authorized channel
Console vs control planeA browser session should not hold permission to change anythingThe console reads projections and evidence only
Model proposal vs eligibilityA plausible model answer is not evidenceDeterministic verification decides whether a T2 proposal may proceed
Observation vs enforcementA new capability should prove itself before it changes anythingNew actions observe and audit first, and enforcement is promoted separately
Replay vs re-executionInvestigating an incident should not repeat a production changeAudit replay rebuilds the judgment without running the action again

The agent organization assigns these roles to named agents, and no agent may skip the typed control loop. A request that arrives through a conversation re-enters the same event, verification, risk, and audit path as any other request.

The repository follows the same dependency direction as the runtime system.

The composition root reads validated configuration and injects concrete providers into the delivery adapters and the core. The delivery adapters implement persistence, Azure access, GitOps, notifications, ChatOps, and Operator APIs behind shared contracts. The core holds decision and coordination logic and depends only on shared contracts, never on Azure SDKs or UI code. Shared contracts define versioned event, action, rule, workflow, and provider contracts and never import the core. The rule catalog and policies hold governed data, so a rule or action type can be added without rewriting the control loop.

  • core/ holds decision and coordination logic. It depends on shared contracts, never on Azure SDKs or UI components.
  • shared/ defines versioned event, action, rule, workflow, and provider contracts. It never imports the core.
  • delivery/ implements persistence, Azure access, GitOps, notifications, ChatOps, and Operator APIs behind those contracts.
  • rule-catalog/ and policies/ hold governed data. You can add a rule or an action type without rewriting the control loop.
  • The composition root reads validated configuration, picks the concrete providers, and injects them at startup.

For the complete dependency map, read Project Structure.

The first implementation maps each portable contract to a small Azure resource set. Provider-specific calls stay inside adapters, so swapping a resource does not touch decision logic. AKS is the default runtime for new installations, and Container Apps remains a compatibility profile.

Portable concernContractAKS (default)Container Apps (compatibility)
Event streamKafka wire protocolEvent Hubs through its Kafka endpointEvent Hubs through its Kafka endpoint
Core runtimeOCI image and portable manifestKubernetes Deployments in a user node poolContainer Apps
Scheduled workJob or cron contractKubernetes CronJobsContainer Apps Jobs
State, audit, and T1 vectorsPostgreSQL and pgvectorAzure Database for PostgreSQL Flexible ServerAzure Database for PostgreSQL Flexible Server
SecretsEnvironment or mounted secretKey Vault references mounted by the CSI driverKey Vault reference injected by Container Apps
Workload identityOIDC tokenAKS Workload Identity federated to user-assigned managed identitiesUser-assigned managed identity
InventoryResource graph contractAzure Resource Graph plus activity deltasAzure Resource Graph plus activity deltas
ObservabilityOpenTelemetry-compatible signalsLog Analytics and Application InsightsLog Analytics and Application Insights
ConsoleStatic read-only applicationAzure Static Web AppsAzure Static Web Apps
Console Operator APIHTTP read contractOperator Service behind API ManagementContainer App with its own read-only identity
Document ingestionUpload and chunking contractIngestion API and Processing Worker with Data Lake StorageContainer Apps with Data Lake Storage
Human approvalTyped approval messageTeams bot and Adaptive CardsTeams bot and Adaptive Cards

On AKS, each service sets its own replica floor and ceiling, and the floor is at least one. On Container Apps, the core runs continuously with a floor of one replica and a ceiling of three. That floor stays at one because scale-to-zero needs a credential-free Kafka-lag scale rule, and without that rule an incoming event would never wake the app. Scheduled jobs and static surfaces can still scale to zero. For the full provider surface, read CSP-neutrality contracts.

An action type is incomplete until it declares all seven safeguards:

  • Stop condition: the measurable signal that halts execution.
  • Rollback path: the tested way to restore the old state or move forward safely.
  • Impact scope limit: the largest scope, batch size, concurrency, or rate the action may touch.
  • Dry-run receipt: the successful what-if result for the exact target and revision.
  • Logical-target lock: held until the side effect commits.
  • Idempotency key: stable duplicate suppression across retries.
  • Two-phase audit: intent before the effect and terminal closure after execution and independent outcome observation.

If a required dependency such as the audit store is unavailable, FDAI drops autonomy to observation mode or holds the work for review. It does not fail open.

Consider a resource change that opens network access wider than policy allows:

  1. Azure emits a resource-change event onto the Kafka-compatible event bus.
  2. Event ingest normalizes the payload, attaches inventory context, and finds the resource’s correlation key.
  3. T0 matches a versioned network rule and proposes a typed fix.
  4. What-if confirms the exact diff. The safety check sees that the impact scope needs approval.
  5. ChatOps sends an approval card with the rule, the evidence, the impact scope, the stop condition, and the rollback reference.
  6. After approval, the executor opens a fix pull request instead of changing the resource from the console.
  7. Delivery, approval, and the final outcome are linked in the append-only audit trail, and the console shows them as read-only evidence.

A denial, rejection, timeout, or rollback follows the same path. Only the last step differs.

FailureSystem response
Console unavailableCore processing, Git delivery, and ChatOps keep running
ChatOps unavailableWork that needs approval waits in a queue and never auto-executes
Event backlog growsBackpressure caps concurrency and keeps work for retry or dead-letter handling
Audit or critical provider unavailableAutonomy drops to observation mode, or the action is held
Duplicate deliveryIdempotency keys and resource locks stop a second change
T2 models disagreeThe competing evidence is kept and the case goes to human review
Rollback verification failsThe incident stays open and recovery escalates through the typed pipeline
Forseti unavailableNo new agent decision is issued, and work is held for review
Thor unavailableDetection, judgment, and audit continue, but nothing changes
Var unavailableWork that needs approval stays queued, and a timeout becomes an audited no-op
Saga or Vidar unavailableEnforcement startup and changes are blocked, because audit and rollback are hard dependencies
Agent runtime failsThe failure is logged and the established primary consumer keeps running
To learn aboutRead
How tiers choose a decision methodDeterministic first
How actions become auto, approval required, or denyTrust tiers
How typed actions and workflows fit the loopAgent-driven automation
How the named agents divide responsibilityAgents and self-healing
How Azure resources are prepared safelyDeployment preflight
How operators respond to incidentsSRE runbooks