Security & Well-Architected

The trust model, per-agent IAM, and the 5-pillar Well-Architected review (2026-08-04) with its 38-item remediation status.

Trust model & invariantsThe security posture is structural, not prompt-based. These invariants are enforced by code and guarded by tests.

InvariantEnforcement
Verdicts from Lambda gates onlyGates parse exit codes and logs; no model SDK is importable (gates/requirements-gates.txt = jsonschema + referencing)
Verdict isolationNo LLM output feeds any Choice routing variable
Gate determinismSame input → same output. No randomness, no model calls
Per-agent IAM13 scoped roles; none can invoke another agent (InvokeAgentRuntime on no role)
Bounded fix loopsState-machine counter; escalates at max
Fix validationSchema and compile check before re-entry to an expensive stage
Exactly-one signalEach agent calls exactly one SendTaskSuccess/SendTaskFailure
Workspace jailAll I/O confined to runs/<id>/; .. rejected
Mock honestyMock results carry backend:"mock" and never influence a verdict
No design-IP egressAll compute, storage, inference stay in the customer AWS account
Guardrails. A Bedrock Guardrail is deployed advisory on POC (id qj11zn3wdqet). Enforcement mode fails closed; advisory mode fails open and records the intervention rate. Agent-side guardrail code is wired at three model choke points but the infra toggle is still being rolled through — see the status page.

Per-agent least privilege13 dedicated roles, each holding exactly what its stage needs. If any agent is compromised, its blast radius is its own scope.

