Generated banner for Agent Advisor
Generated logo for Agent Advisor

Agent Advisor

AWSOfficialPublished by AWS

  • Skill
  • Workflow
  • Cloud and DevOps
  • Apache-2.0
  • Low risk
  • Has scripts

From the author

Entry point for AI-agent work on AWS: pick a runtime, plan a migration for existing workloads, and build an executable POC — one phased flow. Triggers on: which runtime for my agent, AgentCore vs ECS vs EKS vs Lambda, AgentCore vs Lambda MicroVMs, deploy an AI agent on AWS, agent architecture on AWS, I have an agent idea what do I build, move/migrate my agents to AWS, agent migration plan, add AgentCore services (memory, gateway, identity, policy, observability) to an agent already on AWS, Temporal on AWS (migrate/run Temporal workers on AWS, a service orchestrated by Temporal, Temporal Cloud vs self-hosted). Temporal Workflow code is never rewritten into Step Functions. Requires at least one agentic component — a purely non-agent system (plain services, batch jobs, HTTP endpoints, non-agent Temporal Activities) is out of scope, redirected to gcp-to-aws / heroku-to-aws / llm-to-bedrock. Not for: compute/data migration with no AI agent; pure LLM SDK rewrite (use llm-to-bedrock); per-model pricing.
— the description by AWS

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

Agent Advisor provides a structured, multi-phase workflow to help users determine the optimal AWS runtime for their AI agents. It uses a deterministic scoring engine to evaluate requirements and guides users through a process that includes discovery, architectural design, cost estimation, and the creation of an executable proof-of-concept. The skill supports various AWS compute options, including AgentCore, ECS, EKS, and Lambda, and integrates with migration engines for existing workloads.

What it does

  • Recommends AWS runtimes for AI agents based on technical requirements.
  • Generates migration plans for existing AI workloads moving to AWS.
  • Provides architectural guidance for agentic systems.
  • Assembles executable proof-of-concept scaffolding.
  • Estimates coarse cost magnitudes for proposed agent deployments.
  • Integrates with external migration engines for workload transitions.

When to use it

  • When you need to decide which AWS runtime is best for a new AI agent.
  • When migrating an existing AI agent workload to AWS.
  • When you need to add services like memory, identity, or observability to an existing AWS agent.
  • When you require a structured plan and POC for deploying agents on AWS.

Advantages

  • Provides a deterministic, repeatable recommendation process.
  • Supports a wide range of AWS compute environments.
  • Offers a unified flow from initial idea to executable POC.
  • Adapts to both technical and business-focused user backgrounds.

Usage examples

“I have an agent idea, what do I build?”
The agent initiates the intake process to clarify your requirements and recommend an appropriate AWS architecture.
“Move my agents to AWS.”
The agent triggers the migration workflow to assess your existing workload and plan the transition to an AWS runtime.
“Which runtime for my agent, AgentCore vs ECS vs EKS vs Lambda?”
The agent runs a scoring analysis to compare these runtimes against your specific agentic needs.
“Add AgentCore services to an agent already on AWS.”
The agent enters the add-capabilities branch to guide you through integrating memory, gateway, and observability services.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/aws/agent-advisor/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip agent-advisor.zip -d .agents/skills

Documentation by AWS

AWS Agent Advisor

Helps startups decide how and where to run AI agents on AWS. Deterministic scoring recommends a runtime; the conversation adapts to the user's technical background.

Definitions

  • "Load" = Read the file with the Read tool and follow it. Do not summarize or skip.

  • $RUN_DIR = the run directory under .agent-advisor/ (e.g. .agent-advisor/0630-1430/), created in Intake.

  • $PLUGIN = ${CLAUDE_PLUGIN_ROOT} (the installed plugin root). On Claude Code this token substitutes inline. If ${CLAUDE_PLUGIN_ROOT} does not resolve (some Cursor/Codex builds, or a literal ${CLAUDE_PLUGIN_ROOT} string showing up in a path error), fall back to the skill's own directory: this SKILL.md lives at <plugin>/skills/agent-advisor/SKILL.md, so the engine and its data are all inside this skill — scripts at ./scripts/..., runtime profiles at ./references/runtimes/..., and decision refs at ./references/decision-refs/... relative to it. Prefer ${CLAUDE_PLUGIN_ROOT}/skills/agent-advisor/...; use the relative fallback only when it fails to resolve.

Prerequisites

Phase Structure (frontmatter)

Phase, fragment, and assembler files carry a YAML frontmatter block that declares how each phase is composed — its inputs, triggers, fragments, assembler, artifacts, gates, and ordering. The execution contract is the vendored references/vendored/dsl/INTERPRETER.md: it defines every frontmatter key, the fragment/assembler model, the gate protocol (HANDOFF_OK / GATE_FAIL), and the interpreter loop. Load it first (once, at the start of a run), then execute each phase file's prose body. Elsewhere in this skill, INTERPRETER.md (without a path) refers to this loaded contract.

Execution

This skill is driven by the interpreter loop in INTERPRETER.md (§ The interpreter loop): it reads .phase-status.json, determines the current phase, runs each phase's _preconditions / fragments / _assemble / _postconditions, advances on HANDOFF_OK via _advances_to, and validates state. The backbone (intake → discover → clarify → confirm → design → estimate → generate → migration-plan → poc → complete) and the one sidebar branch (add-capabilities) are derived from the phase files' frontmatter — they are not restated here.

