← Uday Nallamottu · ubngroup.net

Case Study

Project Nura

Multi-agents governing a multi-account AWS estate — grounded in live APIs, bounded by design.

Author Udhaya (Uday) Nallamottu December 2025

01Executive Summary

An enterprise running two hundred AWS accounts has no shortage of signal. GuardDuty, Config, Access Analyzer, Cost Explorer, and Security Hub each produce findings. What they do not produce is a governed answer to four questions a CISO and a CFO ask continuously: what is misconfigured, what is out of compliance, what is being wasted, and what needs a human right now.

Project Nura is a multi-agent AWS governance platform that answers those questions on a schedule rather than on request. Nine specialized Amazon Bedrock agents scan live AWS environments across security, compliance, cost, cost anomalies, infrastructure, incident response, network security, access analysis, and backup/DR. Each agent calls real AWS APIs through action groups, enriches raw findings with remediation guidance and control mappings, and returns structured findings. An Orchestrator agent above them decides what a human needs to see.

The grounding constraint. Every agent operates under one non-negotiable instruction: it must call run_scan before answering, and never respond from training knowledge. Findings exist because an AWS API returned them, not because a model recalled something plausible. This single constraint is the platform’s central integrity claim — and, as the Evaluable section states plainly, it is the one control that currently depends on the model’s compliance rather than on architecture.

The autonomy model. The Orchestrator triages every scan. LOW and MEDIUM findings receive AI-generated remediation guidance and are closed. HIGH and CRITICAL findings generate an escalation record and an alert to the security team. The purpose is not to reduce work but to reduce noise: without triage, every finding pages someone, and a queue that pages for everything is a queue nobody reads.

The governance model. Nura is designed as a governed AI platform under the Governed AI Autonomy framework: an agent’s authority is bounded by architecture, its activity is visible in real time, its decisions are reconstructable by an examiner, and its correctness is measured rather than assumed.

Platform at a glance

Agents 9 domain scanners + 1 Orchestrator, on Amazon Bedrock
Model Amazon Nova Pro (amazon.nova-pro-v1:0)
Coverage ~35 checker modules across IAM, S3, EC2, RDS, EKS, ECR, Lambda, VPC, DNS, KMS, CloudTrail, GuardDuty, Backup
Frameworks CIS AWS Foundations L1/L2, SOC 2 Type II, AWS FSBP, ISO 27001, NIST CSF, GDPR technical controls
Deployment Two variants — Hosted (customer’s own governance account) and SaaS (multi-tenant)
Access posture Read-only in every scanned account, enforced by IAM
Scale mechanism CloudFormation StackSets + hourly account_sync — zero per-account configuration
Triage Orchestrator auto-closes LOW/MEDIUM with guidance; escalates HIGH/CRITICAL to humans

02The Problem

Multi-account governance does not scale by adding people. Manual review of an AWS account takes a competent engineer two to three hours a week to do properly. At two hundred accounts that is a full-time team doing work that is entirely rules-based, and doing it inconsistently, because a human reviewing the fiftieth account of the week is not the same reviewer who examined the first.

Native tooling reports; it does not reason. GuardDuty tells you a finding exists. Config tells you a rule failed. Neither tells you what it means for this business, which control it violates, what the remediation is, or whether it matters more than the other four hundred open items. The interpretation layer is where the effort actually goes, and it is entirely manual.

Compliance evidence is reconstructed rather than produced. SOC 2 and CIS audit preparation is typically a project: pull configuration state, screenshot consoles, map findings to controls, assemble spreadsheets. The evidence is assembled after the fact to describe a period that has already passed, which means it describes a snapshot rather than a posture.

Alert fatigue is a governance failure, not a UX complaint. A system that surfaces every finding at equal weight trains its operators to ignore it. The security team that stops reading the queue is the predictable outcome of a queue that never distinguishes urgent from routine.


03The Solution

Nura delivers three layers: grounded scanning (agents that can only report what a live AWS API returned), domain enrichment (severity confirmation, remediation steps, control mappings, business-impact framing), and autonomous triage (an Orchestrator that decides what reaches a human).

The nine scanner agents

