Skip to content

1.1.0

Choose a tag to compare

@github-actions github-actions released this 06 Sep 08:49
· 9 commits to main since this release

v1.1.0 - 2026-09-06

Added

  • Provider-namespaced configuration: service blocks can be written as providers.aws.services.*, forward-compatible with providers.azure.*. The top-level services block is the same block under its historical name and keeps working (#135)
  • Per-provider auth adapters (internal/auth) parse SigV4 credentials once and expose the caller's claimed identity to every plugin via auth.FromContext, adding a region field to GET /devcloud/api/logs. Nothing is verified — DevCloud still accepts any credentials (#135)
  • Amazon Comprehend, served by the generic CRUD engine (49 operations auto-crud, 36 unimplemented), where an unimplemented operation returns a clean AWS error rather than a fabricated success (#136)
  • All 48 upstream AI/Machine Learning service models are registered, taking DevCloud from 105 to 148 services. 17 are served and the remaining 31 decline with a clean AWS error instead of falling through to real AWS (#137)
  • docs/coverage.md, which publishes the registered, serving and registered-only service counts together so the service count is never stated on its own (#137)
  • Admin API endpoint GET /devcloud/api/unrouted reports which AWS services this DevCloud was asked for and does not register, with per-service counts and first/last seen; it requires admin.enabled: true. The figure is a floor — an unclassifiable request is routed to S3 rather than counted, and a non-zero droppedServiceIds means the collector hit its key cap (#138)
  • "Service Not Supported" issue form for requesting an AWS service DevCloud does not register yet, which asks which operations you actually call and accepts /devcloud/api/unrouted output (#138)
  • The generic CRUD engine now serves rest-json services, recovering the operation from the request method and path against the route table the model already declares (shared in internal/shared/httproute). 28 registered-only services started serving: services with at least one operation went 117 to 145, and auto-crud operations 1,415 to 2,200 (#139)
  • The 57 AWS services with demonstrated demand are registered, taking DevCloud to 205 services — 199 of which serve at least one operation, for 4,858 engine-served operations. The three that serve nothing are named with their reasons in docs/coverage.md (#139)
  • The generic CRUD engine now serves every protocol DevCloud registers: rest-xml recovers its operation from method and path, and query reads it from the form body's Action field. 112 operations move from unimplemented to auto-crud, so protocol is no longer a reason any registered service serves nothing (#143)
  • CI gates the published coverage figure: go test ./cmd/devcloud/ compares docs/coverage.md, README.md and docs/README.md against the live registry in both directions, so neither the code nor the number can move without the other. The demand set in docs/demand.md is checked to still be registered, so the count cannot be held steady by swapping one service for another (#144)
  • scripts/model_churn.py summarises what a Smithy model sync actually changed, so the weekly sync PR reads as a change rather than a whole-tree regeneration of 194 models (#147)

Changed

  • Codegen now runs through a provider-neutral intermediate representation (internal/codegen/ir) behind a ModelSource interface, so a second API description format is an added file rather than a rewrite. Smithy is the first source and generated output is byte-identical (#135)
  • Service routing aliases are derived from the Smithy models instead of a hand-maintained switch in the gateway, so onboarding a service no longer needs a hand-written routing entry. All 93 previously-routed aliases resolve unchanged, and an alias claimed by more than one service is reported rather than guessed (#137)
  • The fidelity manifest records each service's wire protocol, so a registered service that the CRUD engine cannot reach is distinguishable from one whose wiring is broken (#137)
  • The AWS coverage target is 205 services, not 431: of the 283 services DevCloud does not register, only 57 have been built by two or more of moto, LocalStack and terraform-provider-aws, and DevCloud has received zero service requests to date. The remaining 226 can still be onboarded on request but are no longer promised — evidence in docs/demand.md, decision rule in docs/coverage.md (#138)
  • rest-xml request bodies are still not buffered by the gateway, now by an explicit rule rather than as a side effect of the protocol being unservable: the engine serves rest-xml from the path and query alone, so S3's large binary uploads keep streaming. crud.NeedsBody is the predicate, and a test fails if the body is read (#143)
  • The boto3 compatibility suite exercises every registered service, parametrising over a generated service list (internal/generated/compat/services.json) instead of two hand-written name lists. It found 31 of 205 registered services with no boto3 test at all, and grew from 854 to 993 tests (#144)

Fixed

  • Service registration is no longer silently dropped: scripts/generate-imports.sh gated on a register.go file that no service has, so every run wrote an empty import block and the built binary registered nothing. It now gates on the package actually calling Register, and refuses to write a gutted file instead of reporting success (#136)
  • A newly scaffolded service now serves its CRUD-shaped operations instead of answering HTTP 500 for everything, because the generated provider declined with an error the gateway never routes to the CRUD engine (#136)
  • The fidelity manifest no longer reports auto-crud for operations the binary refuses; a tier assigned from CRUD-registry membership alone says an operation is classifiable rather than reachable, and now requires the owning provider to actually hand unimplemented operations to the engine (#136)
  • Smithy's non-boxed primitives (PrimitiveLong, PrimitiveBoolean and the other five) are mapped to Go types; models using them previously generated code that did not compile (#137)
  • make codegen is now byte-identical across runs, where a model bundling two namespaces with colliding shape names produced different output every time because shapes are keyed by short name and the generator iterated a Go map (#137)
  • Amazon Rekognition can be onboarded; its X-Amz-Target prefix RekognitionService was covered by no routing entry, so every call returned UnknownService (#137)
  • Stale service counts across the docs: README.md advertised 104 services and docs/faq.md 101 when 148 are registered, and docs/fidelity-manifest.md carried outdated per-tier operation totals. Every count now appears with its depth split (148 registered / 117 serving at least one operation), so the number is never read as a capability claim on its own (#138)
  • S3 Control requests were served by S3, which signs with the same name and parsed them as a bucket and key — CreateAccessPoint returned 200 and left an object in a bucket named v20180820. S3 Control is now split off by its /v20180820/ path prefix, and its unserved operations return a clean AWS error instead of a fabricated success (#142)
  • Eight query-protocol providers (rds, neptune, docdb, redshift, elasticache, autoscaling, cloudformation, elasticloadbalancingv2) answered any unimplemented operation with HTTP 200 and an empty <ActionResponse/>, so a caller was told an operation succeeded when nothing ran — and botocore raised KeyError on the missing <ActionResult> wrapper. They now hand the operation to the generic CRUD engine, which serves the 223 CRUD-shaped ones from the real store and refuses the rest with a clean InvalidAction (#145)
  • The four Amazon Lex services are reachable from boto3, where all four sign as lex and no service is called lex, so the alias stayed contested and every Lex call died as UnknownService. The shared-signing-name split now recognises a signing name that is a group key rather than a member service ID, and answers each request from the sibling whose route table models its method and path (#146)
  • appsync.ListApis, eks.ListAccessPolicies and opensearch.ListApplications are reachable: each was implemented, but the provider's hand-written path resolver did not know the route boto3 sends, so the operation arrived empty and the call answered NotImplemented. Each provider now falls back to its own model's route table when its resolver recognises nothing (#146)
  • The fidelity manifest no longer drops operations with short names, where the hand-verified scan required four characters or more and reported resourcegroups.Tag as unimplemented while the code beside it was real. Short dispatch literals are now collected separately and promoted only where the service's own model declares them (#146)
  • S3 no longer answers an unimplemented bucket sub-resource with a bucket listing, where GET /{Bucket}?analytics and seven siblings fell through to ListObjects and botocore read the resulting 200 as a successful call. A bucket-level GET whose query parameter is neither a served sub-resource nor a listing parameter now returns a clean NotImplemented (#146)
  • The weekly Smithy model sync discarded the changes worth reviewing: its test step ended the job before the pull request was opened, and an upstream model that gains an operation is designed to fail that step. The test result is now recorded rather than gating, the PR is always opened when models moved, and the failure is re-raised afterwards so the cron does not silently go green (#147)
  • A release dry run keeps its artifacts; the Upload assets step ran when dry_run was not set, so it uploaded on a real release — where GoReleaser has already attached the same files — and skipped the one path that publishes nothing else (#150)

Documentation

  • Coverage docs state what the compatibility figure excludes and why: two registered services have no boto3 client at all (sagemakerruntimehttp2, transcribestreaming), and the four Lex services are registered but reachable by no boto3 caller because every Lex client signs as the contested alias lex (#144)
  • docs/coverage.md now publishes the measured cost of keeping up with upstream — refreshing all 194 vendored models changed 93 of them, and 32 moved an operation. The reading states its own ceiling: those 93 had been vendored 141 days earlier, so it is an accumulated backlog and not a weekly rate (#147)
  • The release procedure moved from docs/release.md to RELEASE.md at the repo root, and now states three things it never did: the Homebrew formula is published to a separate tap repository through a GitHub App token scoped to that repo alone, a tagged build pushes four *-alpine image tags, and make changelog VERSION= is the batch-and-merge pair (#148)
  • The contributor guide no longer asks for SQLite3 development headers, CGO, or a separately running DevCloud instance — the driver has been pure Go since v1.0.0, and the compatibility suite starts its own server. docs/getting-started.md also no longer advertises a Next.js frontend on port 3000 that lives in a separate repository (#149)
  • The compatibility policy states current figures, having gone stale in five places because nothing gates it: cmd/devcloud/coverage_test.go covers docs/coverage.md, README.md and docs/README.md, and docs/compatibility-policy.md is not in that set. It now reads 1,144 tests, 5,193 auto-crud, 4,497 hand-verified, 205 registered with 4 serving nothing, and 193/12 model-backed to hand-written (#150)