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
Download the skill as a ZIP:
https://autogineer.com/agent-skills/aws/agent-advisor/downloadUnzip 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
uvavailable (for scoring). Check:uv --version. If missing, tell the user to install it from the official install guide (https://docs.astral.sh/uv/getting-started/installation/ — e.g.brew install uvorpipx install uv) and stop.
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_DIRis this skill's name for the run directory (.agent-advisor/[MMDD-HHMM]/). Intake's own prose performs the_initbootstrap.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.jsonat the run root (schemascripts/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 aco_recommendtie-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 anassumedvalue 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), plusnot_applicableformigration_planonly.Conditional backbone routing: the entry-point routing below. When a routing rule marks a phase not-applicable, set it
skippedand advance through its_advances_toin 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 siblinggcp-to-awsskill) → 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-bedrockwithhandoff-summary.md.add_capabilities→ loadreferences/phases/add-capabilities/add-capabilities.mdand follow it (no runtime scoring; writescapabilities-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
migratewith temporal units pre-seeded (see discover).
Gate semantics (backbone tail):
Gate 1 →
migration_planruns only whengenerateis done ANDrecommendation_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) orskipped(declined) — and advance.Gate 2 →
pocruns only whenphases.poc == "in_progress"(set when the user answers Gate 2 "yes" — asked in generate.md Step 7 or migration-plan.md Step 6) ANDrecommendation_reviewed == true. Any winning runtime (agentcore / ecs / eks / lambda / lambda_microvms) — the POC shape follows the verdict (poc.md Step 3 dispatch onreferences/decision-refs/poc-shapes.md). Gate 2 is only offered whenmigration_plan∈ {completed, skipped, not_applicable} — orin_progresson build_deploy only (Stage 2 failed/aborted; fallback POC from design.json per migration-plan.md failure handling); for entry pointmigrate, only whenmigration_plan == "completed"(the POC implements the plan) OR when the stage resolvednot_applicablewithmigration_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-enterspocwithout re-asking. (A declared deviation fromINTERPRETER.md§ The interpreter loop step 5's gate-then-in_progressordering — 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
| File | Purpose |
|---|---|
references/vendored/dsl/INTERPRETER.md | Vendored DSL execution contract (interpreter loop + gate protocol) |
references/phases/intake/intake.md | Entry point + technical background + open context |
references/phases/discover/discover.md | Lightweight code detection |
references/phases/clarify/clarify.md | Clarify orchestrator + answer mapping to scoring keys |
references/phases/clarify/clarify-technical.md | Technical-background question wording |
references/phases/clarify/clarify-business.md | Business-background question wording |
references/phases/confirm/confirm.md | Winner-specific follow-ups |
references/phases/design/design.md | Assemble recommendation; Migrate handoff branch |
references/phases/estimate/estimate.md | Coarse cost magnitude |
references/phases/generate/generate.md | Layered recommendation doc + scaffolding |
references/phases/migration-plan/migration-plan.md | Stage 2: full migration plan via the sibling gcp-to-aws engine |
references/decision-refs/temporal.md | Temporal rules: Tier 1/2 tables, adapter, runbooks, commercials (consumed by discover/clarify/design/generate) |
references/decision-refs/poc-shapes.md | Per-runtime POC deploy shapes (ECS/EKS/Lambda/MicroVMs/Temporal) |
references/decision-refs/*.md | Runtime service cards, model defaults, freshness |
references/decision-refs/workload-classes.md | Deterministic verdicts for non-agent workload units (batch/service/io) |
references/runtimes/*.json | Runtime registry (read by scoring.py) |
scripts/scoring.py | Deterministic scoring engine |
scripts/test_temporal_decision_refs.py | Content lock for the Temporal decision reference |
scripts/test_poc_shapes.py | Content lock for the POC deploy shapes |
scripts/test_workload_classes.py | Content lock for workload-classes.md (verdicts table) |
scripts/test_unit_grouping.py | Unit grouping + pattern matching (workload-class assignment) |
scripts/test_collapse_invariant.py | Collapse-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.
Read
../knowledge-base-for-startups/references/offers.md— the offer index (Offer · Summary · Keywords), one row per offer.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).
If (and only if) one offer clears the bar, open only its detail file
../knowledge-base-for-startups/references/offers/<slug>.mdand 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 canonicalsource_urlplus asourceattribution 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 genericide-startupAdvisorwhen 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
- ATTRIBUTION.mdAdded by AutoGineer907 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer67 B
- SKILL.md19.2 KiB
- references/decision-refs/agentcore.md5.4 KiB
- references/decision-refs/batch.md2.3 KiB
- references/decision-refs/cost-levers.md1.8 KiB
- references/decision-refs/ecs.md1.4 KiB
- references/decision-refs/eks.md1.1 KiB
- references/decision-refs/freshness.md10.7 KiB
- references/decision-refs/lambda-microvms.md1.9 KiB
- references/decision-refs/lambda.md1.1 KiB
- references/decision-refs/managed-alternatives.md1.9 KiB
- references/decision-refs/maturity-readiness.md2.8 KiB
- references/decision-refs/model-selection.md4.2 KiB
- references/decision-refs/poc-shapes.md15.5 KiB
- references/decision-refs/temporal.md17.5 KiB
- references/decision-refs/workload-classes.md2.2 KiB
- references/diagram/build-diagram.md5.1 KiB
- references/handoff/handoff-migration.md2.1 KiB
- references/output-templates/recommendation-doc.md5.1 KiB
- references/phases/add-capabilities/add-capabilities-assemble.md951 B
- references/phases/add-capabilities/add-capabilities.md4.6 KiB
- references/phases/clarify/clarify-assemble.md1.4 KiB
- references/phases/clarify/clarify-business.md3.3 KiB
- references/phases/clarify/clarify-technical.md2.7 KiB
- references/phases/clarify/clarify.md26.5 KiB
- references/phases/confirm/confirm-assemble.md1019 B
- references/phases/confirm/confirm.md15.1 KiB
- references/phases/design/design-assemble.md1.7 KiB
- references/phases/design/design.md26.9 KiB
- references/phases/discover/discover-assemble.md1.2 KiB
- references/phases/discover/discover.md10.0 KiB
- references/phases/estimate/estimate-assemble.md780 B
- references/phases/estimate/estimate.md19.0 KiB
- references/phases/generate/generate-assemble.md1.0 KiB
- references/phases/generate/generate-report.md45.6 KiB
- references/phases/generate/generate.md15.7 KiB
- references/phases/intake/intake-assemble.md991 B
- references/phases/intake/intake.md5.6 KiB
- references/phases/migration-plan/migration-plan-assemble.md1.2 KiB
- references/phases/migration-plan/migration-plan-gcp-constraints.md3.9 KiB
- references/phases/migration-plan/migration-plan.md32.1 KiB
- references/phases/model-recommend/model-recommend-assemble.md937 B
- references/phases/model-recommend/model-recommend.md17.2 KiB
- references/phases/poc/poc-assemble.md1.0 KiB
- references/phases/poc/poc-report.md12.6 KiB
- references/phases/poc/poc.md44.8 KiB
- references/report-help-banner.md6.0 KiB
- references/report-shell.md12.3 KiB
- references/runtimes/agentcore.json3.1 KiB
- references/runtimes/ecs.json1.5 KiB
- references/runtimes/eks.json1.4 KiB
- references/runtimes/lambda.json2.4 KiB
- references/runtimes/lambda_microvms.json3.3 KiB
- references/vendored/README.md2.0 KiB
- references/vendored/ai/bedrock-pricing-cache.md57.2 KiB
- references/vendored/ai/models/anthropic-bedrock.json8.6 KiB
- references/vendored/ai/models/openai-bedrock.json28.0 KiB
- references/vendored/dsl/INTERPRETER.md51.8 KiB
- scripts/anthropic_model_recommendation.pyScript35.0 KiB
- scripts/build_diagram.pyScript21.2 KiB
- scripts/model_recommendation.pyScript8.8 KiB
- scripts/openai_model_recommendation.pyScript58.1 KiB
- scripts/pyproject.toml170 B
- scripts/schemas/current-run-verifications.json1.1 KiB
- scripts/schemas/model-recommendation-input.json5.4 KiB
- scripts/schemas/model-recommendation.json13.1 KiB
- scripts/schemas/model-verification.json2.5 KiB
- scripts/schemas/scoring-result.json3.5 KiB
- scripts/schemas/seed.json5.6 KiB
- scripts/score_units.pyScript2.9 KiB
- scripts/scoring.pyScript16.5 KiB
- scripts/test_build_diagram.pyScript21.8 KiB
- scripts/test_collapse_invariant.pyScript2.0 KiB
- scripts/test_cost_levers.pyScript1.7 KiB
- scripts/test_model_recommendation.pyScript13.9 KiB
- scripts/test_openai_model_recommendation.pyScript46.5 KiB
- scripts/test_opus55_generation_contracts.pyScript20.8 KiB
- scripts/test_opus55_integration.pyScript21.5 KiB
- scripts/test_poc_shapes.pyScript14.2 KiB
- scripts/test_scoring.pyScript35.3 KiB
- scripts/test_temporal_decision_refs.pyScript7.4 KiB
- scripts/test_unit_grouping.pyScript71.7 KiB
- scripts/test_verify_model_path.pyScript25.8 KiB
- scripts/test_workload_classes.pyScript5.2 KiB
- scripts/uv.lock97.8 KiB
- scripts/verify_model_path.pyScript10.9 KiB
references/phases/confirm/confirm.md
_phase: confirm _title: "Confirm — Winner-specific follow-ups" _requires_phase: model-recommend _input:
scoring-result.json
answers.json
model-recommendation.json _assemble: _file: phases/confirm/confirm-assemble.md _produces:
confirm.json _advances_to: design _preconditions:
_check_phase_completed: model-recommend _on_failure: _halt_and_inform
_check_file_exists: scoring-result.json _on_failure: _unrecoverable
_validate_json: scoring-result.json _on_failure: _unrecoverable
_check_file_exists: model-recommendation.json _on_failure: _unrecoverable
_validate_json: model-recommendation.json _on_failure: _unrecoverable _postconditions:
_check_file_exists: confirm.json _on_failure: _halt_and_inform
_validate_json: confirm.json _on_failure: _halt_and_inform
_assert: "confirm.json has one units[<unit_id>] entry per agent_session unit (each with its own confirmed deployment_model, agentcore_services, tool_choices, model_decision, and chosen_runtime when that unit's verdict was co_recommend), plus top-level fields mirroring the primary unit; every model-bearing unit's model_decision copies primary_model, api_path, invocation_model_id, and the independent verification_status from model-recommendation.json plus model-verification.json when present unless the user requested changed requirements and the deterministic engine was rerun; accepted means the recommendation strategy was accepted and never implies verification_status == passed; a single-unit run may use the flat top-level shape alone; confirm.json carries resolved_runtimes{<unit_id>: <runtime>} for every unit (the per-unit rule/Tier-1 picks used by the platform gate); confirm.json records platform_decision {mode, platform} — asked only when the resolved runtimes diverge, silent split otherwise; when the gate was asked, platform_decision.offer records the superset and per-unit sacrifices; every temporal_worker_poll unit's Tier-1 pick (including any user AskUserQuestion choice for Tier-1 rules 1/4) is persisted in resolved_runtimes so Design consumes it verbatim and never re-asks" _on_failure: _halt_and_inform
Phase: Confirm — Winner-specific follow-ups
Runs after scoring, before Design. Only asks what the winning runtime needs.
Step 1 — Read the scoring result
Read $RUN_DIR/scoring-result.json and $RUN_DIR/model-recommendation.json. If
$RUN_DIR/model-verification.json exists, read it too; it is the live account-invocability
result, not a replacement recommendation.
Per-unit confirm (multi-unit systems). scoring-result.json.units carries one scored
result per agent_session unit — each has its OWN verdict, deployment_model, and
agentcore_services. Steps 2–5 below run once per agent_session unit, keyed on that
unit's own scored result — NOT once globally on a top-level verdict. A system with two agent
units where one scored agentcore and the other co_recommend (AgentCore vs Lambda MicroVMs)
must resolve BOTH: confirm the first's deployment model and services, AND break the second's
tie and confirm its own services. Never apply one agent unit's deployment_model, services, or
runtime pick to another.
Non-agent units (batch, light_io, service, temporal_worker_poll) are not scored and
have no agentcore confirm — their verdict comes from workload-classes/temporal rules in Design.
Single-unit collapse: when there is exactly one unit, "per unit" is the one unit and confirm.json's top-level fields ARE that unit's confirm (today's behavior, unchanged).
For each agent_session unit, branch on THAT unit's verdict through Steps 2–4, and record
its confirmed choices into confirm.json.units[<unit_id>] (Step 5). The primary unit
(answers.json.primary_unit) ALSO mirrors to the top-level fields for backward compatibility.
Step 2 — If a unit's verdict includes agentcore
Present the deployment model (deployment_model from the result) and let the user confirm or
switch between Harness (no-code, managed loop — declare the agent as config) and
Framework on Runtime (bring Strands/LangGraph/CrewAI/custom code). If they picked a
deployment_preference in Clarify, it already drove this — restate it and let them change their
mind here. Record the final choice in confirm.json.
When the unit's scoring result carries agentcore_compute_type: "instances", ALSO state it
plainly before they confirm — it changes the cost model and the architecture: "Your >8h
sessions / GPU / instance-type requirement routes this to the Instances compute type:
AWS-managed EC2 in your account (capacity provider), sessions up to 14 days, billed at EC2
rates plus a management fee — not the consumption / $0-I/O-wait model." The compute type is
informational here (scoring owns the routing; the user changes it by changing the answer that
triggered it), so do not add a confirm question for it — just make sure no one reaches Design
believing they are getting microVM pricing.
Then ask which AgentCore services to enable beyond the always-on set (identity, observability,
evaluations, optimization). Multi-select, seeded from agentcore_services:
Gateway (external APIs / MCP), enhanced Identity (OAuth), Policy (high-risk / multi-tenant), Memory (cross-session), Managed KB (internal docs), Code Interpreter, Browser, Web Search, Sandbox.
Conditional (mention only when signals fit — not by default): Payments (agent pays / transacts on the user's behalf — surface if high-risk/transactional actions are detected) and AWS Agent Registry (
registry: shared catalog, resource discovery, or approval-based governance requested by the user or identified in the workload). Registry can fit a single agent;multi_agent == "yes"alone does not justify it. If neither service's signal is present, leave it out. A Registry selection remains conditional until Design checks its Region availability perfreshness.md; Registry discovers resources, not orchestrates their execution. For any selected service that can front external tools/data (Gateway, Managed KB, Web Search, Memory), ask whether they already use a third-party tool for it (e.g. Tavily, Pinecone, Browserbase, a REST/MCP server) — do NOT assume greenfield. If yes: switch to AgentCore native, or keep existing and connect via Gateway. If no: default to native. Record the choice intool_choices.
Step 3 — If a unit's verdict is any non-AgentCore runtime (ecs / eks / lambda / lambda_microvms / batch / fargate)
These run the agent on non-AgentCore compute. Still ask which AgentCore add-on services
they want for THIS unit (services run on any runtime). Record them under this unit. This branch
is the fallthrough for EVERY non-agentcore runtime — including lambda_microvms picked from a
co_recommend tie in Step 4 — so no runtime pick skips its services/tool_choices confirm.
Apply Step 2's conditional-service rules here too, including Registry's discovery/governance
trigger and pending Region verification; its availability is independent of the compute runtime.
Step 4 — If a unit's verdict is co_recommend or no_viable_runtime
co_recommend: present THIS unit's tied runtimes with "choose A if X / B if Y" framing; ask the user to pick one FOR THIS UNIT. Record the pick as this unit's
chosen_runtime(Step 5). Then run Step 2/3 for the pick. Each co_recommend unit is broken independently — two agent units can land on different runtimes. Non-interactive runs: when$RUN_DIR/seed.jsonsupplieschosen_runtime(clarify.md Step 2.5), take the tie-break from it verbatim and say so instead of asking. With no seed and nobody to ask, break the tie toward the highest-scoring runtime, and record the tie, the pick, and the reason in$RUN_DIR/UNANSWERED.md— a silently broken tie hides a real decision.no_viable_runtime: show
blocking_constraints; ask which constraint can relax; if one changes, rewrite$RUN_DIR/answers.jsonwith the changed value and re-run scoring by executing clarify.md Step 5's exact bash block (the PYTHONPATH multi-unit loop that reads answers.json — each unit's ownworkload_class— for the agent_session filter and writes the wrapper{ "units": { ... }, ...primary mirror }).Do NOT invoke
scoring.pydirectly onanswers.jsonhere — that scores only the top-level primary mirror and OVERWRITES the wrapped result with a flat one, deleting everyunits[<id>]entry so this phase's per-unit loop is left with no inputs. Only the wrapper-producing command is safe for rescoring.Re-running clarify.md Step 5 overwrites
$RUN_DIR/scoring-result.jsonwith the correctly-shaped result. Re-read it and return to Step 1.
Step 5 — Write confirm.json and state
Before writing, confirm each model-bearing unit's model and API path alongside its runtime.
Show that unit's path-specific model ID, invocation ID or CRIS TODO, compatibility,
architecture impacts, [BLOCKS], [TUNE], evaluation/rollout gates, and probe status. If any
entry is still decision_required, return to Model Recommend and resolve it; do not confirm a
null model/path. The user may:
accept the recommendation, including the work needed to clear listed blocks; or
change a requirement. In that case update
model-recommendation-input.json, rerunmodel_recommendation.py, and present the new result.
Do not directly edit primary_model, api_path, or invocation_model_id, and do not let
runtime scoring or a downstream migration engine replace them. Accepting the strategy and
proving target-account access are independent. Record each accepted result as
model_decision: {"primary_model": "...", "api_path": "...", "invocation_model_id": "... | null", "accepted": true, "verification_status": "not_run | passed | failed | needs_resolution"} in the matching unit. Use model-verification.json when present;
otherwise use the recommendation's verification.probe_status. Model-less units omit
model_decision.
Write $RUN_DIR/confirm.json with a units object — one entry per agent_session unit
confirmed in Steps 2–4, keyed by unit id — plus top-level fields mirroring the PRIMARY unit
(backward compatibility; single-unit runs are exactly today's flat shape).
Each units[<unit_id>] entry carries:
deployment_model(confirmed; for aco_recommendpick, the deployment model of the runtime the user CHOSE for THIS unit — recompute for the chosen runtime, do not carry a stale value from the tie),agentcore_services(final list for this unit),chosen_runtime(REQUIRED when this unit's verdict wasco_recommend— the runtime id the user picked in Step 4; omit for single-winner verdicts),tool_choices(per-capability native-vs-gateway choices for this unit).
The top-level deployment_model / agentcore_services / chosen_runtime / tool_choices
mirror the primary unit's entry.
{
"units": {
"support-chat": {
"deployment_model": "framework_on_runtime",
"agentcore_services": ["identity", "memory"],
"tool_choices": { "memory": "native" },
"model_decision": {
"primary_model": "anthropic.claude-sonnet-4-6",
"api_path": "runtime_converse",
"invocation_model_id": "global.anthropic.claude-sonnet-4-6",
"verification_status": "passed",
"accepted": true
}
},
"triage-agent": {
"deployment_model": "harness",
"agentcore_services": ["identity"],
"chosen_runtime": "lambda_microvms"
}
},
"deployment_model": "framework_on_runtime",
"agentcore_services": ["identity", "memory"],
"tool_choices": { "memory": "native" }
}Design reads confirm.json.units[<unit_id>] for each agent unit's confirmed
deployment_model/services/runtime; it falls back to the top-level fields for a single-unit run.
Step 6 — Platform divergence gate (only when unit verdicts span more than one runtime)
Collect every unit's resolved runtime — NOT its raw verdict. A co_recommend verdict is
NOT a runtime; use the chosen_runtime the user just picked for that unit in Step 4 (recorded
in confirm.json.units[<id>].chosen_runtime). So per unit: agent_session → its
chosen_runtime if the verdict was co_recommend, else its scored verdict;
temporal_worker_poll → its temporal.md Tier 1 pick (load
references/decision-refs/temporal.md — workload-classes.md has NO temporal rule, so a Temporal
worker unit in a mixed system resolves its polling runtime here for the platform gate); other
non-agent → the workload-classes rule pick (load references/decision-refs/workload-classes.md).
Never
compare the literal string "co_recommend" — two tied units that the user sent to different
runtimes (e.g. AgentCore vs Lambda) DIVERGE and must trigger the gate; comparing raw verdicts
would wrongly see them as "both co_recommend" and skip it.
Persist the resolution as confirm.json.resolved_runtimes — a {<unit_id>: <runtime>} map
covering EVERY unit (agent and non-agent). This is resolved ONCE here and Design consumes it
verbatim (Design does NOT re-evaluate temporal Tier 1). For a temporal_worker_poll unit whose
Tier-1 rule needs a user choice (rules 1 and 4 — EKS vs Serverless Workers), ask the
AskUserQuestion HERE, in this phase, and record the picked runtime in resolved_runtimes (and
cite the fired rule id). Design must find every unit's runtime already decided in
resolved_runtimes, so it never re-asks and platform_decision can never disagree with the
effective_runtime Design writes.
If ALL resolved runtimes name one
runtime, write platform_decision: { "mode": "split", "platform": null, "offer": null }
silently and continue — no question (collapse invariant).
Otherwise AskUserQuestion:
[A] Consolidate onto
<superset runtime>— the runtime satisfying every unit's HARD constraints (eliminations) with the highest summed score; in practice ECS or EKS. (Every run has ≥1 agent unit per Clarify's scope gate, so agent scores always exist to sum.) State the sacrifice per unit ("chat-agent loses AgentCore's built-in memory/identity — self-managed on ECS"). AgentCore is offered as the superset ONLY when every unit isagent_session. Choosing [A] writesplatform_decision: { "mode": "consolidated", "platform": "<runtime>" }.[B] Keep the split — each unit on its own verdict; state the ops cost (two runtimes: two deploy pipelines, two scaling models). Choosing [B] writes
platform_decision: { "mode": "split", "platform": null }.
Whichever the user picks, platform_decision also records the offer that was made —
the report retells it either way:
"offer": {
"superset": "<runtime>",
"sacrifices": ["<unit>: <what it loses>", "..."]
}superset is the runtime option [A] proposed; sacrifices lists, per unit, what that
unit gives up under consolidation (the same statements presented in the question).
Record the choice as platform_decision in confirm.json. The decision does NOT rewrite
per-unit verdicts — Design keeps both (unit verdict + platform decision) so the report
can show what consolidation traded away.
Set phases.confirm = completed (read-merge-write). The flow now advances to Design.
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