Agent Domain Representative checkers
Security Broad posture management IAM (root usage, MFA, key age), S3 (public ACLs, encryption), security groups (0.0.0.0/0 on SSH/RDP), CloudTrail, GuardDuty, KMS/Secrets, RDS, EKS, ECR, SSM, Lambda runtimes
Compliance Regulatory control mapping CIS AWS Foundations L1/L2, SOC 2 CC6/CC7/CC8, AWS Config conformance packs
Cost (FinOps) Quantified waste Idle and oversized EC2, unattached EBS, underutilized RDS, S3 lifecycle gaps, on-demand usage that should be reserved
Cost Anomaly Spend spikes Cost Explorer anomaly results correlated with usage metrics; root-cause reasoning on runaway workloads
Infrastructure Reliability and hygiene EC2 health and AMI age, RDS multi-AZ and backups, VPC flow logs, tagging completeness
Incident Response Active and latent incidents GuardDuty high-severity findings, unusual IAM activity, suspicious CloudTrail events, multi-signal correlation
Network Security Exposure surface VPC peering exposure, permissive NACLs, Route 53 DNSSEC, dangling DNS records
Access Analyzer Over-privilege IAM Access Analyzer external/cross-account findings; permissions unused for 90+ days
Backup & DR Recoverability AWS Backup plan coverage, retention rules, vault lock, cross-region copy, encryption at rest

Enrichment differs meaningfully by domain. The Cost agent attaches estimated monthly USD savings and ranks by impact. The Compliance agent attaches specific control IDs — CIS 1.4 — ensure no root account access key exists, SOC 2 CC6.1 — logical access controls — in a form that drops directly into an auditor’s evidence package, with the mapping itself moving to a static table for the reasons given below. The Access Analyzer agent estimates blast radius and states the minimum permission set that should replace the current one. The Backup agent states the data-at-risk window since the last successful backup.

What the AI does — and what it deliberately does not

The most common misreading of an agentic platform is that the model is doing everything. In Nura it is doing one thing, and the boundary is drawn on a single principle: a model should be used for judgment, never for routing and never for lookup. Wherever a correct answer is determinate, a deterministic system beats a model on every axis that matters here — cost, latency, reproducibility, and auditability.

DeterministicCode decides

  • Which checkers run config
  • Whether a rule is violated checker
  • Base severity checker
  • Control ID mapping table
  • Close vs. escalate rule

Determinate answers. Reproducible, free, instant, auditable.

JudgmentThe model decides

  • Contextual severity adjustment
  • Remediation synthesis
  • Business-impact framing
  • Cost anomaly root cause
  • Cross-signal incident correlation

Ambiguous input, no determinate answer. The only work a model is better at.

Decision Made by Why
Which checkers run Configuration Scan scope is a bundle setting, not an inference
Whether a resource violates a rule Checker code A security group open to 0.0.0.0/0 is a fact, not an opinion
Base severity Checker code Deterministic and reproducible across runs
Compliance control ID mapping Lookup table The mapping is definitional; see below
Triage routing (close vs. escalate) Rule Severity is already known; this is an if-statement
Contextual severity adjustment Model Requires environmental judgment
Remediation synthesis for a specific resource Model Requires composing steps for actual configuration
Business-impact framing Model Requires translating a technical fact into a consequence
Cost anomaly root cause Model Inference over ambiguous multi-signal data
Cross-signal incident correlation Model Hypothesis formation from weak, scattered evidence

Checker selection is deliberately not adaptive. An agent that decided which checks to run each cycle would be cheaper and would destroy the platform’s audit posture. Nura needs to state that CIS 1.4 was evaluated on every scan of every account — not that a model usually chose to evaluate it. Compliance scanning should be exhaustive and boring. Declining to apply AI here is an architectural decision, not an omission.

Severity and triage routing belong to code. Checkers assign severity deterministically; routing LOW/MEDIUM to closure and HIGH/CRITICAL to escalation is a two-line rule over a known field. Delegating it to a model costs tokens, adds latency, and — worse — makes routing nondeterministic, so the same finding can route differently on two runs with no explanation available to an auditor.

Control mapping belongs to a table. “Root account access key exists” maps to CIS 1.4 by definition. A lookup is exact, instant, free, and reproducible; a generated mapping introduces the possibility of a wrong control ID inside an auditor’s evidence package, which is worse than no mapping at all because it will be checked.

