Skip to content

docs(adr): retire ADR-0076 D11's contention metric and the reopen threshold it fed - #10154

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-10076-retire-d11-contention-reporting
Aug 20, 2026
Merged

docs(adr): retire ADR-0076 D11's contention metric and the reopen threshold it fed#10154
os-zhuang merged 2 commits into
mainfrom
claude/issue-10076-retire-d11-contention-reporting

Conversation

@os-elon

@os-elonos-elon commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator

Fixes#10076

Governed surface — draft only, human merge. This PR's diff touches docs/adr/**, which the GOVERNED_SURFACES register carries (printed at head: docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md). Do not flip it ready, enqueue it, or arm auto-merge.

What this does

ADR-0076 D11's 2026-08-16 revision installed a replacement metric — the per-PM-round count of dispatchable cards that could not run concurrently because both land in packages/rest/src/rest-server.ts — and gated reopening option A on that counter sustaining above ~1/round.

This retires the metric and the threshold together, per the maintainer ruling of 2026-08-20 (option B), and records the retirement in the ADR rather than performing it silently.

Why — measured at head, not inherited

  1. No mechanism ever computed the counter. Section ③ reasoned that "the dispatch loop already computes batch independence, so it needs no git log window". Batch independence is computed per round to schedule work; it is not persisted, and the counter was never derived from it. Measured on this tree: no script, gate, workflow or agent-instruction file produces, stores or reads the series. contention appears nowhere in the repo as a metric — only in unrelated runtime code (Redis locks, queue CAS retries, SQLite busy handling).
  2. The reporting anchor has been in a closed/completed state since 2026-08-16T06:47:27Z (issue [finding] ADR-0076 D11 的第二半从未落地:packages/rest/src/rest-server.ts 已 8593 行(ADR 记录约 5.1k),且无 issue 承接 #5949). Every reading owed after that date had nowhere live to land.
  3. The delivery record makes the failure structural. Rounds 15–28: round 23 filed a reading into the already-shut anchor and flagged it; rounds 24–25 produced no entry; rounds 26–28 were filed only retroactively during the audit. Three seats, thirteen rounds, one gap — an obligation with no live named reader and no trigger cannot fail loudly, so it reads as satisfied until somebody audits it.

So the ADR was claiming a reopen threshold that nothing fed. That is the defect; the retirement is the fix.

Shape of the change

  • Section ③'s metric and threshold are marked retired in place, not deleted. The 2026-08-16 decision was argued from them, and a later reader needs to see what was withdrawn rather than find a gap. This follows the file's own house style for the withdrawn "central route generator" framing.
  • A new #### Revision 2026-08-20 (#10076) section records what is retired, why (the three findings above), and — explicitly — what it does not do:
  • The two upstream claim sites stop pointing readers at a live metric: the ADR status line and the D11 status bullet.

Option C — continuing to post measurements into a shut card — is the shape this card exists to end, and is explicitly refused in the ADR text (⛔ markers on both the blockquote and the threshold sentence).

Premise verification (the dispatch asked for this to be re-derived, not assumed)

ClaimVerdictEvidence
D11's commitment text lives in docs/adr/0076-objectql-core-tiering.md✅ confirmedSection ③ of the 2026-08-16 revision
The reopen threshold is fed by some live mechanismnot found — the ruling's premise holdsNo producer/consumer anywhere in the tree
The commitment is also written into a lane file under .claude/skills/pm-dispatch/**nogrep -rni 'contention|5949|rest-server|reopen' .claude/ exits 1, zero lines — so no clause-① stop condition
The rest-server.ts ADR anchor pins D11❌ noscripts/adr-anchors/packages__rest__src__rest-server.ts.json anchors ADR-0045 (the filterAppForUser publish gate), untouched here

One correction to the dispatch brief, carried into the ADR as measured rather than as quoted: #5949 was shut on 2026-08-16T06:47:27Z, not 2026-08-17. The ADR text and this PR both use the measured timestamp.

Gates

Re-run at final head 2864eaa6f (two commits: the revision, then a markdown-marking fix). Each exit code captured before any pipe, and quoted from the gate's own verdict line rather than from $?:

  • node scripts/check-adr-anchors.mjs --self-testEXIT=0; run → EXIT=0, check-adr-anchors: OK (51 anchored file(s), every governing ADR still referenced; 122 decision number(s) … 26707 citation(s) across 3263 file(s) resolve).
  • node scripts/check-adr-links.mjs --self-testEXIT=0; run → EXIT=0, ✅ check-adr-links: 551 relative link destination(s) under docs/adr/ resolve
  • node scripts/pm/check-governed-merges.mjs --self-testEXIT=0, ✓ check-governed-merges --self-test: 81 assertions …
  • node scripts/pm/dispatch-gates.mjs (no paths — it derives its own change set from the merge base) → EXIT=0, deriving exactly the three families above from docs/adr/0076-objectql-core-tiering.md. No family the dispatch list missed.
  • Control-byte scan over the edited file → clean (grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' exits 1).

Declared narrowing — pnpm lint was not run. Not a budget call: this repo's pnpm lint is eslint . --no-inline-config, and every files: block in eslint.config.mjs matches only {ts,tsx,mts,cts,js,jsx,mjs,cjs}. There is no markdown processor block, and no prettier/markdownlint/remark gate in package.json. This PR's diff is exactly one .md file, so ESLint's population provably excludes it and the run could not have read a byte of the change. CI runs the full farm regardless.

Release notes

No changeset: docs/adr/** publishes nothing, which lint.yml names as the textbook skip-changeset case. The label is applied to this PR. content/docs/releases/ is untouched.


Generated by Claude Code

…eshold it fed (#10076)
D11's 2026-08-16 revision installed a replacement metric — the per-PM-round
count of dispatchable cards blocked from running concurrently because both
land in `packages/rest/src/rest-server.ts` — and gated reopening option A on
it sustaining above ~1/round.
Nothing ever computed that counter. Batch independence is computed per round
to schedule work and is not persisted; no script, gate, workflow or agent
instruction file in this repo produces, stores or reads the series. Its
reporting anchor (#5949) has been closed/completed since 2026-08-16, so every
reading owed after that date had nowhere live to land, and the readings that
were filed went into a closed card.
So the ADR claimed a reopen threshold that nothing fed. Per the maintainer
ruling of 2026-08-20 (option B), the metric and the threshold are retired
together, in writing:
- section ③'s metric and threshold are marked retired IN PLACE rather than
deleted, since the 2026-08-16 decision was argued from them;
- a new 2026-08-20 revision records what is retired, why, and — explicitly —
what it does not do: it does not revive the raw `wc -l` series, does not
make B permanent, and does not touch ①/④ or the 2026-08-15 ruling;
- the status line and the D11 status bullet stop pointing readers at a live
metric.
Reopening A is now an ordinary new decision under Prime Directive #13,
argued from a measurement taken for that purpose, rather than an automatic
trigger nothing was ever going to pull.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019bmVFqoQPq63zhKrxdYG1r
@os-elonos-elon added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 20, 2026 — with Claude
@github-actionsgithub-actionsBot added the documentation Improvements or additions to documentation label Aug 20, 2026
…trikethrough
GFM matches strikethrough on a run of ONE or two tildes, and the withdrawn
sentence contains a bare `~` in "~1/round" — so the marking depended on
delimiter-run lengths rather than on being unambiguous. The rest of this
record marks withdrawn text with a ⛔ prose marker and leaves the sentence
standing (the "central route generator" framing above does exactly that),
so this now does the same.
No change to what is retired.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019bmVFqoQPq63zhKrxdYG1r
@os-zhuang
os-zhuang added this pull request to the merge queueAug 20, 2026
Merged via the queue into main with commit 736cfb1Aug 20, 2026
23 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-10076-retire-d11-contention-reporting branch August 20, 2026 15:48
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/sskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-elon@os-zhuang