Cold start (entry phase). With no run under .agent-advisor/ carrying a .phase-status.json, begin at references/phases/intake/intake.md — this skill's entry phase (the one carrying _init: true). On a warm start, current_phase in .phase-status.json is authoritative (INTERPRETER.md § The interpreter loop).

Skill bindings (INTERPRETER.md § Skill bindings). This skill declares:

  • Run root: .agent-advisor/ — $RUN_DIR is this skill's name for the run directory (.agent-advisor/[MMDD-HHMM]/). Intake's own prose performs the _init bootstrap.

  • State shape: § State file below (advisor-specific keys such as entry_point, audience, recommendation_reviewed, migration_plan_ctx, migration_plan_unavailable); the shared state schema is not vendored.

  • Run seed (optional): $RUN_DIR/seed.json, else .agent-advisor/seed.json at the run root (schema scripts/schemas/seed.json) supplies machine-readable answers for a non-interactive run — the Clarify dimensions, the two gate answers, the POC mode, the live-probe answer, and a co_recommend tie-break. It is the HIGHEST-precedence source for every value it carries (clarify.md Step 2.5), which is what makes a repeated run's score comparable: the deterministic engine gets byte-identical input. A gate the seed omits is declined; a dimension the seed omits falls through to detection, then prose, then an assumed value that MUST be recorded in $RUN_DIR/UNANSWERED.md. With no seed, the interactive flow is unchanged.

  • Resolved statuses: skipped (routing resolved the phase without running it), plus not_applicable for migration_plan only.

  • Conditional backbone routing: the entry-point routing below. When a routing rule marks a phase not-applicable, set it skipped and advance through its _advances_to in the same state write.

Routing & gates (orchestration)

Sidebar placement and conditional backbone routing are orchestration prose owned by this file (INTERPRETER.md § Skill bindings, § Backbone vs sidebar).

Entry-point routing:

  • build_scratch → skip Discover; Clarify → Confirm → Design → Estimate → Generate → Gate 2 → POC (any winning runtime). No migration plan (nothing existing to migrate).

  • build_deploy → Discover (if code) → Clarify → Confirm → Design → Estimate → Generate → Gate 1 → Migration Plan (if existing non-AWS AI workload detected and user confirms) → Gate 2 → POC (any winning runtime).

  • migrate → Discover (if code) → Clarify → Confirm → Design → Estimate (target-state run cost; migration TCO comparison stays with the Migration Plan engine) → Generate → Gate 1 → Migration Plan (in-skill, reusing the sibling gcp-to-aws skill) → Gate 2 → POC (any winning runtime, when the plan was produced). Declining Gate 1 keeps the classic handoff: pointer to /aws-startup-advisor:llm-to-bedrock with handoff-summary.md.

  • add_capabilities → load references/phases/add-capabilities/add-capabilities.md and follow it (no runtime scoring; writes capabilities-recommendation.md). This is a self-contained branch — it does NOT pass through Clarify / Confirm / Design / Estimate / Generate, so the phase gate below never applies to it.

  • Temporal detection routes into migrate with temporal units pre-seeded (see discover).

Gate semantics (backbone tail):

  • Gate 1 → migration_plan runs only when generate is done AND recommendation_reviewed == true (generate.md Step 5.5) AND entry point ∈ {migrate, build_deploy} AND the run is migration-eligible (generate.md Step 6) AND the user confirmed Gate 1. Otherwise resolve it: not_applicable (build_scratch / no migratable workload) or skipped (declined) — and advance.

  • Gate 2 → poc runs only when phases.poc == "in_progress" (set when the user answers Gate 2 "yes" — asked in generate.md Step 7 or migration-plan.md Step 6) AND recommendation_reviewed == true. Any winning runtime (agentcore / ecs / eks / lambda / lambda_microvms) — the POC shape follows the verdict (poc.md Step 3 dispatch on references/decision-refs/poc-shapes.md). Gate 2 is only offered when migration_plan ∈ {completed, skipped, not_applicable} — or in_progress on build_deploy only (Stage 2 failed/aborted; fallback POC from design.json per migration-plan.md failure handling); for entry point migrate, only when migration_plan == "completed" (the POC implements the plan) OR when the stage resolved not_applicable with migration_plan_unavailable == "engine_absent" — a standalone deployment that does not bundle the migration engine, where Gate 2 is offered by migration-plan.md Step -1 and the POC is design-backed. A migrate-POC with no plan for any OTHER reason (the user declined) has nothing to implement.

  • Persisting Gate 2 as phases.poc = "in_progress" BEFORE poc.md loads makes the confirmation resumable: if the session breaks between the "yes" and the load, the interpreter re-enters poc without re-asking. (A declared deviation from INTERPRETER.md § The interpreter loop step 5's gate-then-in_progress ordering — the user's confirmation is the entry event worth persisting.)

Phase gate: Do NOT load design.md / estimate.md / generate.md unless $RUN_DIR/.phase-status.json exists and BOTH phases.clarify == "completed" AND phases.confirm == "completed". Confirm confirms the deployment model, the service set, and (for a co_recommend tie) the user's chosen_runtime — Design and the diagram depend on its confirm.json output, so it must not be skipped. If the user asks to skip Clarify or Pass 2, refuse briefly and run it.

