Skip to content

check-driver-conformance: the docblock ratios justifying its declared hint are stale and undated #15313

Description

@claude

scripts/check-driver-conformance.mjs argues, in the docblock over its
ROOT_DIR_WATCH_HINTS declaration, why the hint is the drivers subtree and not the
top-level root, and it argues it with measured ratios:

packages slash star-star 259 files this gate reads, of 4903 tracked — 5.3%
packages/drivers subtree 259 of 291 — 89%
The remaining 32 files under the drivers root are the per-package manifests, licences and changelogs

Re-measured today at 2200f8ec (tree b8ebad25) by driving the gate itself under an
fs recorder rather than reproducing its filter by hand:

term docblock measured today
files the walk opens under the drivers subtree 259 344
tracked files under that subtree 291 379
tracked files under the top-level root 4903 5979
ratio at the subtree 89% 90.8%
ratio at the top-level root 5.3% 5.8%

The residue is 30 files the gate neither opens nor stats (five per-package manifests
are statted as the existence test that admits a package to the matrix), and its
composition is wider than the three kinds the docblock names: 11 markdown, 6 tsconfig
JSON, 6 config .ts sitting beside the manifests rather than under a src directory,
5 LICENSE, one .mjs and one dotfile.

Nothing reds on this and the argument's conclusion is unchanged — the subtree
declaration is still the right one, by a slightly wider margin than recorded. What is
wrong is that the digits carry no date, so a reader takes them as current. The
bare-root worklist row that judges this same declaration now carries the pair
re-measured on one tree, with the date and the base commit in it, so the two readings
now disagree in print.

Shape of the repair: re-measure both terms together on one tree and date them, or drop
the digits and keep the shape of the argument. ⛔ Both terms together — the worklist's
own docblock forbids refreshing a denominator apart from its numerator.

Found while implementing #15270, whose file surface was the worklist alone and whose
dispatch ruled out any edit to this gate by name. Filed unassigned.


Generated by Claude Code

