fix: the weekly model sync discarded the only changes worth reviewing - #147
Merged
Merged
Conversation
A failing test step ends the job before Create Pull Request runs, so a sync whose upstream churn is real enough to move the published-figure gate opens no PR and the refreshed models die with the runner. RED, validated by executing the tests against the committed workflow: TestSyncOpensAPullRequestEvenWhenTestsFail - FAIL (step unreachable) TestSyncPullRequestBodyReportsTheTestResult - FAIL (test step has no id) Refs .claude/plans/aws-service-coverage-100-milestone-8.plan.md Task 2
continue-on-error makes the PR reachable and makes the weekly job green regardless of what upstream did. TestSyncStillFailsWhenTestsFail requires the swallowed failure to be re-raised after the PR exists. RED, validated: SKIP today (the step is not yet continue-on-error), and it becomes a live assertion the moment the Task 2 fix lands.
… cron The test step now records its result instead of ending the job, so the refreshed models reach a pull request even when the published-figure gate fires — which is exactly what an upstream operation change is designed to do. The swallowed failure is re-raised after the PR exists, so the cron does not silently go green forever. The PR body states the in-job test result and what a failure means, so a red sync reads as red rather than inviting a merge. GREEN, validated by rerunning the same target: TestSyncOpensAPullRequestEvenWhenTestsFail PASS (was FAIL) TestSyncPullRequestBodyReportsTheTestResult PASS (was FAIL) TestSyncStillFailsWhenTestsFail PASS (was SKIP, now live) CGO_ENABLED=0 go test ./... no failures Refs .claude/plans/aws-service-coverage-100-milestone-8.plan.md Task 2
A whole-tree regeneration tells a reviewer nothing about which operations moved. model_churn.py's self-check states the three readings that answer it — operation extraction, recursive documentation stripping, and the documentation-only verdict — against synthetic models. RED, validated by executing it: python3 scripts/model_churn.py --self-check -> NotImplementedError at service_operations (exit 1) Refs .claude/plans/aws-service-coverage-100-milestone-8.plan.md Task 3
Reads operation shape names and documentation traits, nothing else, so a reviewer sees the change rather than the regeneration. Documentation stripping is recursive because the traits sit on members, not only on top-level shapes. GREEN, validated by rerunning the same target: python3 scripts/model_churn.py --self-check -> self-check OK (exit 0) Validated against a real refresh of all 194 models (2026-09-06): 93 of 194 changed; 32 moved an operation; 0 documentation-only upstream publishes 431 models; 237 not vendored here Refs .claude/plans/aws-service-coverage-100-milestone-8.plan.md Tasks 3, 4
RED, validated by executing it: TestSyncPullRequestBodySummarisesTheChurn - FAIL (no step runs model_churn.py, so the PR cannot say which operations moved) The other three sync guarantees still pass across the body-path refactor. Refs .claude/plans/aws-service-coverage-100-milestone-8.plan.md Task 3
The body is built from scripts/model_churn.py and passed with body-path, so a reviewer reads which services gained or lost operations instead of a whole-tree regeneration. It also carries the in-job test result and the count of upstream models not vendored here. GREEN, validated by rerunning the same target: TestSyncPullRequestBodySummarisesTheChurn PASS (was FAIL) TestSyncOpensAPullRequestEvenWhenTestsFail PASS TestSyncStillFailsWhenTestsFail PASS TestSyncPullRequestBodyReportsTheTestResult PASS CGO_ENABLED=0 go test ./... no failures Refs .claude/plans/aws-service-coverage-100-milestone-8.plan.md Task 3
Measured once, on 2026-09-06, and published with its ceiling stated: refreshing all 194 vendored models changed 93, of which 32 moved an operation and 0 were documentation-only. Regenerating moved 134 files and took known operations 12,407 -> 12,660, failing the published-figure gate by design. The reading is not a weekly rate and says so. The 93 that changed were vendored 141 days earlier; the 101 vendored the day before did not move at all. The shape of the work is settled, the cadence is not. docs/contributing.md adds what a sync-PR reviewer is asked to check. The PRD's 'What is the sustaining cost?' flips to answered with a number; 'Who owns the ongoing work?' remains the only unchecked item. Validated: CGO_ENABLED=0 go test ./... no failures make codegen; git status internal/generated 0 drift scripts/generate-imports.sh; git diff clean pytest tests/compatibility/ 1127 passed, 17 skipped Refs .claude/plans/aws-service-coverage-100-milestone-8.plan.md Task 5
4 of 5 tasks
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
The weekly Smithy sync was structurally incapable of surfacing the upstream change it exists to surface: its test step ended the job before
Create Pull Request, and an upstream model that gains an operation is designed to fail that step. This PR fixes that, measures one real sync, and publishes what keeping 205 services current actually costs.No service is added. The registered count stays 205.
Related Issue
Refs
.claude/prds/aws-service-coverage-100.prd.md— Milestone 8, "Sustaining cost known and bounded". Closes the PRD's own largest open question, "What is the sustaining cost?", which had survived six milestones.Changes
The defect, and why it hid for six milestones.
go test ./...inside the sync includes the published-figure gate incmd/devcloud/coverage_test.go. One new upstream operation moves the fidelity manifest and fails that gate — on purpose, so a human looks at a coverage change. But a failed step ends the job, soCreate Pull Requestnever ran and the refreshed models died with the runner. A cosmetic sync produced a PR; a semantic one produced a red cron job with nothing attached. The mechanism that would answer "what does this cost?" deleted its own evidence, every time the answer mattered.Confirmed by running it, not by reading the YAML:
.github/workflows/smithy-sync.yml— the test step records its result instead of gating; the PR is opened whenever models moved; the swallowed failure is re-raised after the PR exists, so the cron cannot silently go green forever. The body is built from the churn summary viabody-path.scripts/model_churn.py(new) — says which services gained or lost operations, which models moved only documentation, and how many upstream models are not vendored here. stdlib only,die()on a bad read,--self-checkbuilt in — mirroringscripts/demand_rank.py. It reads operation shape names and doc traits and nothing else; if it ever disagrees with codegen, codegen is right.cmd/devcloud/sync_test.go(new) — four guarantees over the workflow, in the same spirit ascoverage_test.gogatingdocs/coverage.md: the asset is not Go, but a silent regression in it is invisible until the week it matters.docs/coverage.md— new "Keeping up with upstream" section carrying the measurement, its ceiling, and the command that re-derives it.docs/contributing.md— what a reviewer of a weekly sync PR is actually being asked to check.What the measurement says — and what it does not
Refreshed all 194 vendored models against
aws-sdk-go-v2main on 2026-09-06:This is not a weekly rate, and the docs say so. The 93 that changed were vendored 141 days earlier; the other 101 were vendored the day before and none of them moved. So the figure is an accumulated backlog, and the only weekly-scale sample available reads zero.
What is settled is the shape of the work: no sync can be waved through as "AWS just reworded things", and every sync that moves an operation costs a human re-derivation of the published figures. What is not settled is the cadence. The plan pre-registered four outcomes; the measurement did not fit the one it was closest to, and that is recorded rather than rounded off.
Largest movers:
ec2+46 operations,glue+34,acm+23,sagemaker+22.0 documentation-onlyover 141 days looked like a bug, so it was checked rather than trusted — the non-doc differences are real upstream trait additions (smithy.rules#endpointBdd,aws.auth#sigv4a), not nondeterminism.Test Plan
TDD throughout — four RED→GREEN cycles, each checkpointed. Evidence in
.claude/tdd/aws-service-coverage-100-milestone-8.tdd.md.81878beRED →a69ace2GREEN — a failing sync must leave a reviewable PR8a03c77RED (SKIP until applicable) → live assertion after the fix — the fix's own failure mode:continue-on-erroralone would trade one silent no-op for anotherd4e4a6eRED (NotImplementedError) →a358448GREEN — the churn readings4a0e2caRED →f2946bbGREEN — the summary reaches the PR bodyValidation on the final tree:
Known gap, stated rather than papered over: the workflow change is verified statically against the YAML, not by a live
workflow_dispatchrun. That verification arrives with this PR's own CI.Checklist
golangci-lint run)