Skip to content
Merged
1 change: 1 addition & 0 deletions migrate/plugins/migration-to-aws/fixtures/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
Also see:

- `heroku-workshop/` — Heroku what-if workshop seed + arm64 reprice snapshot + `check_expected_workshop.py`
- `gcp-workshop/` — GCP what-if workshop seed + graviton reprice + `check_expected_workshop.py`
- `vercel-workshop/` — Vercel what-if workshop seed + outcome-B/x86 reprice + `check_expected_workshop.py`

## Migration report reference fixture
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# GCP what-if workshop fixtures

Infra-route pilot for `gcp-to-aws` (`references/phases/workshop/`).

| Path | Role |
| ---------------------------- | ----------------------------------------------------------------------------------------- |
| `seed/` | Post-Estimate baseline (`cpu_architecture=x86`, real Q11b prompt, mixed graviton_profile) |
| `after-graviton-reprice/` | After Apply with `graviton` + caveat (worker stays x86) |
| `check_expected_workshop.py` | Stdlib asserter |

```bash
python3 check_expected_workshop.py after-graviton-reprice
```

## House replay bar

Before merge: from `seed/`, enter workshop → set CPU architecture to `graviton`
(sheet must show the incompatible-worker caveat) → Apply & reprice → Compare →
asserter PASS. The committed `after-graviton-reprice/` was produced by that
mechanical path (inventory bytes frozen; worker remains `X86_64`;
`workshop.graviton_note` set). Prefer also a fresh-agent transcript on the PR.

## Merge coordination