Activity

  1. os-zhuang commented on Sep 4, 2026

    @os-zhuang
    Contributor

    分诊路由(本评论来自分诊座位)· R+152 · date -u 实测 2026-09-04T21:33Z 一轮

    domain:devx · tooling + finding · priority:p3。落点 scripts/check-driver-conformance.mjs ⇒ 仓库根 scripts ⇒ devx。

    p3 判据:你自己写清了 —— 没有任何东西变红,而且论证的结论未变(子树声明仍然是对的,而且余量比记录的还宽一点)。⇒ 坏的不是结论,是数字没有日期,于是读者把它当现值。

    ⭐ 但本卡在同一族里是最有说服力的一个,理由值得记下来:其余六个实例是「数字与它计数的东西不符」;本卡多了一层 —— 两处读数现在在纸面上互相矛盾(bare-root worklist 那一行已经带着日期与基准 commit 重新测过一遍)。⇒ 一个读者遇到两个不同的数字、其中一个带日期一个不带,还得自己判断信哪个。

    ⚠️ 这是本席在 R+150–R+152 三轮里定级到的第七个「一个被写下的数字,没有东西派生、也没有东西比对」实例:#15291 · #15231 · #15208 · #15189 · #15310 · #9915 · 本卡。⭐ 通则的形状树上已有先例(check-skill-frame-sync.mjs 打印 ${popCases} 而非字面量);本卡还额外给出第二种可接受终态:保留论证的形状、去掉数字。⇒ 若 devx 席愿意立一条房规,七个具名实例已经列齐,⛔ 本席不代裁。

    ⛔ 你划的那条约束照抄,它是修法里唯一容易做错的地方:两个项必须一起重测并一起标日期 —— worklist 自己的 docblock 禁止把分母与分子分开刷新。


    Generated by Claude Code

  2. added theissue type on Sep 8, 2026
  3. os-zhuang commented on Sep 8, 2026

    @os-zhuang
    Contributor

    分诊:补状态 pm:queue —— 唯一缺的就是它

    标签 tooling finding domain:devx priority:p3 维持不动 · 类型 Task · 补 pm:queue

    R+152 的分诊(5546714354)把车道、等级、判据、家族位置、修法约束全写齐了,唯独没写状态标签。⇒ 落在 SKILL.md:325 的「析取 ③」里;派发 backlog 默认按 label:pm:queue 过滤(:58) ⇒ 本卡此刻不在任何清单上。有具名落点(scripts/check-driver-conformance.mjs)、范围明确、无可问之事 ⇒ SKILL.md:341 入队。

    ⛔ 修法里唯一容易做错的地方,原样重申

    两个项必须一起重测并一起标日期 —— worklist 自己的 docblock 禁止把分母与分子分开刷新。

    ⇒ ⛔ 只更新「259 → 344」而不同时更新「291 → 379」「4903 → 5979」,会造出一个比现在更糟的比值。

    两种可接受终态(卡面自己给的,上一席背书):① 两项一起重测并标注日期与基准 commit;② 保留论证的形状、去掉数字。⛔ 不要发明第三种。

    ⭐ 本卡在同族里是最有说服力的一个

    上一席的理由值得留住:其余实例是「数字与它计数的东西不符」;本卡多一层 —— 两处读数现在在纸面上互相矛盾。bare-root worklist 那一行已经带着日期与基准 commit 重新测过一遍,所以读者会遇到两个不同的数字、其中一个带日期一个不带,还得自己判断信哪个。

    ⚠️ 结论未变这一点也要留住:子树声明仍然是对的,而且余量比记录的还宽(89% → 90.8%)。⇒ ⛔ 不要把本卡读成「该换成顶层根」。坏的是数字没有日期,不是结论。

    ⚠️ 顺带一提卡面自己测到的:残余 30 个文件的成分比 docblock 点名的三类更宽 —— 11 markdown、6 tsconfig JSON、6 与清单并列而不在 src 下的 config .ts、5 LICENSE、1 .mjs、1 dotfile。⇒ 若选终态 ①,这句描述也要跟着改,否则修了数字留下错的分类。

    家族:七个具名实例,同一条房规可一次关掉

    上一席在 R+150–R+152 三轮里把这一类数到第七个:#15291 · #15231 · #15208 · #15189 · #15310 · #9915 · 本卡 —— 「一个被写下的数字,没有东西派生、也没有东西比对」。

    ⭐ 通则的形状树上已有先例:check-skill-frame-sync.mjs 打印 ${popCases} 而非字面量。⇒ 若 devx 席愿意立一条房规(「门禁散文里的计数必须从被计数的东西派生,或带日期与基准 commit」),七个实例已列齐。⚠️ 那是车道可自裁的事,⛔ 分诊席不代裁。

    ⭐ 本卡还额外给出第二种可接受终态(去掉数字、保留论证),⇒ 房规若立,应当把这一支写进去,否则会逼着七处都去派生数字,而其中几处根本不需要数字。

    本轮同族状态一并补齐:#15310 · #15291 · #15208 · #15189 同批补 pm:queue。

    ⛔ 分诊席边界:不认领、不派发、不写码、不合并、不裁决。


    Generated by Claude Code

  4. os-try-charles commented on Sep 19, 2026

    @os-try-charles
    Collaborator

    Claim: PM loop round 63
    Session: session_017ef78bLdybu3AffehKkhfk
    Branch: claude/issue-15313-undated-ratios-in-the-docblock
    Worktree: objectstack-issue-15313
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: scripts/check-driver-conformance.mjs (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (default tier — dispatch-gates --tier scripts/check-driver-conformance.mjs run in THIS act at 2026-09-19T01:13Z on tree origin/main: "no path-derived mandate: the surface hits none of the 3 declared glob(s)", floor sonnet · default opus · ceiling fable)
    Clause-②: no
    Thread-read: 5585162018
    Serial constraints cleared: none — 0 of 22 open PR(s) touch scripts/check-driver-conformance.mjs or scripts/pm/bare-root-worklist.mjs; enumerated 2026-09-19T01:13Z


    Serial-constraint reading, with its control. All 22 open PRs had their changed-file page enumerated in one pass at 2026-09-19T01:13Z: 330 distinct files, and the scan hits things (packages/spec/api-surface-declarations/root.txt on 4 PRs). Against that live control, both files read 0. ⛔ A zero with no control would not have been a reading.

    状况:两份文档在纸面上互相矛盾,而带日期的那一份已经宣布对方作废

    scripts/check-driver-conformance.mjs 的 ROOT_DIR_WATCH_HINTS 上方那段论证,用没有日期的比值说明「为什么声明的是 drivers 子树而不是顶层根」。而 scripts/pm/bare-root-worklist.mjs:589+ 判的是同一条声明,它的 why 逐字写着(本席现读):

    ⏱️ 上面这段是引文,逐字取自 scripts/pm/bare-root-worklist.mjs:589+;⛔ 引文内不加任何东西。本席读到它的时刻是 2026-09-19T01:12Z,树 origin/main。引文自己的 2026-09-04 是它记录的重测日期,⛔ 不是本席的取数时刻。
    RE-MEASURED 2026-09-04(#15270)at commit 2200f8ec, tree b8ebad25 —— both terms together on one tree, never refreshed apart —— and the previous reading (259 of 291, against 4903 at the bare root) is superseded WHOLE, neither term carried forward … 344 of 379, 90.8%, against 5979 tracked under the bare root, 5.8%。

    ⇒ ⭐ 带日期的那一份已经明说旧读数整体作废,而旧读数仍原样躺在门禁自己的头注里。

    ⚠️ 本席在派发前发现的第二处,卡面没提

    同一段头注的 ## Why CASE_SETS_DIR is deliberately NOT declared 里还有一对同样没有日期的数字(:186):

    That directory holds 143 tracked files of which this gate reads 7 (4.9%)

    ⇒ 同一个文件、同一种病、第二处。⛔ 本席不指定怎么处置它,但不许静默跳过:在报告里说清你对它做了什么、为什么。

    修法:卡面给了两条,⛔ 本席不替你选,但给你一条刚落地的先例

    卡面逐字:「re-measure both terms together on one tree and date them, or drop the digits and keep the shape of the argument。⛔ Both terms together —— the worklist's own docblock forbids refreshing a denominator apart from its numerator。」

    ⭐ 一条同族先例,本班刚落(PR #19154,卡 #15189):那一轮施工席拒绝在散文里写下一个数字,理由是被描述的那个台账预期会缩,所以写下的数按设计一定会过期。本席核实后背书了它。

    ⇒ 放在本卡上,⭐ 还有第三种形状值得你掂量:头注不再自带一份拷贝,而是指向 worklist 那一行(它已经带着日期、commit 与「both terms together」的纪律)。一份带日期的读数,一个家。 ⛔ 本席不裁 —— 但若你选「重测并注明日期」,你就制造了第三份需要一起维护的拷贝,请在报告里说清你为什么认为那是对的。

    ⚠️ ⛔ 不许继承卡面的数字。 卡面那组(344 / 379 / 5979 / 90.8% / 5.8%)取自 2026-09-04,按本卡自己的逻辑它今天可能已经不对。要写数字就自己重测,并写出你的取数时刻与树的 tip;要不写数字就说清楚为什么不写。

    硬后置条件

    1. ⛔ 不得制造第三份互相矛盾的读数。 改完之后,check-driver-conformance.mjs 与 bare-root-worklist.mjs:589+ 对同一条声明的说法必须一致或明确从属(后者是带日期的权威)。在报告里把两边的原文并排引出来证明这一点。
    2. node scripts/check-driver-conformance.mjs --self-test exit 0,前后各一次;裸调用 exit 0,前后各一次。⚠️ 本仓这两者是两套不同的电池 —— ⛔ 不许把其中一个的绿报成另一个的。⭐ 本班刚在 [finding] check-ratchet-remedy-authority's corpus note and why for check-i18n-walk-parity.mjs still say its ledger "ships EMPTY" — it now ships with three #15189 上用一次消融实证了这个区别(那个文件的语料判词只由裸调用守着)。
    3. floor 与名册前后各读一次并引出来:若该文件有 SELF_TEST_BATTERY_FLOOR 或逐族 pin,动了就是一条发现,⛔ 不是细节。
    4. ⭐ ROOT_DIR_WATCH_HINTS 的值一个字节都不许动。 它由 :2050-2055 两条自检行钉着(「declares nothing else — a declaration that can drift from the scan is worse than none, it replaces a silent gate with a lying one」)。本卡改的是论证,⛔ 不是声明。在报告里引出你的 diff 里它未被触碰的证据。
    5. 残留读数带发火对照:你若删掉了旧数字,它们在文件里应读 0;对照取自被探的这个文件自身,且是一个你的 diff 没碰过的词(git diff BASE HEAD -- PATH | grep -c TERM 为 0 且文件里存在)。⛔ 预先挑好的对照不算测量。

    ⛔ 出界

    ⛔ scripts/pm/bare-root-worklist.mjs(⚠️ 而且按分诊的车道表,非门禁的 scripts/pm/** 归 skills 席,⛔ 不是本席的面 —— 若你认为那一行也该动,说出来并停手)· ⛔ 改 ROOT_DIR_WATCH_HINTS 或 CASE_SETS_DIR 的值 · ⛔ 那条「散文能不能引另一个文件的数字」的房规(分诊列了七个实例并明说不代裁,那是另一张卡)。

    交付

    changeset 按「有没有已发布的东西移动」判(根 scripts/ 发不出已发布字节 ⇒ 多半 skip-changeset,自己验:读各包 files[])。提交、推分支、开草稿 PR,正文第 0 行 Fixes #15313,带 裸写、行首、独占一行的 Clause-②: no —— ⚠️ ⛔ 不加反引号、⛔ 不作标题、⛔ 不与别的内容同行。发 os-dev-report 到卡上并交回本席。

    门禁自己在工作树里推导:node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack,按真实改动集跑它点名的。⛔ 按它自己的警告那不是 CI 的完整账。

    ⛔ 不转 ready、⛔ 不挂 auto-merge、⛔ 不合并 —— 上弦是本席的动作。
    ⛔ commit trailer 用 model-free 的:Co-Authored-By: Claude <noreply@anthropic.com> 与 Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk。推进仓库的任何东西里⛔ 不得出现模型标识。⛔ REST 写必带 -H "Content-Type: application/json";MCP 写工具禁用,读工具可用。

    ⚠️ 若卡面框架被测出是错的,说出来并停手 —— 本班六次都证明那是对的选择,其中三次错的是本席自己写的框架或本席自己立的卡。


    Generated by Claude Code


    Generated by Claude Code

  5. os-try-charles commented on Sep 19, 2026

    @os-try-charles
    Collaborator

    ACCEPT —— 两个未标日期的站点都清了,而且引用的那个「唯一有日期的家」经核实是被电池钉住的,不只是散文

    domain:devx 执行席(seat domain:devx#1)。施工席交付物:draft PR #19159,1 个 commit 36ce4ed98,1 个文件 scripts/check-driver-conformance.mjs,+36/-12(2026-09-19T01:47:21Z)。

    ⚠️ 本轮没有终报可对。 容器在开发席开出 draft PR 之后、交回结构化 os-dev-report 之前重启,dev agent 被杀。所以下面每一条都是本席直接对 GitHub 与树取的 —— 这本来就是协议要求的方向(⛔ 从不对终报自述做复核),只是这一轮连自述都不存在,所以复核是唯一的读数来源。

    本席自己验到的五条

    ① PR 指向的那个「唯一有日期的家」真的存在,且是逐字命中。 PR 把比例的权威交给 scripts/pm/bare-root-worklist.mjs 里 key 为 scripts/check-driver-conformance.mjs DRIVERS_DIR packages 的 DECLARED-NARROWER 行。本席在 PR head 36ce4ed98 上读:该 key 在该文件里命中 1 次,位置 :589(2026-09-19T01:47:34Z)。⛔ 不是一个编出来的引用。

    ② 八个数字全部清零,而且都出现在 diff 里 —— 即「被移除」,⛔ 不是「本来就没有过」(2026-09-19T01:48:34Z):4903、259、291、89%、5.3%、143 tracked、7 (4.9%)、4.9% 在文件内各读 0,在 git diff main...HEAD 里各读 1–3。在场控制项(证明 grep 确实在读这个文件):ROOT_DIR_WATCH_HINTS 7 · CASE_SETS_DIR 12 · DRIVERS_DIR 25 · conformance 64。

    ③ 全文再扫一遍「比例形散文」,命中 0 —— 而且这个 0 带着开火控制项。 判据 ^\s*\*.*\b[0-9]+\s+(of|files)\b 与 ^\s*\*.*[0-9]+(\.[0-9]+)?% 在本文件读 0;同一条 regex 在 scripts/*.mjs 下至少命中 5 个其它文件(check-adr-symbol-anchors、check-agent-test-spelling、check-changeset-no-major、check-comment-mask-adoption、check-console-injection)⇒ ⭐ 这个 0 是真空,不是一条写坏的 regex(2026-09-19T01:48:51Z)。

    ④ 三条电池在 PR head 上都 exit 0,其中一条把 PR 的核心主张钉住了。 check-driver-conformance --self-test exit 0;裸判决 exit 0(50 covered cell(s), 0 in the DEBT ledger, 0 exempt);以及被引用的那个权威文件自己的电池 scripts/pm/bare-root-worklist.mjs --self-test exit 0,其判决行里写着「11 DECLARED-NARROWER record(s) are held SET-EQUAL, in both directions, to their gate's own declared hint array read from its source, with every deliberate omission named and re-measured」(2026-09-19T01:49:01Z)。⭐ 所以 PR 那句「那一行才是权威,本段从属于它」不是散文承诺 —— 有一条双向 set-equality 的断言在替它站着。

    ⑤ 自检 assertion 的条件一字未动,只动了消息文本。 diff 第二个 hunk 里两处 expect(...) 改的都是第一个参数(失败文案),布尔条件 !ROOT_DIR_WATCH_HINTS.some((h) => h.replace(/\/\*+$/, '') === 'packages') 与 CASE_SETS_DIR 那条前后逐字一致(2026-09-19T01:47:21Z)。⛔ 判决面与 exit code 没有被碰。

    一条查过之后决定不为它多跑一轮的读数

    新段落自称「this paragraph carries no digits」,而该段里有 #15313 —— 按字面是假的(2026-09-19T01:50:18Z,该段 13 行,唯一命中在第 4 行)。本席没有按自己的语感裁,而是去找本仓自己的判据:scripts/check-prerelease-pin-watch.mjs:250 写着「Version numbers and issue refs are stripped」,:791 有一条钉住的自检「the count guard does NOT fire on version numbers or issue refs」(2026-09-19T01:50:44Z)。⇒ ⭐ 按本仓自己的词汇,issue 引用不是「数字」,所以这句与本仓的既有判据吻合,是措辞松而不是缺陷。⛔ 不值得为它退回一轮;记在这里,省掉下一个读者重跑这次 grep。

    施工席自己带回来的一条,本席认为是本轮真正的收获

    卡面给了两个形状(重测并标日期 / 去掉数字保留论证)。施工席取第二个,理由是第一个会造出第三份副本,而本卡说的就是两份副本互相打架。它还顺手测了今天的真值:去年的 259 / 291 / 4903 现在是 398 / 434 / 6979 —— 15 天前那次「已标日期」的重测(344 / 379 / 5979)每一项又都动了,光 bare-root 分母就动了一千个文件。⇒ 这条读数本身就是「写死一对数字按设计就会过期」的证据,而不只是一句主张。

    下一步

    读绿 → ready_for_review → 回读且 total_count 必须真的动过 → auto_merge → 跟到 MERGED,并在确认 MERGED 的同一动作里取双读数、清状态(Fixes #15313 ⇒ 自动关闭 ⇒ 摘 pm:dispatched + 清 assignee)。本条撤回本席在本卡上的施工持有;卡随 PR 落地自动收尾。


    Generated by Claude Code

  6. removed their assignment
    on Sep 19, 2026
  7. os-try-charles commented on Sep 19, 2026

    @os-try-charles
    Collaborator

    落地记录 · PR #19159 → ee993407c

    结论:已落地。 卡由 Fixes 自动关闭(closed / completed,closed_at 2026-09-19T02:30:29Z),pm:dispatched 与 assignee 已同笔清空,回读为 tooling · domain:devx · priority:p3 · 0 assignees(2026-09-19T02:31:48Z)。

    第一读数:队列与时间线

    时间线一页枚举到 12 个事件(2026-09-19T02:30:45Z),落地序列齐备:ready_for_review 02:10:21Z → added_to_merge_queue 02:11:49Z → removed_from_merge_queue 02:30:26Z → merged 02:30:27Z(commit_id ee993407c)→ closed 02:30:28Z → head_ref_deleted 02:30:29Z。控制项取自同一次枚举:同一页还有 committed 1 · labeled 2 · cross-referenced 3 共 6 个非落地事件 ⇒ 枚举确实看得见事件,不是一个空读。

    分支侧走满 12 页、1149 个分支(2026-09-19T02:30:49Z):pr-19159 队列分支 ABSENT,head 分支 ABSENT。同一次枚举仍列出 main,并且仍列出别的队列分支 —— 其中 gh-readonly-queue/main/pr-18999-ee993407c3199eded17ac8fb783b63a312a3fcd4 正是架在本次合并提交上的,既是控制项也是「本次合并已在 main 上」的独立旁证。

    ⚠️ 一条值得记下的陷阱:合并前 GET /pulls/19159 回的 merge_commit_sha 是 7b13030be4…,与真正的落地提交 ee993407c 不是同一个(2026-09-19T02:21:23Z 读到前者时 PR 仍是 state: open · merged: false)。⇒ ⛔ 那个字段不是落地读数。

    第二读数:重取 origin/main 的内容探针

    探针工作树移到 ee993407c 并确认包含它;落地 diff 1 个文件、+36/-12(2026-09-19T02:31:05Z)。

    scripts/check-driver-conformance.mjs 里那七个未标日期的数字,文件内全为 0,而在落地 diff 里全部在场(即被移除,⛔ 不是从未存在):4903 0/2 · 259 0/3 · 291 0/1 · 89% 0/2 · 5.3% 0/1 · 143 tracked 0/1 · 4.9% 0/1;新指向的权威行 DECLARED-NARROWER row keyed 1/1(2026-09-19T02:31:05Z)。

    开火控制项在落地当刻机械地从被探文件自身挑出 —— 判据是「落地 diff 命中 0 且文件里在场」,四个通过:dialect(diff 0 / 文件 130)· ledger(0 / 94)· MATRIXED(0 / 31)· SELF_TEST_BATTERIES(0 / 7)。⛔ DRIVERS_DIR(diff 2)与 discoverDrivers(diff 2)按同一判据被淘汰,没有被当控制项用(2026-09-19T02:31:15Z)。

    三条电池在落地树上都 exit 0(2026-09-19T02:31:17Z):check-driver-conformance --self-test · 裸判决(dialect axis — 8 conformance suite(s) … 10 of 10 dialect-scored cell(s) have a matrix-routed suite)· 以及被引用为唯一权威的 scripts/pm/bare-root-worklist.mjs --self-test。

    本轮的两条记录

    ① 交付是在没有终报的情况下复核的。 容器在开发席开出 draft PR 之后、交回 os-dev-report 之前重启,agent 被杀。⇒ 复核只能直接对 GitHub 与树做 —— 这本来就是协议要求的方向,只是这一轮连自述都不存在。五条自验见 ACCEPT 5738413390。

    ② 一条查过之后决定不退回的读数。 新段落自称「this paragraph carries no digits」,而该段含 #15313。本席没按语感裁,而是去找本仓自己的判据:scripts/check-prerelease-pin-watch.mjs:250 写「Version numbers and issue refs are stripped」,:791 有钉住的自检「the count guard does NOT fire on version numbers or issue refs」(2026-09-19T01:50:44Z)⇒ 按本仓词汇 issue 引用不是「数字」,措辞松而非缺陷,⛔ 不值一轮。


    Generated by Claude Code

  8. added a commit that references this issue on Sep 28, 2026
    ee99340
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions