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/model-recommend/model-recommend.md
_phase: model-recommend _title: "Model Recommend — Bedrock model and API path" _requires_phase: clarify _input:
answers.json
scoring-result.json
context-signals.json _knowledge:
{ file: references/vendored/ai/models/anthropic-bedrock.json }
{ file: references/vendored/ai/models/openai-bedrock.json } _assemble: _file: phases/model-recommend/model-recommend-assemble.md _produces:
model-recommendation-input.json
model-recommendation.json _advances_to: confirm _preconditions:
_check_phase_completed: clarify _on_failure: _halt_and_inform
_check_file_exists: [answers.json, scoring-result.json] _on_failure: _unrecoverable
_validate_json: [answers.json, scoring-result.json] _on_failure: _unrecoverable _postconditions:
_check_file_exists: [model-recommendation-input.json, model-recommendation.json] _on_failure: _halt_and_inform
_validate_json: [model-recommendation-input.json, model-recommendation.json] _on_failure: _halt_and_inform
_assert: "model-recommendation.json was written by model_recommendation.py; it has one workloads[unit_id] entry for every agent_session unit and every other model-bearing unit; every entry has decision_status == recommended before this phase completes; each entry carries exact structured source hints, source_analysis, feature_assessment, model_identity, primary_model, api_path, invocation_model_id, compatibility, architecture_impacts, additional_targets when the workload has separate-modality capabilities (embeddings/images/audio, each unresolved with a named service and null candidate), blocks, tuning, migration_deltas, evaluation, rollout, and provisional verification with region plus catalog_verified_at; runtime-scoring output did not independently replace any selected model" _on_failure: _halt_and_inform
_assert: "every feature_status entry marked
detectedin model-recommendation-input.json has a named source location behind it (Step 3's evidence rule); a surface that was scanned and not found isabsent, a surface whose source path could not be read isunknown, and no feature was markeddetectedbecause the migration implies it" _on_failure: _halt_and_inform
Phase: Model Recommend — Bedrock model and API path
This phase is the model-selection authority. Runtime scoring remains in Clarify, but it MUST NOT decide the final model or Bedrock API path.
Step 1 — Build the per-workload source inventory
Read $RUN_DIR/answers.json and, when present, $RUN_DIR/context-signals.json. Create one
input row for every agent_session unit and every other unit with an LLM call. Do not create a
row for a model-less compute unit.
For each row, preserve machine-readable source facts:
provider:anthropic | openai | azure_openai | google_genai | bedrock | none | unknownmodel_ids[]: exact strings found in code or stated by the user; do not normalize themsdk: exact SDK/package name when knownapi_surface: e.g.messages,chat_completions,responses,conversesource_paths[]: the files containing the provider call sites — a file belongs here only if it invokes the SDK/API. Tool definitions, capability manifests, and config that merely evidences a feature are not call sites; cite those where the feature is recorded instead. It must cover the whole scan: if Step 3 marks a featuredetectedon the strength of a call in some file, that file is a call site and belongs here — a feature cited from a path the list omits is an inconsistent scan. Sort the list, so two scans of the same repository produce the same array.
Discovery evidence is a hint, not an immutable fact. The downstream executor MUST re-scan code and may override a stale hint with a logged mismatch; it MUST NOT silently replace the advisor-confirmed target model/path.
Step 2 — Resolve model/path requirements
Map existing answers into each row's requirements:
model_priority→prioritymodel_featuresplus agent tool use →critical_features[]target region → top-level
region; useunknownwhen no concrete region was given
For Anthropic sources, ask one batched clarification only for requirements not established by code or prior answers:
preserve the first-party Messages API?
require newest Anthropic beta features?
require Bedrock Guardrails, invocation logging, or CloudWatch integration?
require a shared multi-model Converse surface?
require a provider-native Bedrock request body?
minimum context window and expected output-token ceiling?
use thinking?
allow Global CRIS, or require a geography-scoped CRIS profile?
For OpenAI and Azure OpenAI sources, ask instead for the provider-neutral requirements (never
reuse the Anthropic preserve_messages_api switch):
api_continuity:required | preferred | not_required | unknown— must the OpenAI SDK and API surface be preserved?require Bedrock Guardrails, invocation logging, or a shared multi-model Converse surface?
does the code use
n(multiple candidates), hosted state (Assistants/Threads,previous_response_id), hosted web/file search, Files API, or vector stores?minimum context window and expected output-token ceiling?
allow Global CRIS or require a geography-scoped profile (runtime Converse only)?
OpenAI is handled by a dedicated provider module (openai-bedrock.json catalog).
Recognized GPT-5.6 and GPT-6 source identities are evaluated against their exact same-model
catalog entry before capability/numeric fallbacks. GPT-5.x on Mantle is Responses-only, so a Chat
Completions source is reshaped rather than routed to mantle_openai_chat. GPT-6 Chat Completions
sources with required or preferred API continuity instead keep that surface through
mantle_openai_chat; GPT-6 Responses sources use mantle_openai_responses. Both Mantle paths are
in-region only and enforce the selected model's cataloged region_availability: Astra reaches
us-east-1 and us-west-2, while Sol, Luna, and 6.1 Sol reach us-east-1 only. Outside that footprint,
the engine skips the same-model Mantle candidate and evaluates its existing capability/numeric
fallbacks. Governance requirements select the exact same GPT-5.6 or GPT-6 model through
runtime_converse only when the requested Global or geography-scoped CRIS profile is cataloged
for that model and source region; an unsupported profile falls through to an eligible documented
runtime candidate or remains an explicit decision. GPT-5.5/5.4 remain mantle-only. GPT-6 Astra's
runtime surface lacks Invoke support (Responses/Chat Completions/Converse only), while
Sol/Luna/6.1 Sol support all four APIs. Every selected path remains provisional until it is probed
in the target account and region. Azure OpenAI remains an explicit provider_module_pending
generic result.
For Astra, preserve a compatible explicit API preference before the source default. Keep Astra selected and require a decision when its path, region or feature evidence cannot satisfy the request; do not silently substitute another model.
OpenRouter/LiteLLM-sourced OpenAI models still use the OpenAI module. Discover records the
underlying provider (e.g. openai) even when the calls transit a gateway — see discover.md's
gateway-detection rule. Do not treat a gateway-routed source as unknown or route it to the
generic branch: the model itself, and therefore the Mantle/Converse recommendation, is unaffected
by the gateway. What changes is api_continuity: a gateway-routed source is not, by construction,
calling the OpenAI SDK directly, so its actual migration effort is closer to preferred than
required — ask this explicitly rather than assuming required from the SDK detection default,
and note in [TUNE]/rationale that landing on Mantle from OpenRouter means a real base-URL,
credential, and model-ID-format change, not the zero-code-change claim that applies to a direct
OpenAI SDK caller.
Do not ask users to choose an API path by name unless they already expressed a preference.
The deterministic engine ranks (model, api_path) candidates together after filtering hard
constraints. If an explicit preference exists, record preferred_api_path. Record
min_context_tokens, expected_output_tokens, thinking_enabled, data_residency,
cris_geography, and an explicit inference_profile_id when known. Do not manufacture a
Global or geography prefix when residency is unresolved.
Step 3 — Record migration-sensitive features
For Anthropic source paths, scan for migration-sensitive features:
budget_tokens,sampling_parameters,assistant_prefillrefusal_handling,tokenizer_rebaseline,max_tokens_headroomstructured_output,prompt_cachingcitations,streaming,tool_use,visionserver_tools,files_api,url_sources,message_batchesmodels_api,fallbacks,conversation_state,agent_infra
For OpenAI source paths, scan instead for OpenAI feature codes:
tool_or_function_calling,structured_output_json,streaming,image_input_visionreasoning,sampling_params,max_tokens,multiple_candidates_n,prompt_cachingweb_search,file_search_retrieval,files_api,vector_stores,assistants_threadsaudio_modality,embeddings,images,conversation_state
Put observed features in detected_features[]. Also write feature_status entries as
detected | absent | unknown. For a Claude version hop, inspect every source path and mark each
version-breaking surface explicitly; absence from detected_features[] alone means unknown,
not proved absent.
Each status must be earned by evidence, and the evidence is a source location.
detected— you can name the file and line where the feature is used (a parameter, a call, a request field, a declared capability). Cite that location in the phase's chat output for every feature you markdetected. A feature you believe ought to be there, or that the migration will imply anyway, is notdetected:tokenizer_rebaseline, for instance, is a consequence of the version hop and belongs inmigration_deltas, not in the scan, unless the source actually counts tokens.absent— you read every source path and the surface is not used. This is the correct status for a feature you cannot cite; do not round a plausible guess up todetected.unknown— a source path could not be read, so the surface was never scanned. Say which path.
The scan feeds blocks, tuning, and migration_deltas counts, so a false detected inflates
the findings and two runs over the same repository then disagree. If the evidence is not citable,
the status is absent. An incomplete version scan produces version_scan_incomplete and the phase
must not present the migration as ready. For OpenAI, the module distinguishes the platform axis
(OpenAI hosting → Bedrock) from the model-generation axis (GPT-4.x/o-series → GPT-5.x reasoning);
opaque deployment names stay unknown and are never inferred to a family.
Step 4 — Write and validate model-recommendation-input.json
Write $RUN_DIR/model-recommendation-input.json with this shape:
{
"schema_version": 2,
"region": "us-east-1",
"primary_unit": "support-agent",
"workloads": [
{
"workload_id": "support-agent",
"source": {
"provider": "anthropic",
"model_ids": ["claude-3-7-sonnet-latest"],
"sdk": "anthropic",
"api_surface": "messages",
"source_paths": ["src/agent.py"]
},
"requirements": {
"priority": "balanced",
"critical_features": ["tool_use"],
"preserve_messages_api": true,
"governance": [],
"min_context_tokens": 200000,
"expected_output_tokens": 16000,
"thinking_enabled": true,
"data_residency": "geo_required",
"cris_geography": "us"
},
"detected_features": ["budget_tokens", "assistant_prefill"],
"feature_status": {
"budget_tokens": "detected",
"assistant_prefill": "detected",
"sampling_parameters": "absent",
"refusal_handling": "unknown"
}
}
]
}Validate it against scripts/schemas/model-recommendation-input.json. On validation failure,
fix the input; do not bypass the schema.
Step 5 — Run the deterministic recommendation engine
Resolve $SCRIPTS using the same plugin-root fallback as Clarify, then run:
uv run python "$SCRIPTS/model_recommendation.py" \
"$RUN_DIR/model-recommendation-input.json" \
--output "$RUN_DIR/model-recommendation.json"It prints RESULT=ok WORKLOADS=<n> SCHEMA_VALIDATED=<yes|no>. SCHEMA_VALIDATED=no means the host
has no jsonschema (a bare python3 invocation without uv): the recommendation is still
deterministic, but nothing machine-checked the input or the output, so read both against
scripts/schemas/ yourself before continuing.
The engine output is authoritative for the joint model/path ranking. Do not hand-edit its recommendation. Keep these identities separate:
model_identity.model_key: logical catalog identitymodel_identity.path_model_id/primary_model: the ID form for the selected pathinvocation_model_id: the resolved account-callable ID; runtime may leave this null until a CRIS profile is resolved
Every capability claim remains probe_status: not_run and
availability_claim: provisional until the exact (invocation_model_id, api_path) pair is
invoked in the target account and region.
OpenAI sources use the dedicated OpenAI provider module (provider_module: openai) and its
dated catalog. Azure OpenAI and Google sources remain the generic provisional branch and carry
provider_module_pending in [BLOCKS]; do not present those as provider-complete. All modules
share one artifact shape, so downstream phases consume every provider identically.
Step 6 — Resolve decision_required before advancing
If any workload has decision_status: decision_required, present its decision_options and
tradeoffs. Ask the user to resolve the conflicting requirement, update
model-recommendation-input.json, and rerun the deterministic engine. Do not pick an option,
edit the output, or mark this phase completed while any workload remains unresolved.
Step 7 — Optionally probe the selected path
Offer a live target-account probe after all workloads are recommended. This is optional and
separate from recommendation acceptance because it uses AWS credentials and invokes a billable
model. Run it only with explicit approval:
uv run --with boto3 --with anthropic python "$SCRIPTS/verify_model_path.py" \
"$RUN_DIR/model-recommendation.json" \
--output "$RUN_DIR/model-verification.json"Each API path needs its own client library. The line above covers the Anthropic and runtime
paths. A workload on mantle_openai_responses or mantle_openai_chat additionally needs
--with openai --with aws-bedrock-token-generator; without them that workload comes back
failed with a RuntimeError naming the missing package, while every other workload still
probes normally. So a failed status here can mean "the dependency was absent", not "the model
is unavailable" — read the error type before treating it as a capability finding.
The verifier must call only the recorded invocation_model_id; it never substitutes another
model. Runtime recommendations with an unresolved CRIS profile produce needs_resolution.
Keep model-verification.json when generated and show its per-workload status. A failed probe
does not change the accepted recommendation; it blocks runnable POC claims until resolved.
When this engine rewrites a recommendation, it removes the sibling model-verification.json
if any workload's model, API, invocation ID, region, allowed profile set or allowed in-region
model ARN set changed. An unchanged
invocation contract retains its verification. After invalidation, treat verification as
not_run; do not restore a passed result from an older design or report.
For an Opus 5.5 application-profile ARN, the verifier first reads GetInferenceProfile
for that ARN and the recommendation's verification.allowed_inference_profiles. It requires
active destinations matching the selected model and an allowed regional profile before
invoking the original ARN. The caller needs bedrock:GetInferenceProfile for these metadata
reads; a failed or inconclusive check prevents inference and does not establish access.
For London in-region profiles, verification.allowed_in_region_model_arns carries the
exact permitted foundation-model destination. An ACTIVE application profile with only that
destination is also valid; a different model, region or additional destination is not accepted
by this rule. Cross-region application profiles still need the reference-profile comparison.
Step 8 — Present the recommendation and advance
For each workload, show the primary model, API path, resolved invocation ID or CRIS TODO,
compatibility groups, architecture impacts, any additional_targets (separate-modality targets
such as embeddings/images/audio, shown as unresolved with their named service — never as a
runnable model ID), path rationale, [BLOCKS], [TUNE], evaluation mode, rollout gate, and
verification status. Do not resolve blockers in chat by silently changing the output. Confirm
handles user acceptance or requested requirement changes.
Set phases["model-recommend"] = completed and leave phases.confirm = pending.
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