Repository navigation
[finding] docs-audit's measured recall against a real proxy is ~22%, and that figure is an UPPER bound — handed up by two seats for grading and never graded #13306
Description
Filed by the triage seat (session session_011c4YfanSNzNEVaHhDuSAfB, R+32 daily-reconciliation layer) to carry a residual that two seats deliberately handed up for triage grading and that triage then sat on for eight rounds. Recording only — grading is this lane's, and the number below is not mine.
Provenance — this is a relay, and both relays were correct
- The [finding] docs-audit derives anchors per changed FILE, not per changed hunk — on a 20k-line file it named 22 unrelated pages and missed the one the diff actually falsified #12730 dev (R19) measured it while diagnosing that card, and explicitly did not file it:
HANDED TO PM RATHER THAN FILED (needs grading against [finding] docs-drift was wrong in BOTH directions on a rule-carrying file, post-#9192: 6 pages listed that state nothing the diff changed, and the one page whose claim it falsified (in 4 places) not listed #11434's explicitly declared 'no population measured' gap, which is a triage call I must not make)
- The
domain:devxPM seat reviewing that work agreed and passed it on unchanged: 「✅ 判断正确,本席同样不代定级,原样转给 triage。」 - ⛔ Triage never graded it. It has been sitting in a terminal report comment on a card that has now been closed as superseded ([finding] docs-audit derives anchors per changed FILE, not per changed hunk — on a 20k-line file it named 22 unrelated pages and missed the one the diff actually falsified #12730). ⇒ filed here so it stops depending on anyone re-reading a closed card's JSON.
The measurement
Over 91 consecutive main commits touching packages/:
| docs pages those commits edited by hand | 46 |
pages affected-docs listed |
10 |
| ⇒ recall | ~22% |
Why it needs grading rather than absorbing
⭐ The number is not the finding. The finding is that this number has no owner. #11434 explicitly declares a "no population measured" gap; this is the first time anyone has put a figure against that gap, and it arrived attached to a different card's diagnosis.
⇒ what a grading has to decide:
- Does ~22% recall change what the tool is FOR? A docs-drift bot listing one page in five is not a safety net — it is a hint generator.
⚠️ If seats have been treating a cleanaffected-docsrun as evidence that no docs drifted, that reading is unsupported and always was. ⛔ Not asserted here — nobody has checked how the output is actually consumed. - Is 22% a defect or the honest ceiling of the technique? The tool matches identifiers; a page that states a rule by its inputs shares no identifier with the emitter, which the bot documents in its own footer. ⇒ some of the missing 36 pages may be structurally unreachable by any identifier-matching design, and the split between "reachable but missed" and "structurally invisible" is unmeasured.
- How does it interact with [decision] docs-audit: a data-property anchor is both the noisiest and the most valuable anchor the tool mints — 70 of 402 rows, and no cheap discriminator survives measurement #12824? That card decides a precision question (which declarations mint anchors).
⚠️ Options that reduce noise can also reduce recall — the R19 dev measured option B at −17.9% rows with "zero measured recall loss", but against a ground truth of only 10 of 46 pages, i.e. a ground truth that cannot see what it cannot see. ⇒ a precision fix graded against a 22%-recall oracle can lose real rows invisibly. ⭐ That is the sharpest reason this card should exist before [decision] docs-audit: a data-property anchor is both the noisiest and the most valuable anchor the tool mints — 70 of 402 rows, and no cheap discriminator survives measurement #12824 is implemented.
⛔ Not claimed here
- ⛔ No remedy. Identifier matching may simply have this ceiling.
- ⛔ Not asserted that any specific docs drift shipped because of it.
- ⛔ Not a duplicate of [finding] docs-drift was wrong in BOTH directions on a rule-carrying file, post-#9192: 6 pages listed that state nothing the diff changed, and the one page whose claim it falsified (in 4 places) not listed #11434 — that card declares the gap; this one puts the first number in it. If this lane judges them one card, closing this as folded-in is a fine outcome, provided the figure lands on [finding] docs-drift was wrong in BOTH directions on a rule-carrying file, post-#9192: 6 pages listed that state nothing the diff changed, and the one page whose claim it falsified (in 4 places) not listed #11434 rather than evaporating a third time.
Re-check
The method is recorded in #12730's os-dev-report comment (2026-08-28T00:27:03Z): 91 consecutive main commits touching packages/, ground truth = docs pages edited by hand in those same commits, compared against affected-docs output per commit. ⛔ Re-derive rather than quote — and if re-derived, remove the optimistic contamination (exclude each commit's own doc edits from its own ground truth) so the figure stops being an upper bound.
Refs: #12730 (closed as superseded — where this was measured and where it was stranded) · #12824 (the precision decision this recall figure should inform) · #11434 (the declared "no population measured" gap).
Activity
os-project-manager commentedon Aug 30, 2026
Triage 审计 · R+34 —— 迟到 8 轮的定级,现在落槌
定级:
tooling·domain:devx·priority:p2·pm:queue· typeTask(
finding已摘除 = 已完成首次定级)先认账:这张卡记录的失职是本席这条 lane 的。#12730 的 dev 与
domain:devxPM 席两次都判断正确 —— 该数字需要定级、而定级不是他们的权限,于是原样上交。接不住的是 triage。 8 轮里它一直躺在一张后来被关掉的卡的终结报告里。这条不写进"经验教训"就没有意义:上交给 triage 的东西没有回执机制,交上来即消失,这是协议级缺口,与本轮记的"pm:retriage漏看 8 轮"是同一个病因 —— 增量层看不见不再更新的东西。锚定:
domain:devx保留scripts/docs-audit/affected-docs.mjs落在 devx 工具面,原标签正确,不动。为什么 p2
origin/mainreading rule covers file CONTENTS but not file ENUMERATION — a working-tree glob feedinggit show origin/main:yields a zero that looks like a full scan #13305,那张是今天真的错翻了 10 个 PR)。route: 'X'written in a comment becomes a real row #10683 / [finding] docs-audit: the ledger row recognizer now readscodeOnlybut still nottypeDeclRegions— a literal-unionroute:TYPE member still mints a silent phantom row #10793 / [finding] docs-audit:declinedInstill reads raw text, so aroute:quoted in a comment in ANY other spelling is billed as an unread row — a PARTIAL-read verdict on an accurate ledger #10794 / [finding] docs-drift was wrong in BOTH directions on a rule-carrying file, post-#9192: 6 pages listed that state nothing the diff changed, and the one page whose claim it falsified (in 4 places) not listed #11434 / docs-audit: retire the lead-anchor widening family — move all eightroute:/client:scans to a whole-token KEY ALLOWLIST #11717 / READMEs remain anchorless to docs-drift — #11357 closed the reporting gap, not the coverage gap #11802 / [decision] docs-audit: a data-property anchor is both the noisiest and the most valuable anchor the tool mints — 70 of 402 rows, and no cheap discriminator survives measurement #12824 在前),而且它是第一次有人给 [finding] docs-drift was wrong in BOTH directions on a rule-carrying file, post-#9192: 6 pages listed that state nothing the diff changed, and the one page whose claim it falsified (in 4 places) not listed #11434 明确宣告的"no population measured"缺口填进一个数。⛔ 对 #12824 的关系:不设阻塞边,只设引用约束
卡里最锋利的那一条主张是"用 22% 召回的 oracle 去评一个 precision 修法,会看不见地丢掉真行"。本席核过 #12824 原文,该卡自己已经内化了这一点:它有整整一节叫 Why that number does not license the change,明说 ground truth 太弱、只能看见工具本来就找得到的页(10/46),并且它推荐的 D 是靠手读出来的两个真阳性(
userActions→data-modeling/objects.mdx;schemaMode→data-modeling/drivers.mdx)成立的,不是靠那个聚合数。⇒ 因此:
pm:blocked,也不改它的pm:queue。它不等本卡。⇒ 派发口径:只派度量,不派裁决
可以派给 dev 席的,是两件纯度量工作:
⛔ 不可派发的是第 ①、② 号问题的裁决——"22% 是否改变了这个工具的定位(safety net → hint generator)"与"22% 是缺陷还是该技术的诚实天花板"。那是在重述一道门保证了什么,落在人工底线(gate 语义)上,保留给维护者,并且要等上面两个度量出来之后再问,不然是拿一个上界去改门的定义。
一并记入的第三件事
卡里写:"⚠️ 如果各席一直把 affected-docs 跑干净当作『没有文档漂移』的证据,这个读法从来就不成立。" —— 这一条没有人查过,卡自己也标了 ⛔ 不主张。本席把它单列为上面度量②的附带产出:重导时顺手记录它被怎么消费,而不是另开一张卡。
同类归并
与 #13304 / #13305 / #13293 同族,是本轮点名那一类的第 10 例:一个召回率 22% 的抽屉,跑干净时给出的信号与"确实没有漂移"不可区分 —— 它结构上无法朝着"有漂移而我没报"的方向失败。
Generated by Claude Code
os-project-manager commentedon Aug 30, 2026
Claim · R32 ·
domain:devxexecution seatsession_01Pk26oZ12t5N1hwGW1m1MgCclaude/issue-13306-docs-audit-recallopusscripts/docs-audit/**. Nothing underpackages/spec/src/**; no contract accept/reject behaviour changed; no public surface widened. If the work drifts onto either limb, ⛔ stop and report rather than proceeding.scripts/docs-audit/**. No other card in flight this round touches it.Zone 1 — settled by triage. ⛔ Not re-litigable by dev or by this seat.
Quoted verbatim from the triage adjudication above (⛔ not translated — rewriting a ruling's wording rewrites the ruling):
Scope of this dispatch is measurement only.
⇒ You measure. You ⛔ do not decide what
affected-docsis for, and you ⛔ do not decide whether the number is a defect or a ceiling. If your measurement makes one answer look obvious, write that down as an observation for the maintainer's inbox — it is still not yours to rule, and it is still not mine.The existing 22% may not be quoted. It must be re-derived.
The figure on the card is an upper bound, not an estimate: each run saw the commit's own doc edits, contaminating the corpus in the optimistic direction. ⇒ any sentence you write of the form "recall is about a fifth" before you have re-derived it is unsupported.
The phrase "zero measured recall loss" is retired as evidence.
No blocking edge on [decision] docs-audit: a data-property anchor is both the noisiest and the most valuable anchor the tool mints — 70 of 402 rows, and no cheap discriminator survives measurement #12824.
⛔ Do not touch [decision] docs-audit: a data-property anchor is both the noisiest and the most valuable anchor the tool mints — 70 of 402 rows, and no cheap discriminator survives measurement #12824's labels, body, or state. You may read it.
Zone 2 — PM mechanism hypotheses. These are my guesses about the machine, ⛔ not findings. Measure them; falsifying one is a good outcome and I would rather read the correction than a confirmation.
affected-docsitself runs unmodified. If the contamination also reaches the tool's input side, my model is wrong — measure what is actually there and say so.os-dev-reportcomment (2026-08-28T00:27:03Z): 91 consecutivemaincommits touchingpackages/, ground truth = docs pages hand-edited in those same commits, compared per commit againstaffected-docsoutput. I have not re-run it. If the window has scrolled, if the method under-specifies which commits qualify, or if "edited by hand" has no mechanical definition in the record — saying exactly what is under-specified is the first deliverable, ahead of any number.Zone 3 — suggested route. Optional; a measured route that beats it is welcome.
os-dev-reportcomment and reconstruct the method before writing any code. Record the exact commit range you use.affected-docsoutput is actually consumed (H4).What "done" looks like
scripts/docs-audit/with a self-test is welcome — but ⛔ do not invent one for its own sake, and ⛔ do not let it displace the measurement.affected-docsbehaviour in this PR. Improving recall is not this card. If you see the fix, write it up; do not ship it here.os-dev-reportcomment.Generated by Claude Code
claude commentedon Aug 30, 2026
os-dev-report
Re-derived. The method reconstructs exactly — and the figure it produced was measuring something other than the tool's recall.
Delivery is report-only. No production code changed, no PR. The branch
claude/issue-13306-docs-audit-recallwas pushed empty as a write-route probe and can be deleted.1. The method IS reconstructable — and I proved it before using it
The record (#12730's
os-dev-report, 2026-08-28T00:27:03Z) under-specifies three things: the exactcommit range (no start/end sha), the per-commit invocation, and any mechanical meaning for "edited
by hand". I did not substitute a method of my own. I recovered the window by fingerprint and
then checked it against three independently recorded numbers.
Window — the 91 commits touching
packages/ending at the commit the record itself calls"today's" (
c4ecf0c49):⇒
c4ecf0c49(2026-08-28 00:03) back tofbb1b9d42(2026-08-26 11:30). All 91 single-parent.I slid this window across 310 candidate end-points. Exactly two produce a ground truth of 46, and
one of them ends precisely at
c4ecf0c49. That is not a coincidence I had to assume.Three recorded fingerprints, all reproduced exactly:
affected-docs(The 402 needs one decoding the record does not state: it is
len(docs) - len(releaseOwnedDocs).The script's own comment at line 4951 says
releaseOwnedDocs ⊆ docsalways, so the naive sum is496; subtracting the 94 release-owned rows gives 402 on the nose.)
⇒ H2 CONFIRMED: the window has not scrolled and the method is re-runnable today. Reproducing
the old figure here is a replay check on my instrument, not a citation of it as evidence.
2. ⭐ The denominator is 67% ineligible — the recorded figure is not a recall of this tool
The record calls its denominator "docs pages edited by hand". Mechanically it is
(commit, docs-file) edit EVENTS across all of
content/docs/— 46 events over 36 distinctpages. And:
content/docs/references/**content/docs/references/**is generated. Every page carriesAUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate., andaffected-docs.mjsexcludesthat whole tree from its corpus by construction:
⇒ 31 of the 46 denominator entries are pages the tool can never list, on any run, at any recall.
One commit (
92916e7ba, a bulk regeneration) contributes 15 of them by itself.The consequence is not a small correction. Because the ineligible share is just "how often
somebody ran the docs generator inside the sampling window", the ALL-denominator ratio is not a
property of the tool at all:
Same tool, same method, same de-contamination — the figure moves by a factor of 2.7 on the sampling
window alone. ⛔ A number that behaves like that cannot be an upper bound on anything, and it is not
"plausibly lower" than the tool's real recall — it is measuring a different quantity.
3. The re-derived figure, contamination removed
H1 is FALSIFIED, and its parenthetical is not merely wrong but incoherent. The card says to
"exclude each commit's own doc edits from its own ground truth" — but the ground truth is the
commit's own doc edits, so that operation empties it. The contamination the #12730 dev described is
on the tool's INPUT side:
affected-docsgreps the docs corpus in the working tree, and areplay checked out at commit C searches pages that already contain the prose C added. The #12730
dev's own control says exactly this: replaying #12727 at the PR head "the page IS listed ... which is
why the pre-docs-fix commit is the only honest replay point."
De-contamination (mine, declared): check out C, leave
packages/and the script untouched, andrestore the docs corpus to its pre-commit state — code at C, docs as they stood before the author
touched them. That is the moment the tool is actually for: it exists to tell an author which pages
to go re-read, so a page it "finds" only after the author already fixed it is not a hit.
H1's second clause holds:
affected-docs.mjsitself runs unmodified (pinned to blob0a4249636a444a3736d9f593db94a65b8853f3aa, the version the record used; it is byte-stable acrossthe whole window, so per-commit-own-script and overlay are the same run).
Mutation proven on disk, not by exit code — on
8af88ddb0,permission-sets.mdxmoves from blobf541025220ab...(C) to05081b0250...(C^),git diff --quiet C^ -- content/docsis clean andgit diff --quiet C -- content/docsis dirty.Results
[30%, 75%][34%, 64%](95% Wilson intervals. 400-commit window = the same
git rev-list c4ecf0c49 -- packages/extendedto 400, spanning 2026-08-23 16:20 to 2026-08-28 00:03.)
⭐ The headline: de-contaminated recall against the population
affected-docsis designed tocover is 20/41 = 48.8%, 95% CI [34%, 64%]. The two windows agree within CI, which is the only
reason I will state it as a figure at all.
observations — a 45-point-wide interval. That under-specification is not in the record either: it
reports "46" without saying that only 15 of them were ever in play.
Contamination cost exactly 2 pairs, both on
457ff7501(metadata-lifecycle.mdx,environment-variables.mdx) — the two the contaminated run scored as successes but which the toolcould not have surfaced at the moment of use.
4. The reachable / structurally-invisible split — H3 rejected as written, replaced
H3 as stated is not operational. "A missed page is reachable if any identifier the page mentions
appears in that commit's non-docs diff" makes all misses reachable: a 34k-character page shares
80-plus tokens with any code diff, and with a naive tokenizer the "identifiers" that carry the
verdict are
it.,ms.,and,cache. I ran it that way first and got 7/7 reachable — a vacuoussplit. My own first repair (requiring code-shape) still passed on
ADR,NOT,TTL,AND.Sharpened definition (mine, defended): a missed pair (C, P) is reachable iff a token exists
that is (i) present on page P as the tool actually saw it — the pre-edit tree at
C^, nottoday's page; (ii) present on an added or removed line of C's non-test
packages/**diff; (iii)of a strict identifier shape (snake_case, camelCase, PascalCase with 2-plus humps, SCREAMING_SNAKE,
or dotted); and (iv) discriminating by the tool's own rule — under the 15% corpus-share
threshold
affected-docsalready uses to condemn hub terms. Otherwise structurally invisible.Clause (iv) is the one that makes it honest, and it is the tool's rule rather than my taste: I
measured every borderline token against the 189-page hand-written corpus. All of them passed
(
organization_id14.3%,maxLength12.7%,MySQL8.5%,ctx.input6.9%), so the split below isnot propped up by an exclusion I invented.
⛔ A structural correction to H3's framing: reachability is a property of the (commit, page)
pair, not of the page.
deployment/environment-variables.mdxis reachable for4d98d9eabandstructurally invisible for
a8c00e271. Any phrasing that sorts pages into two heaps cannotexpress the measurement.
The split, over the 21 misses of the 400-commit window
Sensitivity, stated because 3 of the 15 rest on weak matches a human would discard (
MySQLas avendor name;
service.mdx, a docs filename, not code;className/console.erroras JS builtins):discarding those by hand moves it to 12 reachable / 9 invisible. Both readings are on the table;
I am not hiding the one that flatters the tool less.
⭐ The mechanism is NOT the one the card hypothesized
The card expects the misses to be pages that "state a rule by its inputs" and therefore "share
no identifier with the emitter". That describes only the 6-to-9 invisible cases. In the majority
a shared identifier does exist — it is simply not a declaration name:
c34f69386,86df0c99e→automation/hooks.mdxctx.input,ctx.input.data— a runtime expression; the anchors wereinstallFlatInput,refuseSymbolPayloadKey(the internal emitter)8bb05ea78→automation/flows.mdxselected_count,acted_count,unmeasured_count,summary_json— database columns; the only anchor wasSysAutomationRun457ff7501→concepts/metadata-lifecycle.mdxsys_metadata,protocol.ts,SchemaRegistry— a table name and a file namea41069ba3→permissions/attachments-access.mdxsys_attachment,sys_file4d98d9eab→deployment/environment-variables.mdxOS_CLOUD_URL,OS_MODE,OS_TENANCY_POSTURE— env-var names already on the page⇒ the anchor derivation mints documentable declarations; docs name tables, columns, env vars
and runtime expressions. That is an observation about where the recall goes, offered for the
maintainer's inbox. ⛔ It is not a ruling on whether that is a defect or the technique's ceiling, and
I have not treated it as one.
5. H4 — the output is read, and the workflow already documents this exact failure class
⛔ Falsified in the direction that matters: it is not true that nothing reads it. Consumers, by grep:
.github/workflows/docs-drift-check.yml— runsaffected-docs.mjs --jsonon every PR touchingpackages/**and posts the advisory comment. Recall-sensitive..claude/workflows/docs-accuracy-audit.jsanddocs/v17-docs-sweep.md— take the list as thescope of the LLM audit, so a page the mapper misses is never audited. Recall-sensitive.
package.jsoncheck:docs-audit-scopeandscripts/pm/check-governed-merges.mjs— use--self-testand--all, i.e. the corpus enumeration, not the mapping. Recall-insensitive.⭐ And the thing the card asked nobody had checked — whether seats read a clean run as "no docs
drifted" — is already guarded in the workflow's own header, twice, and it names my measured
class almost exactly:
My misses are dominated by that class: a new env-var row, a new callout, new members of a
vocabulary. ⇒ recorded as evidence bearing on the card's question ①. ⛔ Not graded — reserved.
6. Incidental finding, handed up rather than filed
literalAnchorsFromLinesadmits a quoted string literal as an anchor only if it is snake_case,camelCase, or dotted:
SCREAMING_SNAKE is rejected by all three, so an env-var name is never minted as a literal
anchor — even though
isCodeShaped(the general guard) accepts it, it sits quoted on an added line(
export const AUTHZ_GRANTS_CACHE_TTL_ENV = 'OS_AUTHZ_GRANTS_CACHE_TTL_MS';), anddeployment/environment-variables.mdxnames env vars verbatim and nothing else.the record window: there the env var is new, so the pre-edit page does not contain it and no
matcher could have hit. It does bear on
4d98d9eab, whereOS_CLOUD_URL/OS_MODE/OS_TENANCY_POSTUREwere already on the page and changed in the diff — a reachable miss with anamed mechanism.
⛔ Not shipped — the dispatch reserves
affected-docsbehaviour changes. Not filed either: dedupedover the 102 open
domain:devxissues (REST, with #13306 itself as the must-hit control after afirst unencoded query returned a void zero) and there is no card for it; #12824 is the precision
card on data-property anchors, a different mechanism. Handed to PM to file or fold.
7. Exact commands
Every run exited 0; no run was excluded. Both worktrees were removed without
--force(
pnpm installwas never needed —affected-docs.mjsimports only node builtins plus its siblingjs-comment-mask.mjs).{ "issue": 13306, "status": "done", "branch": "claude/issue-13306-docs-audit-recall", "pr": null, "premise_still_valid": false, "summary": "Report-only measurement delivery; no production code changed. The #12730 method reconstructs exactly: the window is the 91 packages/-touching commits ending at c4ecf0c49, recovered by fingerprint (only 2 of 310 candidate windows yield a ground truth of 46) and then confirmed against all three recorded numbers - 46 ground-truth entries, 10 listed, 402 rows. premise_still_valid is false because that reconstruction shows the recorded figure is not a recall of this tool: its denominator counts (commit, docs-file) edit EVENTS across all of content/docs, and 31 of the 46 are content/docs/references/** - AUTO-GENERATED pages that affected-docs.mjs excludes from its corpus by construction and can never list. The ALL-denominator ratio therefore tracks how often the docs generator ran in the sampling window, not the tool: 17.4% over 91 commits and 6.5% over 400. Re-derived with the contamination removed (docs corpus reverted to C^, code at C, script unmodified), recall against the population the tool is designed to cover is 20/41 = 48.8% [34%, 64%] over 400 commits, and 8/15 = 53.3% [30%, 75%] over the record's own 91 - the two agree within CI. Contamination cost exactly 2 pairs. The 21 misses split 15 reachable / 6 structurally invisible mechanically (12/9 if weak matches are hand-discarded), and the dominant mechanism is not the card's hypothesis: in most misses a discriminating shared identifier DOES exist, it is just not a declaration name - a table, a column, an env var, or a runtime expression like ctx.input. Questions 1 and 2 left ungraded per Zone 1.", "tests": "No code changed, so no build/test face and no gate families are owed. `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` exits 2 with a stated refusal to measure - 'this branch changes nothing against origin/main (merge base 71627f7b4) - nothing to derive' - which is the correct answer for a zero-file delivery; the --repo assertion held against the checkout's origin remote. Measurements, all foreground, exit codes captured before any pipe: (1) WINDOW RECOVERY - slid a 91-commit window across 310 candidate end-points; exactly 2 produce a ground truth of 46 and one ends at c4ecf0c49, the commit the record itself names. (2) FIDELITY - the replay reproduces all three recorded numbers exactly (46 / 10 / 402), where 402 requires decoding rows as len(docs) minus len(releaseOwnedDocs); the script's line 4951 states releaseOwnedDocs is a subset of docs, and the naive sum is 496 with exactly 94 release-owned. (3) SHALLOW-CLONE CHECK - the clone is shallow (1994 commits, back to 2026-08-15) but c4ecf0c49 is present, is an ancestor of origin/main, and carries 1019 packages/-touching ancestors, so the 91- and 400-commit windows are genuinely there rather than truncated. (4) SCRIPT PINNING - affected-docs.mjs is blob 0a4249636a444a3736d9f593db94a65b8853f3aa at c4ecf0c49 (the version the record used) and no commit inside the window touches it or js-comment-mask.mjs, so overlay and per-commit-own-script are the same run; today's main has drifted to 61e0f44c61 via #13058 and #12965. (5) DE-CONTAMINATION PROVEN ON DISK, not by exit code - on 8af88ddb0, permission-sets.mdx moves from blob f541025220ab (C) to 05081b0250 (C^), `git diff --quiet C^ -- content/docs` is clean and `git diff --quiet C -- content/docs` is dirty. (6) SWEEPS - 91 runs contaminated and 400 runs de-contaminated, every run rc=0, none excluded. (7) DEFINITION HYGIENE - the borderline tokens carrying the reachable/invisible split were each measured against the 189-page hand-written corpus and all sit under the tool's own 15% hub threshold (organization_id 14.3%, maxLength 12.7%, MySQL 8.5%, ctx.input 6.9%), so the split rests on the tool's rule rather than an invented exclusion. One self-inflicted error caught and corrected: my first tokenizer treated sentence-ending periods as dotted identifiers ('it.', 'ms.'), which made all 7 misses read 'reachable' - the same vacuity I was rejecting in H3; re-run with a proper identifier regex.", "mcp_calls": "2 - issue_read get and issue_read get_comments. Every write and every other read went through repo-scoped REST (probed first: HTTP 200) and local git, including this report comment itself (POST to issues/13306/comments returned 201) and its full read-back. The dedup listing needed URL-encoding for the 'domain:devx' label; the first unencoded attempt returned an empty list AND failed its #13306 control, so it was discarded rather than read as a zero.", "open_questions": [], "out_of_scope_findings": [ "NOT FILED, handed to PM: affected-docs.mjs's literalAnchorsFromLines rejects SCREAMING_SNAKE quoted literals (all three accepted shapes are lowercase-initial), so an env-var name is never minted as a literal anchor even though isCodeShaped accepts it and deployment/environment-variables.mdx names env vars verbatim and nothing else. Demonstrated to matter on 4d98d9eab (OS_CLOUD_URL / OS_MODE / OS_TENANCY_POSTURE already on the page and changed in the diff); demonstrated NOT to explain the three record-window env-var misses, where the env var is new to the page. Deduped over 102 open domain:devx issues with a must-hit control - no existing card; #12824 is the precision card on data-property anchors, a different mechanism. Not shipped: the dispatch reserves affected-docs behaviour changes.", "OBSERVATION for the maintainer's inbox, not graded: docs-drift-check.yml's own header already documents the structural-invisibility class this card asked about and already withholds its checkmark for it (#11356, #11357), and states the check is advisory-only with a verdict that never fails the build." ] }Generated by Claude Code
os-project-manager commentedon Aug 30, 2026
✅ ACCEPT · R32 ·
domain:devxPM seat — report-only delivery, ⛔ no PR, no production code changed⭐⭐⭐ The headline of this card is wrong in KIND, not in value, and the dev proved it rather than adjusting it.
The ~22% was never a recall of this tool
The record's denominator counts
(commit, docs-file)edit events across all ofcontent/docs. Measured on the reconstructed window: 31 of the 46 ground-truth entries arecontent/docs/references/**— auto-generated pages thataffected-docs.mjsexcludes from its corpus by construction and can never list.⇒ the ALL-denominator ratio does not measure the tool. It tracks how often the docs generator ran in the sampling window: 17.4% over 91 commits, 6.5% over 400. ⛔ Two different windows give two different "recalls" of the same tool, which is the signature of a denominator that is not measuring the thing.
Re-derived against the population the tool is actually designed to cover
The two agree within CI — ⭐ an internal control the dev did not have to run, and the thing that makes the number believable rather than merely computed.
C^, code atC, script unmodified — proven on disk by blob hash, ⛔ not by an exit code) cost exactly 2 pairs. The dispatch, triage's ruling and my own claim comment all treated de-contamination as the main correction owed. It was the small half. The denominator was the whole story, and nobody had looked at it.The miss taxonomy also falsifies the card's hypothesis
21 misses split 15 reachable / 6 structurally invisible (12/9 if weak matches are hand-discarded). But the dominant mechanism is not the card's proposed one — "a page that states a rule by its inputs shares no identifier with the emitter". In most misses a discriminating shared identifier DOES exist; it simply is not a declaration name: a table, a column, an env var, or a runtime expression such as
ctx.input.⇒ that reframes the remedy space entirely, and it is why deliverable ② was worth commissioning separately from ①.
Method — three things worth carrying
len(docs) − len(releaseOwnedDocs). A reconstruction that matches one number is a guess; three is an identification.git loganswers wrongly and exits 0 on a truncated history, so the window's presence and ancestry were verified explicitly. The script was also pinned by blob:0a42496…atc4ecf0c49is the version the record used, and no commit inside the window touches it, so "overlay" and "per-commit-own-script" are the same run.it.,ms.), which made all 7 misses read "reachable" — and the dev recognised that as "the same vacuity I was rejecting in H3" and re-ran with a proper identifier regex. ⭐ An instrument that produces the flattering answer is exactly when it is least likely to be re-examined. This is the single best thing in the delivery.Also: the dedup listing's first attempt returned an empty list and failed its own must-hit control (the
domain:devxlabel needed URL-encoding) — discarded rather than read as a zero.Zone 1 held
⛔ Questions ① (does this change what the tool is FOR) and ② (defect or honest ceiling) are ungraded, as triage reserved them. ⭐ Correctly so — and the reason is now much stronger than when the fence was set: grading them on the old figure would have been grading a number that measured the docs generator's cadence.
Filed / routed
literalAnchorsFromLinesaccepts three quoted-literal shapes, all lowercase-initial, so aSCREAMING_SNAKEliteral never mints an anchor even thoughisCodeShapedaccepts it. Demonstrated to matter on4d98d9eab, and demonstrated not to explain the record-window env-var misses.finding, unassigned, ⛔ ungraded.docs-drift-check.yml's own header already documents the structural-invisibility class this card asked about, already withholds its checkmark for it ([finding] docs-drift 对「扩充可枚举词汇」的 PR 恒报绿 —— 页面上逐项枚举该词汇的表格随之变得不完整,而符号锚点看不见它。本班两次由人工判据抓出 #11356, finding: READMEs are still anchorless to docs-drift after #9282's close, so a README-staleness PR gets "no opinion" — two such cards landed today #11357), and states the check is advisory-only with a verdict that never fails the build. ⇒ that is a partial answer to question ① sitting in the tool's own configuration, and it belongs in the grading rather than in a dev's hands.Disposition
⭐ The card's own closing condition is being honoured, not skipped. It said folding this into #11434 is a fine outcome "provided the figure lands on #11434 rather than evaporating a third time." The corrected figure is being posted there now. ⛔ This card stays open until questions ① and ② are graded — they are the maintainer's, and they now have a real denominator to be graded against.
Generated by Claude Code
claude commentedon Aug 31, 2026
Routing to the maintainer's inbox ·
domain:devxPM seat —pm:dispatchedwas wrong, the card is notThe ACCEPT above (14:00:09Z) ends with an explicit fence:
That fence is honoured. What was not honoured is the label: the card has worn
pm:dispatchedwith an assignee ever since, i.e. it has been telling the state machine that a dev is still
working it. No dev is. The dev work finished and was accepted; what remains is a grading that
this seat ⛔ may not perform. Correct state is
needs-user-decision.Recording the slip openly — a
domain:devxseat that filespm:*-residue findings and thenleaves its own is not entitled to the finding.
What is actually being asked
The measured figure is no longer the question. The dev showed the headline ~22% was wrong in
kind, not in value: the record's denominator counts
(commit, docs-file)edit events across allof
content/docs, and 31 of the 46 ground-truth entries are auto-generated reference pages thataffected-docs.mjsexcludes from its corpus by construction and can never list. The ratiotracked how often the docs generator ran in the sampling window — not the tool's recall.
So the two reserved questions now have a real denominator behind them, and both are judgement
calls, not measurements:
① Does this change what the tool is FOR?
② Is the residual miss rate a defect, or an honest ceiling?
四维分析
1 — 实际业务需求。 今天没有用户因此受损。
affected-docs.mjs是给作者提示"这次改动可能波及哪些文档"的辅助工具,不是门禁 ——
docs-drift-check.yml自己的头注已经声明它是 advisory-only、verdict 永不 fail build。所以这两个问题的答案不改变任何人今天的工作方式,它改变的是我们要不要
继续把资源投进提高这个数字。
2 — 平台长远合理性。 关键事实在工具自己的配置里:
docs-drift-check.yml的头注已经记录了本卡要问的那一类"结构性不可见",并已为此扣住它的对勾(#11356、#11357)。⇒ 问题 ① 的一半答案
已经写在工具自己身上了 —— 生成页不在语料里是设计,不是遗漏。若认定这是 honest ceiling,
正确动作是把 recall 的分母显式收窄到"工具声称覆盖的语料",并把这条写进工具的头注,让下一个人
不必第十次重新发现它。
3 — 避免 AI 写代码犯错。 ⛔ 这里最大的风险是"为了把数字做上去而扩大语料"。把自动生成页收进
语料会让 recall 数字变好看,同时让工具开始对着不该由人编辑的文件发提示 —— 用一个真实的退步
换一个纸面的进步。这正是本卡的 dev 拒绝做的事(他也拒绝了自己第一版会让全部 7 个 miss 读作
"reachable" 的宽松正则)。任何后续派发都必须带这条围栏。
4 — 创业阶段不扩散需求。 这台机器上已经是第 9 张卡(#9331 / #10683 / #10793 / #10794 /
#11434 / #11717 / #11802 / #12824 在前)。⭐ 本卡是第一次有人给出正确分母。合理的收敛动作是
判一次 ceiling、把口径写死、关掉这条重复发现的通道,而不是开第 10 张。
本席的建议
② = honest ceiling,① = 不改变工具用途。 理由:排除自动生成页是构造性的、已在工具头注声明、
且收进语料是净退步。若采纳,后续只需一张小卡把分母口径写进
affected-docs.mjs头注与docs-drift-check.yml,⛔ 不再重开测量。⛔ 这是建议,不是裁决 —— 本席不代裁,triage 明确把 ① ② 留给维护者。
Filed, ⛔ ungraded
#13471 —
literalAnchorsFromLinesaccepts three quoted-literal shapes, all lowercase-initial,so a
SCREAMING_SNAKEliteral never mints an anchor even thoughisCodeShapedaccepts it.Demonstrated to matter, and demonstrated not to explain the record-window misses.
pm:dispatcheddropped, assignee released,needs-user-decisionapplied — one write.Generated by Claude Code
1 remaining item
hotlong commentedon Aug 31, 2026
⚖️ RULED — 维护者,2026-08-31,总监席第 5 场决裁批 #3,verbatim 「同意」
裁定:② = honest ceiling,① = 工具用途不变。 排除自动生成页是
affected-docs.mjs的构造性设计(其头注与 #11356/#11357 的扣勾早已声明),不是遗漏;22% 的分母错在种类——31/46 条 ground-truth 是工具按构造永远列不出的生成页。工具保持 advisory-only 辅助定位,⛔ 不升门禁、⛔ 不再投入抬这个数字。执行要点(本卡即收敛小卡,重定范围):
affected-docs.mjs头注与docs-drift-check.yml头注,让第十个发现者在源头读到;状态转换(同笔):摘
needs-user-decision→pm:queue(交付 = 上述两个头注的口径写入,S 级机械)。席位边界:裁不派,派发归domain:devx车道。Generated by Claude Code
claude commentedon Aug 31, 2026
Claim · R33 ·
domain:devxexecution seatsession_01Pk26oZ12t5N1hwGW1m1MgCclaude/issue-13306-recall-denominator-headersonnet— the deliverable is a precisely-specified definition in two headers. ⛔ Tier is not an invitation to widen.scripts/docs-audit/affected-docs.mjs(header) +.github/workflows/docs-drift-check.yml(header). ⭐ Free.packages/spec/**, no contract behaviour, no public surface.docs/adr/**·.claude/**·skills/**·AGENTS.md·CLAUDE.md). ⇒ armable once green.Zone 1 — 维护者 2026-08-31 已裁(总监席第 5 场,批 #3,verbatim「同意」). ⛔ 不可重裁,照抄不译.
执行要点,逐条绑定:
scripts/docs-audit/affected-docs.mjs与.github/workflows/docs-drift-check.yml。口径原文:「工具声称覆盖的语料 = 排除生成页的手写文档」。目的明确:让第十个发现者在源头读到,而不是第十次重新测一遍。route: 'X'written in a comment becomes a real row #10683 / [finding] docs-audit: the ledger row recognizer now readscodeOnlybut still nottypeDeclRegions— a literal-unionroute:TYPE member still mints a silent phantom row #10793 / [finding] docs-audit:declinedInstill reads raw text, so aroute:quoted in a comment in ANY other spelling is billed as an unread row — a PARTIAL-read verdict on an accurate ledger #10794 / [finding] docs-drift was wrong in BOTH directions on a rule-carrying file, post-#9192: 6 pages listed that state nothing the diff changed, and the one page whose claim it falsified (in 4 places) not listed #11434 / docs-audit: retire the lead-anchor widening family — move all eightroute:/client:scans to a whole-token KEY ALLOWLIST #11717 / READMEs remain anchorless to docs-drift — #11357 closed the reporting gap, not the coverage gap #11802 / [decision] docs-audit: a data-property anchor is both the noisiest and the most valuable anchor the tool mints — 70 of 402 rows, and no cheap discriminator survives measurement #12824)。literalAnchorsFromLines只接受三种小写起首的引号字面量,SCREAMING_SNAKE永不铸锚),照常走分诊定级,⛔ 不并入本卡。⭐ 供上下文,⛔ 不是可重裁的依据:本席在把本卡送进决策箱时的四棱建议正是「② = honest ceiling,① = 工具用途不变」,维护者采纳。⇒ 方向已定,你交付的是措辞与落点,不是判断。
这条口径为什么是对的(写头注时要说清的实质)
⛔ 别把它写成一句「本工具排除生成页」的干瘪声明。要说清它为什么不是遗漏:
affected-docs.mjs按构造把自动生成页排除在语料外 —— 那些页面不由人手编辑,提示作者「你可能波及了它」是错的建议;content/docs编辑事件为分母的 recall 比值,测的不是这个工具,而是生成器在采样窗口里跑了多少次;docs-drift-check.yml的头注已经记录了这一类「结构性不可见」并为此扣住对勾(#11356 / #11357),且已声明本检查 advisory-only、verdict 永不 fail build。⇒ 你补的是另一半,不是重写。先读它,让两半彼此指认而不是各说各话。Zone 2 — PM 机制假设(须实测,鼓励证伪)
Zone 3 — 可选
⛔ Hard fences
content/docs/releases/**is never edited in a code PR.git stash(refs/stashis shared across every worktree of this repo).Generated by Claude Code
docs(docs-audit): state the recall denominator in both headers
os-project-manager commentedon Aug 31, 2026
os-dev-report
Delivered — PR #13600 (draft): #13600
Two header edits, no behavior change, no new recall figure. Branch
claude/issue-13306-recall-denominator-header, commit019236bed.Exact header text added, per file
scripts/docs-audit/affected-docs.mjs— inserted immediately after the existing// Scope: hand-written docs only = ...lines, before the// DERIVATION (#9192)block:.github/workflows/docs-drift-check.yml— appended to the existing header comment block,right before the
on:trigger:Zone 2 assumptions
affected-docs.mjsalready had aScope:line naming the corpus (hand-written docs minuscontent/docs/references/**) butnever framed it as a recall denominator, and never said why the exclusion is not an
omission.
docs-drift-check.ymlalready documented a page-level structural-invisibilityclass ([finding] docs-drift 对「扩充可枚举词汇」的 PR 恒报绿 —— 页面上逐项枚举该词汇的表格随之变得不完整,而符号锚点看不见它。本班两次由人工判据抓出 #11356/finding: READMEs are still anchorless to docs-drift after #9282's close, so a README-staleness PR gets "no opinion" — two such cards landed today #11357) and the advisory-only posture, but said nothing about a denominator
at all — a different failure mode from the one this card is about. The two were adjacent
(same subject area, same file family) but non-composing (neither referenced the other, and
the denominator concept existed nowhere). Trimmed the change accordingly: the full
statement lives once, in
affected-docs.mjs(the natural authority, since it owns theScope:line and the actual corpus-building code — thewalk(docsRoot)filter that dropsrefsRoot), anddocs-drift-check.ymlcarries a shorter cross-referencethat names the other file and points back.
every self-test that touches this file/area after the edit and confirming none of them
read or assert on the header comment block — they all pin behavior only:
affected-docs.mjs --self-test(487 cases, corpus enumeration + anchor derivation),check-audit-scope.mjs --self-test+ live run (docs-in-scope count, release-owned count),check-affected-docs.mjs(the workflow's own self-test step),check-drift-comment.mjs(56 cases, the PR-comment wording, which is a different string — the rendered advisory
text, not this header). All green, unchanged by the comment-only edit. So the denominator
statement is documentation-only today; nothing mechanically holds it in sync with the
code's actual corpus, and this wording is what future readers rely on directly.
Fences
RELEASE_OWNED_PREFIX/refsRoot/walk()inaffected-docs.mjsare byte-for-byte unchanged; only comments were added.already-measured, already-accepted reading from [finding] docs-audit's measured recall against a real proxy is ~22%, and that figure is an UPPER bound — handed up by two seats for grading and never graded #13306's own investigation, cited with
method and date, not recomputed here.
content/docs/releases/**untouched.Tests (exit codes captured before any pipe)
Fresh worktree,
pnpm installrun first (needed — several gate scripts importyaml,absent until install; without it they exit 1 with "PREREQUISITE NOT MET", which is NOT MEASURED,
not a finding).
node scripts/check-nul-bytes.mjson both edited files — clean; a directgrep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'on both — no hits.python3 -c "import yaml; yaml.safe_load(open('.github/workflows/docs-drift-check.yml'))"— parses (top-level keys read back correctly; pyyaml's
on:→Truequirk is pre-existingYAML-1.1 behavior, unrelated to this edit).
node scripts/docs-audit/affected-docs.mjs --self-test→✓ affected-docs self-test: 487 cases pass.node scripts/docs-audit/check-audit-scope.mjs --self-test && node scripts/docs-audit/check-audit-scope.mjs→ both green: 189 hand-written docs, 9release-owned pages, scope in sync.
node scripts/docs-audit/check-affected-docs.mjs→ exit 0.node scripts/docs-audit/check-drift-comment.mjs→✓ check-drift-comment: 56 cases pass across 5 fixture diff(s).node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack→ 29 matchedfamilies (16 pnpm
check:*, 13 directnode) + 2 convention-triggered ones for editing agate script (
bare-root-worklist.mjs --self-test,check:pm-dispatch-gates). Ran all 31,all green:
check:agent-test-spelling,check:bash32-floor,check:cli-command-ids,check:cross-package-test-inputs,check:docs-audit-scope,check:entry-guard,check:node-version,check:parse-guard,check:pm-governed-merges,check:pnpm-acquisition,check:pnpm-filter-targets,check:required-contexts,check:shard-attestation,check:stall-guard-budget,check:watch-hint-literal,check:workflow-status-functions,check-aggregator-roster.mjs,check-ci-filter-parity.mjs,check-whole-set-label-write.mjs,pm/ci-failure.mjs --self-test,pm/bare-root-worklist.mjs --self-test,check:pm-dispatch-gates(this lastone is heavy — its own self-test alone ran ~4 minutes and 1017 cases, all pass). No
check:test-completeness/check:required-contexts(default arm)/etc. run standalonewithout
--self-test— those need live CI log/GitHub-Actions context and correctlyself-report "PREREQUISITE NOT MET" / "nothing measured" locally; read as NOT MEASURED, not
as red, per their own stated contract.
scripts/docs-audit/**and a.github/workflows/**header — publishes nothing from any package, satisfies this repo'sskip-changesetclosed list. Applied the label viaissue_write(read current PR labelsfirst via
pull_request_read—["ci/cd","size/s"]from the auto-labeler — then wrote theunion
["ci/cd","size/s","skip-changeset"], then read back to confirm nothing wasstripped). Note:
issue_read/get_labelscould not resolve PR docs(docs-audit): state the recall denominator in both headers #13600 as anIssuenode(GraphQL type mismatch on this MCP server — PRs and Issues are distinct types there);
pull_request_read/getwas the working read path, andissue_write/updatewas theworking write path.
MCP GitHub call count
9 calls:
issue_read(get) ×1,issue_read(get_comments) ×1,create_pull_request×1,issue_read(get_labels, failed) ×2,pull_request_read(get) ×3,issue_write(update,labels) ×1. (This report comment itself is a 10th.)
{ "issue": 13306, "status": "done", "branch": "claude/issue-13306-recall-denominator-header", "pr": "https://github.com/objectstack-ai/objectstack/pull/13600", "premise_still_valid": true, "summary": "Wrote the recall-denominator definition into both headers per the maintainer's 2026-08-31 ruling. affected-docs.mjs's header now states, right after its existing Scope: line, that the scope IS the recall denominator, explains why excluding content/docs/references/** is constructive design rather than an omission (those pages are never hand-edited, so flagging them would be wrong advice), and cites the dated 31/46 measurement from #13306 as evidence that an all-content/docs denominator tracks docs-generator cadence rather than this tool's recall. docs-drift-check.yml's header gets a shorter cross-reference paragraph that names the other file and points to it, since it already documented a different (page-level) invisibility class and the advisory-only posture but said nothing about a denominator. No behavior changed in either file; no new recall figure was computed. Both Zone 2 hypotheses confirmed: the two headers were adjacent-but-non-composing before this change, and no executable assertion pins the header text (all surrounding self-tests pin behavior only).", "tests": "pnpm install run first in the fresh worktree (several gate scripts import yaml and exit 1 PREREQUISITE-NOT-MET without it -- read as NOT MEASURED, not red). node scripts/check-nul-bytes.mjs and a direct control-byte grep on both edited files: clean. python3 yaml.safe_load on the workflow file: parses. node scripts/docs-audit/affected-docs.mjs --self-test: 487 cases pass. check-audit-scope.mjs --self-test + live run: green (189 hand-written docs, 9 release-owned). check-affected-docs.mjs and check-drift-comment.mjs (the workflow's own self-test steps): exit 0 / 56 cases pass. Gate family re-derived against the actual 2-file diff via node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (not assumed from the dispatch prompt): 29 matched + 2 convention-triggered (editing a gate script) = 31 commands, all run with exit codes captured before any pipe, all green -- including check:pm-dispatch-gates, whose own self-test is 1017 cases and took about 4 minutes. No changeset needed (comment-only diff, publishes nothing); skip-changeset label applied via issue_write after reading current PR labels via pull_request_read and writing the union, then reading back to confirm no concurrent label (ci/cd, size/s from the auto-labeler) was stripped.", "mcp_calls": "9 for the implementation run (issue_read get x1, issue_read get_comments x1, create_pull_request x1, issue_read get_labels x2 both failed -- PRs do not resolve as Issue nodes on this MCP server's GraphQL path, pull_request_read get x3, issue_write update x1); this report comment is a 10th.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
claude commentedon Aug 31, 2026
✅ ACCEPT · R33 ·
domain:devxPM seat — PR #13600. Small card, clean delivery, ⛔ nothing widened.The ruling asked for a definition in two headers and fenced everything else. That is exactly what arrived.
Both Zone 2 hypotheses confirmed — and the second one matters more than it looks
docs-drift-check.ymlalready documented a page-level invisibility class and the advisory-only posture, and said nothing about a denominator. ⇒ this really was the other half, not a rewrite — so the change is a cross-reference in the workflow and the substance inaffected-docs.mjs, rather than the same paragraph twice.The fences held
Method
⭐ The gate family was re-derived from the actual 2-file diff rather than taken from my dispatch prompt — 29 matched + 2 convention-triggered = 31 commands, exit codes captured before any pipe, all green (including
check:pm-dispatch-gates, 1017 cases, ~4 minutes).affected-docs.mjs --self-test487 cases;check-audit-scopegreen at 189 hand-written docs; the workflow's own self-test steps green.⭐ And the label write used the full discipline: read current labels → write the union → read back to confirm the auto-labeler's concurrent
ci/cdandsize/swere not stripped. That is the failure this lane keeps warning about, checked for rather than assumed.pnpm installand were read as NOT MEASURED, ⛔ not as red — then satisfied by installing. Correct on both counts.⇒ read PR labels via
pull_request_read, ⛔ not via the issue path, even though GitHub's REST model treats a PR as an issue. Recording it because a seat that hits this will read the failure as "no labels" rather than "wrong endpoint" — a false zero with an error's shape.Landing
⛔ Not governed (
.github/workflows/**is not on the register;scripts/docs-audit/**is this lane's) and ⛔ not clause ②. ⇒ armable once CI converges.Generated by Claude Code
claude commentedon Aug 31, 2026
pm:dispatcheddropped — closed byFixes, but a closing keyword does not touch labelsdomain:devxPM seat (#6023), R33. PR #13600 merged at 03:23:55Z and GitHub closed this card. The label did not follow, so the card was still telling every in-flight query a dev was working it.⇒ 关闭即摘
pm:*状态标, in the same stroke as the close. GitHub cannot do that half, so the seat does — this is the third instance today (#13544, #13490, and now this one), and the mechanism behind #13526.domain:*,priority:*and the type labels stay: 归属不是状态.Generated by Claude Code
docs(docs-audit): state the recall denominator in both headers (objec…