Skip to content

feat: register the 57 AWS services with demonstrated demand (205 services) - #140

Merged
skyoo2003 merged 1 commit into
feat/rest-json-enginefrom
feat/milestone-4-demand-set
Sep 5, 2026
Merged

skyoo2003 merged 1 commit into
feat/rest-json-enginefrom
feat/milestone-4-demand-set

Conversation

@skyoo2003

Copy link
Copy Markdown
Owner

Summary

Registers every AWS service with demonstrated demand, taking DevCloud to 205 services — the target Milestone 3 set after the 100% claim was tested and dropped. 54 of the 57 meet the quality floor.

Stacked on #139. Base is feat/rest-json-engine, not main. Merge #139 first. Two thirds of the demand set is rest-json, so without that PR 34 of these 57 would register and serve nothing.

Related Issue

Implements Milestone 4 of .claude/prds/aws-service-coverage-100.prd.md.
Plan: .claude/plans/aws-service-coverage-100-milestone-4.plan.md
Evidence: .claude/tdd/aws-service-coverage-100-milestone-4.tdd.md

Fixes #

Changes

The 57 services — worked in the support-rank order of docs/demand.md, so a stop at any point would have stopped on the best surface. Zero hand-written provider lines: 15.6s to download the models, 2.7s codegen+scaffold, 0.7s imports, 3.3s build.

Three services do not meet the floor, each for a different reason, all named in docs/coverage.md:

Service Why
elastic-load-balancing query protocol — unreadable by the engine
s3-control rest-xml — same
rds-data readable, but not one of its six operations is CRUD-shaped. No protocol change reaches it.

The first two are the whole of Milestone 5's remaining scope, down from "the non-JSON surface". rds-data is worth calling out: it is supported by all three projects in the demand survey — the strongest signal in the set — and it still cannot be served generically.

Alias decisions. Only two new collisions needed a human (timestream, timestream_20181101 — Query and Write share shape name and version). apigateway, elasticloadbalancing and kinesisanalytics settled themselves, because the newly registered v1 service publishes the contested name as its own ID. That retires three Group 3 substitutions, exactly as protocol.go's comment predicted. v2 callers keep working through three compatibility devices, each with a test covering both sides:

Pair Separated by
API Gateway v1/v2 URL path — every v2 operation is under /v2/, no v1 operation is
ELB v1/v2 Version= in the query body
Timestream Query/Write the operation, via the fidelity manifest

Three defects the new services exposed, fixed at the root

  1. 18 SigV4 signing names are shared across 50 services. AWS splits a data plane or successor into its own SDK client while leaving it signing with the parent's name, so every non-winning member was routed to a provider modelling none of its operations — boto3.client("mediastore-data").list_items() landed on mediastore. The grouping is derivable, so codegen emits aliases.SigningSiblings and the gateway picks the member that models the request (REST route for a path, the manifest for an operation). A hand-written map written for Timestream earlier in this change was deleted.
  2. writeAWSError sent XML to rest-json clients — HasPrefix("rest-json", "json") is false. botocore surfaced it as a ClientError with no error code at all.
  3. Query-protocol errors used S3's bare <Error>; botocore's query parser wants <ErrorResponse><Error> and raises KeyError otherwise. Found via elb, the first registered-only query service.

A correction to the plan

The plan predicted 52 floor-meeting services and four for Milestone 5. Its protocol census used grep -o 'aws.protocols#…' | head -1, which matches anywhere in the JSON rather than the service shape's own trait. The parser's authoritative split is rest-json 34 / json-1.1 15 / json-1.0 6 / query 1 / rest-xml 1 — connect is rest-json and timestream-query is json-1.0. So it is 54 floor-meeting, and Milestone 5 is two services.

Files Changed

508 files, of which 481 are generated, scaffolded, or upstream models (367 internal/generated/, 57 internal/services/ scaffolds, 57 smithy-models/). Review is 27 hand-written files.

Per decision 5, the 57 providers are byte-identical scaffolds from one template, so review is of the template and generator plus the per-service behavioural evidence in the compat suite. No provider was hand-edited.