Current state vs. designed boundary

Two rows in that table describe where the platform is going rather than where it is. Today the Compliance agent generates control IDs as part of enrichment, and the Orchestrator invokes a model to make the close-vs-escalate decision. Both are being moved — mapping to a static table, routing to a rule on the checker-assigned severity field.

Auditing the platform against its own governance framework is what surfaced them. Neither was a bug; both worked. But both spent inference on decisions with determinate answers, and each one that moves out of the model reduces the surface that the Evaluable pillar has to measure.

Where inference genuinely earns its cost

The same fact means different things in different environments. A public S3 bucket serving a static marketing site is expected; a public S3 bucket holding database exports is a breach in progress. The checker returns an identical finding in both cases. Reasoning from bucket naming, tags, object patterns, and account context toward which situation this is is judgment, and it is the difference between a finding that is accurate and a finding that is actionable.

Remediation must be composed, not retrieved. Generic guidance — “enable encryption” — is already in the AWS documentation and helps nobody. Producing the specific commands for this resource, in this region, with these dependencies and this blast radius, is synthesis against a particular configuration.

Anomaly root cause is inference over ambiguity. The Cost Anomaly agent takes a spend spike plus usage metrics and reasons toward a misconfigured Auto Scaling group, a forgotten test instance, or a Lambda invocation loop. There is no deterministic answer; there is a most probable explanation given weak evidence. The same is true of the Incident agent’s correlation of GuardDuty findings, unusual IAM activity, and CloudTrail events into a single incident hypothesis. These two are the platform’s strongest uses of a model, and neither is expressible as a rule.

Business-impact translation is a communication problem. “IMDSv1 is enabled on this instance” and “an SSRF vulnerability in an application on this host could be used to retrieve this instance’s IAM credentials” describe the same finding. Only one of them causes anything to happen.

Every deterministic decision moved out of the model strengthens all four pillars at once: Controlled, because fewer outcomes depend on model compliance; Observable, because the logic is inspectable rather than inferred; Auditable, because the outcome is reproducible; and Evaluable, because there is less surface requiring measurement. Narrowing the model’s role is not a retreat from AI — it is what makes the remaining AI defensible.

The Orchestrator

The Orchestrator runs asynchronously after every scan and holds five action groups: query_findings, remediate_finding, create_escalation, invoke_scanner (to re-run a specific agent for deeper analysis), and query_escalation (to check whether a human has resolved an open item).

A clarification worth stating explicitly: remediate_finding writes AI-generated remediation steps to the finding record and marks it REMEDIATED. It does not modify the customer’s AWS environment. Nura’s autonomy today is autonomy over documentation and triage, not over infrastructure. Executing remediations is a roadmap item with a deliberate approval tier, described later. Conflating the two would overstate what the platform does, which is precisely the kind of claim the governance framework exists to discipline.

Two deployment variants

Hosted. The customer deploys a dedicated AWS governance account. A bootstrap script run from the management account creates the account, places it in a dedicated OU, registers it as a StackSets delegated administrator, and deploys the platform via Terraform through GitHub Actions. CloudFormation StackSets in SERVICE_MANAGED mode targeting the org root then install a read-only reader role in every existing and future member account. All data stays inside the customer’s AWS organization — the model for regulated industries with data sovereignty requirements.

SaaS. The customer deploys a single read-only CloudFormation stack creating a reader role with an ExternalId condition. All scanning infrastructure runs multi-tenant, with per-customer KMS keys and Cognito JWT authentication. Setup is minutes rather than hours.

The two share the same agents, the same checkers, the same scoring, and the same governance model. They differ only in where the compute runs and who owns the state.


04Architecture

Scale without per-account configuration

The design decision that makes multi-account governance tractable is the removal of per-account setup entirely.

An account_sync Lambda runs hourly, calls organizations:ListAccounts, and writes every active member account into an account_registry DynamoDB table. The scan trigger reads from that registry. StackSets in SERVICE_MANAGED mode maintain the reader role across the organization automatically.

