feat(advisor): port migration-to-aws skills into aws-startup-advisor - #206
Conversation
There was a problem hiding this comment.
[🤖 AI review 🤖]
Summary
Large consolidation PR (405 files, +51K/-2.3K) porting the 5 migration skills + 6 agents + CI tooling from migrate/plugins/migration-to-aws/ into advisor/plugins/aws-startup-advisor/. The scope is primarily additive (new skill copies) with surgical modifications to root CI, manifests, and existing advisor files. Overall well-structured — CI parameterization is sound, prefix rewrites are consistent, and the deleted stale migration-to-aws/ copy inside advisor is appropriate.
Findings
-
Blocking: Third-party MCP dependency (
sample-aws-pricing-calculator-mcp) — The.mcp.jsonadds a new stdio MCP server runningnpx -y sample-aws-pricing-calculator-mcp@latest. This is maintained by a single individual (frumania, info@frumania.com), has no repository URL, no homepage, and no visible AWS org affiliation. Consider pinning to a specific version instead of@latest(supply-chain risk) and/or adding a comment about provenance. -
Nit: Schema
$idURN still saysmigration-to-aws— The vendored schemas atskills/heroku-to-aws/references/vendored/*/andskills/shared/*/use URNurn:awslabs:startups:migration-to-aws:.... Per PR description this is intentional (namespace identity, not invocation prefix), but it could confuse contributors. A one-line comment in each schema noting this is the canonical URN namespace (not a skill reference) would help.
What looks good
- 27 invocation-prefix rewrites from
migration-to-aws:→aws-startup-advisor:are complete — no stalemigration-to-aws:invocation references remain in skill files. - Three-pass bandit scan correctly isolates per-plugin configs with proper exclusion logic.
- CI
mise.tomlparallelization validates both plugin trees with a single tool source. - Pricing cache refreshed to 2026-07-17 with Graviton ARM64 rows, Claude Fable 5/Sonnet 5/Opus 4.8, and EOL lifecycle updates.
- Proper phase-status schema evolution (
workshopsidebar added consistently). - Deleted stale
skills/migration-to-aws/is the old prose copy — no SKILL.md was lost.
Validation gaps
- Could not run
mise run buildor the full test suite (405-file PR exceeds API diff limit; no local checkout performed). PR description claims green CI locally. - No GitHub Actions status checks visible (empty
statusCheckRollup), so automated CI result cannot be verified. - The
temporal-docsHTTP MCP server (https://temporal.mcp.kapa.ai) is a third-party service — no availability/uptime SLA is documented.
Merge recommendation
Not yet merge-ready — pin sample-aws-pricing-calculator-mcp to an exact reviewed version before merge. Apart from this blocker, the port is scoped correctly for a major version bump.
|
Thanks for the review. Addressed both findings in 38ce478: 1. Blocking (pinned): 2. Nit (done): Added Re: validation gaps noted:
|
…dvisor Port the 5 migration skills (agent-advisor, gcp-to-aws, heroku-to-aws, llm-to-bedrock, tf-best-practices) + canonical shared/ + 6 agents + CI tooling into advisor/plugins/aws-startup-advisor, making it the consolidated plugin (v2.0.0). Delete the stale migration-to-aws skill (old prose copy). Changes beyond verbatim copy: - 27 invocation prefixes: migration-to-aws: -> aws-startup-advisor: - Prose/diagram relabels: platform-generic for compute handoffs, gcp-specific only where genuinely so (migration-plan engine, model-selection provenance) - .mcp.json: +temporal-docs, +aws-pricing-calculator (4 servers total) - Manifests (.claude/.codex/.cursor + marketplace): bumped to 2.0.0, expanded descriptions/keywords/defaultPrompts for the 9-skill consolidated plugin - CI tools parameterized by plugin path (one source, two validation targets) - mise.toml: all lint/validation tasks now run for both plugins - .github/workflows/security-scanners.yml: three-pass bandit - .checkov.yaml: advisor fixture skip-paths mirrored - JSON Schema $id: github.io URLs -> URN form (no Pages publishing exists) - advisor/README.md, AGENTS.md, setup.md: refreshed for 9-skill set - Root README: added aws-startup-advisor to Plugins table The standalone migration-to-aws plugin is intentionally left in place; retirement is a separate follow-up. Tested: mise run lint/fmt/security all green; agent-advisor pytest 230 pass; runtime-validated all 4 skills headlessly (gcp-to-aws 7-phase EXIT=0, heroku-to-aws 7-phase EXIT=0, llm-to-bedrock cross-skill delegation EXIT=0, agent-advisor DSL backbone EXIT=0); 3 adversarial review passes converged.
Address PR review findings: - BLOCKING: pin sample-aws-pricing-calculator-mcp from @latest to @1.2.8 (supply-chain risk — single-maintainer package, no repo URL). The source migration-to-aws plugin uses @latest but we improve on that here. - NIT: add $comment to the 4 JSON Schema files (2 canonical + 2 vendored) explaining the URN 'migration-to-aws' is a stable namespace identity, not a plugin name or skill invocation prefix. mise run build: green. shared:check: byte-identity holds.
38ce478 to
4ae3f40
Compare
|
The scheduled strict staleness gate didn't come along for the ride.
Not on fire yet - advisor's caches are dated 2026-07-17 and 2026-07-19 against 30-day windows, so the first one tips over on 2026-08-16. - name: Check pricing cache freshness (strict)
run: |
node migrate/plugins/migration-to-aws/tools/pricing-staleness.ts --strict
node advisor/plugins/aws-startup-advisor/tools/pricing-staleness.ts advisor/plugins/aws-startup-advisor --strictWorth noting the default shell is Header comment says "the migration-to-aws pricing caches" and wants the same touch-up. |
|
Heads up that this branch predates #200, #201 and #202, and it forks advisor copies of every I checked each fix against the advisor copies on From #201, in
This one has teeth: From #200, under
The effect is an From #202, in
Worth calling out that this PR also forks Simplest sequence is probably to let those three land first and rebase, rather than hand-porting |
|
|
|
Is it safer to rebase it before merge? It's 4 PRs behind |
|
Something worth knowing before this merges: the two merges from main don't mean what they look like they mean. The port copies the five skill trees to new paths under The fork point is
I checked these by blob-hash matching against upstream history rather than reading diffs, so the deliberate prefix rewrites don't muddy the count. The consequences worth acting on are inline: the RDS guidance, dyno halt, dyno types, the Opus 4.8 rate, the policy validator, plugin-root resolution, tool defaults. The stuff that's missing rather than stale
The other 7 never-ported files are the Why nothing caught any of thisI went looking for a gate that should have fired. The bigger issue is that the PR duplicates Two ways out, and I don't have a strong preference:
For this PR specifically I'd re-copy the five trees from current main and re-apply the 27 prefix rewrites, rather than hand-porting 32 files and hoping the list is complete. Worth watching on merge order#202 is a different shape to the four above - it's still open, so nothing is reverted yet. But it fixes One from my earlier comment
The consolidation itself is sound, and the CI parameterization is the good kind of fiddly. It's the drift I'd want cleared before this lands - as it stands it puts back four fixes from the last week, two of them security guidance and one a policy validator. |
…n drift gate Addresses PR review: the ported advisor copies were a pre-awslabs#195/awslabs#199/awslabs#200/awslabs#201 snapshot. Because the port copies files to new paths, git never conflicts on them, so merges from main came back clean while the copies silently drifted — reverting merged fixes and missing a whole feature. Re-copied all 5 skill trees + shared + agents + tools/tests/fixtures/scripts/docs fresh from the now-fixed migrate/ source, then re-applied the mechanical rewrites (27 invocation prefixes, repo paths, URN schema $ids + $comment, tool path params) and the semantic relabels (platform-generic compute handoffs, sibling repoints). Now current with these upstream fixes: - awslabs#201 Opus 4.8 fallback rate 0.005/0.025 (was 3x-high 0.015/0.075) - awslabs#200 eco/basic dyno rows in Fargate + EKS sizing, non-web asserter + fixture - awslabs#199 RDS interim-exposure guidance - awslabs#196/awslabs#197 tf-best-practices policy validator (IPv6 ingress, quoted ports) - awslabs#195 agent-advisor Model Recommend phase + seed.json (deterministic replay) New drift gate (tools/cross-plugin-drift.ts + mise drift:check, wired into lint): compares the two plugin copies directly, normalizing the intentional prefix/path/schema-id differences and allowlisting the 25 deliberately-divergent prose files. Fails loudly the next time a fix lands on one side only — verified it bites on a simulated unported change. Also: parameterized .github/workflows/pricing-staleness.yml for advisor (two steps so bash -e ordering can't mask the advisor pass; updated header comment). mise run build: green. drift:check: 250 identical, 25 allowlisted.
|
@ayn-builds thanks for the deep review — the copy-to-new-path drift analysis was exactly right. Addressed in Re-synced instead of hand-portingRather than hand-port the drifted files, I re-copied all 5 skill trees +
New cross-plugin drift gate (the structural fix)Added Current state: pricing-staleness workflow
On merge order (#202)#202 is still open and touches
|
…e vendored copy awslabs#206 landed today, consolidating the migration skills into aws-startup-advisor and adding a `drift:check` gate (advisor/.../tools/cross-plugin-drift.ts, wired into `mise run build`) that requires the two copies of each shared skill tree to be byte-identical after normalizing three intentional differences: the plugin-scoped invocation prefix, hardcoded repo paths, and the JSON Schema $id namespace form. This branch changed 26 files under the migrate trunk's gcp-to-aws and llm-to-bedrock trees, so the gate now reports them as drift — 21 differing plus 4 absent. An earlier revision of this branch carried an advisor port and dropped it deliberately, because at the time awslabs#206 was still open and renaming every one of those paths; carrying it would have produced rename/modify conflicts on all of them. That objection is gone now that awslabs#206 has merged. There is no automated cross-plugin sync: `shared:sync` covers within-plugin vendored trees, and cross-plugin-drift.ts is check-only. So 25 files are re-copied with the inverse of the gate's own normalize() applied, which makes the result correct by construction rather than by hand-editing. llm-to-bedrock/SKILL.md is handled separately because it is ALLOWLISTED — the gate permits it to diverge, so a blind copy would have silently dropped the advisor's deliberate wording. Diffing the two copies after normalization showed exactly one genuine divergence (the advisor text names the sibling `gcp-to-aws` skill explicitly) plus table column widths that follow from the longer plugin prefix. The port re-applies that one phrase and lets dprint restore the widths. Worth noting for future fixes: because SKILL.md sits on the allowlist, the gate will never flag it again. Both of this branch's SKILL.md fixes — Gate (a.5) prefix-matching `migration_path`, and the `mantle_deps_missing` B4/C3 rows — would otherwise have reached only the migrate side while the gate stayed green. Allowlist entries are permanent blind spots, which the tool's own comments acknowledge. Verification: `drift:check` reports OK (254 identical, 25 allowlisted across 6 skill trees) — 254 against awslabs#206's 250, the difference being the 4 new files. The ported advisor test suite runs green on its own (210 passed), matching the trunk.
…dvisor's vendored copies This branch predates awslabs#206's consolidation, so drift:check fails: 16 skill files (report-decision-core.md missing outright, 15 drifted — SKILL.md, design, discover-preview, estimate, feedback, five generate phase files, migration-complexity, schema-estimate-infra, validate-migration-report) carried the decision-report changes on the migrate side only. Synced via re-copy + the prefix/path/$id rewrites the tool normalizes. Also synced what drift:check cannot see — the advisor plugin's OWN copies outside skills/: scripts/validate-migration-report.py (decision mode: executive sections + CTA, appendices forbidden), tests/test_validate_migration_report.py, tools/run-asserters.py (the gcp-decision-gate asserter mapping), the updated reference fixtures, and the new fixtures/gcp-decision-gate/ tree. Without these the advisor plugin would validate decision reports with the pre-decision rules. The branch also merges feat/decision-gate (awslabs#185's current head — this PR stacks on it and CI needs its 11-file advisor sync) and main. Both suites 51/51, both asserter sets PASS, drift 252 identical, vendored-shared and dprint green.
Resolves the one true conflict (mise.toml lint:frontmatter task: this branch added gcp-to-aws to the migrate-plugin invocation list, main added the whole advisor-plugin invocation list via awslabs#206's port — kept both). Since this branch predates the awslabs#206 advisor consolidation, propagated this PR's changes to the advisor plugin's copies so both plugins stay in parity, matching the pattern _gates already uses (canonical + vendored, migrate + advisor): - skills/shared/dsl/INTERPRETER.md, skills/shared/workshop/workshop-invariants.md (advisor's canonical copies): added the _gates row/semantics, ported 1:1 from the migrate canonical (only diff was the pre-existing migration-to-aws: -> aws-startup-advisor: prefix rename) - skills/heroku-to-aws/references/phases/workshop/workshop.md: added _gates: generate (advisor's heroku workshop lacked it; vercel-to-aws doesn't exist in either plugin, matching this PR's note that vercel was removed on main in awslabs#179) - tools/frontmatter-validator/{parse,types,check}.ts: ported the same _gates parsing/typing/structural-check additions (advisor's validator is a per-plugin copy, not vendored-shared, so it hadn't received them) - tests/tools/frontmatter-validator.test.ts: ported the 5 new _gates test cases at the same position (62 pass, matching migrate's count) - mise.toml: added gcp-to-aws to advisor's lint:frontmatter invocation list for parity (0 frontmatter files today in both gcp-to-aws copies, same guarded-for-rollout state the PR already established for migrate) Ran `node .../sync-vendored-shared.ts --write` for both plugins after resolving: migrate 0 files changed (already in sync), advisor 4 files updated (heroku/agent-advisor/gcp-to-aws vendored copies picking up the _gates addition from canonical). Verified: advisor tsc --noEmit clean; advisor frontmatter-validator test suite 62/62 pass; full `mise run build` green (0 task failures).
Problem
The migration skills (
gcp-to-aws,heroku-to-aws,llm-to-bedrock,agent-advisor,tf-best-practices) currently live in a standalonemigration-to-awsplugin atmigrate/plugins/migration-to-aws/. A stale, outdated copy of one skill (migration-to-aws, the old prose gcp-to-aws) ships insideaws-startup-advisor. Leadership has asked for one canonical plugin —aws-startup-advisor— containing all skills, published to Claude Code, Codex, and Cursor.Solution
Port the 5 migration skills + canonical
shared/+ 6 agents + CI tooling intoadvisor/plugins/aws-startup-advisor/, making it the consolidated plugin (v2.0.0). The standalonemigration-to-awsplugin is intentionally left in place — retirement is a follow-up.What moved:
agent-advisor,gcp-to-aws,heroku-to-aws,llm-to-bedrock,tf-best-practices+ canonicalskills/shared/generic-phase-worker-rw,llm2bedrock-code-analyzer,-code-rewriter,-log-ingestor,-prompt-evaluator,-report-generatortools/(frontmatter-validator, sync-vendored-shared, fixtures-check, pricing-staleness, run-asserters),tests/,fixtures/,scripts/,docs/,bandit.yml,tsconfig.jsonWhat changed (not just copied):
migration-to-aws:→aws-startup-advisor:.mcp.json: addedtemporal-docs+aws-pricing-calculatorserversmise.tomlextended to validate both plugins in parallel.github/workflows/security-scanners.ymlbandit job: three-pass.checkov.yamlskip-paths mirrored for advisor fixtures$idURLs → URN form (no GitHub Pages publishing; avoids skills.sh flags per fix: replace github.io URLs to resolve skills.sh security scan flags #204)advisor/README.md,AGENTS.md,setup.mdrefreshed for the 9-skill pluginREADME.mdPlugins table now listsaws-startup-advisorDeleted:
advisor/plugins/aws-startup-advisor/skills/migration-to-aws/(stale old copy)Type of Change
Team Folder
advisor/.checkov.yaml,mise.toml,.github/workflows/,.claude-plugin/marketplace.json,README.md)Checklist
mise run buildlocally and it passes.checkov.yaml, its bandit pass in the CI workflow, and its entry inmarketplace.json)By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.
Testing performed
Static validation:
mise run buildgreen (lint:frontmatter ×4 roots, shared:check ×2, fixtures ×4, pricing ×2, types ×2, test 57 pass, fmt:check, full security suite)Runtime validation (headless Claude Code with
--plugin-dir):gcp-to-aws: 7-phase EXIT=0, 12 Terraform files + 4 scripts + docsheroku-to-aws: 7-phase EXIT=0, Beanstalk Terraform + CI/CD + pg_dump scriptllm-to-bedrock: EXIT=0, cross-skill delegation toaws-startup-advisor:gcp-to-awsprovenagent-advisor: 6-phase DSL backbone EXIT=0, scoring → AgentCore verdict, recommendation docAdversarial review (3 independent passes):
Design decisions
$idas URN — avoids skills.sh flags without breaking schema identityKnown items (intentional follow-up)
generic-phase-worker-ro/-gitin INTERPRETER.md docs but not shipped — pre-existing, no phase dispatches themaws.github.io/eks-chartsHelm URL — load-bearing, no github.com substitute