Skip to content

chore(deferrals): re-decide both expired rows, and bump the ratchet they were holding - #40

Merged
tomtom215 merged 3 commits into
mainfrom
claude/deferrals-redecision-2026-08
Aug 18, 2026
Merged

chore(deferrals): re-decide both expired rows, and bump the ratchet they were holding#40
tomtom215 merged 3 commits into
mainfrom
claude/deferrals-redecision-2026-08

Conversation

@tomtom215

Copy link
Copy Markdown
Owner

What and why

cargo xtask deferrals --check is a weekly scheduled gate, not a PR gate (ADR-0010, deliberately — an expiry should page the schedule, not block unrelated work). Nobody acted on it. Two rows passed their review-by dates, and three published claims had rotted behind them. Both are re-decided against re-fetched evidence rather than re-dated blind, which is what ADR-0010 requires.

rust-sdk-902-offer-clock (review-by 2026-08-10). The offer is open with zero replies at 68 days — no comment, no assignee, no linked PR, labelled P2/enhancement. But R9 has not fired: its trigger is two substantive offers unanswered for 60+ days, and the same day's other filing was answered — rust-sdk#903 closed and fixed by merged #905 in nine days. So the count stands at one and M4's DoD does not re-scope. Outcome recorded in the risk register and the engagement doc; not posted upstream, because this repo's own pattern (issue #9) makes posting a maintainer action.

That PR was also not "maintainer-authored" as the engagement doc claimed — GitHub shows the author carrying the Contributor badge, approved and merged by a Member. Still a successful engagement, but the distinction is precisely what R9 measures: maintainers triaged and merged a community fix promptly; they did not write it.

suite-0-2-0-stable-pin-bump (review-by 2026-08-15). Half of it was buildable, so it is built. The row and register row 2.4 both said the npm alpha dist-tag "has been quiet since 2026-07-01" — alpha.10 published 2026-07-27, the day after that was written, and alpha.11 on 2026-08-07. That is ADR-0010's own founding example recurring verbatim. The stable pin genuinely cannot move (latest is still 0.1.16, unchanged since 2026-03-30) and re-dates; the draft ratchet moves here with a BLESS=1 re-measurement in the same commit.

The bump paid for itself immediately

No pre-existing check changed status. The entire delta is 36 new wire-schema-valid checks, which validate every message against the negotiated revision's JSON schema. Thirty-two pass. The four that fail are all on the 2025-11-25 leg — resources-{list,read-text,read-binary,templates-read} — each for must have required property 'cacheScope' and 'ttlMs'.

That is CACH-001: the single clause this workspace's registry had already flagged against the legacy server, while the official runner scored both servers an indistinguishable 23/23. The runner found it independently, six weeks later. The standing finding "the runner cannot distinguish the two servers" is recorded as superseded rather than deleted — a negative result about an instrument expires when the instrument improves. Legs now read 37 passing / 4 failing (legacy) and 41 / 0 (stateless); baseline totals move 46 → 78 passing, 0 → 4 failing, 46 → 82 checks.

The asymmetry is recorded because it is instructive: tools/list and prompts/list pass only because rmcp's #[tool_handler]/#[prompt_handler] expansions attach caching hints unconditionally, while resources/* go through this workspace's revision-aware cached(), which correctly withholds them at 2025-11-25. The honest implementation is the one the new check fails.

The gate caught me, and found older residue

The first push failed CI: draft-coverage — CHANGELOG.md quotes a verdict of 123 pass, 1 fail that no committed report produced. The entry had quoted register row 1.5i in good faith. Those figures are the pre-ADR-0012 counts — 58 + 65 = 123 and 59 + 65 = 124 exactly, folding not-observed into pass, the very accounting ADR-0012 removed. The 2026-08-17 sweep that corrected this arithmetic fixed the CLAIM_FILES the gate parses and stopped exactly at that boundary; register row 1.5i, 03-conformance-strategy.md and 06-roadmap.md are outside it and still carried the inflated pair. All three corrected against the committed goldens, second commit. The lesson kept is the boundary, not the arithmetic.

Deliberately not done

Moving deferrals --check into xtask ci. ADR-0010 excludes it on purpose and that reasoning holds. The real gap is the last mile: a red weekly job reaches a human only by an easily-missed email, and the job runs spec-drift too, so a network flake looks the same from outside as an expired row. Fixing that needs issues: write on a workflow that is deliberately contents: read, plus a new pinned action — a security-surface change with no actionlint available here to validate it. Opened as ledger row expired-deferral-notification rather than shipped untested as a rider. Second new row, draft-suite-pin-currency, covers the blind spot that let the ratchet go six weeks stale: the weekly alpha job runs at the registry's revision, so it cannot see draft scenario churn.

Checklist

  • cargo xtask ci passes locally — reports every local gate ran and passed: 12 steps, 85 suites, 1,757 tests, 0 failed, 0 SKIPPED, no warnings or errors outside the 3 known-benign license-not-encountered notes. MSRV clippy (1.88.0) and cargo-deny both ran (advisories ok, bans ok, licenses ok, sources ok).
  • SPDX header on every new file — no new files; all changes are edits to existing tracked files.
  • No source or registry file exceeds 500 lines — every source and registry file (182) is within 500 lines.
  • New public items have rustdoc — no public API changed; the only code change is one const string, DRAFT_SUITE_VERSION.
  • New code has tests — no new code paths. The behaviour change is the pin, and it is covered by the ratchet itself: cargo xtask draft-readiness re-run after the bless reports matches the committed baseline with a clean working tree, so the recorded baseline is self-consistent at the new pin.
  • Golden reports regenerated deliberately — none needed, and none changed. The committed captures under corpus/draft/captured/ are not auto-regenerated (re-copying a tap is a deliberate act, per corpus/README.md), so no .jsonl and no golden moved. conformance/draft-readiness.json was re-blessed and its diff reviewed check by check.
  • ADR added/updated — none needed. ADR-0010's mechanism is being used, not revised; ADR-0012's rule is being applied to docs that had escaped it. The one genuine policy change — decoupling the two suite pins' triggers — is a refinement of the version policy in 03-conformance-strategy.md, stated there with its reasoning.
  • Plan documents updated — deferrals.json (both rows re-decided, two rows added), 01-ecosystem-context.md (rows 1.5i and 2.4), 03-conformance-strategy.md (pin triggers decoupled; runner-vs-registry paragraph), 06-roadmap.md, 07-ecosystem-engagement.md (rows 1 and 9), 08-risk-register.md (R9), corpus/README.md, crates/mcp-everything-server/README.md, and a dated note in scheduled.yml.

