Repository navigation
feat: register the 57 AWS services with demonstrated demand (205 services) - #140
Merged
Merged
Conversation
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
This was referenced Sep 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.
Related Issue
Implements Milestone 4 of
.claude/prds/aws-service-coverage-100.prd.md.Plan:
.claude/plans/aws-service-coverage-100-milestone-4.plan.mdEvidence:
.claude/tdd/aws-service-coverage-100-milestone-4.tdd.mdFixes #
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:elastic-load-balancingqueryprotocol — unreadable by the engines3-controlrest-xml— samerds-dataThe first two are the whole of Milestone 5's remaining scope, down from "the non-JSON surface".
rds-datais 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,elasticloadbalancingandkinesisanalyticssettled themselves, because the newly registered v1 service publishes the contested name as its own ID. That retires three Group 3 substitutions, exactly asprotocol.go's comment predicted. v2 callers keep working through three compatibility devices, each with a test covering both sides:/v2/, no v1 operation isVersion=in the query bodyThree defects the new services exposed, fixed at the root
boto3.client("mediastore-data").list_items()landed onmediastore. The grouping is derivable, so codegen emitsaliases.SigningSiblingsand 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.writeAWSErrorsent XML torest-jsonclients —HasPrefix("rest-json", "json")is false. botocore surfaced it as aClientErrorwith no error code at all.<Error>; botocore's query parser wants<ErrorResponse><Error>and raisesKeyErrorotherwise. Found viaelb, 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 isrest-json34 /json-1.115 /json-1.06 /query1 /rest-xml1 —connectis rest-json andtimestream-queryis 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/, 57internal/services/scaffolds, 57smithy-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 passmake test-compat— 842 passed, 3 skipped (was 790)make stats—Services: 205rm -rf internal/generated && make codegen— no driftbash scripts/generate-imports.sh— idempotentRED evidence:
go test ./internal/gateway/gavenormalizeServiceID("apigateway") = "apigateway", want "apigatewayv2"and three more, plusalias "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
golangci-lint run)docs/coverage.md,docs/crud-engine.md,docs/demand.md, PRD