State file (.phase-status.json)

{
  "run_id": "0630-1430",
  "entry_point": "build_scratch",
  "audience": "technical",
  "current_phase": "clarify",
  "phases": {
    "intake": "completed",
    "discover": "skipped",
    "clarify": "in_progress",
    "confirm": "pending",
    "design": "pending",
    "estimate": "pending",
    "generate": "pending",
    "migration_plan": "pending",
    "poc": "pending"
  }
}

Status values: pending → in_progress → completed, plus skipped. Use read-merge-write: read before each update, change only the advancing keys, keep prior phases.

recommendation_reviewed (top level, boolean) is set to true by generate.md Step 5.5 when the user explicitly confirms they have seen the recommendation. Gate 1, Gate 2, and the migration_plan / poc states all require it — no gate may be asked while it is absent.

migration_plan additionally uses not_applicable (build_scratch, or no migratable workload detected). When Stage 2 runs, migration_plan_ctx is added at the top level: {"repo": "<abs path to target repo>", "migration_dir": "<abs path to .migration/<id>/>"} — Stage 3 reads gcp-to-aws artifacts ONLY via this recorded path, never by re-globbing.

Files

FilePurpose
references/vendored/dsl/INTERPRETER.mdVendored DSL execution contract (interpreter loop + gate protocol)
references/phases/intake/intake.mdEntry point + technical background + open context
references/phases/discover/discover.mdLightweight code detection
references/phases/clarify/clarify.mdClarify orchestrator + answer mapping to scoring keys
references/phases/clarify/clarify-technical.mdTechnical-background question wording
references/phases/clarify/clarify-business.mdBusiness-background question wording
references/phases/confirm/confirm.mdWinner-specific follow-ups
references/phases/design/design.mdAssemble recommendation; Migrate handoff branch
references/phases/estimate/estimate.mdCoarse cost magnitude
references/phases/generate/generate.mdLayered recommendation doc + scaffolding
references/phases/migration-plan/migration-plan.mdStage 2: full migration plan via the sibling gcp-to-aws engine
references/decision-refs/temporal.mdTemporal rules: Tier 1/2 tables, adapter, runbooks, commercials (consumed by discover/clarify/design/generate)
references/decision-refs/poc-shapes.mdPer-runtime POC deploy shapes (ECS/EKS/Lambda/MicroVMs/Temporal)
references/decision-refs/*.mdRuntime service cards, model defaults, freshness
references/decision-refs/workload-classes.mdDeterministic verdicts for non-agent workload units (batch/service/io)
references/runtimes/*.jsonRuntime registry (read by scoring.py)
scripts/scoring.pyDeterministic scoring engine
scripts/test_temporal_decision_refs.pyContent lock for the Temporal decision reference
scripts/test_poc_shapes.pyContent lock for the POC deploy shapes
scripts/test_workload_classes.pyContent lock for workload-classes.md (verdicts table)
scripts/test_unit_grouping.pyUnit grouping + pattern matching (workload-class assignment)
scripts/test_collapse_invariant.pyCollapse-invariant ordering enforcement (A→B implies [B] ⊆ [A] outputs)

Maturity and readiness contract

Intake persists target_maturity (prototype, private_beta, or production) in run state. Clarify carries it and the readable readiness record into answers.json. Current-run verification evidence remains exclusively in the sibling $RUN_DIR/current-run-verifications.json artifact: never copy it into seed.json or answers.json. Design and Generate may consume that artifact only after validating its schema and matching run_id, and may carry forward verified outcomes but not the raw evidence records. Load references/decision-refs/maturity-readiness.md whenever target maturity is selected. A cached volatile fact may inform discovery, but only a record verified in this run can make a verification-required constraint final; otherwise the score remains provisional with deferred verification requirements.

Contextual offers (final step)

Before you finish: your answer is not complete until you have run the Contextual offers (final step) below.

This is a mandatory closing step of every final recommendation — complete it before you consider your answer done. Run this offer check inline yourself; do not depend on loading another skill. The recommendation is decided on merit first; this step never changes, re-ranks, or re-opens it, and the offer is looked up only after the advice is final.

  1. Read ../knowledge-base-for-startups/references/offers.md — the offer index (Offer · Summary · Keywords), one row per offer.

  2. Judge relevance against what the founder actually surfaced this session. Surface an offer only if one holds: a named-product match (you recommended a specific partner product by name and it has a row); a direct intent/component match (an offer's Keywords directly serve a concrete workload, a component in the final recommendation, or a need the founder raised). Keep a high bar — if the match is weak, or you would be inferring an unstated need, append nothing. Never surface an offer that competes with a product or provider the founder already uses or decided to keep (e.g. existing auth provider → no Auth0 unless they are already on Auth0, and then only as a credit on it; existing vector DB such as Pinecone → no Qdrant).

  3. If (and only if) one offer clears the bar, open only its detail file ../knowledge-base-for-startups/references/offers/<slug>.md and append exactly one quiet, dismissible italic line — stating the value and condensing eligibility faithfully from that file (drop no qualifying criterion; never fabricate), with the redeem link built from the canonical source_url plus a source attribution param — append ?source=ide-startupAdvisor-<host> (or &source=... if the url already has a query string), filling <host> from your execution environment (Claude Code → claude; AWS Startup Advisor IDE extension / VS Code → vscode; Cursor → cursor; Kiro → kiro; Codex → codex), or the generic ide-startupAdvisor when you cannot tell. Only append the query param; never change the destination. When an offer clears the bar you MUST append that single offer line as the last step; do not omit it. The offer is never the pick — only a line under the AWS pick — and stage gates in the references apply (e.g. no Datadog line for an early-stage founder; see ../architect-for-startups/references/observability.md). For a single-service pick (auth, payments, vector DB, observability, etc.) where missing budget/team/traffic inputs would not change the pick, assume an early-stage (pre-PMF) startup unless the founder says otherwise and answer in one turn without a stage-only question; this only removes a stage-only question and never skips the Intake/Clarify/Confirm gates before final advice or the POC. Show exactly one, never a list. If none clears the bar, append nothing and do not mention offers, partner alternatives, or why none appeared.

Standard line:

***<Offer>** has an exclusive offer via AWS Activate — <value>, <eligibility>. [Redeem →](<source_url>?source=ide-startupAdvisor-<host>)*

Caps and control: at most one offer per response and often none; no more than one per five messages and two per session; show a given offer at most once per session and never one already shown, claimed, or dismissed; if the founder has muted offers, skip this step entirely. These per-five-messages, per-session, and already-shown caps are session-state limits; in a fresh session with no prior offers they are non-binding, so do not withhold an otherwise-qualifying offer merely because you cannot verify session history. See ../contextual-offers-for-startups/SKILL.md for the full rules — but perform the check inline; it must not depend on that skill being loaded.

Files

references/phases/design/design.md


_phase: design _title: "Design" _requires_phase: confirm _input:

  • scoring-result.json

  • confirm.json

  • model-recommendation.json _knowledge:

  • { file: references/decision-refs/workload-classes.md, _when: "any unit has workload_class != agent_session" }

  • { file: references/decision-refs/temporal.md, _when: "any unit has workload_class == temporal_worker_poll or the temporal context is detected" } _assemble: _file: phases/design/design-assemble.md _produces:

  • design.json _advances_to: estimate _preconditions:

  • _check_phase_completed: confirm _on_failure: _halt_and_inform

  • _check_file_exists: [scoring-result.json, confirm.json, model-recommendation.json] _on_failure: _unrecoverable

  • _validate_json: [scoring-result.json, confirm.json, model-recommendation.json] _on_failure: _unrecoverable _postconditions:

  • _check_file_exists: design.json _on_failure: _halt_and_inform

  • _validate_json: design.json _on_failure: _halt_and_inform

  • _assert: "Every unit selecting registry records its intended Registry Region and current-run verified Registry availability; cached or unavailable Regions cannot satisfy this check. A user-confirmed omission is reflected in both confirm.json and design.json service lists, including the primary-unit mirrors." _on_failure: _halt_and_inform

  • _assert: "design.json has one units[] entry per inventory unit, a platform block consistent with confirm.platform_decision, and top-level legacy fields mirroring the primary unit; design.json has top-level verdict, chosen_runtime, deployment_model, agentcore_compute_type, agentcore_services, model_recommendation, and carries scores + eliminated (and blocking_constraints when present) copied verbatim from scoring-result.json; every agentcore-verdict unit carries agentcore_compute_type (microvms or instances) verbatim from its scoring result and every non-agentcore unit carries null — the compute type is never re-derived in Design; every model-bearing unit's model_recommendation is derived from the matching model-recommendation.json workload entry and accepted confirm.model_decision, including model_identity, model, api_path, invocation_model_id, source, source_analysis, feature_assessment, compatibility, architecture_impacts, additional_targets (separate-modality target contracts, carried verbatim when present), blocks, tuning, migration_deltas, evaluation, rollout, provisional verification, and live_verification when model-verification.json exists; no model was independently selected from scoring-result.json; handoff_required is true iff ANY unit's effective_runtime needs a compute handoff — one of ecs, eks, fargate, or batch (not just the primary/winning runtime; AgentCore/Lambda/Lambda MicroVMs are self-contained); when temporal units exist, design.json has a temporal block recording the Way, per-queue Tier 1 rule ids, and Serverless Workers labeled Public Preview regardless of any docs label; Workflow orchestration code is never rewritten; every unit carries a key_change line derived from its runtime's service card; every non-agent unit's verdict equals the runtime its workload-classes rule maps to (W1→eks/ecs; W2→batch; W3/W4→lambda; W5/W6→fargate) — verdict and workload_class are never contradictory; every unit carries an effective_runtime equal to platform.runtime when platform.mode is consolidated, else its own resolved runtime (a co_recommend unit resolves to its confirm chosen_runtime) — effective_runtime is always a concrete runtime enum, never the literal co_recommend" _on_failure: _halt_and_inform


Phase: Design

Assembles the recommendation from the scoring result + Confirm choices + service cards.

Step 1 — Read inputs

Read $RUN_DIR/scoring-result.json, $RUN_DIR/model-recommendation.json, and $RUN_DIR/confirm.json. The winning runtime is confirm.chosen_runtime if present (co_recommend pick), else scoring-result.verdict. Prefer confirm.deployment_model and confirm.agentcore_services over the scoring-result defaults (Confirm is the user-confirmed set). (Clarify's scope gate guarantees at least one agent_session unit, so a scored top-level verdict always exists — there is no zero-agent branch.)

If $RUN_DIR/model-verification.json exists, read it and attach each workload's matching record as live_verification. Do not infer passed from confirm.model_decision.accepted; acceptance and target-account invocability are separate.

Step 2 — Load the winning runtime's service card

Load ALL THREE files (each is required; do not skip any — Step 4's lock-in check depends on managed-alternatives.md even when no lock-in ends up applying):

  1. ${CLAUDE_PLUGIN_ROOT}/skills/agent-advisor/references/decision-refs/<verdict>.md (use lambda-microvms.md for lambda_microvms; use ecs.md for fargate — ECS-on-Fargate shares the ecs card; batch has its own batch.md; for co_recommend, load both cards). serverless_workers has NO card — skip this load for it and derive from temporal.md plus poc-shapes.md per the key_change note below.

  2. ${CLAUDE_PLUGIN_ROOT}/skills/agent-advisor/references/decision-refs/model-selection.md

  3. ${CLAUDE_PLUGIN_ROOT}/skills/agent-advisor/references/decision-refs/managed-alternatives.md

Step 3 — Refresh volatile facts

Load ${CLAUDE_PLUGIN_ROOT}/skills/agent-advisor/references/decision-refs/freshness.md and follow its procedure: read the winning profile's volatile_facts, try the AWS MCP Server for each, fall back to cached values on failure. Record which succeeded vs fell back (for the freshness footer). When any unit selects registry, also load the AgentCore service card and the registry_regions fact from references/runtimes/agentcore.json, even for non-AgentCore runtime winners. Apply freshness.md's Registry availability procedure in Step 4d.

Step 4 — Provider lock-in check

Determine the managed alternative from the source/current model provider: Claude-committed → claude_managed; OpenAI-committed → bedrock_managed; multi-provider or undecided → none. If a managed alternative applies, surface it as awareness only (per managed-alternatives.md) with its tradeoffs — do NOT present it as the recommendation. Otherwise note AgentCore supports all models.

Step 4b — I/O-wait TCO differentiator (surface proactively)

Most customers don't know AgentCore Runtime (and Harness) bill $0 during I/O wait (active CPU only). Surface this as a TCO advantage — WITHOUT adding a question — when it actually matters: if traffic_pattern is bursty or idle, OR session_state is hitl, AND AgentCore is viable (winning runtime is agentcore, or it is in a co_recommend set, or it was not eliminated). Set io_wait_tco_note = true in design.json and include a short note for the doc, e.g.: "Your traffic is spiky / has human-in-the-loop waits — on AgentCore you pay nothing while the agent waits on the model or a human (active-CPU billing only), which is a real TCO edge vs always-on compute. Exact numbers come from the migration/pricing plugins." No dollar figures here. If AgentCore is not viable, omit the note. The note applies to the microVMs compute type only — when agentcore_compute_type is instances, billing is EC2 in the user's account plus a management fee (an idle instance costs money unless the session is stopped), so omit the $0-I/O-wait claim and let the scoring warning carry the pricing caveat instead.

Step 4c — FedRAMP status (WIP, not a hard block)

If the user's compliance includes fedramp: AgentCore's FedRAMP authorization is in progress (WIP) — do NOT hard-eliminate AgentCore for it. Verify the current status per freshness.md (the fedramp volatile fact, via the AWS MCP Server). Then surface an honest note: "AgentCore's FedRAMP authorization is in progress — verify the current status before committing. If you need FedRAMP-authorized compute today, GovCloud on ECS/EKS is the safe fallback." Record fedramp_note = true in design.json when this fires. (HIPAA/SOC/PCI/etc. are unaffected — AgentCore is eligible for those.)

Step 4d — Region gating (availability + CRIS/GDPR)

Read region from answers. Region does NOT change the verdict — it gates the following:

  1. Availability: if the winning runtime is agentcore (or the chosen deployment model is Harness), verify it's available in the user's region via the AWS MCP Server (per freshness.md; the profile's regions volatile fact). If unavailable, surface a note with the nearest supported region and — if the gap is blocking — the container fallback. Do NOT silently recommend a runtime the user's region can't run. Record region_availability_note when it fires.

  2. Registry availability: for each unit with registry in its confirmed agentcore_services, apply freshness.md's AWS Agent Registry availability procedure independently of that unit's runtime, including ECS/EKS/Lambda. Check the intended Registry Region, not merely Runtime availability. Preserve the user's confirmed decision to omit Registry or use a supported Region in that unit's design rationale and mirror the primary unit at the top level. Record the intended Registry Region in each selected unit's rationale even when it matches the workload Region. If the user omits Registry, also update confirm.json.units[unit_id].agentcore_services (and the top-level primary mirror) so downstream POC generation cannot re-enable it from the earlier selection. An unavailable or unverified Registry must not appear as an available, ready-to-deploy service. Append its warning to existing warnings and region_availability_note; do not overwrite Runtime notes.

  3. CRIS / data residency: if region is multi/global OR the user is in the EU OR compliance includes gdpr, surface the CRIS choice: geo-CRIS keeps inference within the region (data-residency-safe) vs global-CRIS may route cross-region (a GDPR risk). Present it as a compliance decision, not a silent default. Record cris_note = true. Exact CRIS/region configuration is validated downstream in the migration flow — keep this directional.

Step 4e — Temporal resolution (when temporal units exist)

When any unit has workload_class == temporal_worker_poll:

Consume Confirm's decision — do NOT re-evaluate Tier 1. Confirm already resolved every temporal_worker_poll unit's runtime (including any user AskUserQuestion choice for Tier-1 rules 1 and 4) and persisted it in confirm.json.resolved_runtimes[<unit_id>]. Read that value as the unit's verdict verbatim and cite the fired rule id it recorded in rationale (e.g. "Tier1-R2: team operates K8s → EKS"). Re-running Tier 1 here — especially the OFFER rules — could pick a different runtime than the one the user confirmed and make platform_decision disagree with effective_runtime. Only if resolved_runtimes is somehow absent (older run) fall back to loading references/decision-refs/temporal.md and applying the rules in order.

Way resolution: the Way comes FIRST from the user's answer answers.json.system.temporal_way (cloud/self_hosted are binding); the Way table in references/decision-refs/temporal.md applies ONLY when it is undecided/absent. Commercials selection deferred to Generate.

Write the temporal block when temporal units exist:

{
  "way": "cloud | self_hosted",
  "server_current": "...",
  "per_queue_rules": { "<queue>": "<rule id>" },
  "serverless_workers_status": "Public Preview"
}

temporal.server_current is read from context-signals.json.temporal.server (discover's output; "unknown" on the declared no-code path). serverless_workers_status is set from this run's freshness check (see freshness.md) — currently "Public Preview" — and MUST NOT be auto-upgraded to GA from a docs label alone.

Freshness (temporal units only)

Load references/decision-refs/freshness.md and run its Temporal section.

Use the public Temporal documentation pages and AWS Marketplace page named there. Follow its web lookup and cached-fallback procedure without an authentication pause. Preserve each result's source and date in design.json.volatile_facts for the freshness footer.

Non-negotiable regardless of channel: Serverless Workers is Public Preview, not GA — the docs label has moved before without a GA announcement (it read "Available" in 2026-07); do not trust it at face value, re-verify this run and label the output Public Preview until GA evidence appears. Workflow Streams and External Payload Storage are Preview. The anti-fabrication rule applies: only claim web-verified for calls actually made and results observed this run.

Step 5 — Assemble design.json

Assemble per unit:

  • agent_session units: verdict/deployment_model/agentcore_compute_type/services from that unit's scoring result + that unit's confirm overrides (compute type is copied verbatim, never re-derived — scoring owns the >8h / GPU / instance-type routing); model/path from model-recommendation.json.workloads[<unit_id>] + the accepted confirm.json.units[<unit_id>].model_decision — read confirm.json.units[<unit_id>] (deployment_model, agentcore_services, chosen_runtime, tool_choices) for THIS unit, not a global top-level value. For a single-unit run, fall back to confirm.json's top-level fields. Each agent unit's confirmed runtime/services are independent — never copy the primary unit's. Write the compatibility model_recommendation object as {"model": primary_model, "model_identity": ..., "reasoning": rationale joined for display, "api_path": api_path, "invocation_model_id": ..., "source": ..., "source_analysis": ..., "feature_assessment": ..., "alternatives": ..., "compatibility": ..., "architecture_impacts": ..., "additional_targets": ... (copy verbatim when the recommendation has them; a separate-modality target with status unresolved must NOT be turned into a runnable model id), "blocks": ..., "tuning": ..., "migration_deltas": ..., "evaluation": ..., "rollout": ..., "verification": ..., "live_verification": ... | null}. This preserves current report consumers while carrying the complete advisor contract. verification is the catalog/probe requirement from the recommendation; live_verification is only populated from the separate probe artifact. Never read the scoring result's deprecated coarse model mirror for this field. Every non-agent unit's runtime comes from confirm.json.resolved_runtimes[<id>] VERBATIM — Confirm already resolved and (for Temporal rules 1/4) user-confirmed each one, so Design must NOT re-run temporal.md Tier 1 or workload-classes.md and risk a different pick than the one behind platform_decision. The rule references below only say WHICH rule produced that value (for the rationale cite) and are the fallback when resolved_runtimes is absent (older run).

  • temporal_worker_poll units: verdict = resolved_runtimes[<id>] (Confirm's Tier-1 pick; cite the rule id it recorded in rationale, e.g. "Tier1-R5: default → ECS Fargate"). Fallback only: references/decision-refs/temporal.md Tier 1. deployment_model and agentcore_services are null; model_recommendation is null.

  • other units: verdict = resolved_runtimes[<id>] (Confirm's workload-classes pick). It MUST be the exact runtime enum the fired rule maps to (W1 → eks or ecs; W2 → batch; W3 → lambda; W4 → lambda; W5 → fargate; W6 → fargate), NOT the prose label. Cite the rule id in rationale (e.g. "W2: batch → AWS Batch"). Fallback only: references/decision-refs/workload-classes.md. deployment_model and agentcore_services are null; model_recommendation only if the unit calls an LLM. The verdict and workload_class must be consistent: a batch workload_class NEVER has ecs verdict unless W1 (existing cluster reuse) fired.

key_change derivation: each unit gains a "key_change" field — one line extracted from the winning runtime's "Serving & security notes" section. Derive it by reading the runtime card's ## Serving & security notes block and summarizing the entry contract + IAM posture. Every runtime-card verdict has a card with this block: agentcore.md, ecs.md, eks.md, lambda.md, lambda-microvms.md, batch.md, and fargate → ecs.md (ECS-on-Fargate shares the ecs card). Never fabricate this line — read it from the resolved card.

Model-less consumption rule (applies when reading ANY service card for a unit whose model_recommendation is null — a non-agent SECONDARY unit in a mixed system): the cards describe the common model-bearing case, so their Bedrock-specific items (bedrock:InvokeModel in the IAM posture, Bedrock Guardrails, "calls Bedrock directly", Bedrock egress) DO NOT apply — strip them from that unit's key_change and IAM/networking summary, keeping only the service-specific permissions (e.g. S3 for a batch job, ALB/networking for a service). Never emit bedrock:InvokeModel or a Bedrock call for a model-less unit even though the card's prose lists it unconditionally. The same rule governs Generate's use of the card. (A model-bearing unit reads the card as written.)

serverless_workers has NO runtime card (it is a temporal_worker_poll Tier-1 outcome, not a scored runtime). Do NOT try to load serverless_workers.md in Step 2, and do NOT block on a missing card. For a serverless_workers unit, derive key_change from references/decision-refs/temporal.md (the Serverless Workers Tier-1 entry) + the Temporal worker POC section of poc-shapes.md — one line on the worker's connection/env contract — and label it Public Preview. (Same as the other temporal_worker_poll verdicts, whose cards are the resolved compute card — ecs/eks — while serverless_workers is Temporal-managed with no AWS compute card.)

  • networking default in one sentence (e.g., "POST /invocations, execution role with InvokeModel, public endpoints over TLS"). This gives Generate a load-bearing sentence for the migration's operational shift.

Consolidated does NOT rewrite per-unit verdict; it sets effective_runtime instead. Even when the user chose to consolidate onto a superset (e.g. ECS/EKS), each unit's verdict stays the runtime its own rule produced (agent_session → its scored runtime; non-agent → its workload-classes token — W2→batch, W3/W4→lambda, W5/W6→fargate). The consolidation lives in the platform block (mode: "consolidated", runtime: "<superset>"); it never overwrites units[].verdict. The per-unit verdict records what each unit would run on its own (the report shows the trade-off consolidation makes).

Every unit ALSO gets an effective_runtime field — the ACTUAL deploy target — computed here so every downstream phase reads ONE value instead of re-deriving it:

  • platform.mode == "consolidated" → effective_runtime = platform.runtime (the superset) for EVERY unit.

  • platform.mode == "split" → effective_runtime = the unit's resolved runtime: when the unit's verdict is co_recommend, that is NOT a runtime — use the chosen_runtime the user picked in Confirm (confirm.json.units[<id>].chosen_runtime, or the top-level chosen_runtime for a single-unit run); otherwise the unit's verdict. effective_runtime is ALWAYS a concrete runtime enum (agentcore | lambda_microvms | ecs | eks | lambda | batch | fargate | serverless_workers) — never the literal co_recommend. (serverless_workers is a legal temporal_worker_poll Tier 1 outcome — Public Preview — and Estimate/POC dispatch on it; it MUST be in this enum or a user who accepts Public Preview Serverless Workers gets normalized to a wrong runtime.) Also set units[].verdict to that resolved runtime for a co_recommend unit (record the tie + the pick in rationale), so no downstream reader ever sees verdict: "co_recommend".

Downstream phases (Estimate cost bands, Generate report + diagram, Migration Plan injection, POC dispatch) MUST read unit.effective_runtime as the deploy/cost/render target, and use unit.verdict only to show the "would-have-been" trade-off. A content-review unit with workload_class: light_io under "consolidate onto ECS" therefore has verdict: "lambda" (the _assert that verdict equals the workload-classes token still holds) AND effective_runtime: "ecs" (where it actually deploys). In a split run the two are equal.

Each unit also carries its coupling object over from context-signals.json.units[] (verbatim — { "mode": "queue|api|a2a|none" }), falling back to answers.json.units[<id>].coupling when context-signals.json is absent (a skipped-Discover run whose unit Clarify materialized — that record carries coupling/trigger/description/evidence; use them). A materialized single unit has coupling.mode: "none". The diagram uses per-unit coupling.mode to wire ONLY the units actually on the queue/gateway (an interconnect of queue means at least one queue coupling exists, not that every unit is coupled), so an independent none unit is never linked.

Then the platform block: mode = "consolidated" | "split" from confirm.json's platform_decision; runtime from the same; interconnect from the units' coupling (api/a2a present → gateway and add gateway + identity to shared_services; queue → queue (name the queue service from discovery evidence — the queue technology the code uses — defaulting to Amazon SQS when none is detected, no Gateway); all none → none; single unit → in_process). When couplings mix, precedence is gateway (any api/a2a) > queue > none — one interconnect value describes the system.

Legacy mirror (collapse + compatibility): the primary unit (identified by answers.json.primary_unit, chosen in Clarify) has its verdict, chosen_runtime, deployment_model, agentcore_services, and model_recommendation ALSO written at design.json's top level, exactly as today. The top-level chosen_runtime is the primary unit's RESOLVED runtime: confirm.json.resolved_runtimes[primary_unit] (== the co_recommend pick when the primary's verdict was co_recommend, else its plain verdict). It is always set — for a single-winner verdict it equals the verdict, so it is never missing. (The primary is always an agent unit per Clarify's scope gate.) Single-unit runs therefore produce today's design.json plus a one-element units array.

Carry the scoring facts forward so Generate has a deterministic source for "Alternatives considered" and the "Eliminated" line (Generate reads design.json, not scoring-result.json):

{
  "units": [
    {
      "id": "...",
      "workload_class": "...",
      "verdict": "...",
      "effective_runtime": "... (= verdict when split; = platform.runtime when consolidated)",
      "coupling": { "mode": "queue | api | a2a | none (carried over from context-signals.json.units[])" },
      "deployment_model": "...",
      "agentcore_compute_type": "microvms | instances | null (verbatim from this unit's scoring result; instances = capacity-provider EC2 — >8h/GPU/heavy/instance-type workloads)",
      "agentcore_services": [...],
      "model_recommendation": {...},
      "rationale": "...",
      "key_change": "..."
    }
  ],
  "platform": {
    "mode": "consolidated | split",
    "runtime": "ecs | eks | lambda | lambda_microvms | agentcore | null (the consolidation superset = the runtime satisfying every unit's hard constraints with the highest summed score, null when split; in practice usually ECS/EKS, but any qualifying runtime is legal — Lambda/Lambda MicroVMs for an all-agent system that fits them, AgentCore only when every unit is agent_session)",
    "interconnect": "in_process | gateway | queue | none",
    "shared_services": [...]
  },
  "verdict": "...", "chosen_runtime": "...", "deployment_model": "...",
  "agentcore_compute_type": "microvms | instances | null",
  "agentcore_services": [...], "model_recommendation": {...}, "warnings": [...],
  "scores": {...}, "eliminated": {...}, "blocking_constraints": [...],
  "volatile_facts": {"microvms_session_cap": {"value": "8h", "source": "mcp|cached"},
                     "instances_session_cap": {"value": "14d", "source": "mcp|cached"}},
  "managed_alternative": "claude_managed | bedrock_managed | none",
  "io_wait_tco_note": true|false,
  "fedramp_note": true|false,
  "region_availability_note": "... | null",
  "cris_note": true|false,
  "handoff_required": true|false
}

Copy scores, eliminated, and (if present) blocking_constraints verbatim from scoring-result.json. Set handoff_required = true when ANY unit's effective_runtime needs a downstream compute handoff — i.e. is one of ecs, eks, fargate, or batch — not just the primary unit's winning runtime. These runtimes hand the compute layer to the source-platform migration skill — gcp-to-aws or heroku-to-aws (their service cards say so: ecs.md, eks.md, batch.md, and fargate = ECS). AgentCore, standard Lambda, and Lambda MicroVMs are self-contained. So a system whose primary unit is AgentCore but which has a secondary Fargate/Batch/ECS/EKS unit — OR which consolidated onto ECS/EKS — still needs the handoff. Scan every units[].effective_runtime; if any is in {ecs, eks, fargate, batch}, handoff_required = true; a system with none of its units on those has handoff_required = false. (For migrate, Generate ends with the migration-plan gate — the user chooses between an in-skill migration plan and the classic downstream handoff; that's an entry-point behavior in Step 6, independent of handoff_required.)

Step 6 — Branch on entry point

  • entry_point == migrate → set phases.design = completed and continue to Estimate, then Generate. The user gets the same recommendation doc + architecture diagram as Build paths; Generate then offers the migration-plan gate (Gate 1) at the end — in-skill plan or classic handoff. Estimate runs on migrate too — it produces the target-state run cost per unit; the migration TCO comparison stays with the Migration Plan engine.

  • otherwise → set phases.design = completed and continue to Estimate.

Maturity/readiness and provisional-verification extension

Load references/decision-refs/maturity-readiness.md with the design inputs. Copy target_maturity, readiness, recommendation_status, and deferred_verification_requirements from the run artifacts into design.json, preserving the release and evaluation gates applicable to the tier. A provisional recommendation is not a launch approval: state the unresolved constraint, verification key, owner, and blocking decision explicitly.

This supersedes the unconditional statement in Step 4b: include an AgentCore I/O-wait billing advantage only if the sibling $RUN_DIR/current-run-verifications.json artifact is schema-valid, its run_id matches $RUN_DIR, and its agentcore.io_wait_billing record has status: "verified" with a source-backed observed value from this run. Never read or write verification evidence through answers.json. Without validated current-run evidence, say only that the billing behavior requires current verification and do not make a comparative billing claim.

Requirements and compatibility

Written for: Claude Code

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Names Claude Code tools, Needs Python

Security

What our scanner noticed· Low risk

  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
AWS
Publisher
AWS (Official)
Source
aws/agent-toolkit-for-aws · plugins/aws-startup-advisor/skills/agent-advisor · commit 0a218f8
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • NOTICE (added by AutoGineer from NOTICE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by AWS or AWS.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download agent-advisor.zip