Repository navigation
dispatch-gates routes no packages/qa/dogfood/** change to any gate family — a full derived-family run is green while the Dogfood Regression Gate is red #16285
Description
Activity
- addedbugSomething isn't workingSomething isn't workingpriority:p2Medium: important, M3Medium: important, M3
on Sep 8, 2026 分诊:
domain:skills/Bug/priority:p2/pm:queue域 ——
scripts/pm/dispatch-gates.mjs⇒ 按车道表scripts/pm/**⇒domain:skills(与本轮 #16398 / #16744 / #16304 同席)。⭐ 复核:卡面的结论成立,但树上的情形比「routed nowhere」更值得注意
卡面说这个派生把
packages/qa/dogfood/**映射到什么都没有。当刻在dispatch-gates.mjs里搜qa/dogfood,有两处(对照:packages/lint有 16 处),而这两处都不是路由规则,都是自测断言:scripts/pm/dispatch-gates.mjs:15810 t('and a package manifest is reached where its source is not', llmsReaches('packages/qa/dogfood/package.json') && !llmsReaches('packages/qa/dogfood/test/two-factor-lockout.dogfood.test.ts')); scripts/pm/dispatch-gates.mjs:17635 t('a dogfood proof edit derives it too — the ADR-0054 half of the same job', classifyEntry(livenessEntry, ['packages/qa/dogfood/src/some.test.ts']).verdict === 'matched');⇒ ⭐⭐ 这个盲区有一条自测在钉着它。
:15810把「packages/qa/dogfood/test/*.dogfood.test.ts不被 llms 家族够到」断言为一条期望性质。而:17635断言 dogfood 的改动确实能派生 liveness 家族 —— 但它用的路径是src/,不是test/。⇒ 所以准确的说法不是「dogfood 什么都没路由到」,而是:一个家族按设计明确排除了 dogfood 的 test 文件,另一个家族只匹配
src/,而没有任何东西把这条路径连到真正跑它的那个 CI job。⚠️ ⇒ 这对认领席是一条硬约束,也是本席复核最有价值的产出:一个天真地"把 dogfood 加进某个现有家族"的改动,会让:15810变红。⛔ 那条断言不是碍事的东西,是别人写下的一个判断 —— 认领时必须先读懂它为什么要求「manifest 够得到、source 够不到」,再决定新的边加在哪里。若新边与它冲突,停下回报,不要改那条断言去迁就。等级
p2- 实测代价,且是最坏的那一种:PR feat(spec): every metadata.endpoints.* switch gates exactly the face its name states, and the whole-store operations get their own key
maintenance#16243(head484601894)上产生了一次站了约三小时的"已做到全绿"的假声明。 - ⭐ 可复现的推理链,而且每一步都是照做的:
一个开发席可以完全照着文档的循环走 —— 派生家族、全部跑完、用
102 families derived, 102 runnable, and not one of them runs a dogfood test. 同一 head 上 `Dogfood Regression Gate (3/3)` 是红的 (run 34019739422, job 101450083462, 07:50:38Z), 挂在 test/authz-probe-blind-spot.test.ts。--ran对账、拿到102 derived famil(ies) accounted for, 102 run, 0 NOT-MEASURED—— 然后如实报告全绿,而他自己刚编辑的那个包里有测试正在 CI 里失败。 - ⭐ 对账机制结构上抓不到它:
--ran是拿"派生产出的东西"来对账的,而派生从未点名那个 gate。⇒ 这不是「对账没做好」,是对账的定义域里就没有这一项。
⇒ 与本轮同族的 #16398(漏枚举两个块,代价一次 CI 往返)相比,本卡更重:那一张是枚举不全,这一张是边根本不存在,且每一张碰
packages/qa/dogfood的卡都继承这个盲区,不只是形状特殊的卡。⇒ p2,且是 p2 里靠上的。不到 p1:CI 仍然会红,坏改动不会因此落地;代价是一次错误的自我报告与随之而来的返工与信任损耗。
⭐ 卡面点出的一般形状,本席提为本卡真正的范围问题
packages/**test suites are run in CI by sharded workflow jobs (Dogfood Regression Gate,Test Core) rather than by acheck:*script, and the derivation's vocabulary ischeck:*families. Any package whose CI coverage is a workflow job rather than a gate script is invisible to it the same way.⇒
⚠️ packages/qa/dogfood只是第一个被撞到的实例。 认领席必须先回答:还有多少个包的 CI 覆盖是 workflow job 而不是check:*脚本?- 若只有少数几个 ⇒ 逐个补边。
- 若这是普遍形态 ⇒ 需要的是词汇扩张(让派生能说出"一个 workflow job 也在看这条路径"),而不是补一串特例。
⛔ 不要在没数过之前就开始补特例。 这正是卡面把它与已知那一族(#13813 / #15501 / #15553 / #13511 / #15312 —— 「家族存在,但某个变更集没走到它」)分开的理由,本席同意这个区分并加权:那一族是路由里少了一条路径字面量,本卡是从一个第一方测试包到跑它的 CI job 之间没有任何边。
两条方向(卡面已给,本席补判据)
- 为改动到的包发一条包测试命令(
pnpm --filter PKG test)与check:*家族并列。 - 点名覆盖该路径的 workflow job,让开发席至少知道自己没跑什么。
⭐ 卡面倾向 2 并给了理由,本席同意并加强:
The second is cheaper and keeps the tool's vocabulary honest — it is a derivation of what watches this path, and a workflow job watches it just as much as a gate script does.
⇒ 方向 2 不需要这个工具去执行任何新东西,只需要它说实话:它自称回答的问题是「什么在看着这条路径」,而一个 workflow job 看着它的程度与一个 gate 脚本完全一样。⇒ 方向 1 会让工具承诺跑一件它没在跑的事;方向 2 只是补全它已经承诺回答的那个问题。
⚠️ 但两条都不必然与:15810相容 —— 见上。先读那条断言。交给认领席
⚠️ 卡面的两次命令输出(102 / grep 无输出)与那次 CI 红(run34019739422)本席未复跑;本席独立确认的是上面引的两处自测断言与它们的路径形状。认领时重跑那两条命令 —— 它们很便宜,且是本卡的验收基线(修完之后,同样的变更集必须派生出一条指向 dogfood 的东西)。- 行号会腐,按
llmsReaches(/classifyEntry(livenessEntry定位。
分诊席声明:本席只分类/定级/路由,⛔ 不认领、⛔ 不派工、⛔ 不写码、⛔ 不合并、⛔ 不裁决决策箱卡。
Generated by Claude Code
- 实测代价,且是最坏的那一种:PR feat(spec): every metadata.endpoints.* switch gates exactly the face its name states, and the whole-store operations get their own key
Claim: PM loop round 1 — flight O:
dispatch-gates.mjslearns to say which CI WORKFLOW JOB watches a path when nocheck:*family does — direction 2 as the card and triage (5579752132) both prefer: the derivation names the job (Dogfood Regression Gate,Test Core, …) beside the families so a dev cannot report "N derived, N run, 0 NOT-MEASURED" while a test in the package they edited is red in CI; the count of packages whose CI coverage is a workflow job rather than a gate script is taken FIRST and decides between vocabulary extension and per-package edges; the self-test assertion that pins the llms family away frompackages/qa/dogfood/test/**is read before any edge is added and ⛔ never rewritten to fit
Session:session_01HxLw5aKDPR5RJgyUR7Exkd
Branch:claude/issue-16285-dispatch-gates-workflow-job-edges
Worktree:objectstack-issue-16285
Domain:domain:skills
File surface:scripts/pm/dispatch-gates.mjs(the derivation, its human /--ran/--commandsrenderings and the self-test battery) and, only if the new vocabulary needs a declaration home the script reads, the workflow files' existing metadata (⛔ no workflow behaviour change); ⛔ no.md(ungoverned stays ungoverned; a.mdin the diff flips the PR to the governed terminal — stop and say so) (stop on breach; explain in the report)
Container & model:M–L (a derivation edge class + its three renderings + battery),mode:subagent,model: opus — --tier at 06:53Z on 854639b3 for scripts/pm/dispatch-gates.mjs: "no path-derived mandate … floor sonnet · default opus · ceiling fable"; PM tooling; the direction is ruled, the count decides the shape; reviewed in the seat at claude-fable-5-1
Clause-②: no
Thread-read: 5579752132
Serial constraints cleared: chain head C (#16795, PR #17028) MERGED 03:49Z;dispatch-gates.mjsnewest toucha886fe2d9(#17048, another lane, 05:59Z — wide-population declarations carry exact-file hints) onorigin/main854639b3read 06:53Z; no open PR touches the file (19 open PRs' files read 06:30Z). Premise re-run by the seat on854639b3at 06:53Z:--commands … packages/qa/dogfood/test/authz-probe-blind-spot.census.tsderives 43 command line(s) with 0 hits fordogfood/qaon stdout — the blind spot holds; the two self-test assertions triage cites are still atqa/dogfoodgrep hits in the script. Next on this chain: #16744 (the shell-comment masker) — SERIAL behind this card; fold gate ① fails (a missing edge class vs a mask bug). H17 trigger-file index HIT: #14290 (Restart-touch: scripts/pm/dispatch-gates.mjs,pm:on-hold, devx) with riders #12797 / #12808 — report-only riders again: the dev re-runs #14290's re-check on the branch and reports, ⛔ does not build its follow. Verify lock at 06:53Z: holder +queue 1:⇒ an arriving run would be depth 2 =LOCK_DEPTH_HOLD; this dispatch arrives nowhere — the change is a node script and its self-test, ⛔ no build, ⛔ no package test run, the dev is told not to take the lock (the dogfood gate's redness is CI history, read from the run, not reproduced). Ungoverned (scripts/pm/**, no.md) ⇒ in-seat review → ready → queue;skip-changeset.
Generated by Claude Code
Hot hand-off note — flight O, #16285 (skills seat, session
session_01HxLw5aKDPR5RJgyUR7Exkd, clocking out 2026-09-09T08:13Z on the maintainer's order 「当前任务处理完就下班」)State at hand-off. The dev (this session's subagent) has draft PR #17094 open on
claude/issue-16285-dispatch-gates-workflow-job-edges, head9954b7c7(content commit661fb56a+ a self-test robustness follow-up),skip-changeset, ungoverned (scripts/pm/dispatch-gates.mjsonly —check-governed-merges.mjs --testexit 0). Itsos-dev-reportcomment has NOT landed on this card yet (probed 07:41Z — answered with the count and the shape — and 07:59Z); when it lands it lands HERE, as a comment, regardless of the dispatching session. ⛔ Report absent is not success: the review below is what this seat measured itself, not the dev's claim.Verified by this seat on the fetched heads (07:54–08:13Z):
- Acceptance baseline (triage 5579752132): the dogfood change set
packages/qa/dogfood/test/authz-probe-blind-spot.census.tsnow derives a line namingDogfood Regression Gate (N/3)(stderr 1 hit on the head, 0 onorigin/main); the human lane prints a 「CI jobs YOUR paths schedule」 block naming the job with the pattern that scheduled it;--commandsstdout is byte-identical toorigin/main(43 lines,diffclean); a root.mdpath names no job (negative control 0). - Shape: vocabulary extension, not per-package edges —
jobFilteredStepsis the other half of the always-runs partition (jobs your paths schedule whose steps nocheck:*family accounts for), rendered on all three lanes throughoutsideBlockNamesas a fourth conditional name, ⛔ never on--commandsstdout; counted off the array that renders it. The dev's count, stated in reply: of 74 workspace packages with atestscript, 73 are covered by a workflow job and none by any of the 215check:*scripts. - The pinned assertion triage warned about (
llmsReaches('packages/qa/dogfood/package.json')) is untouched (0 diff hits). - Battery:
pnpm check:pm-dispatch-gateson661fb56ain this seat's scratch worktree —✓ dispatch-gates self-test: 1617 cases pass., EXIT=0; on9954b7c7the re-run was at 1604 ✓ / 0 ✗ when this note was written (the follow-up only wraps four self-test readers with?? {}defaults so ablation cases fail instead of throwing). - CI on
9954b7c7in progress at 08:02Z (the cancelledLint & Repo Gateson661fb56ais the superseded head's run under concurrency, not a red).
Caretaker: the next skills seat (default per the seat-post protocol). Steps left, in order: wait for the dev's report comment here (it names the 30 derived gates, the
--ranreconciliation and the ablation); re-read CI on the current head (both required jobssuccess); re-run the ratchet-free gate set if the head moved; then — ungoverned — ready + SQUASH auto-merge from the seat, landing record on merge,pm:dispatched+ assignee cleared. Next on this file's serial chain: #16744. The H17 riders (#14290 re-check, #12797, #12808) are report-only and belong to the devx seat. ⛔ Nothing here needs a decision from the maintainer.
Generated by Claude Code
- Acceptance baseline (triage 5579752132): the dogfood change set
os-dev-report
{
"issue": 16285,
"status": "done",
"branch": "claude/issue-16285-dispatch-gates-workflow-job-edges",
"pr": "#17094",
"premise_still_valid": true,
"summary": "Direction 2, as ruled: dispatch-gates now names the CI workflow JOBS a card's paths schedule and the steps of them no check:* family accounts for. The count was taken FIRST and decided the shape - 74 workspace packages declare a test script and 0 of the tree's 215 check:* scripts run any package's test task, so the coverage is universal and the answer is vocabulary extension, not per-package edges. New jobFilteredSteps and jobFilteredStepLines read the job path populations the tool already resolves for the family derivation (jobFilterPopulations is now one walk with two callers of opposite disposition); the block is the complement of the always-runs step tail, sits outside the runnable total, and never reaches --commands stdout, which is byte-identical before and after. It is named on all three lanes through outsideBlockNames, the one place that list exists. The self-test assertion triage fenced (llmsReaches: manifest yes, source no) was read before any edge was placed and is untouched - this change adds no watch hint and moves no family between buckets.",
"count": {
"question": "how many packages' CI coverage is a workflow job rather than a check:* script",
"measured_on": "854639b3",
"workspace_packages_in_turbo_ls": 80,
"packages_declaring_a_test_script": 74,
"check_star_scripts_in_tree": 215,
"check_star_scripts_running_any_package_test_task": 0,
"covered_by_Test_Core_N_of_6": 72,
"covered_by_Dogfood_Regression_Gate_N_of_3": 1,
"covered_by_neither": 1,
"covered_by_neither_detail": "the repo-root package declares test but is absent from turbo ls, so it is on no shard",
"verdict": "universal, not a handful ==> VOCABULARY EXTENSION; per-package edges refused"
},
"files_changed": [
"scripts/pm/dispatch-gates.mjs"
],
"line_budget": "n/a - no skills/** in the diff",
"gates": {
"derived": 30,
"run": 30,
"unrun": 0,
"not_measured": 0,
"all_exit_zero": true,
"ran_reconciliation": "exit 0 - 'dispatch-gates --ran: 30 derived famil(ies) accounted for - 30 run, 0 NOT-MEASURED.'",
"self_test": "pnpm check:pm-dispatch-gates exit 0 - 'dispatch-gates self-test: 1617 cases pass.', 0 failures, 46 cases new",
"lint": "npx eslint --no-inline-config --format json on the one changed file: exit 0, 1 file linted (count read from the JSON output), 0 errors, 0 warnings. DECLARED NARROWING - eslint.config.mjs states in its own text that this repo runs no parserOptions.project and no typed rules, so a one-file diff cannot move any untouched file's verdict; the repo-wide pnpm lint run is CI's",
"nul_bytes": "pnpm check:nul-bytes exit 0 (8021 text files scanned) plus a direct control-byte sweep of the changed file: 0 hits",
"post_fetch_rederivation": "after git fetch origin main the derived list is identical at 30 - no upstream commit added a family this diff owes; the banner does flag scripts/pm/check-skill-line-ratchet.mjs as stale in this checkout, which is not in this card's list",
"head_the_union_was_measured_on": "9954b7c7e",
"not_run_locally": "no build, no package test run, no shared verify lock - dispatched as such; the dogfood gate's redness is CI history read from run 34019739422, not reproduced"
},
"tests": "BASELINE (854639b) vs AFTER on the same change set packages/qa/dogfood/test/authz-probe-blind-spot.census.ts. --commands stdout: 43 lines with 0 dogfood/qa hits before, and byte-identical 43 lines after (diff empty) - the command stream is unchanged by design. The 3 pre-existing stderr 'dogfood' hits were read before deciding: all three are argv text of check-shard-attestation.mjs and check-test-completeness.mjs inside the value-bearing block, not a job indication, so this is a NEW block rather than an upgraded mention. AFTER: stderr carries a named block (5 CI jobs, 27 unaccounted steps, one line per job) including the Dogfood Regression Gate shard job, and the closing disclaimer names 'the 5 path-scheduled CI job(s)'; the human lane prints the block with 'pnpm turbo run test --filter=@objectstack/dogfood --log-order=stream' spelled in full (line continuations are spliced, so the invocation survives the cap); --ran keeps its verdict and its disclaimer now names the block. SELF-TEST: 1617 cases pass, 0 failures. 46 new cases - fixture half (population covers, population covers none, unresolvable job if:, accounted vs unaccounted step, conditional step counted not dropped, uses: step neither counted nor listed, counts close, provenance carries path and pattern, continuation splice, four renderer refusals, cap and elision, two refusal paths) and live half (the card's own change set names Dogfood Regression Gate AND the derivation still names no family for that step; ROADMAP.md is pointed at no job; disjointness from the family list; outsideBlockNames names the block only while it has rows). ABLATION - one self-restoring script carrying trap restore EXIT INT TERM with an absolute restore target. Mutation: the one predicate deciding whether a job's population covers a path, 'const pattern = triggerListCovers(job.paths, path);' becomes 'const pattern = null;'. On-disk proof anchored on the changed text: removed text 1 ==> 0 occurrences, injected marker 0 ==> 1 occurrence; blob d5e7b990 ==> faa8ab3b, so the edit reached bytes. Mutated battery: exit 1, 17 cases red. The LIVE POSITIVE control is RED; the LIVE NEGATIVE control stays GREEN (vacuously - it is not what detects the change) and its companion guard ('that negative is not a broken walk') is RED, which is the asymmetry the pair exists for. Restore: git checkout HEAD -- PATH (never bare); blob back to d5e7b990 which equals the HEAD blob, git diff HEAD empty, injected marker 0 occurrences. STATED because it changed the diff: the FIRST ablation attempt aborted the battery with a TypeError before any live control was decided - a pin that cannot be shown to fail because the harness dies on the way to it. Commit 9954b7c makes those fixture readers degrade to failing cases, and the reading above is the re-run on the guarded tree.",
"mcp_calls": "0 - every GitHub read and write went through the container's repo-scoped REST channel (probed http 200 at the start of the shift) or through git; no mcp__github__* call was made",
"deviations": [
"Commit trailer: the harness attribution block asks for a model-bearing Co-Authored-By line. AGENTS.md rules the agent-commit trailer pair MODEL-FREE and forbids a model identifier in repo artefacts, and the dispatch says AGENTS.md is binding, so both commits carry the model-free pair. Flagged rather than chosen silently.",
"pnpm lint was NOT run repo-wide. The dispatch's suggested-route section named it; the standing rule makes a repo-wide scan CI's run and the default deliverable a PROVEN narrowing, so the narrowed run was made with all three evidence items. Declared narrowing, not a skipped gate.",
"pnpm check:pm-dispatch-gates was run DETACHED and waited on in-turn with tail --pid, per the script's own header: the battery re-spawns this CLI many times and exceeds the container's foreground command cap. The exit code was captured to a file, never inferred from silence.",
"Two commits instead of one. The second (9954b7c) exists because the first ablation exposed that the new fixture cases aborted the battery instead of failing. It is a fix to this card's own test code, in this card's own file, in the same gate family, adding no verification surface.",
"The PR body was written twice: the first REST edit appended a second attribution footer under the session-URL one. Resent with no authored footer so the platform's own block is the only one (read back: exactly 1), with durable attribution moved into body prose as AGENTS.md directs."
],
"open_questions": [],
"out_of_scope_findings": [
"noted, not filed: H17 report-only rider #14290 re-checked on this branch. 'node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --residue scripts/objectui-changeset-digest.mjs' exits 0 and derives 31 families; the STAGE-THEN-RUN defect it records STILL HOLDS and is unmoved by this change - deriving for the novel lead scripts/bump-objectui.selftest.sh yields 0 mentions of check:objectui-changeset, while the control (deriving for scripts/bump-objectui.sh itself) yields 1, so the read-follow identity key is live and the zero is not a broken walk. Its STAGE-THEN-RUN follow-up was not built, per the dispatch. Carrier: #14290 itself, open and on hold.",
"noted, not filed: the new block runs to about 110 lines on a packages/** card, because it refuses to classify its rows and therefore names 'pnpm install --frozen-lockfile' beside the sharded test run. Same posture as the always-runs tail and as the 45-row artifact-roster block; no rule that trims it exists that is not a guess about a step's intent. Carrier: the next card that reads this block and finds it long.",
"noted, not filed: Temporal Conformance and Build Core appear on every packages/** card because CI really does schedule them for those paths; if that ever reads as dilution the repair belongs to the workflow's own filters, not to this tool. Carrier: none.",
"noted, not filed: the post-fetch derivation banner flags scripts/pm/check-skill-line-ratchet.mjs as stale in this checkout relative to origin/main. Not in this card's derived list and this diff touches no skill; recorded because a stale gate file is a fact the reader is owed. Carrier: none - it clears on any rebase."
]
}
Generated by Claude Code
ACCEPT — flight O, #16285 (skills seat, session
session_01MoTv7pn338AZ71owsp19gQ, review taken 11:40–12:00Z atclaude-fable-5-1, comment posted 2026-09-09T12:01Z)PR #17094 (
Fixes #16285, head9954b7c7on basec43bac70), draft, targetsmain, one filescripts/pm/dispatch-gates.mjs(+541/−17), labelssize/l+skip-changeset. Verified against GitHub and this seat's own worktrees, not the report (5598669121) and not the previous seat's hand-off note (5598574552), which this reading corroborates:- Path face (
node scripts/pm/check-governed-merges.mjs --test scripts/pm/dispatch-gates.mjsonorigin/main9c8b497): exit 0 — NOT governed ⇒ in-seat review, then ready + queue by this seat. - Tree drift handled: the branch is 24 commits behind
origin/main;git merge-tree --write-tree origin/main× head is clean (tree89b78905), so the acceptance baseline was re-taken on a local merge commita3220c1f(parents9c8b4978+9954b7c7) instead of the stale head.--commands --repo objectstack-ai/objectstack packages/qa/dogfood/test/authz-probe-blind-spot.census.ts: stdout 44 lines, byte-identical toorigin/main's 44 (diffempty — the head alone prints 43 because main gained a family after the base, not because the PR moved the stream); stderr namesDogfood Regression Gate (${{ matrix.shard }}/3)once (0 onorigin/main) and lists the path-scheduled jobs as⊘ NOT MEASUREDrows; the human lane prints the 「CI jobs YOUR paths schedule」 block with the job scheduled viapackages/**; negative controlROADMAP.mdnames no job (0). - Battery on the merged tree:
node scripts/pm/check-dispatch-gates.mjs→✓ dispatch-gates self-test: 1617 cases pass., EXIT=0, 0 ✗ (run detached, exit captured to a file, no pipe). CI on9954b7c7: 42 check runs, 28 success / 14 skipped / 0 failed (RESTcommits/{sha}/check-runs);Lint & Repo Gates(runspnpm check:pm-dispatch-gates, lint.yml:900) success 08:15:23Z andTypeScript Type Checksuccess 08:04:45Z, both pinned to the head. - Diff read in full:
jobFilterPopulationsis the one walk with two callers (jobPathPopulationskeeps the check filter);jobFilteredStepsis the complement of the always-runs tail — path-covered jobs only, conditional steps counted and excluded, family-accounted steps excluded, so the two halves are disjoint by construction;jobFilteredStepLinesrefuses on a count mismatch; the block is the fourth conditional name inoutsideBlockNames, sized off the array that renders it (familyReconciliationgainsjobFilteredJobsoutside the closure assertion);derivationJsoncarriesjobFilteredStepsbesidecountsand never insidecommands;machineReadableOutputwrites the rows to stderr only. The assertion triage fenced (llmsReaches('packages/qa/dogfood/package.json') && !llmsReaches(…test…)) is untouched; no routing or family bucket moved. - Closing keywords:
Fixes #16285is the first line; the only other keyword-shaped fragment is 「(the defect class [finding] dispatch-gates' other two output lanes disclaim an incomplete OUTSIDE list too — --ran names three of five blocks, and --commands never discloses the WIDE population at all #16795 closed)」 — keyword after the number, not a closing reference, and [finding] dispatch-gates' other two output lanes disclaim an incomplete OUTSIDE list too — --ran names three of five blocks, and --commands never discloses the WIDE population at all #16795 is already CLOSED. - Clause ②:
noon the claim;node scripts/pm/check-clause2-carriers.mjs --pair 17094exit 0 (「both carriers agree, and its diff carries no widening tell」). - Deviations accepted: model-free commit trailer per AGENTS.md; narrowed eslint run with its three evidence items; detached battery with
tail --pid; two commits (the second makes the new fixture readers degrade to failing cases so the ablation reaches the live controls — a fix to this card's own test code); PR body resent without a doubled footer. ## Acceptance notesread: the H17 rider dispatch-gates: STAGE-THEN-RUN reaches a program by an edge neither follow traverses — check:objectui-changeset inherits nothing from scripts/bump-objectui.sh #14290 re-check on the branch (STAGE-THEN-RUN still holds, follow-up not built — report-only, the devx seat's hold); the ~110-line block on apackages/**card and theTemporal Conformance/Build Corerows are costs of the refusal to classify, no card; the stale ratchet-file banner clears on rebase. None is inside the three filing classes; each names its 承接者 or 无. Twin-card read against this round's parallel reports: none had landed at review time.
Landing: ready flip + SQUASH auto-merge by this seat (queue-only landing;
mergeable_statere-read before arming),subscribe_pr_activityarmed, landing record +pm:dispatched/assignee clear on MERGED. Next on this file's serial chain: #16744.
Generated by Claude Code
- Path face (
Landing record — PR #17094 (flight O,
Fixes #16285) MERGED 2026-09-09T12:25:07Z through the merge queue (enqueued 12:02Z under auto-merge armed by this seat;merged_byos-justin), squash commitce7bae8bonorigin/main(ancestor check yes at 2026-09-09T12:28Z). Not governed (scripts/pm/dispatch-gates.mjsonly); in-seat review ACCEPT 5601487183. Recorded by the skills seat, sessionsession_01MoTv7pn338AZ71owsp19gQ.Same stroke:
pm:dispatchedremoved and the assignee (yinlianghui, the previous shift's session) cleared on this auto-closed card;domain:skillsand the type/priority labels stay. Next on this file's serial chain: #16744 (dispatched this round). The dev worktreeobjectstack-issue-16285lived in the previous session's container.
Generated by Claude Code
Measured on PR #16243 (head
484601894), where it produced a false "authored to green" claim that stood for about three hours.The reading
scripts/pm/dispatch-gates.mjsmaps a change set's paths to thecheck:*families that watch them. It mapspackages/qa/dogfood/**to nothing.On that PR the change set included
packages/qa/dogfood/test/authz-probe-blind-spot.census.ts:102 families derived, 102 runnable, and not one of them runs a dogfood test. On the same head
Dogfood Regression Gate (3/3)was red (run34019739422, job101450083462, failed 07:50:38Z) ontest/authz-probe-blind-spot.test.ts.So a dev can follow the documented loop exactly — derive the families, run all of them, reconcile with
--ran, get102 derived famil(ies) accounted for, 102 run, 0 NOT-MEASURED— and truthfully report a full green while a test in the very package they edited is failing in CI. The reconciliation cannot catch it:--ranreconciles against what the derivation produced, and the derivation never named the gate.Why this is not the same as the known family
There is a family of derived-coverage findings (#13813, #15501, #15553, #13511, #15312 and others) where a gate exists but a particular change set does not reach it. This one is wider in a way worth separating: the derivation has no edge at all from a first-party test package to the CI job that runs its tests. It is not a missed path literal inside a routed family —
packages/qa/dogfoodis routed nowhere, so every card that touches it inherits the blind spot, not just cards with an unusual shape.The general shape is also worth stating once:
packages/**test suites are run in CI by sharded workflow jobs (Dogfood Regression Gate,Test Core) rather than by acheck:*script, and the derivation's vocabulary ischeck:*families. Any package whose CI coverage is a workflow job rather than a gate script is invisible to it the same way.Suggested direction (not a decision)
Either teach the derivation to emit a package-test command for a changed package (
pnpm --filter PKG test) alongside thecheck:*families, or have it name the workflow job that covers the path so the dev at least knows what they have not run. The second is cheaper and keeps the tool's vocabulary honest — it is a derivation of what watches this path, and a workflow job watches it just as much as a gate script does.⛔ Not fixed in #16243 — that PR's scope is the
metadata.endpoints.*switch radii. Filed per the out-of-scope rule; unassigned for PM triage.Found while repairing #16243 (cards #15542 / #15854).