Test Plan

  • CGO_ENABLED=0 go test ./... — all pass
  • make test-compat — 842 passed, 3 skipped (was 790)
  • make stats — Services: 205
  • rm -rf internal/generated && make codegen — no drift
  • bash scripts/generate-imports.sh — idempotent

RED evidence: go test ./internal/gateway/ gave normalizeServiceID("apigateway") = "apigateway", want "apigatewayv2" and three more, plus alias "timestream" is claimed by more than one service and has no override. The golden alias lock caught every deliberate retirement — which is what it exists for.

Runtime cost (CGO_ENABLED=0, Apple Silicon): binary 31.3 → 33.1 MiB; peak RSS 57.7 → 43.7 MiB; all 205 services register in 49 ms. RSS fell rather than rose, but the two readings were taken on different days and are not a controlled comparison — read it as "memory is not the constraint at 205", not as a saving.

Checklist

  • Self-reviewed the code
  • Added/updated tests
  • Lint/format passes (golangci-lint run)
  • Updated documentation (if applicable) — docs/coverage.md, docs/crud-engine.md, docs/demand.md, PRD
  • Added a Changie changelog fragment for user-facing changes

DevCloud now registers 205 services — the target Milestone 3 set after the
100% claim was tested and dropped. 199 of them serve at least one
operation, up from 117.

54 of the 57 meet the quality floor. The three that do not are named in
docs/coverage.md, each for a different reason:
  elastic-load-balancing  query protocol, unreadable by the engine
  s3-control              rest-xml, same
  rds-data                readable, but not one of its six operations is
                          CRUD-shaped. No protocol change reaches it.

The first two are the whole of Milestone 5's remaining scope, down from
"the non-JSON surface".

Onboarding cost, zero hand-written provider lines: 15.6s to download 57
models, 2.7s codegen+scaffold, 0.7s imports, 3.3s build.

Alias decisions. Only two new collisions needed a human (timestream,
timestream_20181101 — Query and Write share shape name AND version).
apigateway, elasticloadbalancing and kinesisanalytics settled themselves,
because the newly registered v1 service publishes the contested name as
its own ID. That retires three Group 3 substitutions, exactly as
protocol.go predicted it would. v2 callers keep working through three
compatibility devices, each with a test covering both sides:
  API Gateway  URL path (/v2/ is v2, nothing else is)
  ELB          Version= in the query body
  Timestream   the operation, via the fidelity manifest

RED: go test ./internal/gateway/ —
  normalizeServiceID("apigateway") = "apigateway", want "apigatewayv2"
  (+3 more), and alias "timestream" has no override.
  The golden alias lock caught every deliberate retirement.
GREEN: go test ./... all pass; make test-compat 842 passed, 3 skipped.

Three defects found by the new services and fixed at the root:

1. 18 SigV4 signing names are shared across 50 services, because AWS
   splits a data plane or successor into its own client while leaving it
   signing with the parent's name. Every non-winning member was routed to
   a provider modelling none of its operations —
   boto3.client("mediastore-data").list_items() landed on mediastore.
   The grouping is derivable, so codegen emits aliases.SigningSiblings and
   the gateway picks the member that models the request (REST route for a
   path, the manifest for an operation). A hand-written map written for
   Timestream earlier in this change was deleted.

2. writeAWSError sent XML to rest-json clients: HasPrefix("rest-json",
   "json") is false. botocore surfaced it as a ClientError with no error
   code at all.

3. Query-protocol errors used S3's bare <Error>; botocore's query parser
   wants <ErrorResponse><Error> and raises KeyError otherwise. Found via
   elb, the first registered-only query service.

Evidence: .claude/tdd/aws-service-coverage-100-milestone-4.tdd.md
@github-actions github-actions Bot added documentation Improvements or additions to documentation tests Test code and test infrastructure codegen Smithy codegen and generated code services AWS service implementations labels Sep 5, 2026
@skyoo2003
skyoo2003 merged commit a1af2b3 into main Sep 5, 2026
1 check passed
@skyoo2003
skyoo2003 deleted the feat/milestone-4-demand-set branch September 5, 2026 11:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

codegen Smithy codegen and generated code documentation Improvements or additions to documentation services AWS service implementations tests Test code and test infrastructure

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant