Skip to content

feat(#653): Phase 1 — remove AWS IaC modules from workflow core#657

Merged
intel352 merged 18 commits into
mainfrom
feat/issue-653-aws-iac-cutover-v2
May 13, 2026
Merged

feat(#653): Phase 1 — remove AWS IaC modules from workflow core#657
intel352 merged 18 commits into
mainfrom
feat/issue-653-aws-iac-cutover-v2

Conversation

@intel352
Copy link
Copy Markdown
Contributor

Summary

  • Deletes platform.ecs, platform.networking, platform.apigateway, platform.autoscaling module implementations and their 15 companion step types (step.ecs_*, step.network_*, step.apigw_*, step.scaling_*) from workflow core
  • Removes the AWS Route53 backend from platform.dns; replaces it with an actionable migration-error stub (awsRoute53ErrorBackend) that fires at Plan()/Apply() time
  • Deletes AWSAPIGateway helper in module/api_gateway.go; removes its 3 test functions
  • Adds infra.autoscaling_group to the infra plugin (14th abstract resource type)
  • Creates internal/legacyaws leaf package with migration error formatters, wired into engine.go, wfctl validate, and wfctl ci_validate
  • Adds modernize/legacy_aws_rule.go (legacy-aws-types rule): auto-fixes 3 of 4 module types, flags networking split + all 15 step types as manual
  • Adds docs/migrations/v0.53.0-aws-iac-removal.md migration guide
  • Drops 3 freed AWS SDK packages from go.mod: service/apigatewayv2, service/applicationautoscaling, service/route53
  • Adds aws-sdk-banned CI job to verify those packages never re-enter

Design

See: docs/plans/2026-05-13-issue-653-phase1-aws-cutover-design.md

Implementation Plan

See: docs/plans/2026-05-13-issue-653-phase1-aws-cutover.md

Scope Manifest

PR Count: 1
Tasks: 6
Status: Locked 2026-05-13T00:00:00Z

PR # Title Tasks Branch
1 Phase 1 — remove AWS IaC modules from workflow core Task 1–6 feat/issue-653-aws-iac-cutover-v2

Changes

Task What was implemented
T1 Deleted 8 module files + 5 pipeline step files + api_gateway_test.go AWS tests + companion test files; added module/aws_absent_test.go regression gate for 3 freed SDK packages; updated module/app_container.go to remove ECS backend
T2 Replaced route53Backend in platform_dns_backends.go with awsRoute53ErrorBackend (Init succeeds, Plan/Apply/Status/Destroy error with migration hint); freed service/route53 import; added TestPlatformDNS_AWSBackendMigrationError
T3 Stripped all 4 module types + 15 step types from platform plugin, schema registries (schema.go, module_schema.go, step_schema_builtins.go), cmd/wfctl/type_registry.go; added infra.autoscaling_group; updated DOCUMENTATION.md; regenerated golden schema
T4 Created internal/legacyaws/types.go; wired into engine.go, validate.go, ci_validate.go; tests in engine_legacyaws_test.go + cmd/wfctl/legacy_aws_types_removed_test.go
T5 Added modernize/legacy_aws_rule.go + legacy_aws_rule_test.go; registered in AllRules(); created docs/migrations/v0.53.0-aws-iac-removal.md
T6 go mod tidy (root + example/); added aws-sdk-banned CI job to .github/workflows/ci.yml

Parity with workflow-plugin-aws v0.2.0

All 4 removed module types are implemented by workflow-plugin-aws v0.2.0 as infra.* modules with provider: aws. The wfctl modernize --apply command auto-renames 3 of the 4 (all except platform.networking which requires a 1→2 manual split).

Closes #653

🤖 Generated with Claude Code

intel352 and others added 16 commits May 13, 2026 07:54
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>
Copilot AI review requested due to automatic review settings May 13, 2026 12:41
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.autoscaling modules and their associated pipeline step types and tests.
  • Replaced the platform.dns AWS Route53 backend with a migration-error backend that fails at Plan/Apply/Status/Destroy.
  • Added legacy-AWS type detection + migration messaging (internal/legacyaws), a wfctl modernize rule, 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.

Comment thread cmd/wfctl/type_registry.go
Comment thread module/aws_absent_test.go Outdated
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 13, 2026

⏱ Benchmark Results

No significant performance regressions detected.

benchstat comparison (baseline → PR)
## benchstat: baseline → PR
baseline-bench.txt:263: parsing iteration count: invalid syntax
baseline-bench.txt:333150: parsing iteration count: invalid syntax
baseline-bench.txt:584146: parsing iteration count: invalid syntax
baseline-bench.txt:1117346: parsing iteration count: invalid syntax
baseline-bench.txt:1455492: parsing iteration count: invalid syntax
baseline-bench.txt:1756090: parsing iteration count: invalid syntax
benchmark-results.txt:264: parsing iteration count: invalid syntax
benchmark-results.txt:321907: parsing iteration count: invalid syntax
benchmark-results.txt:605069: parsing iteration count: invalid syntax
benchmark-results.txt:1095387: parsing iteration count: invalid syntax
benchmark-results.txt:1428292: parsing iteration count: invalid syntax
benchmark-results.txt:1710044: parsing iteration count: invalid syntax
goos: linux
goarch: amd64
pkg: github.com/GoCodeAlone/workflow/dynamic
cpu: AMD EPYC 7763 64-Core Processor                
                            │ baseline-bench.txt │        benchmark-results.txt        │
                            │       sec/op       │    sec/op      vs base              │
InterpreterCreation-4              4.380m ± 129%   4.385m ± 118%       ~ (p=0.818 n=6)
ComponentLoad-4                    3.526m ±  11%   3.554m ±  10%       ~ (p=0.310 n=6)
ComponentExecute-4                 1.910µ ±   1%   1.933µ ±   1%  +1.15% (p=0.002 n=6)
PoolContention/workers-1-4         1.070µ ±   3%   1.080µ ±   1%       ~ (p=0.394 n=6)
PoolContention/workers-2-4         1.067µ ±   1%   1.077µ ±   1%  +0.94% (p=0.011 n=6)
PoolContention/workers-4-4         1.073µ ±   1%   1.079µ ±   1%       ~ (p=0.197 n=6)
PoolContention/workers-8-4         1.075µ ±   1%   1.086µ ±   1%  +1.02% (p=0.017 n=6)
PoolContention/workers-16-4        1.085µ ±   1%   1.087µ ±   2%       ~ (p=0.623 n=6)
ComponentLifecycle-4               3.589m ±   2%   3.670m ±   1%  +2.26% (p=0.004 n=6)
SourceValidation-4                 2.297µ ±   1%   2.389µ ±   1%  +3.98% (p=0.002 n=6)
RegistryConcurrent-4               822.0n ±   7%   861.3n ±   6%  +4.78% (p=0.026 n=6)
LoaderLoadFromString-4             3.611m ±   1%   3.670m ±   1%  +1.63% (p=0.002 n=6)
geomean                            17.83µ          18.10µ         +1.53%

                            │ baseline-bench.txt │        benchmark-results.txt         │
                            │        B/op        │     B/op      vs base                │
InterpreterCreation-4               2.027Mi ± 0%   2.027Mi ± 0%       ~ (p=0.937 n=6)
ComponentLoad-4                     2.180Mi ± 0%   2.180Mi ± 0%       ~ (p=1.000 n=6)
ComponentExecute-4                  1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-1-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-2-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-4-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-8-4          1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-16-4         1.203Ki ± 0%   1.203Ki ± 0%       ~ (p=1.000 n=6) ¹
ComponentLifecycle-4                2.183Mi ± 0%   2.183Mi ± 0%       ~ (p=0.517 n=6)
SourceValidation-4                  1.984Ki ± 0%   1.984Ki ± 0%       ~ (p=1.000 n=6) ¹
RegistryConcurrent-4                1.133Ki ± 0%   1.133Ki ± 0%       ~ (p=1.000 n=6) ¹
LoaderLoadFromString-4              2.182Mi ± 0%   2.182Mi ± 0%       ~ (p=0.461 n=6)
geomean                             15.25Ki        15.25Ki       +0.00%
¹ all samples are equal

                            │ baseline-bench.txt │        benchmark-results.txt        │
                            │     allocs/op      │  allocs/op   vs base                │
InterpreterCreation-4                15.68k ± 0%   15.68k ± 0%       ~ (p=1.000 n=6)
ComponentLoad-4                      18.02k ± 0%   18.02k ± 0%       ~ (p=1.000 n=6)
ComponentExecute-4                    25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-1-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-2-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-4-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-8-4            25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
PoolContention/workers-16-4           25.00 ± 0%    25.00 ± 0%       ~ (p=1.000 n=6) ¹
ComponentLifecycle-4                 18.07k ± 0%   18.07k ± 0%       ~ (p=1.000 n=6) ¹
SourceValidation-4                    32.00 ± 0%    32.00 ± 0%       ~ (p=1.000 n=6) ¹
RegistryConcurrent-4                  2.000 ± 0%    2.000 ± 0%       ~ (p=1.000 n=6) ¹
LoaderLoadFromString-4               18.06k ± 0%   18.06k ± 0%       ~ (p=1.000 n=6) ¹
geomean                               183.3         183.3       +0.00%
¹ all samples are equal

pkg: github.com/GoCodeAlone/workflow/middleware
                                  │ baseline-bench.txt │       benchmark-results.txt        │
                                  │       sec/op       │    sec/op     vs base              │
CircuitBreakerDetection-4                  282.7n ± 3%   283.2n ± 15%       ~ (p=1.000 n=6)
CircuitBreakerExecution_Success-4          21.53n ± 0%   21.52n ±  0%       ~ (p=0.506 n=6)
CircuitBreakerExecution_Failure-4          66.37n ± 1%   66.81n ±  0%  +0.67% (p=0.002 n=6)
geomean                                    73.92n        74.12n        +0.27%

                                  │ baseline-bench.txt │       benchmark-results.txt        │
                                  │        B/op        │    B/op     vs base                │
CircuitBreakerDetection-4                 144.0 ± 0%     144.0 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Success-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Failure-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                              ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                  │ baseline-bench.txt │       benchmark-results.txt        │
                                  │     allocs/op      │ allocs/op   vs base                │
CircuitBreakerDetection-4                 1.000 ± 0%     1.000 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Success-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
CircuitBreakerExecution_Failure-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                              ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/module
                                 │ baseline-bench.txt │       benchmark-results.txt        │
                                 │       sec/op       │    sec/op     vs base              │
JQTransform_Simple-4                     956.8n ± 17%   861.9n ± 30%       ~ (p=1.000 n=6)
JQTransform_ObjectConstruction-4         1.431µ ±  1%   1.429µ ±  0%       ~ (p=0.416 n=6)
JQTransform_ArraySelect-4                3.285µ ±  1%   3.266µ ±  0%  -0.56% (p=0.009 n=6)
JQTransform_Complex-4                    37.35µ ±  0%   37.36µ ±  1%       ~ (p=0.818 n=6)
JQTransform_Throughput-4                 1.766µ ±  0%   1.756µ ±  1%       ~ (p=0.117 n=6)
SSEPublishDelivery-4                     63.32n ± 26%   68.23n ±  0%       ~ (p=0.063 n=6)
geomean                                  1.630µ         1.619µ        -0.69%

                                 │ baseline-bench.txt │        benchmark-results.txt         │
                                 │        B/op        │     B/op      vs base                │
JQTransform_Simple-4                   1.273Ki ± 0%     1.273Ki ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_ObjectConstruction-4       1.773Ki ± 0%     1.773Ki ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_ArraySelect-4              2.625Ki ± 0%     2.625Ki ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_Complex-4                  16.22Ki ± 0%     16.22Ki ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_Throughput-4               1.984Ki ± 0%     1.984Ki ± 0%       ~ (p=1.000 n=6) ¹
SSEPublishDelivery-4                     0.000 ± 0%       0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                             ²                 +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                 │ baseline-bench.txt │       benchmark-results.txt        │
                                 │     allocs/op      │ allocs/op   vs base                │
JQTransform_Simple-4                     10.00 ± 0%     10.00 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_ObjectConstruction-4         15.00 ± 0%     15.00 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_ArraySelect-4                30.00 ± 0%     30.00 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_Complex-4                    324.0 ± 0%     324.0 ± 0%       ~ (p=1.000 n=6) ¹
JQTransform_Throughput-4                 17.00 ± 0%     17.00 ± 0%       ~ (p=1.000 n=6) ¹
SSEPublishDelivery-4                     0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                             ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/schema
                                    │ baseline-bench.txt │       benchmark-results.txt        │
                                    │       sec/op       │    sec/op     vs base              │
SchemaValidation_Simple-4                    1.105µ ± 4%   1.100µ ±  2%       ~ (p=0.563 n=6)
SchemaValidation_AllFields-4                 1.665µ ± 1%   1.646µ ± 17%       ~ (p=0.223 n=6)
SchemaValidation_FormatValidation-4          1.581µ ± 3%   1.583µ ±  1%       ~ (p=0.974 n=6)
SchemaValidation_ManySchemas-4               1.837µ ± 4%   1.809µ ±  3%       ~ (p=0.699 n=6)
geomean                                      1.520µ        1.509µ        -0.75%

                                    │ baseline-bench.txt │       benchmark-results.txt        │
                                    │        B/op        │    B/op     vs base                │
SchemaValidation_Simple-4                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_AllFields-4                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_FormatValidation-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_ManySchemas-4              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

                                    │ baseline-bench.txt │       benchmark-results.txt        │
                                    │     allocs/op      │ allocs/op   vs base                │
SchemaValidation_Simple-4                   0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_AllFields-4                0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_FormatValidation-4         0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
SchemaValidation_ManySchemas-4              0.000 ± 0%     0.000 ± 0%       ~ (p=1.000 n=6) ¹
geomean                                                ²               +0.00%               ²
¹ all samples are equal
² summaries must be >0 to compute geomean

pkg: github.com/GoCodeAlone/workflow/store
                                   │ baseline-bench.txt │       benchmark-results.txt        │
                                   │       sec/op       │    sec/op     vs base              │
EventStoreAppend_InMemory-4                1.126µ ± 24%   1.244µ ± 31%       ~ (p=0.368 n=6)
EventStoreAppend_SQLite-4                  1.563m ±  4%   1.615m ±  8%  +3.32% (p=0.026 n=6)
GetTimeline_InMemory/events-10-4           13.40µ ±  3%   13.93µ ±  3%  +3.99% (p=0.002 n=6)
GetTimeline_InMemory/events-50-4           74.83µ ±  2%   78.10µ ±  1%  +4.37% (p=0.002 n=6)
GetTimeline_InMemory/events-100-4          134.2µ ± 15%   126.0µ ± 24%       ~ (p=0.699 n=6)
GetTimeline_InMemory/events-500-4          614.1µ ±  0%   650.8µ ±  1%  +5.97% (p=0.002 n=6)
GetTimeline_InMemory/events-1000-4         1.255m ±  1%   1.352m ±  1%  +7.75% (p=0.002 n=6)
GetTimeline_SQLite/events-10-4             104.1µ ±  0%   109.5µ ±  1%  +5.23% (p=0.002 n=6)
GetTimeline_SQLite/events-50-4             242.1µ ±  1%   258.4µ ±  1%  +6.74% (p=0.002 n=6)
GetTimeline_SQLite/events-100-4            410.2µ ±  0%   435.2µ ±  1%  +6.09% (p=0.002 n=6)
GetTimeline_SQLite/events-500-4            1.752m ±  0%   1.859m ±  0%  +6.12% (p=0.002 n=6)
GetTimeline_SQLite/events-1000-4           3.400m ±  0%   3.600m ±  2%  +5.88% (p=0.002 n=6)
geomean                                    217.5µ         228.2µ        +4.91%

                                   │ baseline-bench.txt │         benchmark-results.txt         │
                                   │        B/op        │     B/op       vs base                │
EventStoreAppend_InMemory-4                  788.5 ± 9%     758.5 ± 14%       ~ (p=0.221 n=6)
EventStoreAppend_SQLite-4                  1.981Ki ± 3%   1.986Ki ±  2%       ~ (p=0.450 n=6)
GetTimeline_InMemory/events-10-4           7.953Ki ± 0%   7.953Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-50-4           46.62Ki ± 0%   46.62Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-100-4          94.48Ki ± 0%   94.48Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-500-4          472.8Ki ± 0%   472.8Ki ±  0%  -0.00% (p=0.015 n=6)
GetTimeline_InMemory/events-1000-4         944.3Ki ± 0%   944.3Ki ±  0%  -0.00% (p=0.022 n=6)
GetTimeline_SQLite/events-10-4             16.74Ki ± 0%   16.74Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-50-4             87.14Ki ± 0%   87.14Ki ±  0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-100-4            175.4Ki ± 0%   175.4Ki ±  0%       ~ (p=1.000 n=6)
GetTimeline_SQLite/events-500-4            846.1Ki ± 0%   846.1Ki ±  0%  +0.00% (p=0.013 n=6)
GetTimeline_SQLite/events-1000-4           1.639Mi ± 0%   1.639Mi ±  0%       ~ (p=0.448 n=6)
geomean                                    67.33Ki        67.12Ki        -0.30%
¹ all samples are equal

                                   │ baseline-bench.txt │        benchmark-results.txt        │
                                   │     allocs/op      │  allocs/op   vs base                │
EventStoreAppend_InMemory-4                  7.000 ± 0%    7.000 ± 0%       ~ (p=1.000 n=6) ¹
EventStoreAppend_SQLite-4                    53.00 ± 0%    53.00 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-10-4             125.0 ± 0%    125.0 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-50-4             653.0 ± 0%    653.0 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-100-4           1.306k ± 0%   1.306k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-500-4           6.514k ± 0%   6.514k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_InMemory/events-1000-4          13.02k ± 0%   13.02k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-10-4               382.0 ± 0%    382.0 ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-50-4              1.852k ± 0%   1.852k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-100-4             3.681k ± 0%   3.681k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-500-4             18.54k ± 0%   18.54k ± 0%       ~ (p=1.000 n=6) ¹
GetTimeline_SQLite/events-1000-4            37.29k ± 0%   37.29k ± 0%       ~ (p=1.000 n=6) ¹
geomean                                     1.162k        1.162k       +0.00%
¹ all samples are equal

Benchmarks run with go test -bench=. -benchmem -count=6.
Regressions ≥ 20% are flagged. Results compared via benchstat.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 13, 2026

Codecov Report

❌ Patch coverage is 67.74194% with 50 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
internal/legacyaws/types.go 0.00% 37 Missing ⚠️
module/platform_dns_backends.go 62.50% 6 Missing ⚠️
cmd/wfctl/ci_validate.go 66.66% 1 Missing and 1 partial ⚠️
cmd/wfctl/validate.go 66.66% 2 Missing ⚠️
module/app_container.go 0.00% 2 Missing ⚠️
module/multi_region.go 0.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

Copilot AI review requested due to automatic review settings May 13, 2026 13:03
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.dns example, the provider field is shown as aws, but infra.* modules expect config.provider to be the service name of an iac.provider module (e.g. aws-provider). Using provider: aws will fail unless the config also defines an iac.provider module named aws. 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

Comment thread DOCUMENTATION.md
Comment on lines 497 to 505
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 |
Comment on lines +95 to +99
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),
Comment thread module/app_container.go
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)
Comment thread plugins/infra/plugin.go
Comment on lines 26 to 30
"infra.iam_role",
"infra.storage",
"infra.certificate",
"infra.autoscaling_group",
}
@intel352 intel352 merged commit 1389d02 into main May 13, 2026
31 checks passed
@intel352 intel352 deleted the feat/issue-653-aws-iac-cutover-v2 branch May 13, 2026 13:16
intel352 added a commit that referenced this pull request May 13, 2026
* 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>
intel352 added a commit that referenced this pull request May 13, 2026
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>
intel352 added a commit that referenced this pull request May 13, 2026
* 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Audit AWS SDK usage in workflow core (RBAC/secrets/artifact stay; IaC drivers reviewed for plugin move)

2 participants