The operational consequence: adding an account to the AWS Organization brings it into governance scope within the hour, with no Terraform change, no configuration file, and no manual role creation. Onboarding two hundred accounts requires the same effort as onboarding one. This also closes the coverage gap that manual onboarding produces — the accounts nobody remembered to register are precisely the accounts most likely to be misconfigured.

The scan pipeline

EventBridge Scheduler triggers scanning on a fixed cadence — six hours for hosted deployments, twenty-four for SaaS. The trigger Lambda reads the account registry and enqueues one SQS message per account (SaaS uses a FIFO, KMS-encrypted queue). An executor Lambda processes each message independently: assume the cross-account read-only role, invoke the Bedrock agents included in that customer’s scope, write findings to DynamoDB partitioned on customer_id, publish webhook events, and invoke the Orchestrator asynchronously.

Two properties follow from this shape. Each account fails independently — a broken role in one account produces one FAILED scan record, not a cascade. And there is no always-on compute: scanning is measured in Lambda-seconds, so cost scales with the estate rather than with the clock.

Agent execution

Each Bedrock agent has a system prompt defining its domain expertise and a strict instruction to call run_scan before answering. The action group Lambda assumes the target account’s read-only role and executes the domain’s checker modules — real boto3 calls against live infrastructure. Raw findings return to the agent, which confirms severities, expands remediation into specific AWS CLI commands, maps to compliance controls, and emits structured JSON.

The agent framework was chosen over direct model invocation deliberately: it handles the tool-calling loop and session management, and — more importantly — it establishes a data path where the model’s input is a real API response rather than a prompt. That is what makes the grounding constraint enforceable in principle. The extent to which it holds in practice is an empirical question, addressed under Evaluable.

Data and isolation

DynamoDB holds findings, reports, escalations, scan records, and the account registry, with S3 storing full report JSON blobs. In the SaaS variant every table partitions on customer_id, extracted from the Cognito JWT sub claim and bound before any query executes. Each customer additionally receives a dedicated KMS key created by a Cognito post-confirmation trigger.


05What Makes Nura Different

Agents that cannot invent findings by design. Most “AI security” tooling asks a model to assess a configuration. Nura requires an API call first and gives the model no other data source. The difference is between a system that reasons about infrastructure and one that reasons about its recollection of infrastructure.

Domain specialization over a general assistant. Nine narrow agents, each with domain-specific enrichment logic, produce materially better output than one general agent with a large prompt — because the enrichment that matters differs by domain. Cost findings need dollar estimates; compliance findings need control IDs; access findings need blast radius. A single agent trying to do all of it does each of them adequately.

Triage as a first-class function. The Orchestrator exists specifically to keep the finding queue readable. Auto-closing routine findings with documented guidance and escalating only what needs judgment is the difference between a governance system that gets used and one that gets muted.

Zero write access, enforced by the cloud provider. Reader roles carry read-only permissions with ExternalId conditions against confused-deputy attacks. Customers can audit this at any time. The platform’s access surface in a scanned account is entirely read-only.

Governance as an economic architecture. Model selection, scan cadence, result caching, and bundle scoping are not afterthoughts — they are what make continuous governance affordable enough to run continuously. A platform that costs too much to run daily becomes a platform that runs quarterly, which is the point-in-time auditing it was built to replace.


06Governed AI Autonomy

Nura is not only a consumer of AI — it is a governed AI platform. Every agent operates inside the Governed AI Autonomy framework: Controlled, Observable, Auditable, Evaluable.

These four are a ladder, and the order matters. Controlled bounds what an agent can do at all. Observable lets an operator see what it is doing while it does it. Auditable lets an independent examiner reconstruct what it did months later. Evaluable answers the only question that justifies extending autonomy: was it right, and how often?

Each rung is a precondition for the next increment of trust. Nura’s current autonomy — writing guidance and triaging severity, but never touching customer infrastructure — is bounded precisely because the fourth rung is not yet built.

Evaluable Is it right, and how often? In build
Auditable Can an examiner reconstruct it? Named gaps
Observable What is it doing right now? Shipped
Controlled What can it do at all? Shipped
Each rung is a precondition for the next increment of autonomy. Read bottom to top.

Controlled — what can the agent do?

