feat(gcp-to-aws): post-Estimate what-if workshop checkpoint - #154
Conversation
Port the Heroku workshop pattern for infra-route GCP migrations: freeze inventory, edit region/HA/compute/Graviton knobs, refresh Design+Estimate as artifact-only inner runs, and compare scenario snapshots. AI-only/billing-only runs skip the offer. Includes fixtures + asserter. Co-authored-by: Cursor <cursoragent@cursor.com>
…ixtures Inner Design skips state transition; sheet/refresh surface graviton_profile risk; SKILL resume never recomputes Estimate when workshop is pending; fixtures use real Q11b prompts and keep incompatible worker on x86. Co-authored-by: Cursor <cursoragent@cursor.com>
Review fixes landed (
|
Fresh-agent replay (house bar)Agent from
|
Add optional what-if-scenarios executive section from scenarios/index.json and enforce it in validate-migration-report.py when ≥2 workshop variants exist. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Stakeholder deliverable: what-if section in migration report
Commits: |
…g CI failures: ten files committed with dprint drift (fmt:check) and markdownlint MD025/MD029 (the fixtures README second H1; workshop-assemble's fenced block splitting an ordered list). mise run build now exits 0.
|
Follow-up on my review: confirmed d7dc26c addressed the resume/Graviton-caveat/fixture items, and the scenario report rendering (ead6b1f, 3de3532) sources knob columns from per-scenario preferences copies as it should. Pushed b19b57d: branch now passes |
… workshop-refresh 6b: after each snapshot, best-effort build_estimate via the aws-pricing-calculator MCP -> shareable calculator.aws URL stored as estimation_summary.calculator_url (null + one chat note on failure; never blocks). Compare table and the migration report's what-if section render the link. AWS computes regional prices server-side when opened -- the honest region answer. Aligns with awslabs#49's Estimate-phase calculator integration (same server, same degradation); server registration (.mcp.json) rides the heroku workshop branch.
|
Pushed fbea367 — shareable calculator.aws link per workshop scenario (refresh step 6b: best-effort |
Clean merge (no conflicts) bringing the branch up to current main (through awslabs#159). gcp-to-aws is the prose skill (no workshop fragment-id issue); shared:check OK, both DSL validators green, full mise build green.
Union-resolve fixtures/README.md registry: keep both gcp-workshop (this branch) and vercel-workshop (awslabs#153, now on main) entries. Full build green.
Brings the branch up to current main (through awslabs#153/awslabs#154/awslabs#159). Resolutions: - fixtures/README.md: union — keep heroku-workshop + vercel-workshop registry lines. - estimation-infra.schema.json (canonical + vendored): took main's generic workshop- metadata description (the 'heroku-to-aws pilot' note is stale now that vercel/gcp share the field); shared:sync keeps copies byte-identical. Full build green.
Union-resolve fixtures/README.md: all three workshop fixture registry lines (heroku-workshop, vercel-workshop, gcp-workshop) now coexist. Full build green.
…ode, vendored Merge-last PR: built from awslabs#152 + awslabs#153 + awslabs#154 (plus awslabs#148 via awslabs#152's lineage). After those merge, three near-identical copies of the workshop contract and the estimate Step 0 pricing-mode block would exist -- the exact drift pattern that produced the cached_stale enum bug and the vendored-edited-instead-of-canonical arm64 rates. - skills/shared/workshop/workshop-invariants.md (canonical): frozen discovery + fingerprint, checkpoint state semantics incl. the warm-start rule, the inner-runs allowed/forbidden contract, scenario store rules (max-5 warn-and-name eviction, working-tree==active, estimation_summary core fields), region honesty, and the calculator link procedure. Vendored into all three skills; gcp gains a references/vendored tree (now 4 skills under shared:check). - skills/shared/estimate/pricing-mode.md (canonical Step 0): cache staleness, MCP retry ladder, display modes, and the 5-rung pricing hierarchy incl. the estimated rung. heroku + vercel cost engines now execute the vendored copy as Step 0 instead of restating it; vercel keeps its skill-specific Step 0a-workshop knobs section. - Skill workshop files keep knobs/artifact names/engine refreshes and defer to the invariants file for every invariant (workshop.md hard rules note the canonical wins on disagreement; refresh inner-runs and 6b calculator sections are pointers with skill-specific lines only). - READMEs unioned across the three branches; canonical estimation-infra schema takes the workshop-metadata side + shared:sync. Validated: shared:check green across 4 vendored trees, fixtures-check green (123 json / 8 asserters / 10 seeds), all three workshop asserters PASS on the merged tree, frontmatter validation green, full mise build green.
…ode, vendored Merge-last PR: built from #152 + #153 + #154 (plus #148 via #152's lineage). After those merge, three near-identical copies of the workshop contract and the estimate Step 0 pricing-mode block would exist -- the exact drift pattern that produced the cached_stale enum bug and the vendored-edited-instead-of-canonical arm64 rates. - skills/shared/workshop/workshop-invariants.md (canonical): frozen discovery + fingerprint, checkpoint state semantics incl. the warm-start rule, the inner-runs allowed/forbidden contract, scenario store rules (max-5 warn-and-name eviction, working-tree==active, estimation_summary core fields), region honesty, and the calculator link procedure. Vendored into all three skills; gcp gains a references/vendored tree (now 4 skills under shared:check). - skills/shared/estimate/pricing-mode.md (canonical Step 0): cache staleness, MCP retry ladder, display modes, and the 5-rung pricing hierarchy incl. the estimated rung. heroku + vercel cost engines now execute the vendored copy as Step 0 instead of restating it; vercel keeps its skill-specific Step 0a-workshop knobs section. - Skill workshop files keep knobs/artifact names/engine refreshes and defer to the invariants file for every invariant (workshop.md hard rules note the canonical wins on disagreement; refresh inner-runs and 6b calculator sections are pointers with skill-specific lines only). - READMEs unioned across the three branches; canonical estimation-infra schema takes the workshop-metadata side + shared:sync. Validated: shared:check green across 4 vendored trees, fixtures-check green (123 json / 8 asserters / 10 seeds), all three workshop asserters PASS on the merged tree, frontmatter validation green, full mise build green. (#157) Co-authored-by: Logan Kleier <lkleier@amazon.com>
Summary
gcp-to-awsmigrations: freezegcp-resource-inventory.json, edit region/availability/kubernetes/Graviton knobs, refresh Design + Estimate as artifact-only inner runs, snapshot up to 5 scenarios, compare side-by-side.graviton_profilecarries risk-signal tiers, the sheet surfaces the caveat and the scenario label records it — never a silently optimistic reprice.Motivation: same as #152/#153 — Transform-style what-if for live SA workshops, one discovery run, multiple priced scenarios. GCP's twist is the checkpoint lives in the prose-orchestrated skill: checkpoint semantics are documented in
schema-phase-status.md, all phase-list templates gained theworkshopkey, and both Estimate (deferred advance + inner-run rules) and Design (inner-run rules) got explicit sections.Relationship to other PRs
discover.md's phase template near feat(gcp-to-aws): live discovery via the authenticated gcloud CLI (stacked on #148) #149's edits — one of the two will need a trivial rebase..mcp.json) rides feat(heroku-to-aws): post-Estimate what-if workshop checkpoint #152; degrades to silent-null here when unconfigured.Test plan
fixtures/gcp-workshop/(seed → graviton reprice after-state);python3 check_expected_workshop.py after-graviton-reprice→ PASS (inventory byte-frozen, fingerprint match, X86_64→ARM64 design flip, $95→$85 balanced, subset correct)fixtures:checkgreen; both seeds carry theworkshopphase keymise run buildgreen (branch previously failed fmt:check/markdownlint — fixed here)Made with Cursor