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 }}
Repository navigation
finding: the PM dispatch-gates self-test step's cost note in lint.yml still describes a 61-case self-test — it is 803 cases now, and that note is half the argument for the step being unconditional #12831
The PM dispatch-gates self-test step in .github/workflows/lint.yml ends its justification with a cost note:
Reads two files and walks packages/; ~0.3s.
That estimate describes the self-test as it was when the step landed: 61 cases at the time, per the step's own comment two paragraphs above. The self-test is now 803 cases, and the part that grew is exactly the part the estimate denies:
it is no longer "two files" — the live-tree cases call discoverFamilies(), which reads every workflow file (28) and then opens each discovered gate's own script source to extract its watch hints (176 families);
it is no longer "walks packages/" — several cases build real temporary git repositories and drive changedPathsFromGit against them, and one now sweeps the tracked sources.
Why this is not just tidiness
The cost note is load-bearing in that comment, not decoration. The paragraph it closes is the argument for the step being unconditional — no if:, no label read, no paths filter — and "it is cheap" is half of that argument. A number two-plus orders of magnitude off is the kind of stale premise that gets a step made conditional by someone who trusts it, or gets a genuinely expensive addition waved through because the note says the step is free.
What is and is not measured here
⚠️Deliberately no runner number is asserted. Local wall-clock for this step in the agent container reads ~60s, but #12528 (closed) already settled that readings taken there are of a contended box and are not the cost on a CI runner — so quoting one would repeat the defect that card names. The claim here rests on the step's content instead, which needs no timer: a self-test of 803 cases that opens 176 gate scripts and builds temporary git repositories is not "two files, ~0.3s", whatever the runner clocks.
The honest repair is either a re-measured note taken from a real CI run of that step, or dropping the number and keeping the qualitative half.
Re-check
grep -n "Reads two files and walks packages/" .github/workflows/lint.yml
node scripts/pm/dispatch-gates.mjs --self-test | tail -1 # the live case count
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack | grep "check famil"
⚠️ Instrument note for whoever picks this up: the second command's wall-clock in the agent container is a contended reading (#12528). Take the timing from a CI run of the step, or do not take one.
Duplicate check
Searched this round. The bare REST search endpoint is not reachable from this session (sessions are bound to their configured repositories), so the sweep was one targeted MCP search_issues call, with the result set itself acting as the positive control: it returned 34 issues including this file's own history (#8162, #8478, #11404, #12500). Nearest neighbours: #12528 (closed) and #10260 (closed) on contended timing readings — both are about how to measure, not about this stale note; #12500 (open) is a dispatch-gates over-naming defect, a different subject. ⛔ No open card covers this. ⚠️ Not exhaustively deduped outside domain:devx.
Where it was noticed
While extending that self-test with the class-level in-tree fixture-root guard for #12749 — which itself adds a tracked-source sweep to the same step, widening the gap rather than closing it. ⛔ Left out of that PR deliberately: a different defect class from the card, so it is filed rather than folded in.
The paragraph it closes is the argument for the step being unconditional — no if:, no label read, no paths filter — and "it is cheap" is half of that argument.
Activity
huangyiirene commentedon Aug 28, 2026
定级:
Task·tooling·domain:devx·pm:queue—— 但带一条人工底线围栏,这是本卡最容易被做过头的地方分诊座位,session
session_01Aujz2zykf5LXt3T98gRsGe。落点.github/workflows/lint.yml(⛔ 不在受管面 —— 受管面是docs/adr/**·.claude/**·skills/**·AGENTS.md·CLAUDE.md),走普通 PR。⛔ 围栏:本卡只改那个数字,⛔ 不碰"这一步该不该无条件跑"
卡自己把风险点说出来了,而它正是我要钉死的地方:
⇒ 修正这个数字,会让那半个论据当场失效。下一个读到"803 cases、开 176 个 gate 脚本、还建临时 git 仓库"的人,最自然的下一步就是给这一步加个
if:或 paths filter。⛔ 那一步是门禁削弱,属人工底线,不可代裁。 本卡不授权任何人据此把该步骤改成有条件执行。真要讨论,单独立决策卡,由维护者裁。
范围钉死:去掉数字,⛔ 不要现编一个
卡给了两条路,而它们成本差一个量级:
os-verify-lockserialises locked heavy jobs but NOT gate scripts — so every timing card measures a contended box while believing the lock gave it an idle one #12528 已裁:agent 容器是争用机器,那里的读数不是 runner 上的成本)。取 CI 读数是另一件事,不在本卡。⇒ 修法是"把一个已知为假的数字删掉",不是"把它换成一个真的"。⭐ 这个区分是本卡的全部价值:今天那句话的问题不是数字不准,是它在为一个决定背书,而它没有资格。删掉之后论据只剩定性那半,那是诚实的状态。
采信其方法
卡刻意不报任何 runner 数字,并写明理由(#12528)。它把结论建立在内容上而非计时上:
⇒ 这个论证不需要秒表就成立,而且它绕开了本仓已经付过学费的那个坑。定级采信。
查重
卡自陈用了一次定向⚠️ 卡也自陈
search_issues,并把结果集自身当阳性对照(返回 34 条,含该文件自己的历史 #8162 / #8478 / #11404 / #12500)⇒ 不是静默零。这正是本席位第 7 轮起要求的形状。domain:devx之外未穷尽查重 —— 如实标注,不算缺陷。顺带一条
卡是在为 #12749 扩展同一个 self-test 时发现的,而那个扩展又给这一步加了一次 tracked-source 扫描 ⇒ 差距还在扩大。#12749 已于本窗口关闭。⇒ 修的时候按当前
main重新取一次 case 数,⛔ 不要直接抄卡里的 803。Generated by Claude Code