Read-only by capability, not by policy. Both variants scan through IAM roles carrying read-only permissions. An agent that is compromised, misdirected, or simply instructed to modify infrastructure receives AccessDenied from AWS’s authorization layer rather than from Nura’s application code. This is control by capability removal — the strongest form available, and the one a skeptical customer can verify themselves by reading the role.

ExternalId conditions on every assumed role. Knowing a role ARN is insufficient to assume it. This closes the confused-deputy path that multi-tenant scanning platforms otherwise expose.

Tenant isolation is architectural. JWT validation precedes all query logic; customer_id from the signed sub claim scopes every read and write. A customer cannot forge another’s identity because the token is signed by the platform’s Cognito pool. Per-customer KMS keys mean that even a hypothetical partition-level failure yields ciphertext under a different key.

Capability scoping by bundle. The executor invokes only the agents within a customer’s purchased scope. A FinOps-only customer’s data is never processed by the Security or Backup agents — scope is enforced at invocation, not filtered at display.

Autonomy bounded by severity. The Orchestrator may close LOW and MEDIUM findings. HIGH and CRITICAL findings can only be escalated — the Orchestrator has no action group capable of closing them. The boundary is structural rather than instructional.

No write path to customer infrastructure exists. remediate_finding writes to Nura’s own finding record. There is currently no code path by which any agent modifies a customer resource. Autonomy over infrastructure is a roadmap item, gated behind the approval tiers described below.

The one control that is not architectural. The instruction “you must call run_scan before answering; never respond from training knowledge” is enforced in each agent’s system prompt. The action group is the agent’s only data source, which makes the constraint structurally supported — but nothing architecturally prevents the model from embellishing a finding, adjusting a severity, or emitting an item the checker never returned. This is the platform’s central integrity claim and its weakest control. Naming it as such is the point: it is precisely why fabrication rate is the first metric under Evaluable.

Observable — what is it doing right now?

Observability serves the engineer in the moment, and is deliberately distinct from auditability, which serves an examiner afterward.

Live posture. The dashboard presents current findings by severity, account, and status without requiring a query or a batch export.

Scan pipeline telemetry. Every run writes a scan record with scan_id, account, start and completion times, status, and finding count. Which accounts were scanned, when, how long each took, and which failed are all answerable from the database rather than from logs.

Failure is visible, never silent. A removed or altered reader role causes AssumeRole to fail; the executor catches it and writes a FAILED scan record with the error, surfaced on the dashboard as an unscannable account. Coverage gaps announce themselves. The absence of a completion record is itself a signal.

Agent and infrastructure telemetry on separate planes. CloudWatch captures all agent invocations and Lambda execution independently of the findings pipeline, so a degraded AI layer is distinguishable from a degraded scanning layer.

Scope is inspectable. The account_registry table is the authoritative statement of what is in governance scope. Comparing it against organizations:ListAccounts answers “what are we not watching” directly.

Findings carry their provenance. Each finding records resource ARN, region, severity, description, remediation guidance, control mapping, timestamp, and the scan_id that produced it — traceable to the specific run and the account state at that moment.

Reasoning reaches the operator where they work. Webhook dispatch delivers scan-complete and new-finding events to Slack and Teams, with escalations carrying finding detail and direct links.

As with any AI-generated explanation: remediation guidance is not evidence of correctness. A well-written remediation for a misclassified finding is more dangerous than a bare one, because it is more convincing. These outputs make agent reasoning inspectable so a human can judge it. Whether the reasoning is sound is measured under Evaluable, not asserted here.

Auditable — can an examiner reconstruct it without trusting us?

Auditability is adversarial by design. Observability is built for the engineer who is looking; auditability for the examiner who arrives later, has no context, and has no reason to accept the operator’s account of events.

Findings have a lifecycle, not a state. Each carries created_at, status transitions through OPEN → REMEDIATED or SUPPRESSED, and resolved_at. This produces the evidence auditors actually request: how long an issue was open, when it was fixed, and whether it has recurred.

Continuous rather than point-in-time. Traditional audit evidence describes a snapshot. Because Nura runs on a schedule and retains timestamps, it can answer “what was the posture in March” and “what is the mean time to remediate for CIS Level 1 findings” — questions a point-in-time review cannot address at all. For SOC 2 Type II, which tests whether controls operated effectively over a period, this is the difference between evidence and assertion.

