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://mp-staging.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/estimate/estimate.md
_phase: estimate _title: "Estimate — Coarse Cost Magnitude" _requires_phase: design _input:
design.json _knowledge:
{ file: references/decision-refs/cost-levers.md, _when: "always (drivers step)" } _assemble: _file: phases/estimate/estimate-assemble.md _produces:
estimate.json _advances_to: generate _interactive: false _exec: _agent: rw _preconditions:
_check_phase_completed: design _on_failure: _halt_and_inform
_check_file_exists: design.json _on_failure: _unrecoverable
_validate_json: design.json _on_failure: _unrecoverable _postconditions:
_check_file_exists: estimate.json _on_failure: _halt_and_inform
_validate_json: estimate.json _on_failure: _halt_and_inform
_assert: "estimate.json states a monthly_magnitude_usd band (never a precise total), records pricing_source (cached|cached_stale|mcp), and lists every assumption behind the magnitude; estimate.json has a units{} entry per costed unit and a total band; top-level fields mirror the primary unit; each costed unit carries a breakdown {compute, model_tokens, other}; drivers[] cites only levers from cost-levers.md" _on_failure: _halt_and_inform
Phase: Estimate — Coarse Cost Magnitude
All entry points except add_capabilities run Estimate. Scope: target-state run cost per unit, presented as order-of-magnitude bands. This phase NEVER produces a TCO comparison or current-spend delta — that belongs to the Migration Plan engine (for migrate entry points); do not duplicate or contradict its numbers. The add_capabilities branch runs its own self-contained flow and never reaches here. Magnitude only — NOT precise estimation (that's the migration skills' job). Mirrors the migration skills' pricing pattern.
Step 1 — Read the design and answers
Read $RUN_DIR/design.json and $RUN_DIR/answers.json. Extract primary_unit from answers.json
and the units[] array from design.json. Each unit has id, workload_class, verdict, and
(for agent units) deployment_model.
Step 2 — Pricing source (cached, same as the migration skills)
Primary: a small cached rate table (inline below — AgentCore vCPU/GB-hour, Fargate, Lambda, plus the model default's token rates as order-of-magnitude). Carry a "last updated" date.
Record
pricing_source:cached|cached_stale(if >90 days old).
Cached anchors (order-of-magnitude, us-east-1, verify; last updated 2025-07-14):
AgentCore (microVMs compute type): ~$0.0895/vCPU-hour (active CPU only), ~$0.00945/GB-hour
AgentCore (Instances compute type,
agentcore_compute_type: "instances"in design.json): EC2 On-Demand rate for the chosen instance type (user's Savings Plans / ODCRs apply) PLUS an AgentCore management fee — NOT consumption-based and NOT $0 during I/O wait. No cached anchor here: use the instance type from the user'sinstance_type_requirementanswer (else assume a mid-size general-purpose type and say so), and setpricing_source: cached_stalefor that component with a note to verify the EC2 rate before committing.Lambda MicroVMs: ~$0.0997/vCPU-hour, ~$0.0132/GB-hour
Fargate: ~$0.04048/vCPU-hour, ~$0.004445/GB-hour
Bedrock model token rates: defer to
references/vendored/ai/bedrock-pricing-cache.mdfor exact figures
Step 3 — Produce a magnitude per unit, not a quote
For EACH unit in design.json.units[], estimate a rough monthly band based on its workload_class
and its effective_runtime — NOT its verdict. Under a consolidated platform a unit actually
runs on platform.runtime (its effective_runtime), so it must be COSTED there: a unit whose
verdict is batch but whose effective_runtime is ecs bills as an always-on ECS Fargate task,
not as scale-to-zero AWS Batch. In a split run effective_runtime == verdict, so nothing changes.
Where a bullet below says "verdict", read effective_runtime. The pricing shape depends on the
unit's class:
EKS pricing rule — applies to ANY unit whose effective_runtime == "eks", regardless of
class (agent_session, service, batch, light_io): price by the cluster's ACTUAL node capacity
type — do NOT assume Fargate. EKS-on-Fargate → the Fargate vCPU/GB anchor; EC2 managed nodes /
Karpenter / Spot / GPU → EC2 instance pricing for the stated instance type (Spot discount when
stated); reusing an existing cluster → near-zero marginal cost ONLY when the user stated there is
spare capacity to absorb the workload — otherwise Karpenter/ASG adds nodes and the full
incremental node cost applies, so price the added EC2/Fargate capacity the workload needs. State
the capacity-type assumption (and whether spare capacity was assumed). When the capacity type or
instance is unknown, set pricing_source: cached_stale and note the
assumption; do not assume Fargate. A W1
"existing cluster reuse" verdict or a consolidation onto EKS can land a service/batch unit here —
this rule governs it, NOT the class default below.
agent_session units (effective_runtime = agentcore | lambda_microvms | ecs | eks | lambda): estimate as today — runtime + model + stated usage assumption (sessions/mo, duration, I/O wait %). Apply the cached anchors from Step 2 (AgentCore vCPU/GB, Lambda MicroVMs, Fargate) plus Bedrock model token rates. For a
lambdaruntime use Lambda request pricing (invocations × duration × memory). Foreks, apply the EKS pricing rule above. Any runtime missing a cached anchor: setpricing_source: cached_staleand state the assumption. For answers, readanswers.json.units[<unit_id>](which is already fully resolved — system + unit dims merged).batch units (verdict from workload-classes.md: AWS Batch → Fargate compute; scheduled Lambda):
When
effective_runtime == "eks"(W1 existing-cluster reuse or a consolidation onto EKS): apply the EKS pricing rule above — NOT the AWS Batch / Fargate shape.AWS Batch (long runs, GPU, large memory): Fargate vCPU-hour + GB-hour × run count/month. State assumptions: run frequency, duration, vCPU/GB per run.
Scheduled Lambda (short runs ≤ 15 min): Lambda request pricing (invocations × duration × memory). State assumptions: schedule frequency, duration, memory.
light_io units (verdict: Lambda or Fargate behind ALB):
Lambda (spiky/scale-to-zero): request pricing (invocations/month × avg duration × memory). State assumptions: request volume, duration, memory.
Fargate (sustained high traffic): vCPU-hour + GB-hour for always-on service. State assumptions: vCPU/GB allocation, % utilization.
service units (verdict: Fargate ECS, or existing cluster reuse): Fargate vCPU-hour + GB-hour for long-running service. State assumptions: vCPU/GB allocation, % utilization. When
effective_runtime == "eks"(W1 existing-cluster reuse or a consolidation onto EKS), apply the EKS pricing rule above instead of the flat Fargate anchor.temporal_worker_poll units (verdict from Tier 1: ecs / eks / serverless_workers): estimate the polling tier and the execution tier separately per the cost table shape below. The polling tier is the worker-fleet compute, priced by
effective_runtime:effective_runtime == "ecs"(Fargate) → tens of $/month (small).effective_runtime == "eks"→ NOT automatically small; apply the EKS pricing rule above (this class is subject to it like any other): EKS-on-Fargate → the Fargate anchor, but EC2 managed nodes / Karpenter / Spot / GPU fleets → EC2 instance pricing, and a GPU worker fleet can run into hundreds–thousands of $/month, not "tens". State the node-capacity assumption.effective_runtime == "serverless_workers"→ Temporal Serverless Workers is Public Preview, not GA (labeled so regardless of any docs claim — the label has moved before without a GA announcement). Do NOT invent a cached anchor: give a qualitative fallback (state "Serverless Workers pricing is Public Preview / unverified — treated as a scale-to-zero execution-billed tier; confirm the published rate before committing") rather than a fabricated dollar band. Every other cost line for the unit still gets its band; only the SW polling line may be qualitative when the rate is unverified.
Charge ONLY the worker-fleet polling compute to the
temporal_worker_pollunit'smonthly_magnitude_usd. The execution tier (LLM tokens, AgentCore sessions, batch compute) is the cost of the ACTIVITY-class units, which are ALREADY costed as their ownunits{}entries and already intotal_monthly_magnitude_usd— do NOT also add execution cost into the worker unit or you DOUBLE-COUNT every Activity. The execution tier is USUALLY the dominant tier — same tokens as today (the migration moves them, it doesn't multiply them) — but do NOT assert dominance unconditionally: COMPARE the worker unit's polling band against the aggregate of the Activity units' bands (a comparison for the takeaway, NOT an addition). When Activity volume is low OR the polling fleet is on GPU/added EKS nodes (hundreds–thousands of $/mo), the polling tier can equal or exceed the aggregate Activity cost — say which dominates based on the numbers, or that they are comparable. For Temporal Cloud, derive actions line from user volume × $0.01/action when Way = cloud; self-hosted gets a qualitative-only ops line (no dollar figure). State assumptions per tier.The temporal cost table below:
Cost line Magnitude Note Polling tier (worker fleet: ECS / EKS / Serverless Workers) tens of $/mo on ECS-Fargate; EKS priced by node capacity (EC2/Spot/GPU can be hundreds+); Serverless Workers Public Preview → qualitative fallback small only on Fargate — size per the EKS pricing rule when effective_runtime==eks; SW rate unverified until confirmed Execution tier = the ACTIVITY units' own costs (already their own units{} entries) usually dominant — but compare, do NOT re-add same tokens as today; counted ONCE via the Activity units — never folded into the worker unit; compare vs polling Temporal Cloud actions (system-level orchestration) derive from the user's volume × $0.01/action new line vs self-hosted; or unchanged if already on Cloud What it replaces qualitative only self-hosted cluster ops burden — no dollar figure One takeaway sentence: on ECS-Fargate the execution tier dominates and the polling tier is noise — but on EKS with EC2/GPU nodes (or under low Activity volume) the polling fleet can be material or even dominant, so compare the two computed bands rather than assuming an order.
Important: Temporal Cloud actions are a SYSTEM-LEVEL cost (orchestration dispatches for ALL Activities), NOT attributable to any single unit — so do NOT fold them into any unit's
breakdown.otherormonthly_magnitude_usd. When Way = cloud, record them ONCE at the system level: add them intototal_monthly_magnitude_usdand surface them as their own assumption in the top-levelassumptions(e.g. "Temporal Cloud orchestration: N actions/mo × $0.01"). This is the estimate.json source for the report's system-level "— orchestration" roll-up row (generate-report.md); it is deliberately a system line, not a per-unit breakdown entry, because the per-unitbreakdownis fixed at{compute, model_tokens, other}. Way = self_hosted contributes no orchestration dollar line (qualitative ops burden only).
State every assumption per unit. Never present a precise total — always a band (e.g. "$10–30").
For each unit, also structure the components you just computed into a breakdown — don't flatten
them into the total: compute (runtime/request pricing: AgentCore or Lambda MicroVMs vCPU/GB,
Fargate, Lambda requests), model_tokens (Bedrock token costs — null for units that call no
models), and other (everything else: ALB, storage). Every component is a band, never precise —
EXCEPT when a component's rate is genuinely unverifiable (a Serverless Workers Public Preview
polling tier with no published cached rate): set that component to the string
"unverified" instead of a fabricated band, and reflect it in monthly_magnitude_usd — if the
unverified component is the only compute line, the unit's monthly_magnitude_usd is the band of
its remaining priced components plus a "+ unverified SW polling" suffix (e.g. "40-120 + unverified SW polling"), never a made-up total. State the unverified rate in that unit's
assumptions. All other units/components stay strict dollar bands.
Determinism note: this magnitude is computed in the LLM layer (convention-aligned with the migration skills, which also estimate in-skill). It is the one output that is NOT script-deterministic. Acceptable for v1 (magnitude-only, every assumption stated); flagged as a future candidate to move into a small deterministic script if precision is ever required.
Step 4 — Identify cost drivers per unit
For each unit, determine what moves the cost and which optimization levers apply. Emit one
drivers[] entry per unit with the shape:
{
"unit": "<unit_id>",
"driver": "<what moves the number>",
"effect": "<band per increment>",
"lever": "<from cost-levers.md, cited>"
}Load references/decision-refs/cost-levers.md and cite only the levers documented in that table.
Do not invent discounts or optimizations outside of the table.
driver: the primary cost input (e.g., "session count × avg duration", "batch runs/month", "model tokens", "request volume")
effect: order-of-magnitude impact per increment (e.g., "+$10-30 per 1k sessions", "+$5-15 per 100 batch runs")
lever: the applicable cost-optimization lever from cost-levers.md (e.g., "Model tier routing (Sonnet→Haiku for triage/simple items)", "Prompt caching", "Scale-to-zero runtimes"). Cite the lever name exactly as it appears in the table. If no lever applies, use
null.
IMPORTANT: Each driver's lever must be the cost-levers.md lever that actually fits THAT driver. Do not pick a legal-but-irrelevant lever. For example:
A batch/OCR compute-bound driver (e.g., "pages × duration") should use "Batch inference" or right-sizing levers, NOT "Scale-to-zero runtimes" (AWS Batch is already scale-to-zero).
An agent-session driver (e.g., "session count × duration") fits "Scale-to-zero runtimes" when traffic is spiky/idle-heavy.
Model token drivers fit "Model tier routing", "Prompt caching", or "Batch inference" depending on the workload's latency tolerance.
Example for an agent_session unit:
{
"unit": "ai-customer-support",
"driver": "session count × avg duration",
"effect": "+$10-30 per 1k sessions",
"lever": "Model tier routing (Sonnet→Haiku for triage/simple items)"
}Example for a batch unit:
{
"unit": "weekly-report-generator",
"driver": "batch runs/month",
"effect": "+$5-15 per 100 runs",
"lever": "Batch inference"
}Step 5 — Write estimate.json
Assemble per-unit estimates under units{}, compute the system total, populate the top-level
legacy mirror from the primary unit, and include the drivers[] array:
{
"units": {
"<unit_id>": {
"monthly_magnitude_usd": "50-150",
"breakdown": {
"compute": "10-30",
"model_tokens": "40-120",
"other": "0-5"
},
"assumptions": ["1000 sessions/mo, 5 min avg, 60% I/O wait"]
},
"<unit_id_2>": {
"monthly_magnitude_usd": "10-30",
"breakdown": {
"compute": "10-25",
"model_tokens": null,
"other": "0-5"
},
"assumptions": ["500 batch runs/mo, 10 min avg, 2 vCPU/4GB"]
}
},
"drivers": [
{
"unit": "<unit_id>",
"driver": "session count × avg duration",
"effect": "+$10-30 per 1k sessions",
"lever": "Model tier routing (Sonnet→Haiku for triage/simple items)"
},
{
"unit": "<unit_id_2>",
"driver": "batch runs/month",
"effect": "+$5-15 per 100 runs",
"lever": "Batch inference"
}
],
"total_monthly_magnitude_usd": "60-180",
"total_compute": "20-55",
"total_model": "40-120",
"total_other": "0-10",
"monthly_magnitude_usd": "50-150",
"pricing_source": "cached",
"assumptions": ["1000 sessions/mo, 5 min avg, 60% I/O wait"],
"note": "Order-of-magnitude only. For a precise estimate use the migration skills (gcp-to-aws or heroku-to-aws)."
}Legacy mirror (collapse + compatibility): the primary unit's monthly_magnitude_usd,
assumptions are ALSO written at the top level (exactly as today). The top-level
pricing_source and note apply to the entire estimate. total_monthly_magnitude_usd is the
sum of the units' band edges PLUS any system-level line not attributable to a single unit
(e.g. Temporal Cloud orchestration actions when Way = cloud), rounded to a clean band (e.g.,
units of 50-150 and 10-30 → total 60-180; add the orchestration band on top when present). The
system-level line is recorded in the top-level assumptions, never inside a unit's breakdown.
Also emit total_compute, total_model, total_other — the per-column sums of the units'
breakdown.compute / model_tokens / other bands (Generate renders these as the cost table's
Total row). Unverified handling (uniform across all three column totals AND
total_monthly_magnitude_usd): when a component is the string "unverified" (a Serverless
Workers Public Preview rate the MCP could not confirm) or null, EXCLUDE it from the numeric sum
and append a "+ unverified" suffix to that total's band (e.g. total_compute = "20-55 + unverified", and total_monthly_magnitude_usd likewise carries "+ unverified SW polling").
Never coerce an unverified component to $0 — an excluded-and-flagged band, never a silent drop.
Single-unit runs produce today's estimate.json plus a one-key units map (the collapse invariant:
single unit = today's behavior + additive units{} key).
Step 6 — Write state
Set phases.estimate = completed.
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.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download agent-advisor.zip