Repository navigation
Three sites still cite ADR-0112's "the producer names the condition" unqualified after PR #12453 — one of them fenced, and the phrase census needs a wrap-tolerant grep #12454
Description
Filed unassigned and unlabelled by the domain:cli seat (#6024), session session_01UjujZN219uFzBhSYfMykCd, on behalf of the #11735 dev, which measured this while implementing PR #12453 and could not file it itself (403 on api.github.com, no gh, and the contract forbids MCP for the dedup read — so filing from that seat would have been filing blind). ⛔ Not graded, not routed.
The residue
#11735 / PR #12453 qualified nine citation sites to the code axis. The real population is larger, and three sites still carry the unqualified attribution:
| site | state | why it was left |
|---|---|---|
packages/rest/src/rest-server.ts:9646 |
unqualified | ⛔ FENCED by PR #12421 (#11926) at the time |
packages/rest/src/rest-sandbox-declared-status.test.ts:130 |
unqualified | outside #11735's declared file surface |
packages/rest/src/rest.test.ts:2422 |
unqualified | outside #11735's declared file surface |
⛔ The #11735 dev did not widen its surface to reach them — the claim declared it closed with "stop on breach and explain", and the explanation is this card. That was the right call and this is the other half of it.
The fix is mechanical, because the correct form is already pinned
packages/rest/src/rest-hook-refusal-message-parity.test.ts:630 (landed 2026-08-25 in #12280) carries the canonical qualification:
"ADR-0112's 'the producer names the condition' is a rule about the
code, not the status … The phrase this reading is built on is not in the ADR at all — it iserror-response.ts's own prose."
PR #12453's error-response.ts docblock now states the axis once in full, and the other sites echo it. These three want the same treatment.
rest-server.ts was fenced by an in-flight PR when this was measured, and rest.test.ts is the hottest shared test file in packages/rest. Both may still be held.
⭐ The census method, banked so this is not re-measured wrong
The original card censused with a contiguous-phrase grep over *.ts and found nine. That method cannot see a citation that wraps across a comment line boundary — and two of the three sites above wrap. Measured on origin/main @ 8515954fb:
- the card's own re-check command → 11
- the wrap-tolerant form → 13
# ⛔ under-counts — misses wrapped comment text
git grep -n "the PRODUCER names the condition" -- '*.ts'
# ✅ use this
git grep -n -iE "producer names|names the condition" -- '*.ts'Generalisable: a phrase census over comments must assume the phrase is wrapped, because comments are the one place text is hard-wrapped by convention. ⛔ Reverse-check any zero with a term known present, and never a substring of the term under test.
⛔ Explicitly NOT in scope
Amending ADR-0112 itself. That remains a governed docs/adr/** maintainer-merge path, ruled out of scope on #11735 and still out of scope here. The qualification holds under either outcome of that open question, which is why it forecloses nothing.
Also measured and correctly left alone by #11735's dev, ⛔ do not sweep: the widespread "ADR-0112 envelope (code + status)" idiom (50+ sites) is a different usage — it names the wire envelope as an assertion contract, not a principle about who names what — and is the form the repo's own agent contract prescribes for rejection tests.
Duplicate check
Searched the open domain:cli inventory and by keyword this round. #11735 is the parent and is being closed by PR #12453; no open card covers the residue. domain:devx.
Refs
- Nine in-repo sites cite "ADR-0112 says the PRODUCER names the condition" — ADR-0112 does not say it, and the unqualified paraphrase was read as governing HTTP status #11735 / PR docs(rest,spec): qualify the ADR-0112 "producer names the condition" citations to the code axis #12453 — the nine sites, and the axis statement the fix should echo
- [finding] ADR-0120 D4 says the duplicate pre-flight lives in
os migrate plan, but the runtime-managed index class now reports throughos migrate duplicates#11032 — same defect class (a load-bearing citation accurate about behaviour, inaccurate about the document) - rest: an UNDECLARED hook refusal answers 500 on
/analytics/dataset/querywhere the same refusal answers 400 on/data— the route's fallback arm treats a business refusal as a server fault #11684 / PR fix(rest): classify record-share and analytics refusals at the shared /data door #11731 — where the unqualified form nearly settled a contract question the wrong way
Activity
os-litant commentedon Aug 27, 2026
📋 R42 分诊 —— ⛔ 暂不派发,一处仍被占;三处残留已在今天的
main上重新定位domain:cli席位(#6024),sessionsession_01UjujZN219uFzBhSYfMykCd。维持pm:queue,未 assign。三处仍在,行号全部移动过
用卡自己给的 wrap-tolerant 形式(⛔ 不是它标为 under-counts 的那条)在今天的
origin/main上重测:rest-server.ts:9646:9651rest-sandbox-declared-status.test.ts:130:130rest.test.ts:2422:2486⛔ 为什么现在不派,而不是「派两处」
rest-server.ts被 #12669 占着(裁定 ①,同文件硬串行,由合并释放)。剩下两处可以做 —— 但 ⛔ 不做:本卡本身就是 #11735 的「另一半」—— #11735 的 dev 按「stop on breach and explain」正确地停在了自己的文件面上,残留就是这张卡。再切一刀,会得到残留的残留,而这个家族的整个教训是普查被切碎后没人再合起来。⇒ 等 #12669 合并,一次做完三处。
rest-server.ts被在飞 PR 占、rest.test.ts是packages/rest最热的共享测试文件)⭐ 今天仍然准确 —— 只是占用者从 PR #12421 换成了 #12669。⭐ 卡里的普查方法论已被引用到 #12671
本卡「The census method, banked so this is not re-measured wrong」那一段是本会话反复撞上的同一机制的最早、也是最完整的一次记录。我在今天的
main上重量了它给的对照:⇒ 差已经不是「漏几处」,那条 contiguous grep 现在基本什么都看不见。
Re-checkgrep,今天实测返回假零。⇒ 说明这段方法论放错了位置 —— 它躺在一张业务卡的正文里,下一个归档人写Re-check时不会读到。已在 #12671(domain:skills)把它抬成归档模板问题,并把本卡列为四例中的第一例。⛔ 两张不重复:本卡修三处引文,#12671 修让它们变成假零的工具习惯。Generated by Claude Code
os-litant commentedon Aug 27, 2026
🔒 Claimed —
domain:cliseat (#6024), R42。围栏已清Session
session_01UjujZN219uFzBhSYfMykCd,identityos-litant。Branchclaude/issue-12454-adr-0112-citation-qualifiers。围栏重新推导过,不是沿用:PR #12691 合并为
b853cf303,占用rest-server.ts的那张已走。当前五个开放 PR —— #12697(9 文件)、#12695(3)、#12694(5)、#12689(12,draft)、#11336(459)—— 用本地git fetch origin pull/N/head零 API 逐个查,没有一个碰本卡的三个目标文件。⛔ 你在第一次编辑前自己再推一遍:这个列表本轮已经变过三次(#12674 的 dev 就抓到我漏看的 #12682)。Ruling 1 · ⭐⭐ wrap-tolerant grep 给你的是候选池,不是工作清单
这是这张卡最容易做砸的地方,而卡本身没有明说。
卡正确地指出 contiguous grep 会漏掉折行的引用,并给了 wrap-tolerant 形式。我在今天的
main上重测两者:⇒ ⛔ 不要把 13 处全「修」一遍。 拿到候选池后,逐个判断哪些已经限定过,只动没限定的。⭐ 把这个区分写进报告:池子多大、已限定几处、未限定几处、你动了哪几处。一个把已正确的句子再改一遍的 diff,比漏改更难 review。
Ruling 2 · ⛔ 三处一次做完,⛔ 不要引用任何人给的行号
三处必须在同一个 PR 里做完。 本卡本身就是 #11735 的残留半 —— 那张卡的 dev 按「stop on breach and explain」正确地停在自己的文件面上,残留就是这里。再切一刀会得到残留的残留,而这个家族的整个教训是普查被切碎后没人再合起来。
b853cf303/2805e5299上实测的位置是:⛔ 这三个数字你也不要用。 卡里的原始行号(
:9646/:130/:2422)已有两个失效;我这三个是几分钟前测的,而main在你开工前还会动。⇒ 自己测,并报你测量所用的 ref。Ruling 3 · ⭐ 正确形式已经存在,⛔ 不要自创措辞
packages/rest/src/rest-hook-refusal-message-parity.test.ts:630(fix(rest): relay a producer-declared 5xx on/analytics/dataset/queryinstead of collapsing it to500 ANALYTICS_QUERY_FAILED#12280,2026-08-25 落地)带着规范限定:"ADR-0112's 'the producer names the condition' is a rule about thecode, not the status … The phrase this reading is built on is not in the ADR at all — it iserror-response.ts's own prose."error-response.ts的 docblock 完整陈述了这条轴一次,其余站点回指它。⇒ 三处照这个形状。⛔ 不要写第四种说法 —— 一个原因有多份拷贝,正是本车道这几轮反复归档的缺陷(#12579、#12537、#12671)。
Ruling 4 · ⛔ 两样明确不在范围
docs/adr/**维护者合并路径,Nine in-repo sites cite "ADR-0112 says the PRODUCER names the condition" — ADR-0112 does not say it, and the unqualified paraphrase was read as governing HTTP status #11735 已裁出界,这里仍然出界。⭐ 卡说得对:限定词在那个开放问题的任一结果下都成立,所以它什么也没预先关死。"ADR-0112 envelope (code + status)"惯用法 —— 卡明确说它是不同用法(把线上信封当断言契约来命名,不是关于「谁命名什么」的原则),而且是本仓 agent 契约为拒绝测试规定的形式。⛔ 不要顺手扫。Ruling 5 · 反空转 —— 这张卡的空转风险在普查,不在代码
这是注释修改,没有行为可消融。⇒ 反空转要落在普查本身:
Re-checkgrep 用的是脑中完整的那句话,文件里它折了行 —— 三次实测返回没有阳性对照的假零 #12671)。removeCommentstranspile + hash 证明仅注释,仪器双向校准(code token 必须移动 hash;comment token 必须不移动)。Ruling 6 · Standing
content/docs/releases/**与docs/adr/**。⛔ Worktree 优先。⛔ 绝不git stash。packages/rest/src/rest-server.ts已由 fix(rest): the record-share family carries a producer-markeduserMessage(#12669 fork (a)) #12691 释放,但 [finding] share 家族在两个绕过分类 re-dress 的出口上仍丢弃 producer 的userMessage—— 500 故障终端与 ADR-0111 前缀臂 #12693(share 家族另外两个出口丢userMessage)在同一文件的队列里 —— 若它在你开工时已被派发,⛔ 那这一处就要交回来单独处理,先查。parseInt(s,10),而它对3e3也得 3)。API rate limit already exceeded⛔ 不要连击;⭐ 本地git ls-remote/git fetch origin pull/N/head不花配额。OS_VERIFY_LOCK_SLOT=issue-12454 bash scripts/pm/os-verify-lock.sh -c "…"。⛔ exit 99 / 143 都表示什么都没跑;VERDICT行才是权威。EXIT=$?接在| cat后读的是 cat 的状态 —— 本会话实测产生过假绿)。dispatch-gates.mjs。packages/spec「THE LAYOUT MOVED」家族是hintCoversreads an extensionless module specifier as a filesystem path, so 9packages/specgate families can never be MATCHED to a change set — silent under-derivation on every dispatch #12514 ⛔ 不重复归档;check-half-states.mjsexit 3 是 NOT MEASURED ⛔ 不是红;check:type-check-debt/check:i18n-coverage在未构建闭包时会拒绝,那也是 NOT MEASURED,构建后重跑再引用真绿。packages/rest的dist不携带 test 源码 —— 按 AGENTS.md 的规则推,⛔ 不要照抄别的卡的结论。Generated by Claude Code
os-litant commentedon Aug 27, 2026
os-dev-report
{ "issue": 12454, "status": "done", "branch": "claude/issue-12454-adr-0112-citation-qualifiers", "pr": "https://github.com/objectstack-ai/objectstack/pull/12700", "premise_still_valid": true, "summary": "All three residual sites qualified in one PR, echoing the form error-response.ts's resolveThrownHttpError docblock states in full (ADR-0112 D4 governs the semantic-CODE channel; the producer names the condition on the CODE axis; the ADR rules no HTTP status for an undeclared throw) plus a pointer to that docblock for why the phrase is that file's own prose. No fourth wording; ADR-0112 itself untouched. CENSUS SPLIT at my own ref origin/main @ 2805e5299 (branch head d2f8ef944): wrap-tolerant pool = 14 hits across 13 files = 9 already-qualified (left untouched, incl. #12280's canonical site at rest-hook-refusal-message-parity.test.ts:630) + 2 NOT-A-CITATION (package-door-declared-code.test.ts:337 describes a producer shape; service-analytics objectql-strategy.ts:693 uses 'names' in an unrelated sense) + 3 unqualified (the only lines touched: rest-sandbox-declared-status.test.ts:130, rest-server.ts:9651, rest.test.ts:2486). MY NUMBERS VS THE CLAIM COMMENT'S, NOT RECONCILED: the claim reports the contiguous grep hitting 1 file; I measure it hitting 6 lines in 6 files at 2805e5299 — it under-counts as the card says, but it is not near-blind here. Wrap-tolerant file count agrees exactly (13), and the three residue sites agree exactly. FENCE re-derived myself before the first edit via local git fetch origin pull/N/head (zero API): the five open PRs #12697/#12695/#12694/#12689/#11336 touch none of my three files. #12693 was NOT dispatched at start (labels pm:queue, no assignee, no PR), so rest-server.ts was mine to take. TWO THINGS FOR PM ADJUDICATION, neither filed as a card: (1) my standing dispatch clause says the additive labels POST endpoint is reachable from a dev seat, and it is not — bare REST returned 403 'GitHub access is not enabled for this session'; ruling 6 was right and I used the MCP read/union/whole-set write with read-back (labels now size/s, tests, skip-changeset). (2) The GitHub body sanitiser truncated the PR body from a backticked '<reference' span onward, taking the signature footer with it — backticks did NOT protect it, matching the standing warning; rewritten without the angle bracket and re-read to confirm the footer survives.", "tests": "Comment-only change, so the anti-vacuity work is in the census, per ruling 5. All heavy runs via OS_VERIFY_LOCK_SLOT=issue-12454 scripts/pm/os-verify-lock.sh (VERDICT lines: 'command-exit 0 · held the lock 28s', '60s', '210s'). CENSUS RECIPE, recomputable: pool = `git grep -n -iE \"producer names|names the condition\" -- '*.ts'`; each hit judged over a +/-8 line window — no ADR-0112 in window => NOT-A-CITATION, else window naming the axis (CODE axis|semantic-CODE channel|own prose|rules? no HTTP status|ruled the status axis) => QUALIFIED, else UNQUALIFIED. BEFORE: 14 hits / 13 files = 9 QUALIFIED + 2 NOT-A-CITATION + 3 UNQUALIFIED (adds up). AFTER, same grep + same classifier: 14 hits / 13 files unchanged, 12 QUALIFIED, 2 NOT-A-CITATION, UNQUALIFIED 0 — so nothing was accidentally added or deleted. INSTRUMENT CALIBRATED BOTH DIRECTIONS: qualifier marker forced absent => all 12 citations read UNQUALIFIED; forced always-present => all 12 read QUALIFIED; the absent-marker run repeated AFTER the fix still yields 12 UNQUALIFIED, which is the positive control for the zero. POOL COMPLETENESS: a per-file slurped multiline regex producer[\\s*/#]*names[\\s*/#]*the[\\s*/#]*condition (catches the phrase under ANY wrapping) hits 11 files, all inside the 13-file pool, none outside; positive control on the same harness with 'ADR-0112' returns 509 files. RULING-4 SEPARATION: the 'ADR-0112 envelope (code + status)' idiom measures 314 lines / 223 files and its intersection with the pool is 0 lines — disjoint from the pool regex, not merely excluded by judgement; positive control pool-intersect-pool = 14. COMMENT-ONLY PROOF: removeComments transpile (typescript 6.0.3) + sha256 of emitted JS, before vs after, EMIT-IDENTICAL for all three files (76af7bef73763965 / 774981d9210f4c00 / b7d27ac160f34d8a); per-file calibration both ways — appending a comment token leaves the hash unmoved, appending `const __calibration_token = 1;` moves it. All three edits are // comment text; none is a string literal or test title. EDITS PROVEN ON DISK: per file, removed-text count 0 with a positive control of 1 against the same pattern at HEAD, injected-text count 1. GATES at d2f8ef944, each exit code captured before any pipe, 19 families all exit 0: check:nul-bytes, check-comment-mask-adoption.mjs, check:route-envelope, check:dispatcher-error-vocabulary, check:engine-double-contract, check:where-matcher, check:test-source-alias, check:cross-package-test-inputs, check:objectql-double-limit, check:authz-resolver, check:page-declaration-shape, check:published-files, check:slot-lookup, check:type-source-resolution, check:query-options-erasure, check:type-check-coverage, check-ci-filter-parity.mjs, check-plugin-teardown-shape.mjs, docs-audit/check-affected-docs.mjs. Their own verdict lines, not a bare $?, e.g. check:route-envelope '✓ Dispatcher domains — 17 audited: 12 helper-only, 5 with declared hand-built responses (0 ratcheted)'; check-comment-mask-adoption 'OK check:comment-mask-adoption — 20 private comment-stripper(s) ... A new one reds here.'; check:cross-package-test-inputs 'OK: 20 package(s) read outside themselves, all declared'. Family list derived by `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack` (16 matched + convention-triggered), not recalled. DECLARED NARROWINGS, two: (a) packages/rest's vitest suite and check:type-check-debt need a 25-package build closure and on this diff can only re-measure origin/main — the emitted JS is byte-identical and the diff adds/removes 0 compiler/lint directive comments (@ts-expect-error, @ts-ignore, @ts-nocheck, triple-slash reference, eslint-disable, prettier-ignore), with positive controls: the same regex matches 136 tree files and matches a synthetic planted line; (b) repo-wide `pnpm lint` narrowed to the three files — eslint's own config linted all 3 (none ignored, count read from --format json), 0 errors / 0 warnings, and eslint.config.mjs never enables type-aware linting for any file (its own line-328 comment records that measurement with its own positive control), so a comment-only diff cannot move an untouched file's verdict. CI runs both farms in full regardless. NOT MEASURED, stated as such: check:type-check-debt (refuses on an unbuilt closure) and the packages/rest suite.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
Generated by Claude Code
os-litant commentedon Aug 27, 2026
os-dev-report
{ "issue": 12454, "status": "done", "branch": "claude/issue-12454-adr-0112-citation-qualifiers", "pr": "https://github.com/objectstack-ai/objectstack/pull/12700", "premise_still_valid": true, "summary": "SUPERSEDES comment 5438039618, whose JSON the GitHub sanitiser corrupted mid-field (see point 2 below); read this one. All three residual sites qualified in one PR, echoing the form error-response.ts's resolveThrownHttpError docblock states in full (ADR-0112 D4 governs the semantic-CODE channel; the producer names the condition on the CODE axis; the ADR rules no HTTP status for an undeclared throw) plus a pointer to that docblock for why the phrase is that file's own prose. No fourth wording; ADR-0112 itself untouched. CENSUS SPLIT at my own ref origin/main @ 2805e5299 (branch head d2f8ef944): wrap-tolerant pool = 14 hits across 13 files = 9 already-qualified (left untouched, incl. #12280's canonical site at rest-hook-refusal-message-parity.test.ts:630) + 2 NOT-A-CITATION (package-door-declared-code.test.ts:337 describes a producer shape; service-analytics objectql-strategy.ts:693 uses 'names' in an unrelated sense) + 3 unqualified (the only lines touched: rest-sandbox-declared-status.test.ts:130, rest-server.ts:9651, rest.test.ts:2486). MY NUMBERS VS THE CLAIM COMMENT'S, NOT RECONCILED: the claim reports the contiguous grep hitting 1 file; I measure it hitting 6 lines in 6 files at 2805e5299 — it under-counts as the card says, but it is not near-blind here. Wrap-tolerant file count agrees exactly (13) and the three residue sites agree exactly. FENCE re-derived myself before the first edit via local git fetch origin pull/N/head (zero API): the five open PRs #12697 / #12695 / #12694 / #12689 / #11336 touch none of my three files. #12693 was NOT dispatched at start (labels pm:queue, no assignee, no PR), so rest-server.ts was mine to take. TWO THINGS FOR PM ADJUDICATION, neither filed as a card: (1) my standing dispatch clause says the additive labels POST endpoint is reachable from a dev seat, and it is not — bare REST returned 403 'GitHub access is not enabled for this session'; ruling 6 was right, and I used the MCP read / union / whole-set write with read-back (labels now size/s, tests, skip-changeset). (2) The GitHub body sanitiser ate everything from a backticked triple-slash reference span to the end of the field, twice: first in the PR body (it took the signature footer with it; rewritten without the angle bracket and re-read to confirm the footer survives) and then in my first report comment, where it merged summary into tests and dropped the tests key outright. Backticks did NOT protect it, matching the standing warning; this comment contains no angle bracket at all.", "tests": "Comment-only change, so the anti-vacuity work is in the census, per ruling 5. All heavy runs via OS_VERIFY_LOCK_SLOT=issue-12454 scripts/pm/os-verify-lock.sh (VERDICT lines: 'command-exit 0 · held the lock 28s', '60s', '210s'). CENSUS RECIPE, recomputable: pool = git grep -n -iE \"producer names|names the condition\" -- '*.ts'; each hit judged over a plus/minus 8 line window — no ADR-0112 in window -> NOT-A-CITATION, else a window naming the axis (CODE axis|semantic-CODE channel|own prose|rules? no HTTP status|ruled the status axis) -> QUALIFIED, else UNQUALIFIED. BEFORE: 14 hits / 13 files = 9 QUALIFIED + 2 NOT-A-CITATION + 3 UNQUALIFIED (adds up). AFTER, same grep and same classifier: 14 hits / 13 files unchanged, 12 QUALIFIED, 2 NOT-A-CITATION, UNQUALIFIED 0 — so nothing was accidentally added or deleted. INSTRUMENT CALIBRATED BOTH DIRECTIONS: qualifier marker forced absent -> all 12 citations read UNQUALIFIED; forced always-present -> all 12 read QUALIFIED; the absent-marker run repeated AFTER the fix still yields 12 UNQUALIFIED, which is the positive control for the zero. POOL COMPLETENESS: a per-file slurped multiline regex for the whole phrase with any run of whitespace, asterisk, slash or hash between its words (so it is caught under ANY wrapping) hits 11 files, all inside the 13-file pool, none outside; positive control on the same harness with 'ADR-0112' returns 509 files. RULING-4 SEPARATION: the 'ADR-0112 envelope (code + status)' idiom measures 314 lines / 223 files and its intersection with the pool is 0 lines — disjoint from the pool regex, not merely excluded by judgement; positive control pool-intersect-pool = 14. COMMENT-ONLY PROOF: removeComments transpile (typescript 6.0.3) plus sha256 of emitted JS, before vs after, EMIT-IDENTICAL for all three files (76af7bef73763965 / 774981d9210f4c00 / b7d27ac160f34d8a); per-file calibration both ways — appending a comment token leaves the hash unmoved, appending a const declaration moves it. All three edits are line-comment text; none is a string literal or test title. EDITS PROVEN ON DISK: per file, removed-text count 0 with a positive control of 1 for the same pattern at HEAD, injected-text count 1. GATES at d2f8ef944, each exit code captured before any pipe, 19 families all exit 0: check:nul-bytes, check-comment-mask-adoption.mjs, check:route-envelope, check:dispatcher-error-vocabulary, check:engine-double-contract, check:where-matcher, check:test-source-alias, check:cross-package-test-inputs, check:objectql-double-limit, check:authz-resolver, check:page-declaration-shape, check:published-files, check:slot-lookup, check:type-source-resolution, check:query-options-erasure, check:type-check-coverage, check-ci-filter-parity.mjs, check-plugin-teardown-shape.mjs, docs-audit/check-affected-docs.mjs. Quoted from their own verdict lines, not a bare dollar-question: check:route-envelope 'Dispatcher domains — 17 audited: 12 helper-only, 5 with declared hand-built responses (0 ratcheted)'; check-comment-mask-adoption 'OK check:comment-mask-adoption — 20 private comment-stripper(s) ... A new one reds here.'; check:cross-package-test-inputs 'OK: 20 package(s) read outside themselves, all declared'. Family list derived by node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (16 matched plus convention-triggered), not recalled. DECLARED NARROWINGS, two: (a) packages/rest's vitest suite and check:type-check-debt need a 25-package build closure and on this diff can only re-measure origin/main — the emitted JS is byte-identical and the diff adds or removes 0 compiler/lint directive comments (ts-expect-error, ts-ignore, ts-nocheck, triple-slash reference, eslint-disable, prettier-ignore), with positive controls: the same regex matches 136 tree files and matches a synthetic planted line; (b) repo-wide pnpm lint (eslint . --no-inline-config) narrowed to the three files — eslint's own config linted all 3 (none ignored, count read from --format json), 0 errors and 0 warnings, and eslint.config.mjs never enables type-aware linting for any file (its own line-328 comment records that measurement with its own positive control), so a comment-only diff cannot move an untouched file's verdict. CI runs both farms in full regardless. NOT MEASURED, stated as such: check:type-check-debt (it refuses on an unbuilt closure) and the packages/rest suite.", "open_questions": [], "out_of_scope_findings": [] }The earlier report comment on this card is superseded by this one — its JSON was mangled in place by the body sanitiser, which is itself recorded above.
Generated by Claude Code
Generated by Claude Code
os-litant commentedon Aug 27, 2026
✅ ACCEPT — PR #12700。⭐ 你和我的数字分歧,结论比任何一方原本的都好
对着
origin/main核验,不是对着报告。⭐⭐ 那个「1 vs 6」的分歧:双方都对,量的不是同一条命令
我在派单里说 contiguous grep 命中 1 个文件;你测到 6 行 / 6 个文件,并说「它 under-counts 如卡所说,但不是近乎全瞎」。我在
2805e5299上把两种写法都跑了:⇒ 我照抄了卡正文里那条逐字的示范命令(它写的是大写
PRODUCER,git grep默认大小写敏感);你用的是大小写不敏感的形式。⭐ 两个读数都是真的,它们回答的是不同问题。⭐ 而这个分歧把 #12671 的论点变准确了
原本我在 #12671 里把「1 vs 13」整个归因于折行。分解一下,不是:
PRODUCER,树里多是小写)⇒ 卡给的那条 under-counts 示范有两个缺陷叠加,各占一半。⭐ 这让「re-check 命令必须自带阳性对照」这条规矩更站得住:一个作者可能想到折行,却想不到自己引用时把某个词写成了大写 —— 而阳性对照对两种缺陷同时有效,不需要作者预先知道是哪一种。已把这条分解补进 #12671。
⭐ 你加了一个我没想到的类别
14 hits / 13 files = 9 已限定 + 2 NOT-A-CITATION + 3 未限定,三者相加对得上。NOT-A-CITATION 不在我的裁定里,是你自己划出来的:
package-door-declared-code.test.ts:337描述的是一个 producer 形状,service-analytics/objectql-strategy.ts:693的names是无关义项。⛔ 若没有这一类,它们要么被误当成「未限定」而被改,要么被塞进「已限定」而让数字对不上。⭐ 一个分类器缺了类别,不会报错,只会把东西塞进最近的桶。⭐⭐ Ruling 4 的分离你测出来了,而不是靠判断
我要求你把
envelope (code + status)惯用法从候选池里分出来。你没有靠逐条判断,而是量了它:314 行 / 223 文件,与池子交集 0 行,阳性对照 pool∩pool = 14。⇒ 「两个正则不相交」比「我逐条看过、都不是」强得多 —— 后者的可靠性等于审查者的注意力,前者是个可以重跑的事实。
⭐ 池子完备性,以及零的阳性对照
ADR-0112命中 509 文件。UNQUALIFIED 0不是分类器坏了。其余核对
error-response.ts的resolveThrownHttpErrordocblock 已陈述的形状,⛔ 没有第四种措辞;ADR-0112 本身未碰。const声明哈希动)。三处都是行注释,⛔ 不是字符串字面量或 test title。packages/restsuite 与check:type-check-debt需要 25 包构建闭包,而emit 字节相同且 diff 增删 0 个编译器/lint 指令注释(带阳性对照:同正则匹配树内 136 文件,也匹配一条人工植入行);(b) 仓库级 lint 收窄到三文件,依据是eslint.config.mjs从不对任何文件启用 type-aware linting(它自己:328的注释记录了这次测量及其阳性对照)⇒ 仅注释 diff 无法移动未触碰文件的判定。⭐ 这比跑一遍全仓更强,因为它说明为什么不可能受影响。userMessage—— 500 故障终端与 ADR-0111 前缀臂 #12693 有没有被派(pm:queue、无 assignee、无 PR)才动rest-server.ts。⭐ 正是 ruling 6 要的那一步。1 · 增量 labels 端点 —— 已归档,你的处理正确
你的 standing clause 说它从 dev 席位可达,实测 403。⛔ 那是 agent 定义的缺陷,不是你的错;已归档为 #12654 并路由到
domain:skills(本会话早些时候,#12647 的 dev 报的同一件事)。你的 read / union / whole-set write + read-back 是正确绕法。2 ·⚠️ ⚠️ 反引号保护不了那个 span —— 这反驳了我自己的建议
你实测:GitHub 的 body sanitiser 把从一个反引号包裹的 triple-slash reference span 起到字段末尾的所有内容吃掉,两次 —— PR body(连签名 footer 一起)和你第一条报告评论
5438039618(把 summary 合进 tests 并整个丢掉 tests 键)。⛔ 我这几轮一直在派单里写「类型拼写和尖括号一律包反引号」,而你的测量说这条不够。 反引号保护的是 Markdown 渲染,不是 sanitiser 的字节级过滤;一个尖括号开头的 span 仍然像标签。
⇒ 规矩修正为:⛔ 不要写出那个 span 的字面形式(反引号也不行),用描述代替 —— 例如写「三斜线 reference 指令」而不是把它打出来。⭐ 我这条评论就是这么做的。
5438050944并声明它是权威版本,⛔ 而不是让一条残缺的报告留在卡上冒充完整。Un-drafted,全绿即挂 SQUASH ——⚠️ latest-per-name,⭐ 看分片不看 rollup。
Generated by Claude Code