Every finding maps to a named external control. The Compliance agent attaches specific framework IDs, so a finding is defensible by reference to a published standard rather than to internal opinion. Findings are queryable by date range, severity, status, account, resource type, and control ID.

Scan-level traceability. Each finding’s scan_id links to the exact run, its timestamp, and its triggering event.

Auditability roadmap

Stated plainly, because a governance framework that overclaims its own maturity fails the first audit it meets:

Capability Status Why it matters
Finding lifecycle records with control mappings Implemented Produces continuous-compliance evidence directly
Scan records linking findings to runs Implemented Establishes provenance for every finding
Retention policy aligned to audit periods Gap Default 90-day DynamoDB TTL purges findings before a 12-month SOC 2 Type II window closes. Evidence retention and cost control are currently in direct conflict — this needs an explicit archival tier, not a TTL
Model and prompt version pinned per finding Planned Enrichment text is model-generated; without a recorded model and prompt version, a past finding’s guidance cannot be reproduced or explained
Session tags on cross-account assume-role calls Planned Pushes agent identity and scan purpose into CloudTrail — an examiner trusts AWS’s log, not ours
Immutability / tamper-evidence on finding records Planned Nothing currently prevents a finding record from being altered after the fact
Suppression rationale as a required field Planned SUPPRESSED is a risk-acceptance decision and should not be recordable without a stated reason and an owner

The retention gap is the most consequential and the least obvious. A platform marketed on continuous compliance evidence that deletes its evidence at ninety days has a contradiction at its center. It is named here rather than discovered by an auditor.

Evaluable — is it right, and how often?

An evaluation is something that can fail. It produces a number, on data not chosen to flatter the system, that could come back bad. Read-only IAM, control mappings, dashboards, and remediation narratives are all valuable — but none of them can return a failing result, which is why none appear in this pillar.

Nura makes three distinct kinds of claim, and each requires its own measurement.

Family A — do the checkers find what exists?

Family B — does the AI layer preserve what the checkers found?

Family C — does the Orchestrator triage correctly?

How results are reported. Agent behaviour is stochastic; a single run is not a result. Every model-dependent evaluation runs n repetitions and reports mean, standard deviation, fabrication rate, and injection-compliance rate rather than a pass/fail verdict. Scenarios passed at 100% across repeated runs are flagged as saturated and retired or hardened, because a suite that only produces green has stopped producing signal.

Status. Family A is buildable from a Terraform fixture account and requires no model work. Families B and C are specified with a defined fixture format; the harness is in development. This pillar is stated as roadmap rather than accomplishment deliberately — claiming evaluation coverage that does not exist is the specific failure the pillar was added to prevent.

Summary

Pillar Question Mechanisms in Nura
Controlled What can it do? Read-only IAM in every scanned account; ExternalId conditions; JWT tenant isolation; per-customer KMS; bundle-scoped invocation; severity-bounded Orchestrator authority; no write path to customer infrastructure
Observable What is it doing? Live posture dashboard; scan records; FAILED-scan visibility on role loss; separated agent and pipeline telemetry; inspectable account registry; per-finding provenance; Slack/Teams delivery
Auditable What did it do, and can we prove it? Finding lifecycle with timestamps; continuous rather than point-in-time evidence; named control mappings; scan-level traceability. Gaps: retention vs. TTL conflict, model version pinning, CloudTrail session tags, tamper-evidence, suppression rationale
Evaluable Is it right, and how often? (in build) Detection recall; fabrication rate; control-mapping accuracy; injection resistance; false auto-closure rate; cross-model stability

Controlled and Observable are properties of Nura’s architecture today. Auditable is substantially built with named and consequential gaps. Evaluable is under construction — and its absence across the industry is why it is named as a pillar rather than assumed. A platform that cannot state how often its agents are correct has not earned autonomy; it has only been permitted it.


07Compliance Coverage

