From e0d8c475537fbf9f7423472d479c4d36293bcea2 Mon Sep 17 00:00:00 2001 From: Sung-Kyu Yoo Date: Sun, 13 Sep 2026 22:18:17 +0900 Subject: [PATCH 1/3] fix: give six changelog fragments the issue link the release tag checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Six fragments wrote `Issue:` at the top level instead of under `custom:`, where `.changie.yaml` declares it. `changie batch` rendered them as `[#](.../issues/)`, which release.yml:234 rejects — the tag would have failed at the notes-validation step, after the guardrails had already passed. The pre-flight grep in RELEASE.md (`grep -L 'Issue: "[0-9]'`) matches both spellings, so it did not catch this. Also trims the #163 fragment from 484 to 337 characters, under the 400-char ceiling `.changie.yaml` sets and `changie new` enforces on fragments it writes itself. The CI-runner timing detail it dropped is in the issue. --- changes/unreleased/Added-20260913-120000.yaml | 3 ++- changes/unreleased/Added-20260913-140000.yaml | 3 ++- changes/unreleased/Added-20260913-160000.yaml | 3 ++- changes/unreleased/Added-20260913-170500.yaml | 11 +++++------ changes/unreleased/Documentation-20260913-170000.yaml | 3 ++- changes/unreleased/Fixed-20260913-161500.yaml | 3 ++- 6 files changed, 15 insertions(+), 11 deletions(-) diff --git a/changes/unreleased/Added-20260913-120000.yaml b/changes/unreleased/Added-20260913-120000.yaml index f2ba727..b9d09d7 100644 --- a/changes/unreleased/Added-20260913-120000.yaml +++ b/changes/unreleased/Added-20260913-120000.yaml @@ -2,4 +2,5 @@ kind: Added body: 'The 226 AWS services DevCloud does not register now have their Smithy models vendored, so codegen covers all 420 models. No service is registered yet and every published coverage figure is unchanged' -Issue: "160" +custom: + Issue: "160" diff --git a/changes/unreleased/Added-20260913-140000.yaml b/changes/unreleased/Added-20260913-140000.yaml index d5c40b1..b4292be 100644 --- a/changes/unreleased/Added-20260913-140000.yaml +++ b/changes/unreleased/Added-20260913-140000.yaml @@ -4,4 +4,5 @@ body: 'Eight AWS services whose operations the generic CRUD engine cannot classi kinesis-video-webrtc-storage, marketplace-commerce-analytics, eks-auth and inspector-scan — now have hand-written providers, bringing coverage to 213 registered and 209 serving' -Issue: "161" +custom: + Issue: "161" diff --git a/changes/unreleased/Added-20260913-160000.yaml b/changes/unreleased/Added-20260913-160000.yaml index 99a8509..73746ee 100644 --- a/changes/unreleased/Added-20260913-160000.yaml +++ b/changes/unreleased/Added-20260913-160000.yaml @@ -3,4 +3,5 @@ body: 'The 218 AWS services that had generated routers but no provider package a now registered from the codegen scaffold template, so their SDK calls are answered locally instead of reaching a real AWS account — coverage moves to 431 registered and 426 serving at least one operation' -Issue: "162" +custom: + Issue: "162" diff --git a/changes/unreleased/Added-20260913-170500.yaml b/changes/unreleased/Added-20260913-170500.yaml index beac194..6050d16 100644 --- a/changes/unreleased/Added-20260913-170500.yaml +++ b/changes/unreleased/Added-20260913-170500.yaml @@ -1,9 +1,8 @@ kind: Added body: 'Two published figures are now gated against the binary that were not: the routing and depth targets on the coverage page, and the size of the shipped - binary (45 MiB ceiling, checked in CI). A third gate is new but narrower than - intended — every one of the 431 registered services is now asserted to - initialize, which main.go only warned about, while its startup time is logged - rather than gated because a shared CI runner is 14x slower than the machine the - published figure comes from' -Issue: "163" + binary (45 MiB ceiling, checked in CI). A third gate asserts that all 431 + registered services initialize, which main.go only warned about, but its startup + time is logged rather than gated' +custom: + Issue: "163" diff --git a/changes/unreleased/Documentation-20260913-170000.yaml b/changes/unreleased/Documentation-20260913-170000.yaml index e2672e3..4691397 100644 --- a/changes/unreleased/Documentation-20260913-170000.yaml +++ b/changes/unreleased/Documentation-20260913-170000.yaml @@ -3,4 +3,5 @@ body: 'The coverage page now states its two targets separately — routing, whic 431 of 431 and is a leak-zero safety property, and depth, which stays at the 205 services the 2026-09-05 demand study settled — so a service count can no longer be read as a promise of fidelity' -Issue: "163" +custom: + Issue: "163" diff --git a/changes/unreleased/Fixed-20260913-161500.yaml b/changes/unreleased/Fixed-20260913-161500.yaml index 3467707..1813e3f 100644 --- a/changes/unreleased/Fixed-20260913-161500.yaml +++ b/changes/unreleased/Fixed-20260913-161500.yaml @@ -3,4 +3,5 @@ body: 'The CRUD engine no longer answers an operation it cannot classify with a broader sibling''s route — chime''s AssociatePhoneNumberWithUser was returning UpdateUser''s 200 — because the registry now carries every REST-bound operation and declines the unclassifiable ones instead of letting their paths fall through' -Issue: "162" +custom: + Issue: "162" From d7155844d8bd713c49a8d1cf34a6a73d45fcea10 Mon Sep 17 00:00:00 2001 From: Sung-Kyu Yoo Date: Sun, 13 Sep 2026 22:18:26 +0900 Subject: [PATCH 2/3] docs: correct the two protocol-table rows that miscount EC2 as having no model The protocol table said 12 services have no in-tree Smithy model and exactly one speaks a protocol the parser cannot read. Counted against internal/generated/fidelity/manifest_gen.go, it is 11 and two: `ec2` is model-backed but speaks `aws.protocols#ec2Query`, which parser.go:441-453 does not recognise alongside the five it does. That put the page at odds with fidelity-manifest.md:106 and compatibility-policy.md:78, which both say 11, and left a core service's missing engine coverage unexplained. Rows now sum to 431 either way, so the arithmetic did not expose it, and no test gates this table. Adds a paragraph separating what EC2 loses from what a registered-only service loses: EC2 is served by a hand-written provider and is not in the registered-only five, but its model-declared tail stays `unimplemented` rather than falling back to `auto-crud`. --- docs/coverage.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/docs/coverage.md b/docs/coverage.md index 9bb5cff..0d18a61 100644 --- a/docs/coverage.md +++ b/docs/coverage.md @@ -49,8 +49,9 @@ so does the reverse. See [Reproducing these numbers](#reproducing-these-numbers) ## Why a registered service can serve nothing The generic [CRUD engine](crud-engine.md) needs two things: to know which -operation a request is for, and to recognise that operation as CRUD-shaped. Only -the second still stops it. +operation a request is for, and to recognise that operation as CRUD-shaped. The +second is the usual blocker; the first still stops two services whose protocol +the parser does not read. **The protocol always says which operation**, and the engine reads every form: @@ -61,8 +62,8 @@ the second still stops it. | `json-1.0` | 48 | the `X-Amz-Target` header | | `query` | 15 | the `Action` form field | | `rest-xml` | 4 | HTTP method + path | -| no in-tree model | 12 | n/a — hand-written providers | -| unrecognised protocol | 1 | n/a — `partnercentralrevenuemeasurement` is `rpcv2Cbor` | +| no in-tree model | 11 | n/a — hand-written providers | +| unrecognised protocol | 2 | n/a — `ec2` is `ec2Query`, `partnercentralrevenuemeasurement` is `rpcv2Cbor` | **The operation is not CRUD-shaped.** `GetThing`, `ListThings` and `CreateThing` map onto a generic store. `ExecuteStatement`, `InvokeEndpoint` and @@ -71,13 +72,19 @@ answer. This applies to four services: `forecastquery`, the two SageMaker Runtim variants `sagemaker-runtime` and `sagemakerruntimehttp2`, and `rds-data`. No protocol change reaches them. -**The protocol is one the parser does not read.** This applies to exactly one -service, and it is a different failure from the four above. -`partnercentralrevenuemeasurement` speaks `smithy.protocols#rpcv2Cbor`, which -`internal/codegen/parser.go` does not recognise, so *none* of its operations is -classified — not because their names are unshaped, but because the model never -reached the classifier. Teaching the parser a sixth protocol would reach it; no -amount of CRUD-shaping would. +**The protocol is one the parser does not read.** This applies to two services, +and it is a different failure from the four above. `ec2` speaks +`aws.protocols#ec2Query` and `partnercentralrevenuemeasurement` speaks +`smithy.protocols#rpcv2Cbor`; `internal/codegen/parser.go` recognises neither, so +*none* of their operations is classified — not because their names are unshaped, +but because the model never reached the classifier. Teaching the parser those two +protocols would reach them; no amount of CRUD-shaping would. + +EC2 is the one case where this costs depth rather than service: it is registered +and served by a hand-written provider, so it is not in the registered-only five. +What it loses is the engine — its model-declared long tail stays `unimplemented` +instead of falling back to `auto-crud`, which is what `EngineWired: false` on its +[fidelity manifest](fidelity-manifest.md) entry records. Registering a service the engine cannot serve is deliberate. The alternative is worse: an *unregistered* service is not routed, so the SDK call leaves the From 2a9bf2a10d38e435aad8487433c9ee56b39d13c3 Mon Sep 17 00:00:00 2001 From: Sung-Kyu Yoo Date: Sun, 13 Sep 2026 22:22:42 +0900 Subject: [PATCH 3/3] docs: halve the changelog body ceiling to 200 characters and refit the fragments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 400-character ceiling was wide enough to hold two full sentences plus a subordinate clause, so it never pushed against the one-sentence rule it was meant to back — the #163 fragment reached 484 and still read as being in the spirit of the limit. At 200 the ceiling and the rule push the same way. Refits the eight unreleased fragments that were over. What came out is detail the linked issue already carries: the eight service names in #161, the CI-runner timing in #163, the DynamoDB and Lambda operation counts in #167. Also trims RELEASE.md's "right length" example, which was 203 characters and would have failed the limit the paragraph above it states, and labels both examples with their length. --- .changie.yaml | 6 +++--- RELEASE.md | 18 ++++++++++-------- changes/unreleased/Added-20260913-140000.yaml | 7 ++----- changes/unreleased/Added-20260913-160000.yaml | 7 +++---- changes/unreleased/Added-20260913-170500.yaml | 8 +++----- .../unreleased/Changed-20260913-145759.yaml | 2 +- .../unreleased/Changed-20260913-184045.yaml | 2 +- .../Documentation-20260913-170000.yaml | 7 +++---- .../Documentation-20260913-212251.yaml | 2 +- changes/unreleased/Fixed-20260913-161500.yaml | 3 +-- 10 files changed, 28 insertions(+), 34 deletions(-) diff --git a/.changie.yaml b/.changie.yaml index 8a200c2..8d5b6e9 100644 --- a/.changie.yaml +++ b/.changie.yaml @@ -18,9 +18,9 @@ kinds: - label: Documentation body: # A ceiling, not a target: one sentence is the rule (see RELEASE.md), and a - # body this long is a paragraph that belongs in the linked issue. Enforced by - # `changie new` only — a hand-written fragment is not checked. - maxLength: 400 + # body this long is already two. Enforced by `changie new` only — a + # hand-written fragment is not checked. + maxLength: 200 custom: - key: Issue label: Issue Number diff --git a/RELEASE.md b/RELEASE.md index 2adb705..b2e6250 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -30,7 +30,7 @@ You are prompted for a **kind** (`Added`, `Changed`, `Deprecated`, `Removed`, writes a small YAML file under `changes/unreleased/` — commit it alongside your code. Prefer `changie new` over hand-writing the YAML: it enforces the issue number — a fragment without one renders as a dead link — and refuses a body over -400 characters. +200 characters. ### One sentence. Two at most. @@ -45,12 +45,14 @@ already points at. - **Never a third.** If it needs one, it is either two changes (write two fragments) or a story that belongs in the issue. -`changie new` refuses a body over 400 characters (`body.maxLength` in -[`.changie.yaml`](.changie.yaml)). That is a ceiling for the two-sentence case, -not a target, and it does not see a fragment you hand-write. +`changie new` refuses a body over 200 characters (`body.maxLength` in +[`.changie.yaml`](.changie.yaml)). That is roughly one sentence: at 200 the +second sentence is already crowding the first, so the ceiling and the rule push +the same way. It does not see a fragment you hand-write. ```yaml -# too long — the root cause, the mechanism and the evidence all belong in #142 +# too long — 417 characters; the root cause, the mechanism and the evidence all +# belong in #142 body: 'S3 Control requests were served by S3. `s3control` signs with S3''s own signing name, so every call fell through to the REST-XML default and the S3 provider parsed it as a bucket and key — `CreateAccessPoint` returned 200 and @@ -58,10 +60,10 @@ body: 'S3 Control requests were served by S3. `s3control` signs with S3''s own `/v20180820/` path prefix, and its unserved operations return a clean AWS error instead of a fabricated success' -# right length +# right length — 193 characters body: 'S3 Control requests were served by S3, which answered `CreateAccessPoint` - with a fabricated 200. It is now split off by its `/v20180820/` path prefix, and - its unserved operations return a clean AWS error' + with a fabricated 200. It is now split off by its `/v20180820/` path prefix and + its unserved operations decline cleanly' ``` Config: [`.changie.yaml`](.changie.yaml). diff --git a/changes/unreleased/Added-20260913-140000.yaml b/changes/unreleased/Added-20260913-140000.yaml index b4292be..2d358e8 100644 --- a/changes/unreleased/Added-20260913-140000.yaml +++ b/changes/unreleased/Added-20260913-140000.yaml @@ -1,8 +1,5 @@ kind: Added -body: 'Eight AWS services whose operations the generic CRUD engine cannot classify - — payment-cryptography-data, geo-routes, cloudsearch-domain, ec2-instance-connect, - kinesis-video-webrtc-storage, marketplace-commerce-analytics, eks-auth and - inspector-scan — now have hand-written providers, bringing coverage to 213 - registered and 209 serving' +body: 'Eight AWS services the generic CRUD engine cannot classify now have + hand-written providers, taking coverage to 213 registered and 209 serving' custom: Issue: "161" diff --git a/changes/unreleased/Added-20260913-160000.yaml b/changes/unreleased/Added-20260913-160000.yaml index 73746ee..e309904 100644 --- a/changes/unreleased/Added-20260913-160000.yaml +++ b/changes/unreleased/Added-20260913-160000.yaml @@ -1,7 +1,6 @@ kind: Added -body: 'The 218 AWS services that had generated routers but no provider package are - now registered from the codegen scaffold template, so their SDK calls are answered - locally instead of reaching a real AWS account — coverage moves to 431 registered - and 426 serving at least one operation' +body: 'The 218 AWS services with generated routers but no provider package are now + registered from the codegen scaffold, taking coverage to 431 registered and 426 + serving at least one operation' custom: Issue: "162" diff --git a/changes/unreleased/Added-20260913-170500.yaml b/changes/unreleased/Added-20260913-170500.yaml index 6050d16..f501c7b 100644 --- a/changes/unreleased/Added-20260913-170500.yaml +++ b/changes/unreleased/Added-20260913-170500.yaml @@ -1,8 +1,6 @@ kind: Added -body: 'Two published figures are now gated against the binary that were not: the - routing and depth targets on the coverage page, and the size of the shipped - binary (45 MiB ceiling, checked in CI). A third gate asserts that all 431 - registered services initialize, which main.go only warned about, but its startup - time is logged rather than gated' +body: 'Three figures are now gated against the binary: the coverage page''s routing + and depth targets, the 45 MiB binary-size ceiling, and that all 431 registered + services initialize' custom: Issue: "163" diff --git a/changes/unreleased/Changed-20260913-145759.yaml b/changes/unreleased/Changed-20260913-145759.yaml index 4ea13df..e81ec3d 100644 --- a/changes/unreleased/Changed-20260913-145759.yaml +++ b/changes/unreleased/Changed-20260913-145759.yaml @@ -1,5 +1,5 @@ kind: Changed -body: The weekly Smithy sync re-derives the published coverage figures itself and commits them into its own pull request, so reviewing it is confirming which operations moved rather than transcribing the figures out of failing tests by hand +body: The weekly Smithy sync now re-derives the published coverage figures and commits them into its own pull request, so reviewing it means confirming what moved rather than transcribing failing tests time: 2026-09-13T14:57:59.733064+09:00 custom: Issue: "165" diff --git a/changes/unreleased/Changed-20260913-184045.yaml b/changes/unreleased/Changed-20260913-184045.yaml index 85f60b1..c7482ee 100644 --- a/changes/unreleased/Changed-20260913-184045.yaml +++ b/changes/unreleased/Changed-20260913-184045.yaml @@ -1,5 +1,5 @@ kind: Changed -body: The published fidelity tiers are stated against two denominators — the services DevCloud promises depth on, and every service it registers — so the long tail it routes to stop SDK calls escaping to a billable account no longer reads as a drop in hand-written coverage +body: The published fidelity tiers are stated against two denominators — the services DevCloud promises depth on, and every service it registers — so the routed long tail no longer reads as a fidelity drop time: 2026-09-13T18:40:45.000000+09:00 custom: Issue: "166" diff --git a/changes/unreleased/Documentation-20260913-170000.yaml b/changes/unreleased/Documentation-20260913-170000.yaml index 4691397..dc2c9ea 100644 --- a/changes/unreleased/Documentation-20260913-170000.yaml +++ b/changes/unreleased/Documentation-20260913-170000.yaml @@ -1,7 +1,6 @@ kind: Documentation -body: 'The coverage page now states its two targets separately — routing, which is - 431 of 431 and is a leak-zero safety property, and depth, which stays at the 205 - services the 2026-09-05 demand study settled — so a service count can no longer - be read as a promise of fidelity' +body: 'The coverage page states routing and depth as two targets — 431 of 431 + registered, depth still the 205 services the demand study settled — so a service + count no longer reads as a fidelity promise' custom: Issue: "163" diff --git a/changes/unreleased/Documentation-20260913-212251.yaml b/changes/unreleased/Documentation-20260913-212251.yaml index 59bee88..387b48c 100644 --- a/changes/unreleased/Documentation-20260913-212251.yaml +++ b/changes/unreleased/Documentation-20260913-212251.yaml @@ -1,5 +1,5 @@ kind: Documentation -body: 'The five per-service pages now list the operations DevCloud actually serves, derived from the fidelity manifest rather than from memory: S3 documented 8 of 37, DynamoDB 8 of 20, Lambda 6 of 25 and IAM 6 of 58, and each page''s limitations denied features that had since been implemented' +body: The five per-service pages now list the operations DevCloud actually serves, derived from the fidelity manifest rather than from memory — S3 had documented 8 of 37, IAM 6 of 58 time: 2026-09-13T21:22:51.981235+09:00 custom: Issue: "167" diff --git a/changes/unreleased/Fixed-20260913-161500.yaml b/changes/unreleased/Fixed-20260913-161500.yaml index 1813e3f..cfef236 100644 --- a/changes/unreleased/Fixed-20260913-161500.yaml +++ b/changes/unreleased/Fixed-20260913-161500.yaml @@ -1,7 +1,6 @@ kind: Fixed body: 'The CRUD engine no longer answers an operation it cannot classify with a broader sibling''s route — chime''s AssociatePhoneNumberWithUser was returning - UpdateUser''s 200 — because the registry now carries every REST-bound operation - and declines the unclassifiable ones instead of letting their paths fall through' + UpdateUser''s 200 — and now declines it cleanly' custom: Issue: "162"