Scoped by design

  • design/testbench/signoffbedrock:InvokeModel, S3 R/W on runs/*
  • verification — model (formal harness) + S3; lint & formal on one runtime
  • simulate/pnr — S3 + ssm:SendCommand (tag-conditioned) for PCS
  • registry — DynamoDB PutItem/GetItem only
  • notifierses:SendEmail, sns:Publish
  • cleanup — destructive actions gated by ALLOW_CLEANUP + resource tags

Verified sound in the review

  • No shell=True, os.system, or eval anywhere — the fixed-argv rule holds
  • Cognito M2M secret never reaches a CFN parameter, SSM, or env var — Secrets Manager only
  • No 0.0.0.0/0 ingress in any template
  • Gate & invoker Lambda roles genuinely minimal
  • Adapter path sanitisers (option_safe_path, workspace jail) are well-built allowlists

Well-Architected reviewConducted 2026-08-04 at commit bac666b, covering all five pillars. Method: read from templates and source — no live account state was inspected, so dollar figures are order-of-magnitude.

Security
reviewed
Cost
reviewed
Performance
reviewed
Reliability
reviewed
Op. Excellence
reviewed

Sustainability was not assessed. Each finding was graded real now, latent (correct today, breaks on a plausible change), or a disclosed POC tradeoff (the code already names the compromise). Items confirmed sound were recorded too.

Headline findings by pillar

PillarMost significant finding at review timeGradeNow
SecurityS2 — agents could overwrite Lambda deployment packages (bucket-wide PutObject); deferred code injection on next deployRealScoped to runs/*
SecurityS1 — a role granted InvokeAgentRuntime, contradicting a stated invariantRealRole deleted
SecurityS5 — gate evidence not bound to the run under audit (verdict integrity)RealGuard + run_id bound
CostC1 — documented idle cost off by ~17× (POC ~$25/mo, not ~$5)RealCorrected
CostC6 — nothing expired: no log retention, no lifecycle on run dataReal13 groups + 6 rules
CostC9 — fix budget was per-stage, so "5" meant up to 20RealRun-wide total
PerformanceP1 — HeartbeatSeconds == TimeoutSeconds on all 13 states; liveness bought zero early detectionReal120–180s, verified live
PerformanceP2 — strictly sequential DAG; ~35–110s of free latency in two independent pairsRealDeferred
ReliabilityR1 — failure path recorded nothing, told nobodyRealRegisterFailure→NotifyFailure
Op. ExcellenceO3 — EnableAlarms had four defaults; effective default OFFRealAll true, 22 alarms
The review credited what was sound. A review that lists only defects gives a false picture: fixed-argv discipline held everywhere, the Cognito secret was handled correctly, ECR lifecycle policies were separated so the app rule can't expire a referenced base, and the token price table's unknown-model fallback is deliberately nonzero so a silent $0 can't understate spend.

AgentCore Agentic AI Lens reviewA second, distinct review — a gap analysis of the agentic layer against the AWS Well-Architected Agentic AI Lens, AgentCore best practices, and multi-agent collaboration guidance. Advisory, not a scored pass/fail.

Reviewer stance: "this is a mature system — the orchestration and trust model are excellent and already Lens-aligned." Seven findings, each mapped to a Lens best-practice ID and prioritised. Both open P0s have since been addressed in code (see the status page); the rest track to named specs.

#FindingPriorityNow
F2Live path invoked AgentCore Runtime without a runtimeSessionId (AGENTSEC05-BP02) — one run's 13 stages landed in 13 unrelated sessionsP0Code-complete
F1No Bedrock Guardrails on any model invocation (AGENTSEC04/08-BP01)P0Advisory on POC
F4OTEL is a dependency but emits nothing (AGENTOPS05-BP01)P1Specced, on integration
F3Memory used records API, not an event-based strategy; poisoning unmitigatedP1Code-complete, unwired
F5Agent-level eval specced but not executed (agents-eval-harness)P2Not built
F7Human-in-the-loop config-gated OFF, not standardizedP2Spec only
F6AgentCore Gateway/MCP is intent, not implementationBacklogNot wired
The review's one hard constraint: "Do not move any verdict or routing decision into a model." Three specs were proposed from it — agents-runtime-session-identity, agents-bedrock-guardrails, agents-memory-strategy-upgrade — all now code-complete (see the spec inventory).

29 open questions posed to AWS

A separate Lighthouse-POC validation ask (docs/AWS-FOLLOWUP-QUESTIONS.md) puts 29 questions to AWS across four areas — AgentCore platform maturity/roadmap, architecture & spec validation, a production-readiness bar, and program/GTM. These are open, unanswered questions to AWS, tracked for a working session with the AgentCore service team; none carry recorded answers yet.

How to read all of this honestly. The 5-pillar review was a static reading of the repo, not a live-account audit. The Agentic AI Lens review is a gap analysis with (now-addressed) open P0 items, not a clean bill. The 29 AWS questions are unresolved. None of it should be represented as a passed AWS Well-Architected Review — it is the review discipline applied to the system, with the gaps named.

Remediation status — 38 of 38 in codeEvery finding above the disclosed-tradeoff line has a fix in the repo (merged at 76d1b72). The honest qualifier: 0 were deployed at merge; the primary account was later redeployed 2026-08-27, bringing the remediation live on POC.

38 / 38
remediation items fixed in the repo
POC: live
redeployed 2026-08-27; heartbeat separation verified at 18/18 states

What the remediation itself surfaced

Deliberately not done (recorded, not hidden)

The load-bearing distinction. "Fixed in code" is not "live in the account." Every ✅ in the remediation table means "in the repo" until a stack deploy (templates) or image rebuild (agent code) lands it. This is why the status page separates code-complete from deployed for every spec.

Deployment & cost modelThree presets, one config file per environment. An exported shell variable overrides the file.

PresetWhat it addsIdle floorWhat dominates idle
pocin-image EDA, S3 workspace~$25/moQuickSight Enterprise author (~$24). ENABLE_QUICKSIGHT=false → single digits
dev+ PCS/Slurm + FSx Lustre + X-Ray~$420–640/moFSx Lustre 1.2 TiB min (~$174), always-on t4g.medium login node (~$25), PCS cluster-hour fee
prod+ SES completion emails~$420–640/moSame as dev

Two cost caveats, stated plainly

  • The POC figure was once published as ~$5/mo — wrong by ~17×. Corrected inline in config.poc.env.
  • The QuickSight account subscription survives stack deletioncfn delete does not stop that charge.
  • The PCS cluster-hour rate was not verifiable from the repo and may dominate the dev/prod floor — confirm against current pricing.

Per-run cost, read back from the run's own rows

  • calc4 clean: ~$0.67–2 (Sonnet-on-all vs Haiku-on-non-RTL)
  • AES-128: ~$1.4–5.3 (mean $2.88, driven by repair count)
  • When there is nothing to report it returns records=0, never a fabricated $0.00
  • AgentCore runtimes (13, idle): $0
Note on this page's own exposure. These pages surface operational metrics — run IDs, per-run cost, token counts, model IDs, pass/fail, and the config matrix. That is intentional for a demo audience, but worth knowing before the site is made public.