Framework Coverage Agents involved
SOC 2 Type II CC6 logical access, CC7 system operations, CC8 change management, CC9 risk mitigation Access Analyzer, Security, Compliance, Incident Response
CIS AWS Foundations Benchmark Level 1 and Level 2 controls Compliance, Security, Network Security
AWS Foundational Security Best Practices Full FSBP standard Security, Compliance
ISO 27001 A.9 access control, A.12 operations security, A.13 communications security Access Analyzer, Network Security, Infrastructure
NIST CSF Identify, Protect, Detect, Respond, Recover All nine agents map to CSF functions
GDPR (technical controls) Encryption at rest and in transit, access logging, data retention Security, Compliance, Backup & DR

The practical effect is that audit evidence becomes a query rather than a project — provided the retention gap named above is closed first. Findings export by date range, control ID, severity, account, and status, with control mappings that drop directly into an auditor’s workbook.


08Cost Engineering

Continuous governance is only continuous if it is affordable to run continuously. Six decisions carry that:

Model selection. All agents run on Amazon Nova Pro rather than a frontier model. The work is structured — take checker output, classify, apply domain knowledge, emit JSON — and does not require frontier reasoning. Nova Pro is AWS-native, avoiding cross-provider latency, and costs roughly an order of magnitude less per token. Estimated cost is a few cents per full scan per account. This decision is asserted rather than measured; E6 exists to test it.

Scan-gated invocation. Because every agent must call run_scan before answering, each agent invocation is a single tool call followed by a single processing pass. There is no multi-turn conversation accumulating context across turns.

Findings as a result cache. Scan output is written to DynamoDB. Every subsequent dashboard view and API read serves from the database and invokes no model. AI cost is incurred once per scan, not once per page view — which decouples inference cost from usage entirely.

Scheduled rather than event-driven scanning. Cadence is fixed at six or twenty-four hours. Token consumption is therefore a known, predictable rate rather than a function of infrastructure churn. Real-time event-driven scanning is a roadmap item precisely because it trades this predictability for latency.

Bundle-scoped invocation. Only the agents in a customer’s scope are invoked. A FinOps customer never pays for Security or Backup/DR inference.

Serverless throughout. No always-on compute; Lambda invocations measured in seconds, SQS buffering to prevent thundering-herd behaviour at scan time, DynamoDB on-demand with no capacity planning, and StackSets removing per-account provisioning entirely.

A seventh is available and not yet taken: Bedrock prompt caching. All nine agents share substantial instruction preamble, and caching the static prefix would cut input token cost materially on every scan.


09Engineering Challenges

Selected problems worth recording, because the debugging pattern generalizes.

Bedrock Agents request body format. Every agent report returned blank summaries and empty findings, with no errors anywhere. The Bedrock Agents runtime delivers action group parameters as requestBody.content["application/json"].properties — an array of name/value objects — while the handlers were reading event["body"], which is how direct Lambda invocation works. Both code paths executed successfully; the Lambda simply received nothing. It was found by pulling a real Bedrock Agents event payload from CloudWatch and diffing the actual event structure against what the code expected.

The generalizable lesson: silent success is the expensive failure mode. Two valid invocation contracts that differ in shape and fail without raising produced a platform-wide outage that no error handler could catch. Contract validation at the handler boundary — assert the expected keys exist and fail loudly if not — would have surfaced it in minutes rather than days.

Multi-account discovery at scale. Per-account configuration files do not survive an organization that adds accounts weekly. Replacing them with an hourly organizations:ListAccounts sync into a registry table removed onboarding effort entirely and, more importantly, removed the coverage gap that manual registration creates.

StackSets OU targeting. Deploying to the wrong OU ID silently deploys to nothing. SERVICE_MANAGED StackSets targeting the org root require the root OU identifier, not the management account ID — a distinction with no error message attached.

Empty strings in DynamoDB GSIs. DynamoDB rejects empty string values on indexed attributes. Any optional field that participates in a GSI must be omitted rather than set empty, which requires the write path to distinguish “absent” from “blank.”

Several remaining issues followed a single pattern — IAM permissions absent from a role that appeared complete, Lambda packaging structure producing import failures, Cognito auth flows disabled by default. All were fast to fix and slow to find, which is an argument for asserting preconditions at startup rather than discovering them at runtime.


10Roadmap