Land **#149** (GCP live discovery) before or rebase this branch onto it — both
touch `discover.md`. Workshop PRs (#152 Heroku, #153 Vercel, #154 GCP) all edit
`fixtures/README.md`; expect small registry conflicts — last merger wins by
keeping all three bullets.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"migration_id": "0719-gcp-ws",
"last_updated": "2026-07-19T19:05:00Z",
"current_phase": "estimate",
"phases": {
"discover": "completed",
"clarify": "completed",
"design": "completed",
"estimate": "completed",
"workshop": "in_progress",
"generate": "pending",
"feedback": "pending"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"phase": "design",
"services": [
{
"aws_service": "ECS Fargate",
"source_resource_id": "run:web",
"aws_config": {
"cpu_architecture": "ARM64",
"region": "us-east-1"
},
"graviton": {
"compatibility": "ready",
"target_architecture": "arm64",
"selected": true
}
},
{
"aws_service": "ECS Fargate",
"source_resource_id": "run:worker",
"aws_config": {
"cpu_architecture": "X86_64",
"region": "us-east-1"
},
"graviton": {
"compatibility": "incompatible",
"target_architecture": "x86_64",
"selected": false
}
},
{
"aws_service": "RDS PostgreSQL",
"source_resource_id": "sql:main",
"aws_config": {
"instance_class": "db.t4g.micro",
"multi_az": false,
"region": "us-east-1"
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"phase": "estimate",
"pricing_source": {
"status": "cached"
},
"projected_costs": {
"aws_monthly_premium": 110.0,
"aws_monthly_balanced": 85.0,
"aws_monthly_optimized": 62.0
},
"complexity_tier": "small",
"recommendation": {
"path": "migrate_optimized",
"path_label": "Migrate optimized",
"migrate_if": [
"costs favor AWS"
],
"stay_if": [
"heavy custom networking"
]
},
"architecture_comparison": {
"graviton_monthly": 85.0,
"x86_equivalent_monthly": 95.0,
"savings_amount": 10.0,
"savings_percent": 10.5,
"note": "Partial Graviton: worker remains x86 (incompatible). Hourly savings only on ready services."
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"migration_id": "0719-gcp-ws",
"resources": [
{
"id": "run:web",
"type": "google_cloud_run_v2_service",
"name": "web"
},
{
"id": "run:worker",
"type": "google_cloud_run_v2_service",
"name": "worker"
},
{
"id": "sql:main",
"type": "google_sql_database_instance",
"name": "main"
}
],
"graviton_profile": [
{
"service_name": "web",
"tier": "ready",
"target_architecture": "arm64",
"signals": [
"python-3.11",
"no-native-extensions"
],
"caveats": [],
"source": "app_code"
},
{
"service_name": "worker",
"tier": "incompatible",
"target_architecture": "x86_64",
"signals": [
"platform: linux/amd64",
"native-c-extension"
],
"caveats": [
"Pinned linux/amd64 image; native extension lacks arm64 wheel"
],
"source": "app_code"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"design_constraints": {
"target_region": {
"value": "us-east-1",
"chosen_by": "default",
"question_id": "Q1",
"prompt": "Where are your users located?",
"design_consequence": "All resources deploy in us-east-1; Bedrock model availability checked for this region"
},
"availability": {
"value": "single-az",
"chosen_by": "default",
"question_id": "Q6",
"prompt": "What level of uptime does your application require?",
"design_consequence": "single-az drives RDS single-AZ vs Multi-AZ vs Aurora selection"
},
"kubernetes": {
"value": "ecs-fargate",
"chosen_by": "user",
"question_id": "Q8",
"prompt": "How do you feel about Kubernetes?",
"design_consequence": "ecs-fargate selects EKS vs ECS Fargate vs mixed posture"
},
"cpu_architecture": {
"value": "graviton",
"chosen_by": "user",
"question_id": "Q11b",
"prompt": "Some of your services have ARM64 compatibility considerations. Graviton (ARM64) instances are ~15\u201320% cheaper per hour. Your Python workloads appear compatible; worker has a linux/amd64 pin and native C extension. How would you like to proceed?",
"design_consequence": "Graviton for ready + conditional services; x86 only for incompatible ones (worker stays x86)"
}
},
"workshop": {
"active": true,
"last_sheet_at": "2026-07-19T19:05:00Z",
"active_scenario_id": "scenario-002",
"graviton_note": "1 incompatible \u2014 graviton applies where tier: ready; incompatible entries stay x86"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"baseline_scenario_id": "scenario-001",
"active_scenario_id": "scenario-002",
"max_scenarios": 5,
"inventory_fingerprint": "816eb4c04f8d719c01705a86f250f1292937fa13533db7d38173d4182adf84ee",
"scenarios": [
{
"scenario_id": "scenario-001",
"label": "baseline",
"created_at": "2026-07-19T18:30:00Z",
"source": "baseline",
"manifest": "scenarios/scenario-001.json"
},
{
"scenario_id": "scenario-002",
"label": "graviton (caveat: 1 incompatible \u2014 graviton applies where tier: ready; incompatible entries stay x86)",
"created_at": "2026-07-19T19:05:00Z",
"source": "workshop",
"manifest": "scenarios/scenario-002.json"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"phase": "design",
"services": [
{
"aws_service": "ECS Fargate",
"source_resource_id": "run:web",
"aws_config": {
"cpu_architecture": "X86_64",
"region": "us-east-1"
},
"graviton": {
"compatibility": "ready",
"target_architecture": "arm64",
"selected": false
}
},
{
"aws_service": "ECS Fargate",
"source_resource_id": "run:worker",
"aws_config": {
"cpu_architecture": "X86_64",
"region": "us-east-1"
},
"graviton": {
"compatibility": "incompatible",
"target_architecture": "x86_64",
"selected": false
}
},
{
"aws_service": "RDS PostgreSQL",
"source_resource_id": "sql:main",
"aws_config": {
"instance_class": "db.t4g.micro",
"multi_az": false,
"region": "us-east-1"
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"phase": "estimate",
"pricing_source": {
"status": "cached"
},
"projected_costs": {
"aws_monthly_premium": 120.0,
"aws_monthly_balanced": 95.0,
"aws_monthly_optimized": 70.0
},
"complexity_tier": "small",
"recommendation": {
"path": "migrate_optimized",
"path_label": "Migrate optimized",
"migrate_if": [
"costs favor AWS"
],
"stay_if": [
"heavy custom networking"
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"scenario_id": "scenario-001",
"label": "baseline",
"created_at": "2026-07-19T18:30:00Z",
"source": "baseline",
"preferences_subset": {},
"estimation_summary": {
"aws_monthly_premium": 120.0,
"aws_monthly_balanced": 95.0,
"aws_monthly_optimized": 70.0,
"complexity_tier": "small",
"pricing_source": "cached",
"region_note": null
},
"paths": {
"preferences": "scenarios/scenario-001.preferences.json",
"aws_design": "scenarios/scenario-001.aws-design.json",
"estimation_infra": "scenarios/scenario-001.estimation-infra.json"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"design_constraints": {
"target_region": {
"value": "us-east-1",
"chosen_by": "default",
"question_id": "Q1",
"prompt": "Where are your users located?",
"design_consequence": "All resources deploy in us-east-1; Bedrock model availability checked for this region"
},
"availability": {
"value": "single-az",
"chosen_by": "default",
"question_id": "Q6",
"prompt": "What level of uptime does your application require?",
"design_consequence": "single-az drives RDS single-AZ vs Multi-AZ vs Aurora selection"
},
"kubernetes": {
"value": "ecs-fargate",
"chosen_by": "user",
"question_id": "Q8",
"prompt": "How do you feel about Kubernetes?",
"design_consequence": "ecs-fargate selects EKS vs ECS Fargate vs mixed posture"
},
"cpu_architecture": {
"value": "x86",
"chosen_by": "user",
"question_id": "Q11b",
"prompt": "Some of your services have ARM64 compatibility considerations. Graviton (ARM64) instances are ~15\u201320% cheaper per hour. Your Python workloads appear compatible; worker has a linux/amd64 pin and native C extension. How would you like to proceed?",
"design_consequence": "x86 everywhere; forgoes the ~15\u201320% hourly discount on eligible compute"
}
},
"workshop": {
"active": true,
"last_sheet_at": "2026-07-19T18:30:00Z",
"active_scenario_id": "scenario-001"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"phase": "design",
"services": [
{
"aws_service": "ECS Fargate",
"source_resource_id": "run:web",
"aws_config": {
"cpu_architecture": "ARM64",
"region": "us-east-1"
},
"graviton": {
"compatibility": "ready",
"target_architecture": "arm64",
"selected": true
}
},
{
"aws_service": "ECS Fargate",
"source_resource_id": "run:worker",
"aws_config": {
"cpu_architecture": "X86_64",
"region": "us-east-1"
},
"graviton": {
"compatibility": "incompatible",
"target_architecture": "x86_64",
"selected": false
}
},
{
"aws_service": "RDS PostgreSQL",
"source_resource_id": "sql:main",
"aws_config": {
"instance_class": "db.t4g.micro",
"multi_az": false,
"region": "us-east-1"
}
}
]
}
Loading
Loading