Other gates run

Gate Result
cargo xtask deferrals --check 7 rows, none expired — the gate this PR exists to satisfy
cargo xtask draft-readiness matches the committed baseline at the new 0.2.0-alpha.11 pin; working tree clean
cargo xtask conformance green both legs — zero unexplained divergence, coverage manifest in sync
cargo xtask spec-drift (all features) 412 quotes across 2 revisions, 0 drifted
cargo xtask draft-coverage --check 5 captures evidence 109 of 124 judgeable clauses; every prose claim agrees
cargo xtask mutants no mutants in scope — a true empty, not a pass. The diff is xtask/** (excluded by .cargo/mutants.toml), Markdown and JSON; no shipped-crate src/ changed. Confirmed with cargo mutants --in-diff --list.

Every figure above was re-measured against the committed data before posting.

🤖 Generated with Claude Code

https://claude.ai/code/session_01SjVp39nWRhAQeYjSGbQWoZ


Generated by Claude Code

Tom F. and others added 3 commits August 18, 2026 11:35
…hey were holding

`cargo xtask deferrals --check` is a weekly scheduled gate, not a PR gate
(ADR-0010, deliberately — an expiry should page the schedule, not block
unrelated work). Nobody acted on it. Two rows passed review-by, and three
published claims had rotted behind them.

rust-sdk-902-offer-clock (review-by 2026-08-10). The offer is open with zero
replies at 68 days: no comment, no assignee, no linked PR. But R9's trigger is
TWO substantive offers unanswered for 60+ days, and the same day's other filing
was answered — rust-sdk#903 closed and fixed by merged #905 in nine days. So
R9 has NOT fired and M4's DoD does not re-scope. That PR was also not
"maintainer-authored" as the engagement doc claimed: GitHub shows the author
carrying the Contributor badge, approved and merged by a Member. Successful
engagement either way, but the distinction is exactly what R9 measures.
Recording the outcome, not posting — upstream posting is a maintainer action
under this repo's own pattern (issue #9).

suite-0-2-0-stable-pin-bump (review-by 2026-08-15). Half of it was buildable
now, so it is built. The row and register row 2.4 both said the npm `alpha`
dist-tag "has been quiet since 2026-07-01"; alpha.10 published 2026-07-27, the
day after that was written — ADR-0010's own founding example, verbatim, again.
alpha.11 followed on 2026-08-07. The stable pin genuinely cannot move (`latest`
is still 0.1.16, unchanged since 2026-03-30) and re-dates; the draft ratchet
moves here, with a BLESS=1 re-measurement in the same commit.

The bump earns its keep immediately. No pre-existing check changed status; the
whole delta is 36 new `wire-schema-valid` checks that validate every message
against the negotiated revision's JSON schema. Four fail, all on the 2025-11-25
leg, all for missing `cacheScope`/`ttlMs` on resource results — CACH-001, the
one clause this workspace's registry had already found and the runner had
missed. The standing finding "the runner cannot distinguish the two servers" is
superseded rather than deleted: a negative result about an instrument expires
when the instrument improves, and here the prose-level reading arrived six weeks
before the schema-level one.

The two pins are decoupled in 03-conformance-strategy, because they answer
different questions: one gates a released revision and waits for a release, the
other measures readiness against a scenario set that is itself moving, where
holding still does not preserve the measurement — it ages the question.

Two new rows for what this exposed: draft-suite-pin-currency, and
expired-deferral-notification (a red weekly job reaches a human only by an
easily-missed email; fixing that needs `issues: write` on a `contents: read`
workflow, so it gets its own reviewed change rather than riding along here).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SjVp39nWRhAQeYjSGbQWoZ
… docs

The 2026-08-17 correction fixed "123 and 124 passes where the reports say
58 pass, 1 fail and 59 pass, 0 fail" — and stopped exactly at the boundary of
the CLAIM_FILES that `cargo xtask draft-coverage --check` parses. Register row
1.5i, 03-conformance-strategy and 06-roadmap are outside that set, so all three
still carried the inflated pair: pass + not-observed, which is the accounting
ADR-0012 exists to remove. 58 + 65 = 123 and 59 + 65 = 124, exactly.

Found the right way. A CHANGELOG entry in the previous commit quoted register
row 1.5i in good faith, and the claim gate rejected it as a verdict no
committed report produced. The gate could see the copy and not the original.

All three corrected against the committed goldens, with the register row
recording what it used to say and why rather than being quietly overwritten.
The lesson worth keeping is the boundary, not the arithmetic: a hand-kept
number outside the checked set drifts silently, and the checked set is
currently seven Markdown files.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SjVp39nWRhAQeYjSGbQWoZ
…cision-2026-08

# Conflicts:
#	CHANGELOG.md
@tomtom215
tomtom215 merged commit 1f61185 into main Aug 18, 2026
41 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant