⏱️ 本卡所有读数取自同一动作:2026-09-17T23:34Z,树为 origin/main = c993b7c820。承接 #18565 / PR #18833。
一句话
packages/lint/src/validate-list-view-field-refs.test.ts 的 docblock 声明这张表在两个方向上都拦得住,但第二个方向它拦不住 —— 那个断言是 toBeGreaterThanOrEqual(地板),而地板对「规则加了位置、表没加行」永远为真。⭐ 这正是 #18565 那个洞得以存在的方向。
逐字读数
packages/spec 无关;文件是 packages/lint/src/validate-list-view-field-refs.test.ts
:193-197(docblock,逐字):
/**
* Every remaining position, with the severity tier it earns. The table is the
* readable half of the rule's own POSITIONS table: a position dropped from the
* rule fails here, and a position added to the rule without a row here leaves
* the count assertion below short.
*/
:281-284(它所指的那个断言,逐字):
// A floor, so a position quietly dropped from the rule's table cannot pass
// by simply never being asserted.
it('covers every position the rule walks', () => {
expect(cases.length).toBeGreaterThanOrEqual(46);
两个方向,分开判
- 方向一「a position dropped from the rule fails here」—— 成立。 规则里少走一个位置,该位置对应的 case 就不再产出 finding,逐 case 的断言当场红。⇒ 这一半是真的,而且靠的是 case 断言,⛔ 不是那个计数。
- 方向二「a position added to the rule without a row here leaves the count assertion below short」—— ⛔ 不成立。
cases.length 数的是测试表自己的行数。规则新增一个位置,cases.length 纹丝不动,≥ 46 照样为真 ⇒ 什么都不红。⚠️ docblock 描述的是一个 toEqual 的行为,而代码写的是 toBeGreaterThanOrEqual。
⚠️ 注意 :281 那条行内注释本身是准确的 —— 它说的是地板防「表被悄悄删行」,那确实是地板能做到的。⇒ 缺陷在 :193-197 那段 docblock 多声明了一个方向,⛔ 不在行内注释。
为什么这不是措辞问题
⭐ #18565 就是这个方向的活证据:KanbanConfigSchema 从 #16894 起声明了 titleField,而 POSITIONS 里没有对应行 —— 这份测试一声没吭,因为它拦不住这个方向,而 docblock 让读者以为它拦得住。⇒ 一个声明了自己没有的保护的 pin,比没有 pin 更坏:它让下一个读者不再去找别的保护。
⚠️ 公道地记一笔:#18833 已把地板从 46 抬到 47。那是对的,但它不改变本卡 —— 抬地板只是让表不缩水,方向二依旧敞着。
建议(⛔ 非裁定)
⭐ 本席倾向 A,理由是 #18565 的洞恰好从这个方向进来,而 B 只是不再撒谎、并不设防。⛔ 由维护者/triage 定。
查重(MCP search_issues,含 closed)
以 计数断言/地板/toBeGreaterThanOrEqual/docblock 声称的保护 等词检索:两条命中 #15231(check-wildcard-fallthrough 自测里一个转抄的 17 cases 与断言的 18 不符)与 #15324(measure-self-test-floor 的探针把非零退出码单独判成 HELD)—— 均已 closed,且都是别的门禁、别的机制。⇒ 无孪生。
出处
domain:spec seat 2(座位贴 #18549)复核 PR #18833 / 卡 #18565 时,dev 在 out_of_scope_findings 里交回(class b)。⭐ 本席核对过它引的那句话确实存在(:196-197,逐字),并把 docblock 的两个方向拆开各自判过,⛔ 不是转述报告。
Generated by Claude Code
⏱️ 本卡所有读数取自同一动作:2026-09-17T23:34Z,树为
origin/main=c993b7c820。承接 #18565 / PR #18833。一句话
packages/lint/src/validate-list-view-field-refs.test.ts的 docblock 声明这张表在两个方向上都拦得住,但第二个方向它拦不住 —— 那个断言是toBeGreaterThanOrEqual(地板),而地板对「规则加了位置、表没加行」永远为真。⭐ 这正是 #18565 那个洞得以存在的方向。逐字读数
两个方向,分开判
cases.length数的是测试表自己的行数。规则新增一个位置,cases.length纹丝不动,≥ 46照样为真 ⇒ 什么都不红。toEqual的行为,而代码写的是toBeGreaterThanOrEqual。:281那条行内注释本身是准确的 —— 它说的是地板防「表被悄悄删行」,那确实是地板能做到的。⇒ 缺陷在 :193-197 那段 docblock 多声明了一个方向,⛔ 不在行内注释。为什么这不是措辞问题
⭐ #18565 就是这个方向的活证据:
KanbanConfigSchema从 #16894 起声明了titleField,而POSITIONS里没有对应行 —— 这份测试一声没吭,因为它拦不住这个方向,而 docblock 让读者以为它拦得住。⇒ 一个声明了自己没有的保护的 pin,比没有 pin 更坏:它让下一个读者不再去找别的保护。建议(⛔ 非裁定)
POSITIONS推导(把表里实际被走的位置数算出来,与cases.length判相等)。⭐ 这样 docblock 的两个方向就都成立,而且规则以后每加一个位置都会逼着这张表跟上 —— 正是 [finding]POSITIONS.kanbanis the one item-titled face with notitleFieldrow — from #16894 the key is authorable and a misspelt one is walked by nothing, while the identical typo on calendar/timeline errors #18565 想要的那个保护。POSITIONS.kanbanis the one item-titled face with notitleFieldrow — from #16894 the key is authorable and a misspelt one is walked by nothing, while the identical typo on calendar/timeline errors #18565 那类洞下次照样能进来,只是不再有人被 docblock 误导。⭐ 本席倾向 A,理由是 #18565 的洞恰好从这个方向进来,而 B 只是不再撒谎、并不设防。⛔ 由维护者/triage 定。
查重(MCP
search_issues,含 closed)以 计数断言/地板/
toBeGreaterThanOrEqual/docblock 声称的保护 等词检索:两条命中 #15231(check-wildcard-fallthrough 自测里一个转抄的17 cases与断言的 18 不符)与 #15324(measure-self-test-floor 的探针把非零退出码单独判成 HELD)—— 均已 closed,且都是别的门禁、别的机制。⇒ 无孪生。出处
domain:specseat 2(座位贴 #18549)复核 PR #18833 / 卡 #18565 时,dev 在out_of_scope_findings里交回(class b)。⭐ 本席核对过它引的那句话确实存在(:196-197,逐字),并把 docblock 的两个方向拆开各自判过,⛔ 不是转述报告。Generated by Claude Code