feat(#653): Phase 1 — remove AWS IaC modules from workflow core#657
Conversation
Force-cutover of 6 AWS IaC modules to workflow-plugin-aws v0.2.0. Key divergence from #617: cloud_account_aws.go stays (AWSConfigProvider used by Phase 2 out-of-scope files). platform.dns module type stays; only Route53 backend is removed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Fixes: infra.autoscaling_group missing from core (C-1), platform.dns validate-path guard gap (C-2), step count 15 not 16 (I-1), example/go.mod tidy + grep gate (I-2), platform.dns schema description stale (I-3), T1 file list ambiguity (m-1), T2 backend alternative justification (m-2), T3 DNS row keep/remove clarity (m-3). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add module/app_container.go as partial-edit target in T1: move ECSContainer struct in from platform_ecs.go, remove case *PlatformECS type switch branch, update default error message. - Record cycle 2 findings in adversarial review history. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ix refinement) After removing case *PlatformECS, all ECS-specific structs and methods in app_container.go become dead code. Design updated to remove them entirely rather than leave dead code in place. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix schema: infra.autoscaling_group auto-generated from infraTypes, no manual module_schema.go entry needed. - Add app_container.go comment lines to string-update list. - Record cycle 3 PASS in adversarial review history. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 tasks, single PR. Covers: - T1: delete 14 files + app_container.go C-3 fix + regression gate - T2: replace Route53 backend with migration error stub - T3: strip registration sites + add infra.autoscaling_group - T4: internal/legacyaws + migration errors in engine + wfctl - T5: modernize legacy-aws-types rule + migration doc - T6: go mod tidy + CI grep gate Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…cycle 1) - T2: Init() succeeds for provider:aws (factory returns struct not error); migration error fires at Plan() time — fix test to call m.Plan() not m.Init(); fix mock import (module.NewMockApplication not mock.); remove deleted Route53 tests from file list - T4: replace nonexistent minimalConfigWithModule() with newIsolatedEngine(t) + config.WorkflowConfig pattern from engine_legacy_do_migration_test.go; fix package (workflow not workflow_test); fix Create() call to 4-arg signature; add PluginLoaded variant mirroring DO test Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- T5 test used nonexistent findRule/check/fix helpers and wrong package (modernize_test); actual pattern is package modernize, direct legacyAWSRule() call, yaml.Unmarshal + rule.Check/Fix — mirrors legacy_do_rule_test.go exactly - Remove duplicate "Add to pipeline step registry tests" paragraph - Fix yaml.Marshal round-trip in Fix test to match actual pattern Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove platform.ecs, platform.networking, platform.apigateway, platform.autoscaling module types and their 15 step types (ecs/apigw/scaling/network) from all registration sites: plugins/platform, schema/schema.go, schema/module_schema.go, schema/step_schema_builtins.go, cmd/wfctl/type_registry.go. Add infra.autoscaling_group to plugins/infra and type_registry.go. Update DOCUMENTATION.md with AWS IaC removal notice + infra.autoscaling_group row. Fix multi_region.go error string to reference infra.container_service. Regenerate schema/testdata/editor-schemas.golden.json. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Create internal/legacyaws/types.go mirroring internal/legacydo/types.go. Maps 4 removed module types (platform.ecs/networking/apigateway/autoscaling) and 15 removed step types to their infra.*/step.iac_* successors. RemovedInVersion = v0.53.0. Wire into engine.go, cmd/wfctl/validate.go, cmd/wfctl/ci_validate.go: - extra schema module types list includes legacyaws.ModuleTypes - post-validate sweep checks legacyaws.IsModuleType / IsStepType - actionable FormatModuleError / FormatStepError returned on match Remove 15 legacy step entries from cmd/wfctl/type_registry.go KnownStepTypes(). Tests: engine_legacyaws_test.go (plugin not loaded + plugin loaded branches) + cmd/wfctl/legacy_aws_types_removed_test.go (registry absent + validate/ci_validate paths). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add modernize/legacy_aws_rule.go mirroring legacy_do_rule.go: - ID: legacy-aws-types, Severity: error - Auto-fixes: platform.ecs→infra.container_service, platform.apigateway→infra.api_gateway, platform.autoscaling→infra.autoscaling_group - Flags but does not auto-fix: platform.networking (1→2 split) + all 15 step types (config key shape mismatch: platform + state_store vs legacy service/gateway/scaling keys) - Uses walkTypeNodes helper from legacy_do_rule.go (same package) Register legacyAWSRule() in modernize/modernize.go AllRules() list. Add docs/migrations/v0.53.0-aws-iac-removal.md with full migration recipe (install plugin, modernize, add provider, manual rewrites for networking + steps). Tests: TestLegacyAWSRule_Rewrites (3 auto-fixable types) + TestLegacyAWSRule_GapTypesFlaggedNotRewritten (networking + 6 step types). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
go mod tidy drops 3 freed AWS SDK packages: - service/apigatewayv2 (was platform.apigateway) - service/applicationautoscaling (was platform.autoscaling) - service/route53 (was platform.dns Route53 backend) Also tidy example/go.mod. Add aws-sdk-banned CI job to .github/workflows/ci.yml mirroring the godo-banned job: grep-gates both *.go imports and go.mod entries for the three freed service paths, excluding aws_absent_test.go. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
TestModernizeAllRulesRegistered: expected 9 rules → 10 (add legacy-aws-types). TestKnownStepTypesPopulated: remove 15 legacy AWS step entries from expected list (step.ecs_*/step.network_*/step.apigw_*/step.scaling_* all removed from KnownStepTypes). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Removes legacy AWS IaC functionality (ECS, VPC networking, API Gateway, autoscaling) from workflow core and shifts users onto the generic infra.* + step.iac_* model backed by workflow-plugin-aws, with migration-time guardrails (actionable errors, modernize rule, docs) and CI bans for the freed AWS SDK service packages.
Changes:
- Deleted
platform.ecs/platform.networking/platform.apigateway/platform.autoscalingmodules and their associated pipeline step types and tests. - Replaced the
platform.dnsAWS Route53 backend with a migration-error backend that fails atPlan/Apply/Status/Destroy. - Added legacy-AWS type detection + migration messaging (
internal/legacyaws), awfctl modernizerule, migration docs, and CI/test gates to prevent reintroducing the removed AWS SDK packages.
Reviewed changes
Copilot reviewed 48 out of 50 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| schema/testdata/editor-schemas.golden.json | Updates editor schema golden to reflect removed AWS platform module/step types and updated descriptions. |
| schema/step_schema_builtins.go | Removes built-in step schemas for deleted AWS platform steps. |
| schema/schema.go | Removes deleted AWS platform module/step type strings from the core type list. |
| schema/module_schema.go | Removes deleted AWS platform module schemas; updates platform.dns and app.container descriptions. |
| plugins/platform/plugin.go | Drops factories and manifest type lists for deleted AWS platform modules/steps; updates descriptions. |
| plugins/platform/plugin_test.go | Updates expected factory lists to reflect removed AWS platform types. |
| plugins/infra/plugin.go | Adds infra.autoscaling_group to the infra plugin’s supported abstract resource types. |
| module/platform_networking_test.go | Deletes tests for removed platform.networking module and steps. |
| module/platform_ecs.go | Deletes platform.ecs implementation. |
| module/platform_ecs_test.go | Deletes tests for removed platform.ecs module and steps. |
| module/platform_dns.go | Switches AWS DNS backend registration to the new migration-error backend. |
| module/platform_dns_test.go | Adds coverage asserting AWS backend now returns actionable migration errors. |
| module/platform_dns_backends.go | Removes Route53 implementation; adds awsRoute53ErrorBackend migration-error backend. |
| module/platform_aws_integration_test.go | Deletes AWS integration tests that relied on removed modules/backends. |
| module/platform_autoscaling.go | Deletes platform.autoscaling implementation. |
| module/platform_autoscaling_test.go | Deletes tests for removed platform.autoscaling module and steps. |
| module/platform_apigateway.go | Deletes platform.apigateway implementation. |
| module/platform_apigateway_test.go | Deletes tests for removed platform.apigateway module and steps. |
| module/pipeline_step_networking.go | Deletes networking pipeline steps tied to removed module. |
| module/pipeline_step_ecs.go | Deletes ECS pipeline steps tied to removed module. |
| module/pipeline_step_autoscaling.go | Deletes autoscaling pipeline steps tied to removed module. |
| module/pipeline_step_apigateway.go | Deletes API Gateway pipeline steps tied to removed module. |
| module/multi_region.go | Updates error messaging to remove references to deleted platform.ecs. |
| module/aws_api_gateway.go | Deletes AWSAPIGateway helper module. |
| module/aws_absent_test.go | Adds regression test preventing reintroduction of removed AWS SDK service imports under module/. |
| module/app_container.go | Removes ECS backend support from app.container and updates user-facing messaging. |
| module/api_gateway_test.go | Removes tests for the deleted AWSAPIGateway helper. |
| modernize/modernize.go | Registers the new legacy AWS modernize rule. |
| modernize/legacy_aws_rule.go | Adds legacy-aws-types rule to rewrite/flag removed AWS module and step types. |
| modernize/legacy_aws_rule_test.go | Adds tests for legacy AWS rule behavior (rewrite vs manual). |
| internal/legacyaws/types.go | Introduces centralized legacy AWS type maps and migration error formatters. |
| go.mod | Removes freed AWS SDK service dependencies from the root module. |
| go.sum | Removes freed AWS SDK service checksums from the root module. |
| example/go.mod | Removes freed AWS SDK service dependencies from the example module. |
| example/go.sum | Removes freed AWS SDK service checksums from the example module. |
| engine.go | Allows legacy AWS module types through schema validation and emits actionable migration errors at build time. |
| engine_legacyaws_test.go | Adds tests asserting actionable legacy-AWS migration errors in engine build path. |
| DOCUMENTATION.md | Removes deleted module/step docs; documents AWS IaC cutover and adds infra.autoscaling_group. |
| docs/plans/2026-05-13-issue-653-phase1-aws-cutover.md.scope-lock | Adds scope lock for the plan document. |
| docs/migrations/v0.53.0-aws-iac-removal.md | Adds migration guide for v0.53.0 AWS IaC removal. |
| cmd/wfctl/validate.go | Extends validation to allow legacy AWS types through schema but fail with actionable migration errors. |
| cmd/wfctl/ci_validate.go | Extends CI validation to accumulate actionable legacy AWS module/step errors. |
| cmd/wfctl/type_registry.go | Removes legacy AWS platform types; adds infra.autoscaling_group to wfctl’s known type registry. |
| cmd/wfctl/type_registry_test.go | Updates type registry tests to match removed AWS step types. |
| cmd/wfctl/modernize_test.go | Asserts new legacy-aws-types modernize rule is registered. |
| cmd/wfctl/legacy_aws_types_removed_test.go | Adds regression tests that legacy AWS types don’t leak back and validate emits actionable errors. |
| .github/workflows/ci.yml | Adds CI job banning imports and go.mod entries for removed AWS SDK service packages. |
⏱ Benchmark Results✅ No significant performance regressions detected. benchstat comparison (baseline → PR)
|
Codecov Report❌ Patch coverage is
📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 48 out of 50 changed files in this pull request and generated 6 comments.
Comments suppressed due to low confidence (1)
docs/migrations/v0.53.0-aws-iac-removal.md:179
- In this
infra.dnsexample, theproviderfield is shown asaws, butinfra.*modules expectconfig.providerto be the service name of aniac.providermodule (e.g.aws-provider). Usingprovider: awswill fail unless the config also defines aniac.providermodule namedaws. Please adjust the snippet to use a provider module name (and optionally show its definition).
modules:
- name: my_dns
type: infra.dns
config:
provider: aws
| external plugin. After loading the plugin, use the generic `infra.*` module | ||
| types with `provider: digitalocean` and the generic `step.iac_*` pipeline | ||
| steps. See [v0.52.0 migration guide](docs/migrations/v0.52.0-godo-removal.md). | ||
|
|
||
| **AWS IaC modules** (`platform.ecs`, `platform.networking`, `platform.apigateway`, `platform.autoscaling`) were removed from workflow core in v0.53.0 and are provided by the | ||
| [workflow-plugin-aws](https://github.com/GoCodeAlone/workflow-plugin-aws) v0.2.0+ plugin. | ||
| Use the generic `infra.*` module types with `provider: aws` and `step.iac_*` pipeline steps. | ||
| See [v0.53.0 migration guide](docs/migrations/v0.53.0-aws-iac-removal.md). | ||
| | `iac.provider` | Cloud provider configuration (aws, gcp, azure, digitalocean) for IaC operations | platform | |
| 3. **Add `provider: aws` to each rewritten module's `config:` block.** The | ||
| modernize rule does NOT auto-inject this key. Example: | ||
|
|
||
| Before: | ||
| ```yaml |
| b.WriteString(pluginLine) | ||
| b.WriteString("\n\nMigrate this module to: ") | ||
| b.WriteString(successor) | ||
| b.WriteString(" (provider: aws)\n\nFull mapping:\n") |
| out = append(out, Finding{ | ||
| RuleID: "legacy-aws-types", | ||
| Line: typeVal.Line, | ||
| Message: fmt.Sprintf("%s removed in %s; rewrite to %s (provider: aws) — requires workflow-plugin-aws v0.2.0+", typeVal.Value, legacyaws.RemovedInVersion, successor), |
| m.platformType = "ecs" | ||
| default: | ||
| return fmt.Errorf("app.container %q: environment %q is not a platform.kubernetes or platform.ecs module (got %T)", m.name, envName, svc) | ||
| return fmt.Errorf("app.container %q: environment %q is not a platform.kubernetes module (got %T); platform.ecs was removed — use infra.container_service with workflow-plugin-aws", m.name, envName, svc) |
| "infra.iam_role", | ||
| "infra.storage", | ||
| "infra.certificate", | ||
| "infra.autoscaling_group", | ||
| } |
* docs(#653): design doc for Phase 1 AWS IaC cutover Force-cutover of 6 AWS IaC modules to workflow-plugin-aws v0.2.0. Key divergence from #617: cloud_account_aws.go stays (AWSConfigProvider used by Phase 2 out-of-scope files). platform.dns module type stays; only Route53 backend is removed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs(#653): revise design doc per adversarial review cycle 1 Fixes: infra.autoscaling_group missing from core (C-1), platform.dns validate-path guard gap (C-2), step count 15 not 16 (I-1), example/go.mod tidy + grep gate (I-2), platform.dns schema description stale (I-3), T1 file list ambiguity (m-1), T2 backend alternative justification (m-2), T3 DNS row keep/remove clarity (m-3). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: fix C-3 in aws-cutover design (app_container.go compile break) - Add module/app_container.go as partial-edit target in T1: move ECSContainer struct in from platform_ecs.go, remove case *PlatformECS type switch branch, update default error message. - Record cycle 2 findings in adversarial review history. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: remove dead ECS code from app_container.go in design (cycle 2 fix refinement) After removing case *PlatformECS, all ECS-specific structs and methods in app_container.go become dead code. Design updated to remove them entirely rather than leave dead code in place. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: adversarial cycle 3 PASS — finalize aws-cutover design - Fix schema: infra.autoscaling_group auto-generated from infraTypes, no manual module_schema.go entry needed. - Add app_container.go comment lines to string-update list. - Record cycle 3 PASS in adversarial review history. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs(#653): implementation plan for Phase 1 AWS IaC cutover 6 tasks, single PR. Covers: - T1: delete 14 files + app_container.go C-3 fix + regression gate - T2: replace Route53 backend with migration error stub - T3: strip registration sites + add infra.autoscaling_group - T4: internal/legacyaws + migration errors in engine + wfctl - T5: modernize legacy-aws-types rule + migration doc - T6: go mod tidy + CI grep gate Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(plan#653): fix T2 DNS test assertion + T4 test stub (adversarial cycle 1) - T2: Init() succeeds for provider:aws (factory returns struct not error); migration error fires at Plan() time — fix test to call m.Plan() not m.Init(); fix mock import (module.NewMockApplication not mock.); remove deleted Route53 tests from file list - T4: replace nonexistent minimalConfigWithModule() with newIsolatedEngine(t) + config.WorkflowConfig pattern from engine_legacy_do_migration_test.go; fix package (workflow not workflow_test); fix Create() call to 4-arg signature; add PluginLoaded variant mirroring DO test Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(plan#653): fix T5 modernize test stub (adversarial cycle 2) - T5 test used nonexistent findRule/check/fix helpers and wrong package (modernize_test); actual pattern is package modernize, direct legacyAWSRule() call, yaml.Unmarshal + rule.Check/Fix — mirrors legacy_do_rule_test.go exactly - Remove duplicate "Add to pipeline step registry tests" paragraph - Fix yaml.Marshal round-trip in Fix test to match actual pattern Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: lock scope for issue-653-aws-iac-cutover (alignment passed) * feat(#653): T1 — delete legacy AWS IaC module files + regression gate * feat(#653): T2 — replace Route53 backend with migration error stub * feat(#653): strip registration sites + add infra.autoscaling_group (T3) Remove platform.ecs, platform.networking, platform.apigateway, platform.autoscaling module types and their 15 step types (ecs/apigw/scaling/network) from all registration sites: plugins/platform, schema/schema.go, schema/module_schema.go, schema/step_schema_builtins.go, cmd/wfctl/type_registry.go. Add infra.autoscaling_group to plugins/infra and type_registry.go. Update DOCUMENTATION.md with AWS IaC removal notice + infra.autoscaling_group row. Fix multi_region.go error string to reference infra.container_service. Regenerate schema/testdata/editor-schemas.golden.json. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(#653): add legacyaws package + wire migration errors (T4) Create internal/legacyaws/types.go mirroring internal/legacydo/types.go. Maps 4 removed module types (platform.ecs/networking/apigateway/autoscaling) and 15 removed step types to their infra.*/step.iac_* successors. RemovedInVersion = v0.53.0. Wire into engine.go, cmd/wfctl/validate.go, cmd/wfctl/ci_validate.go: - extra schema module types list includes legacyaws.ModuleTypes - post-validate sweep checks legacyaws.IsModuleType / IsStepType - actionable FormatModuleError / FormatStepError returned on match Remove 15 legacy step entries from cmd/wfctl/type_registry.go KnownStepTypes(). Tests: engine_legacyaws_test.go (plugin not loaded + plugin loaded branches) + cmd/wfctl/legacy_aws_types_removed_test.go (registry absent + validate/ci_validate paths). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(#653): add legacy-aws-types modernize rule + migration guide (T5) Add modernize/legacy_aws_rule.go mirroring legacy_do_rule.go: - ID: legacy-aws-types, Severity: error - Auto-fixes: platform.ecs→infra.container_service, platform.apigateway→infra.api_gateway, platform.autoscaling→infra.autoscaling_group - Flags but does not auto-fix: platform.networking (1→2 split) + all 15 step types (config key shape mismatch: platform + state_store vs legacy service/gateway/scaling keys) - Uses walkTypeNodes helper from legacy_do_rule.go (same package) Register legacyAWSRule() in modernize/modernize.go AllRules() list. Add docs/migrations/v0.53.0-aws-iac-removal.md with full migration recipe (install plugin, modernize, add provider, manual rewrites for networking + steps). Tests: TestLegacyAWSRule_Rewrites (3 auto-fixable types) + TestLegacyAWSRule_GapTypesFlaggedNotRewritten (networking + 6 step types). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(#653): go mod tidy + add aws-sdk-banned CI gate (T6) go mod tidy drops 3 freed AWS SDK packages: - service/apigatewayv2 (was platform.apigateway) - service/applicationautoscaling (was platform.autoscaling) - service/route53 (was platform.dns Route53 backend) Also tidy example/go.mod. Add aws-sdk-banned CI job to .github/workflows/ci.yml mirroring the godo-banned job: grep-gates both *.go imports and go.mod entries for the three freed service paths, excluding aws_absent_test.go. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(#653): update wfctl test fixtures for removed AWS step types TestModernizeAllRulesRegistered: expected 9 rules → 10 (add legacy-aws-types). TestKnownStepTypesPopulated: remove 15 legacy AWS step entries from expected list (step.ecs_*/step.network_*/step.apigw_*/step.scaling_* all removed from KnownStepTypes). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(#653): fix nilerr lint in aws_absent_test.go * fix(#653): correct platform.dns ConfigKeys: zone+records not domain * docs: post-merge retro for issue #653 AWS IaC removal (PR #657) --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Resolves merge conflicts from Phase 1 PR #657 merging into main: - ci.yml: incorporate main's --exclude-dir flags for worktree paths while keeping Phase 2's broader repo scope + service/eks split gate. - schema/schema.go: keep blank-line removals from Phase 2 review fixes. - module/aws_absent_test.go: keep Phase 2's codebuild+eks freed additions + the parseErr t.Logf improvement from round-2 review. - example/go.mod + go.sum: go mod tidy after reconciling; service/codebuild absent (no importers), service/eks absent from example (transitively included via main module which still imports it via platform/provider). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs(#653): design doc for Phase 1 AWS IaC cutover Force-cutover of 6 AWS IaC modules to workflow-plugin-aws v0.2.0. Key divergence from #617: cloud_account_aws.go stays (AWSConfigProvider used by Phase 2 out-of-scope files). platform.dns module type stays; only Route53 backend is removed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs(#653): revise design doc per adversarial review cycle 1 Fixes: infra.autoscaling_group missing from core (C-1), platform.dns validate-path guard gap (C-2), step count 15 not 16 (I-1), example/go.mod tidy + grep gate (I-2), platform.dns schema description stale (I-3), T1 file list ambiguity (m-1), T2 backend alternative justification (m-2), T3 DNS row keep/remove clarity (m-3). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: fix C-3 in aws-cutover design (app_container.go compile break) - Add module/app_container.go as partial-edit target in T1: move ECSContainer struct in from platform_ecs.go, remove case *PlatformECS type switch branch, update default error message. - Record cycle 2 findings in adversarial review history. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: remove dead ECS code from app_container.go in design (cycle 2 fix refinement) After removing case *PlatformECS, all ECS-specific structs and methods in app_container.go become dead code. Design updated to remove them entirely rather than leave dead code in place. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: adversarial cycle 3 PASS — finalize aws-cutover design - Fix schema: infra.autoscaling_group auto-generated from infraTypes, no manual module_schema.go entry needed. - Add app_container.go comment lines to string-update list. - Record cycle 3 PASS in adversarial review history. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs(#653): implementation plan for Phase 1 AWS IaC cutover 6 tasks, single PR. Covers: - T1: delete 14 files + app_container.go C-3 fix + regression gate - T2: replace Route53 backend with migration error stub - T3: strip registration sites + add infra.autoscaling_group - T4: internal/legacyaws + migration errors in engine + wfctl - T5: modernize legacy-aws-types rule + migration doc - T6: go mod tidy + CI grep gate Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(plan#653): fix T2 DNS test assertion + T4 test stub (adversarial cycle 1) - T2: Init() succeeds for provider:aws (factory returns struct not error); migration error fires at Plan() time — fix test to call m.Plan() not m.Init(); fix mock import (module.NewMockApplication not mock.); remove deleted Route53 tests from file list - T4: replace nonexistent minimalConfigWithModule() with newIsolatedEngine(t) + config.WorkflowConfig pattern from engine_legacy_do_migration_test.go; fix package (workflow not workflow_test); fix Create() call to 4-arg signature; add PluginLoaded variant mirroring DO test Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(plan#653): fix T5 modernize test stub (adversarial cycle 2) - T5 test used nonexistent findRule/check/fix helpers and wrong package (modernize_test); actual pattern is package modernize, direct legacyAWSRule() call, yaml.Unmarshal + rule.Check/Fix — mirrors legacy_do_rule_test.go exactly - Remove duplicate "Add to pipeline step registry tests" paragraph - Fix yaml.Marshal round-trip in Fix test to match actual pattern Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: lock scope for issue-653-aws-iac-cutover (alignment passed) * feat(#653): T1 — delete legacy AWS IaC module files + regression gate * feat(#653): T2 — replace Route53 backend with migration error stub * feat(#653): strip registration sites + add infra.autoscaling_group (T3) Remove platform.ecs, platform.networking, platform.apigateway, platform.autoscaling module types and their 15 step types (ecs/apigw/scaling/network) from all registration sites: plugins/platform, schema/schema.go, schema/module_schema.go, schema/step_schema_builtins.go, cmd/wfctl/type_registry.go. Add infra.autoscaling_group to plugins/infra and type_registry.go. Update DOCUMENTATION.md with AWS IaC removal notice + infra.autoscaling_group row. Fix multi_region.go error string to reference infra.container_service. Regenerate schema/testdata/editor-schemas.golden.json. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(#653): add legacyaws package + wire migration errors (T4) Create internal/legacyaws/types.go mirroring internal/legacydo/types.go. Maps 4 removed module types (platform.ecs/networking/apigateway/autoscaling) and 15 removed step types to their infra.*/step.iac_* successors. RemovedInVersion = v0.53.0. Wire into engine.go, cmd/wfctl/validate.go, cmd/wfctl/ci_validate.go: - extra schema module types list includes legacyaws.ModuleTypes - post-validate sweep checks legacyaws.IsModuleType / IsStepType - actionable FormatModuleError / FormatStepError returned on match Remove 15 legacy step entries from cmd/wfctl/type_registry.go KnownStepTypes(). Tests: engine_legacyaws_test.go (plugin not loaded + plugin loaded branches) + cmd/wfctl/legacy_aws_types_removed_test.go (registry absent + validate/ci_validate paths). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(#653): add legacy-aws-types modernize rule + migration guide (T5) Add modernize/legacy_aws_rule.go mirroring legacy_do_rule.go: - ID: legacy-aws-types, Severity: error - Auto-fixes: platform.ecs→infra.container_service, platform.apigateway→infra.api_gateway, platform.autoscaling→infra.autoscaling_group - Flags but does not auto-fix: platform.networking (1→2 split) + all 15 step types (config key shape mismatch: platform + state_store vs legacy service/gateway/scaling keys) - Uses walkTypeNodes helper from legacy_do_rule.go (same package) Register legacyAWSRule() in modernize/modernize.go AllRules() list. Add docs/migrations/v0.53.0-aws-iac-removal.md with full migration recipe (install plugin, modernize, add provider, manual rewrites for networking + steps). Tests: TestLegacyAWSRule_Rewrites (3 auto-fixable types) + TestLegacyAWSRule_GapTypesFlaggedNotRewritten (networking + 6 step types). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore(#653): go mod tidy + add aws-sdk-banned CI gate (T6) go mod tidy drops 3 freed AWS SDK packages: - service/apigatewayv2 (was platform.apigateway) - service/applicationautoscaling (was platform.autoscaling) - service/route53 (was platform.dns Route53 backend) Also tidy example/go.mod. Add aws-sdk-banned CI job to .github/workflows/ci.yml mirroring the godo-banned job: grep-gates both *.go imports and go.mod entries for the three freed service paths, excluding aws_absent_test.go. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(#653): update wfctl test fixtures for removed AWS step types TestModernizeAllRulesRegistered: expected 9 rules → 10 (add legacy-aws-types). TestKnownStepTypesPopulated: remove 15 legacy AWS step entries from expected list (step.ecs_*/step.network_*/step.apigw_*/step.scaling_* all removed from KnownStepTypes). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(#653): fix nilerr lint in aws_absent_test.go * fix(#653): correct platform.dns ConfigKeys: zone+records not domain * docs: post-merge retro for issue #653 AWS IaC removal (PR #657) * docs: Phase 2 design for issue #653 AWS operational-tooling audit Adversarial review PASS (2 cycles). 4-file disposition: - codebuild.go: strip codebuildAWSBackend → codebuildAWSErrorBackend - platform_kubernetes_kind.go: strip eksBackend → eksErrorBackend - pipeline_step_s3_upload.go: exempt (no go.mod win, useful utility step) - nosql_dynamodb.go: exempt (no real SDK import, only in doc comment) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: Phase 2 implementation plan for issue #653 AWS operational audit Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: revise Phase 2 plan per adversarial-review findings Fix: serial-dependency warning on Task 3, test fail-mode description, errors import fate stated explicitly, rollback notes on T1+T2, PR base branch corrected to main, .claire typo fixed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: lock scope for issue-653-phase2 (alignment passed) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(#653/p2): replace codebuildAWSBackend with migration error stub Strip aws-sdk-go-v2/service/codebuild from workflow core. Real AWS backend replaced by codebuildAWSErrorBackend that returns a helpful migration error directing users to workflow-plugin-aws. Mock backend unchanged. Rollback: git revert HEAD; go mod tidy to restore SDK imports. * feat(#653/p2): replace eksBackend with migration error stub Strip aws-sdk-go-v2/service/eks from workflow core. Real EKS backend replaced by eksErrorBackend that returns a helpful migration error directing users to workflow-plugin-aws. GKE and AKS backends unchanged. Rollback: git revert HEAD; go mod tidy to restore SDK imports. * feat(#653/p2): drop service/codebuild from go.mod + extend CI gate go mod tidy drops service/codebuild (zero remaining importers) from go.mod and example/go.mod. service/eks remains (provider/aws/* are legitimate IaC importers). Extend aws-sdk-banned CI gate to module/ scope with codebuild and eks banned packages. Add codebuild + eks to aws_absent_test.go freed slice. CI grep gate scoped to module/ only so IaC provider paths are exempt. * fix: address Copilot review — capture error once in migration test, add ci.yml go.mod gate comment - codebuild_test.go: capture CreateProject() error into variable on first call; reuse for nil-check and .Error() to avoid redundant call and subtle correctness assumption that both calls return identical messages. - ci.yml: add comment on go.mod grep gate explaining why service/eks is omitted (platform/ and provider/ have legitimate callers not yet migrated in Phase 2); prevents future confusion during Phase 3 migration. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: address Copilot round-2 review findings - schema/schema.go: remove blank lines left from step.network_* and step.scaling_* removals in coreModuleTypes slice (stylistic clutter). - module/aws_absent_test.go: log parse errors via t.Logf instead of silently discarding with _ so that syntax errors in source files are visible during test runs. - .github/workflows/ci.yml: broaden first grep gate from module/ to full repo for fully-removed packages; add separate gate for service/eks that excludes only platform/ and provider/ (the two legitimate locations), catching any new eks imports in cmd/, iac/, plugin/, etc. - module/platform_kubernetes.go: remove dead helper safeIntToInt32 (was only called by the old eksBackend, now deleted) and its math import. - module/cloud_account_aws.go: remove dead helpers awsProviderFrom and parseStringSlice (also only called by the old eksBackend). Build verified: GOWORK=off go build ./... passes with no errors. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Summary
platform.ecs,platform.networking,platform.apigateway,platform.autoscalingmodule implementations and their 15 companion step types (step.ecs_*,step.network_*,step.apigw_*,step.scaling_*) from workflow coreplatform.dns; replaces it with an actionable migration-error stub (awsRoute53ErrorBackend) that fires atPlan()/Apply()timeAWSAPIGatewayhelper inmodule/api_gateway.go; removes its 3 test functionsinfra.autoscaling_groupto theinfraplugin (14th abstract resource type)internal/legacyawsleaf package with migration error formatters, wired intoengine.go,wfctl validate, andwfctl ci_validatemodernize/legacy_aws_rule.go(legacy-aws-typesrule): auto-fixes 3 of 4 module types, flags networking split + all 15 step types as manualdocs/migrations/v0.53.0-aws-iac-removal.mdmigration guidego.mod:service/apigatewayv2,service/applicationautoscaling,service/route53aws-sdk-bannedCI job to verify those packages never re-enterDesign
See:
docs/plans/2026-05-13-issue-653-phase1-aws-cutover-design.mdImplementation Plan
See:
docs/plans/2026-05-13-issue-653-phase1-aws-cutover.mdScope Manifest
PR Count: 1
Tasks: 6
Status: Locked 2026-05-13T00:00:00Z
Changes
api_gateway_test.goAWS tests + companion test files; addedmodule/aws_absent_test.goregression gate for 3 freed SDK packages; updatedmodule/app_container.goto remove ECS backendroute53Backendinplatform_dns_backends.gowithawsRoute53ErrorBackend(Init succeeds, Plan/Apply/Status/Destroy error with migration hint); freedservice/route53import; addedTestPlatformDNS_AWSBackendMigrationErrorschema.go,module_schema.go,step_schema_builtins.go),cmd/wfctl/type_registry.go; addedinfra.autoscaling_group; updatedDOCUMENTATION.md; regenerated golden schemainternal/legacyaws/types.go; wired intoengine.go,validate.go,ci_validate.go; tests inengine_legacyaws_test.go+cmd/wfctl/legacy_aws_types_removed_test.gomodernize/legacy_aws_rule.go+legacy_aws_rule_test.go; registered inAllRules(); createddocs/migrations/v0.53.0-aws-iac-removal.mdgo mod tidy(root + example/); addedaws-sdk-bannedCI job to.github/workflows/ci.ymlParity with workflow-plugin-aws v0.2.0
All 4 removed module types are implemented by
workflow-plugin-awsv0.2.0 asinfra.*modules withprovider: aws. Thewfctl modernize --applycommand auto-renames 3 of the 4 (all exceptplatform.networkingwhich requires a 1→2 manual split).Closes #653
🤖 Generated with Claude Code