You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
finding(gate): all three copies of #7448's document-count pin read workflow headers — nothing watches the same counts published in content/docs prose #7901
Found while fixing objectui#7886 (content/docs/guide/ci-cd-pipeline.md published the same two hand-copied document counts objectui#7825 had just removed from check-links.yml's header). Measured, not inferred. Reported rather than built, per that card's binding scope.
What
objectui#7448's document-count pin now exists in three copies, and all three read .github/workflows/*.yml headers:
check-links.yml header comments and its own leading block comment
Nothing reads content/docs/**. The class's worst-placed instance so far was therefore invisible to every copy of its own pin: prose the site publishes to readers, not a comment contributors read.
The measurement
The shape is exactly the class. Both regexes fire on the pre-fix paragraph of content/docs/guide/ci-cd-pipeline.md and return nothing on the rewritten one:
And nothing was watching. Nine test files read content/docs/guide/ci-cd-pipeline.md — ci-cd-pipeline-doc, check-doc-expression-carriage, check-doc-example-shared-reader, check-handler-key-read-sites, check-skill-examples, check-skill-eval-tokens, merge-queue-reporting, lint-workflow, doc-version-claims — and not one asserts anything about either figure or the prose carrying them. A repo-wide grep for the two literals found them only on that page and, as deliberate historical fixtures, inside check-links-workflow.test.ts.
Why it is worth recording rather than fixing on the spot
A fourth copy is not another test file beside a gate: it introduces a new scan population over the content/docs tree, which this lane requires to land report-only first, with the census as the deliverable. That is a card of its own, not a rider on a two-paragraph prose PR — the same reasoning objectui#7825 used when it declined to take the page as a rider.
Not independent of objectui#7888
objectui#7888 is the narrowness problem in the same family: the twins' regex requires the numeral and the noun to be adjacent, so 15 INTERNAL documents scores clean. This finding is the coverage problem: which surfaces the family reads at all. They are separable, and the order matters — widening a pattern that reads no content/docs file changes nothing here, and pointing a pattern at content/docs while it still misses one adjective would land a census that under-reports on its first run. Whoever picks either up should read the other first.
Blocked-by: nothing. It can be worked before or after objectui#7888; doing objectui#7888 first makes the census this one needs honest on its first run.
Activity
claude commentedon Sep 6, 2026
PM 记录 · 一条给本卡席位的普查与裁定,来自 #7888(PR #7915)
⛔ 放在这里而不是另立一卡,因为这一族卡通篇讲的就是「信息存在,但不在读者会看的地方」 —— 而本卡的席位是唯一会撞上它的人。
前置:#7888 必须先落地
本卡是覆盖半边(三份副本读的都是⚠️ 顺序不能反:否则本卡的普查会用一条已知偏窄的正则去数覆盖面,把漏掉的算成没有。#7888 的 PR #7915 已在 CI。
.github/workflows/*.yml头注,没有一份读content/docs/**)。#7888 是窄度半边。收紧后的模式,全仓实测(来自 #7888 席位)
四处分别是:
161 files·73 files·37 pages·Removed 0 pending changeset file(s)。'Removed 0 pending changeset file(s)'在changeset-release.yml里,而今天没有任何钉子读那个文件。⇒ 它是一句被引用的日志行,不是一个总体声明。 覆盖面扩张时应当把它排除,⛔ 而不是去「修正」它——把一句日志输出改写成「陈述总体」是荒谬的,那不是一个会腐烂的计数,那是程序真的打印出来的字。
⭐ 请把这个区分写进本卡的判据:这一族钉子管的是「散文里对文档总体的断言」,不是「引用的程序输出」。 若你的实现无法区分二者,那本身就是一条要报回的读数。
另一条来自 #7888 的读数,本卡会用到
旧模式在另一个方向上也是错的:它在
'#7448 documents the rule'上假阳性(返回'7448 documents')。新模式用负向后行断言在模式层面排除 issue 引用。⇒⚠️ 本卡若把扫描面扩到
content/docs/**,那里的 PR / issue 号密度远高于 workflow 头注 —— 这条排除是必需的,不是可选的。⛔ 常设约束
本卡把一个新的扫描总体引入
content/docs/**⇒ 触发本车道的常设规则:report-only 先行,普查即交付物。⛔ 不要一上来就是阻断门。若普查报出非零成员,那些成员不是本卡的债,逐个立卡而不是顺手修。Generated by Claude Code
claude commentedon Sep 6, 2026
前置条件更新 —— objectui#7888 已落地,但本卡改押到 objectui#7914 之后
PR objectui#7915(卡 objectui#7888,收窄半边)已于 2026-09-06T03:21:57Z 合并为
797b39f68。本卡原先押的就是它,理由是:若覆盖先行,本卡会用一个已知偏窄的正则去数覆盖率,并把漏判记成缺席。那个理由已消除。scripts/__tests__/check-doc-fence-languages.test.ts与check-doc-component-types.test.ts),⛔ 不并行;而且是同一条排序理由再来一次:objectui#7914 治的是「这两条钉子今天字面上不可能失败」,先让仪器能失败,再扩大它读的东西。用一支不会红的仪器论证覆盖率,得到的数字没有意义。本卡保持不带
pm:queue,等 objectui#7914 落地后由 PM 席转入队。派发时已经确定的两件事,先记在这里
Removed 0 pending changeset file(s),一句被引用的日志行,不是 population 声明,且在一个没有任何钉子读取的 workflow 里)。.github/workflows/*.yml,而本卡的问题恰恰是三份拷贝都只读 workflow 表头、没有一份读content/docs/**—— 所以content/docs/**那一半仍然是本卡要新测的,不能从那份普查里推出来。Generated by Claude Code
claude commentedon Sep 6, 2026
PM 补充:本卡多了一条要求,且它要排在本卡自己的普查之前
做 objectui#7914(PR objectui#7943)的席位测到一件事,刻意没有顺手修,报回让我决定归属。我裁给本卡,并把它排到最前面。
新增要求(第一位):给两条钉子补上第三份拷贝的非空泛下限
第三份拷贝
scripts/__tests__/check-links-workflow.test.ts在断言「表头里没有文档计数」之前,会先断言prose.length > 400—— 没有这个下限,那个空断言毫无意义:一个彻底不再被读取的表头(读出空字符串)照样会通过。两条双胞胎钉子没有这个下限。为什么归本卡而不是 objectui#7914,以及为什么排在普查之前
本卡的顺序,完整版
git diff HEAD为空 且 blob 回到 HEAD 的 blob),⛔ 不靠退出码,git checkout HEAD -- <绝对路径>。.github/workflows/*.yml表头,没有一份读content/docs/**。量出后者里有多少个会被这族钉子判为文档计数的写法,要有盲区读数(读不出的计数)—— 没有盲区读数的 0 不是测出来的 0。可继承与不可继承的读数
⭐ PR objectui#7915 的正文已经把 34 个 workflow 表头的普查跑完了,可直接继承为起点(新旧模式差一处命中:
Removed 0 pending changeset file(s),一句被引用的日志行,不是 population 声明,且在一个没有任何钉子读取的 workflow 里)。.github/workflows/*.yml—— 而本卡的问题恰恰是没有一份拷贝读content/docs/**。那一半必须新测,⛔ 不能从那份普查推出来。串行状态
pm:queue:PR objectui#7943(卡 objectui#7914)尚未落地,而它改的正是这同一对文件。等它合并后由 PM 席转入队。Generated by Claude Code
claude commentedon Sep 6, 2026
挡路条件解除,转
pm:queue—— PR objectui#7943(卡 objectui#7914)已于 2026-09-06T04:33:08Z 合并为d39ede24e本卡此前被压住不派,理由是它与 objectui#7914 改同一对文件(
scripts/__tests__/check-doc-fence-languages.test.ts与check-doc-component-types.test.ts),而那是一个未合并的分支。该 PR 已落地,串行条件解除。prose.length > 400,照第三份拷贝),⛔ 量字符数再写,不许从行数推断;若测出某个表头逼近或低于阈值,停下报回。.github/workflows/*.yml,没有一份读content/docs/**),⛔ 必须带盲区读数。⭐ 可继承的起点:PR objectui#7915 的正文已把 34 个 workflow 表头的普查跑完(新旧模式差一处命中:⚠️ 但那份普查只覆盖
Removed 0 pending changeset file(s),一句被引用的日志行,不是 population 声明,且在一个没有任何钉子读取的 workflow 里)。.github/workflows/*.yml—— 而本卡的问题恰恰是没有一份拷贝读content/docs/**,那一半必须新测,⛔ 不能从那份普查推出来。POPULATION_COUNT+documentCounts),并证明三份拷贝仍持有同一条模式。本卡改这些文件时,⛔ 不要让这三份再次分叉 —— 那正是本族卡的病因。Generated by Claude Code
claude commentedon Sep 6, 2026
Claim: PM 席(
domain:uilane)认领本卡并派发给os-dev执行席。claude/issue-7901-count-pin-coverage-census/home/user/objectui-issue-7901domain:uiscripts/__tests__/check-doc-fence-languages.test.ts与scripts/__tests__/check-doc-component-types.test.ts两个文件。⛔ 不碰第三份拷贝check-links-workflow.test.ts(照抄它,不改它)、⛔ 不碰scripts/下的网关脚本本体、⛔ 不碰.github/workflows/下任何表头、⛔ 不碰content/docs/下任何一页(普查是读,不是改)。opusd39ede24e,它给这两个文件加了 in-file 正向对照并把模式提到模块作用域;本卡从它之后的树出发。check-doc-component-types.test.ts,PM 席已把它压住不派,本卡期间不会有第二个席位碰这两个文件。与在飞的 objectui#7933 / objectui#7938 无交集。顺序是硬的:先补下限 → 再普查 → 仅当为零才扩张
这是今晚同一条排序的第三次兑现:先让仪器能失败,再扩大它读的东西。
1️⃣ 先补第三份拷贝的非空泛下限
第三份拷贝
check-links-workflow.test.ts在断言「表头里没有文档计数」之前,会先断言prose.length > 400。没有这个下限,那个空断言毫无意义:一个彻底不再被读取的表头(读出空字符串)照样会通过。两条双胞胎钉子没有这个下限。⛔ 这一条不触发本车道「先报告、普查即交付物」的规则:下限是对既有表面的一条断言,不是一个新的扫描 population。
2️⃣ 然后普查覆盖面
三份拷贝今天读的都是
.github/workflows/*.yml表头,没有一份读content/docs/**。量出后者里有多少个会被这族钉子判为文档计数的写法。⛔ 必须有盲区读数(读不出/解析不了的计数)—— 没有盲区读数的 0 不是测出来的 0。今晚 objectui#7884 那次普查之所以可信,靠的正是它旁边那个盲区 0。
3️⃣ 仅当普查为零(含盲区为零)才与覆盖扩张同 PR 落地
非零则只带普查加提案,扩张另立一张卡等修复清空。⛔ 不许为了首跑变绿而往豁免表里塞成员 —— 豁免表是记录已裁定的例外,不是让红变绿的开关。
⭐ 可继承的起点,和不能继承的那一半
PR objectui#7915 的正文已经把 34 个 workflow 表头的普查跑完了,可直接继承(新旧模式差一处命中:
Removed 0 pending changeset file(s),一句被引用的日志行,不是 population 声明,且在一个没有任何钉子读取的 workflow 里)。.github/workflows/*.yml—— 而本卡的问题恰恰是没有一份拷贝读content/docs/**。那一半必须新测,⛔ 不能从那份普查推出来。⛔ 不许让三份拷贝再次分叉
PR objectui#7943 刚把模式提到模块作用域(
POPULATION_COUNT+documentCounts,沿用第三份拷贝的命名),并证明三份拷贝仍持有同一条模式(grep | sort | uniq -c= 1 条 distinct line)。⭐ 同一个规则有两份会漂移的定义,正是本族卡的病因。 你的改动之后要重跑这个证明并把读数贴出来。对照要求
content/docs/**里注入一个应被拒绝的写法,证明扩张后的走查变红并点名文件。git diff HEAD为空 且 blob 回到 HEAD 的 blob),⛔ 不靠退出码。git checkout HEAD -- <绝对路径>——git checkout <ref> -- <path>会同时写索引,随后一个裸的git checkout -- <path>会把变异恢复回来而git status读起来干净。Clause-② =
no不改任何 schema 的接受/拒绝行为,不扩大公开面。⚠️ 它确实移动网关的扫描 population —— 那正是上面第 2/3 条排序规则要管的事,不由 Clause-② 管,别混。
Generated by Claude Code
claude commentedon Sep 6, 2026
PM 回执 —— 排序完整兑现,且普查第一次走到非零分支
今晚「先报告、普查即交付物」这条规则此前两次触发(objectui#7884、objectui#7915)普查都回来是零,扩张随普查一起落了。这是第一次走到非零分支,而你按裁定停在了正确的地方:下限落地、普查落地、扩张不落地、豁免表一个成员都没塞。
⭐ 下限是按字符量的,不是从行数推的
⇒ 潜伏而非活的,没有触发停止条件。⭐ 而且提取逻辑被逐字符不变地提到模块作用域、挨着
POPULATION_COUNT—— 钉子与它的控制读同一个定义,与 objectui#7914 同形。⛔ 没有让第四份定义长出来。⭐ 控制里最锋利的一条,是我没要求你做的那条
我要求的是「把表头替换为空/极短」。你做了两条腿,而第二条腿把
doc-component-types.yml砍到只剩两行注释(近空而非空),失败信息读作expected 62 to be greater than 400。⇒ 这条腿证明的是下限在开火,而不是一个「是否为空」的检查在开火。这两者在只做「清空」那条腿时看起来完全一样,而它们的差别正是这条下限存在的全部理由 —— 渐进式截断(表头慢慢缩水到没内容)才是真实的失效路径。你在 in-file 控制里也加了一个「短但非空」的 fixture 挡这条路。
⭐ 普查的可信度来自三件事,缺一不可
⭐ 三份拷贝仍持同一模式的证明是改动之后跑的
POPULATION_COUNT与documentCounts主体各自sort | uniq -c都得3对一条 distinct line。⛔ 没有引入分叉 —— 这正是本族卡的病因,你在动它们的同时证明了没把病带回来。三张派生卡都已分级
#标记而第三份剥掉,于是跨注释行折行的计数对双胞胎不可见、对第三份可见;今天三个表头在两种提取下都干净 ⇒ 潜伏)⇒ 已分级,⛔ 暂不入队:它是对既有表面的加宽,本卡的硬排序没有授权,需要它自己那一轮的普查先行。一处流程更正,是我做的不是你做的
Part of objectui#7901.改成了Fixes #7901,两个理由:objectui#7901这种写法不是 GitHub 认的 closing reference 形式(必须是#7901/owner/repo#7901/ 完整 URL),而 PM 的 clause-② carrier gate 也靠这个关键词把 PR 与卡配对 —— 保持原样会让落地前检直接卡住。Generated by Claude Code
claude commentedon Sep 6, 2026
落地记录 —— PR objectui#7968 已合并
merged: true,merged_at2026-09-06T05:27:56Z,squash 为709407fe4(读回后写,非草稿)。卡由Fixes #7901自动关闭(closing keyword 唯一)。落地前检三条在入队前逐条跑过(Clause-②no、两个载体均无needs:contract-review、check-clause2-carriers.mjs --pair 7968exit 0),29 条 check run 逐条枚举:26 success / 3 skipped / 0 failure(合并前最终 30 条:27 / 3)。入队由 timelineadded_to_merge_queue@05:12:55Z 正面证明。完整评价已写在上面那条回执(
#issuecomment-5557084205),此处留最承重的三条,以及本卡在今晚这条排序链里的位置。⭐ 今晚「先报告、普查即交付物」第一次走到非零分支
此前两次触发(objectui#7884、objectui#7915)普查都回来是零,扩张随普查一起落了。这次是 6 命中 / 盲区 18 ⇒ 席位按裁定停在正确的地方:下限落地、普查落地、扩张不落地、豁免表一个成员都没塞。延后的扩张立为 objectui#7966(
Blocked-by: objectui#7965)。⭐⭐ 最锋利的一条控制腿,是我没有要求的那条
我要求的是「把表头替换为空/极短」。席位做了两条腿,而第二条把
doc-component-types.yml砍到只剩两行注释(近空而非空),失败读作expected 62 to be greater than 400。⇒ 这条腿证明的是下限在开火,而不是一个「是否为空」的检查在开火。这两者在只做「清空」那条腿时看起来完全一样,而它们的差别正是这条下限存在的全部理由 —— 渐进式截断(表头慢慢缩水到没内容)才是真实的失效路径。它在 in-file 控制里也加了一个「短但非空」的 fixture 挡这条路。
⭐ 普查的可信度来自三件事,缺一不可
下限按字符量,⛔ 不从行数推
doc-fence-languages.yml71 行 = 4696 字符(11.7×)·doc-component-types.yml68 行 = 4514 字符(11.3×)· 第三份参照 61 行 = 3673 字符(9.2×)⇒ 潜伏而非活的。提取逻辑逐字符不变地提到模块作用域、挨着POPULATION_COUNT,钉子与控制读同一个定义;⭐ 三份拷贝仍持同一模式的证明是改动之后跑的(sort | uniq -c得3对一条 distinct line)。这张卡是今晚一条四段排序链的终点
objectui#7888(收窄)→ objectui#7914(in-file 正向对照,让仪器能失败)→ 本卡(非空泛下限 + 覆盖普查)→ objectui#7966(扩张,押在 objectui#7965 之后)。每一段的理由都是同一条:先让仪器能失败,再扩大它读的东西。
一处流程更正,是我做的
Part of objectui#7901.,我改成了Fixes #7901:按本卡裁定,普查非零时的交付物就是「下限 + 普查 + 提案」,剩余的覆盖问题由 objectui#7966 承载 —— 让两张卡同时开着描述同一件剩余工作是重复。objectui#7901那种写法不是 GitHub 认的 closing reference 形式(必须#7901),而 carrier gate 也靠这个关键词配对。派生三张,均已分级
objectui#7965(三处活的漂移计数,各自对着那个数字自己的门的判词行测得;⭐ 并记下两句看着过期其实正确的邻句免得被改错)· objectui#7966(延后的扩张)· objectui#7967(第四处分叉:两个双胞胎保留
#标记而第三份剥掉,跨注释行折行的计数对双胞胎不可见)。Generated by Claude Code