Executable remediation with approval tiers. The Orchestrator already writes remediation guidance; the next step is executing it. The design is tiered deliberately: safe, reversible actions (enable S3 block public access, enable CloudTrail, add missing encryption) execute automatically; irreversible actions (revoke an access key, terminate an instance, delete a resource) require explicit human approval through a Slack confirmation before executing. This is the first capability that would require a write path into customer accounts, and it should not ship before the Evaluable pillar produces a false-auto-closure number.

Knowledge base for live threat intelligence. A Bedrock Knowledge Base over OpenSearch Serverless, ingesting AWS Security Bulletins, CVE feeds, and benchmark documents, would let agents retrieve current intelligence rather than relying on embedded knowledge — enabling findings such as “this CVE was published last week and affects the RDS engine version running in this account.”

Real-time event-driven scanning. EventBridge rules on CloudTrail events would allow targeted scans on configuration change rather than waiting for the next cycle, trading predictable token cost for detection latency.

Additional frameworks and multi-region. PCI DSS, HIPAA, and FedRAMP as additional checker sets; parallel multi-region scanning for estates spanning regions.

Risk scoring and trending. A composite score across domains, tracked over time, converts Nura from a current-state tool into a posture trajectory platform — and creates the aggregate metric that boards actually ask for.

Custom agent SDK. A defined interface for customer-authored checkers and agents, so organization-specific baselines become first-class rather than feature requests.

Ecosystem integration. Findings into AWS Security Hub via ASFF; Jira and ServiceNow with bidirectional status sync; Splunk, Datadog, and New Relic for SIEM correlation; PagerDuty for escalation routing; and a Terraform plan-time pre-check that blocks merges introducing HIGH or CRITICAL findings — shifting governance left into the pipeline rather than detecting it after deployment.


11Lessons Learned

Use the model for judgment, never for routing or lookup. Auditing the platform against its own framework revealed two decisions running through a model that had determinate answers — compliance control mapping and triage routing. Both worked, which is why neither was noticed. But a model asked to evaluate an if-statement is slower, costlier, and nondeterministic where a rule would be instant and reproducible. What remains after that pruning is inference over genuinely ambiguous input — contextual severity, root-cause hypotheses, remediation synthesis — which is the only category a model is actually better at.

Ground the model, then measure the grounding. Requiring a tool call before any answer is the right architecture, and it is not self-verifying. The gap between “the model has no other data source” and “the model reported only what the data source returned” is exactly one measurement wide, and that measurement is the fabrication rate. Building the constraint was the easy half.

Specialization beat generalization decisively. Nine narrow agents with domain-specific enrichment outperform one broad agent, because the enrichment that matters is different in every domain. The cost is nine prompts to maintain; the benefit is output that a cost analyst, a compliance officer, and a security engineer each find directly usable.

Autonomy should be bounded by consequence, not by confidence. The Orchestrator’s authority is capped by severity rather than by how certain it is. Confidence is a model output and can be wrong in the same way the finding can be wrong. Severity is checker-derived, which makes it a sounder basis for a boundary.

Cost architecture is governance architecture. Every decision that made scanning cheap — result caching, scheduled cadence, bundle scoping, model selection — was also a decision about how often governance actually runs. A platform that is expensive to run continuously becomes a platform that runs quarterly, and quarterly governance is the problem it was built to solve.

Name the gaps before an auditor does. Writing this document surfaced the retention conflict: a platform selling continuous compliance evidence that expires its evidence at ninety days. That contradiction had been in the design for months and was invisible until the auditability pillar forced the question. The framework earns its place by generating questions the architecture does not answer.


12Appendix — Quick Reference

Agent roster

Security · Compliance · Cost (FinOps) · Cost Anomaly · Infrastructure · Incident Response · Network Security · Access Analyzer · Backup & DR · Orchestrator

Orchestrator action groups

query_findings · remediate_finding · create_escalation · invoke_scanner · query_escalation

Triage policy

LOW / MEDIUM → remediation guidance written, finding closed HIGH / CRITICAL → escalation record created, security team alerted, human resolution required

Finding record

Resource ARN · region · severity · description · remediation guidance · compliance control mapping · scan timestamp · scan_id · status (OPEN / REMEDIATED / SUPPRESSED) · resolved timestamp

Technology stack

Published at nuratrix.com