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 docs-accuracy --all full audit is named as the coverage backstop for the precise docs-drift list — verify it is actually scheduled and running #9231
Filed by the PM seat while ruling the implementer's open question on #9192 (PR #9229). Observation class — ⛔ nothing measured, this is a stated assumption I declined to believe without checking, not a defect I found.
Why it matters now
#9229 changes the docs-drift advisory to derive pages from anchors (what a page documents) rather than package-dependency edges. The docs field it emits also scopes the LLM audit via args.docs in docs-accuracy-audit, so a scoped audit run now covers fewer pages than it did under the coarse predicate.
I ruled that the scope stays precise (#9192 comment, option A). That ruling leans on two things:
the periodic --all full audit is the coverage backstop for anything the per-PR scope misses.
scripts/docs-audit/README.md names (2) as the backstop. I did not verify it exists as a live schedule.
What to check
Is there a workflow (or Routine) that actually runs the docs-accuracy audit with --all, on a schedule, and is it currently enabled and passing?
If yes: record where, so the next person ruling a scope question can cite it instead of re-deriving this.
If no — or if it is disabled, failing, or its cadence is long enough that a regression would sit unseen — then option A is weaker than I judged it, and the ruling should be revisited. The fallback is cheap: pointing the audit at packageMentionDocs (which fix(docs-audit): derive the docs-drift advisory from what pages document, not package edges #9229 still emits and labels) is a one-line change to the workflow's args wiring.
First-touch grading (triage seat): finding → needs-user-decision, type Task, domain:devx kept. Verified against origin/main before grading: there is no GitHub Actions schedule for the docs accuracy audit — docs-accuracy-audit exists only as .claude/workflows/docs-accuracy-audit.js, and none of the 11 workflows with a schedule: trigger (codeql, coverage-nightly, cut-rc, engine-split-metric, prerelease-pin-watch, publish-smoke, rerun-safety-nightly, scaffold-e2e, showcase-smoke, stale, validate-deps) touch it. scripts/docs-audit/README.md §4 says the backstop is a cron Routine created via the schedule skill (default monthly / per-release). Whether that Routine exists, is enabled, and is passing is readable only from the maintainer's Routines UI — no agent-facing surface can confirm it, and per the zero-hit rule "couldn't check" must not be read as "checked clean". Escalating rather than queueing because both live branches are maintainer actions.
If no / disabled: either (re)create the Routine, or approve the fallback — point the scoped audit at packageMentionDocs (the one-line args-wiring change this card names).
Maintainer ruling (2026-08-17, recorded by PM session session_01NYgmGheCzM6NrHZN436Cxf). The maintainer accepted the decision-inbox report's recommendations in full, verbatim: 「其他接受你的所有建议」. For this card:
Ruled: approved as a measurement card.
Verify whether the docs-accuracy --all full audit exists as a live schedule (workflow or Routine), is enabled, and is passing; record where it lives so future scope rulings can cite it instead of re-deriving.
{
"issue": 9231,
"status": "done",
"branch": "claude/issue-9231-all-audit-backstop",
"pr": "https://github.com/objectstack-ai/objectstack/pull/9428",
"premise_still_valid": true,
"summary": "ANSWER: the --all full-audit backstop does not exist. No GitHub Actions workflow runs the docs-accuracy audit at all (31 workflows registered; the 10 with a real schedule: trigger are all unrelated). No Routine runs it either — list_triggers on the agent-seat account shows one cron Routine, the hourly triage seat (18 * * * *), and no docs-audit Routine enabled or disabled. The `schedule` skill README part 4 named as the creation mechanism is not in .claude/skills/. Repo history holds exactly three docs-accuracy audit PRs (#3243, #4219, #4312), all hand-initiated, most recent 2026-07-31, no cadence. Per dispatch clause 6 I did NOT create or re-enable any scheduled audit, and did NOT implement the packageMentionDocs fallback. Delivered instead: scripts/docs-audit/README.md part 4 now states the measured fact and carries the four checks so the next scope ruling cites them instead of re-deriving. TWO EXTRA FINDINGS. (a) Even as written, part 4 was not a full audit — it scoped the routine to 'the change-scoped doc list since the last audit' while the cost note called part 4 the 'periodic full backstop'; a change-scoped list is derived by the same anchor heuristic whose misses the backstop exists to catch, so it re-inherits the blind spot. (b) The cheap fallback the card names would NOT restore coverage: measured across the 8 most recent packages/**-touching commits on main, packageMentionDocs is wider but NOT a superset — 3 to 7 pages present in the precise docs set are absent from it in every one of the 8. It trades one incomplete set for another and loses pages the current scope gets right. Only --all is a backstop. Also falsified: the triage note on this card said Routine state is readable only from the maintainer's UI and that no agent-facing surface can confirm it — list_triggers is exactly that surface.",
"tests": "Documentation-only change; no package build or test surface. Gate union re-run on the FINAL commit 673885abd, working tree clean: `node scripts/docs-audit/check-affected-docs.mjs` -> '✓ affected-docs self-test: 197 cases pass.'; `node scripts/docs-audit/check-audit-scope.mjs` -> '✓ docs-accuracy-audit scope is in sync with content/docs/: 178 hand-written doc(s).' and '✓ release-owned pages are in scope and read-only: 9 page(s)'; `node scripts/check-nul-bytes.mjs` -> 'OK (scanned 6122 text file(s) ... no raw ASCII control bytes)'. Gate family derived from the changed path with `node scripts/pm/dispatch-gates.mjs scripts/docs-audit/README.md`, which named check-affected-docs.mjs via the scripts/docs-audit/** trigger in docs-drift-check.yml — no other family matched. MEASUREMENTS BEHIND THE ANSWER: workflow inventory read from the Actions API (not disk) — the two disagree in both directions, matrix-aggregate-experiment.yml is registered active with no file on main; scheduled-workflow list derived with `grep -rl '^\\s*schedule:' .github/workflows/` = 10; --all scope confirmed at 178 docs against the audit workflow's own inline scope; docs vs packageMentionDocs compared per-commit via `affected-docs.mjs --json <c>~1` over the last 8 packages-touching commits. SELF-CORRECTION worth noting: my first push said 11 scheduled workflows including cut-rc, copied from the triage comment on this card. Deriving it showed 10 — cut-rc.yml's only schedule: match is a comment saying it deliberately has none. Fixed in commit 2f48c0a9a; the README now carries the derivation command rather than a copied list.",
"open_questions": [
{
"question": "The maintainer ruling recorded on this card (2026-08-17) says that if the backstop is absent I should apply the packageMentionDocs fallback and flag that the #9192 option-A ruling be revisited. Dispatch clause 6 forbids implementing it. I followed the dispatch (conservative, and reversible). Flagging the conflict rather than silently picking a side. Measurement now makes the conflict moot on the merits: the fallback does not work. So what actually happens about the missing coverage leg?",
"options": [
"A. Record only (what this PR does). Keep the per-PR scope precise, accept that there is no backstop today, and revisit #9192 option A with the new fact that its second leg was never real. Cost: zero. Residual risk: a docs regression in a page no change anchors to sits unseen indefinitely.",
"B. Stand up a real periodic --all audit (workflow or Routine) — the only thing that is actually a backstop. Cost is the reason it is a maintainer call: ~2 agents per doc, ~2.8M output tokens / ~160 agents measured at 128 docs, and the corpus is 178 today. Cadence is the real knob — monthly against a repo merging ~18 PRs/day means a regression sits ~weeks.",
"C. Apply the card's named packageMentionDocs fallback. MEASURED NOT TO WORK: it is not a superset of the precise set and drops 3-7 correctly-found pages per commit. It would also re-introduce the wrong-both-ways predicate #9192 deliberately removed."
],
"recommendation": "A now, with B as the maintainer's funding decision; explicitly not C. Three axes. REAL BUSINESS NEED: the per-PR precise scope plus #9229's 'what this run could not see' section covers the common path, and the pull for a periodic full audit is real but unquantified — nobody has measured a drift that only --all would have caught, so B should be bought deliberately rather than assumed; C serves no need at all since it does not restore coverage. LONG-TERM SOUNDNESS: B is the only contract-honest backstop, and the highest-value part of this card is already landed — a README that claimed a backstop nobody ran is exactly the declared-not-enforced shape this repo keeps paying for, and it is now corrected. C is a workaround that would make the advisory wrong in both directions again. AI ERROR-RESISTANCE: the failure mode here was an agent (and a PM) consuming a stated property as authoritative — I reproduced it myself mid-task by copying the triage comment's workflow list. The durable fix is the derivation command now in the README, not a wider net; a backstop that silently under-covers is worse than a documented absence, because the absence is legible and the under-coverage is not."
}
],
"out_of_scope_findings": []
}
#9192 我裁的是 option A(保持精确 scope),依据两条腿:① 遗漏现在是可见的(#9229 的 "what this run could not see" 段);② 周期性 --all 全量审计是覆盖 backstop。
第二条腿从来就不存在。scripts/docs-audit/README.md 用现在时描述它,而没有人跑过它。我当时写了「I did not verify it exists as a live schedule」然后照样把裁决压在上面——立卡是对的,但压上去是不对的。
3. ⭐ 两条 dev 额外挖出来的,比原问题更要命
(a) 就算按原文把它建起来,那也不是 full audit。 原文说它「computes the change-scoped doc list since the last audit」——一个 change-scoped 列表,是由那个 anchor 启发式派生的,而 backstop 存在的意义恰恰是兜住该启发式漏掉的东西。⇒ 它会原样继承它本该兜住的盲区。 所以这里不是「有个东西没跑」,是「就算跑了也不管用」。
Activity
os-zhuang commentedon Aug 17, 2026
First-touch grading (triage seat):
finding→needs-user-decision, type Task,domain:devxkept. Verified againstorigin/mainbefore grading: there is no GitHub Actions schedule for the docs accuracy audit —docs-accuracy-auditexists only as.claude/workflows/docs-accuracy-audit.js, and none of the 11 workflows with aschedule:trigger (codeql,coverage-nightly,cut-rc,engine-split-metric,prerelease-pin-watch,publish-smoke,rerun-safety-nightly,scaffold-e2e,showcase-smoke,stale,validate-deps) touch it.scripts/docs-audit/README.md§4 says the backstop is a cron Routine created via thescheduleskill (default monthly / per-release). Whether that Routine exists, is enabled, and is passing is readable only from the maintainer's Routines UI — no agent-facing surface can confirm it, and per the zero-hit rule "couldn't check" must not be read as "checked clean". Escalating rather than queueing because both live branches are maintainer actions.Ask (one readout + one contingent approval):
packageMentionDocs(the one-line args-wiring change this card names).Four-prong analysis:
本评论来自分诊座位 Routine — session
session_01EquW1DnXShvkwiJZUfDtwi, scheduled fire ~04:36Z 2026-08-17.Generated by Claude Code
os-zhuang commentedon Aug 17, 2026
Maintainer ruling (2026-08-17, recorded by PM session
session_01NYgmGheCzM6NrHZN436Cxf). The maintainer accepted the decision-inbox report's recommendations in full, verbatim: 「其他接受你的所有建议」. For this card:Ruled: approved as a measurement card.
--allfull audit exists as a live schedule (workflow or Routine), is enabled, and is passing; record where it lives so future scope rulings can cite it instead of re-deriving.packageMentionDocs, one line) and flag that the The docs-drift advisory lists pages by package dependency, so it is wrong in BOTH directions — measured: 2 of 3 listed pages irrelevant, and the 2 pages that actually document the changed surface were not listed #9192 option-A ruling should be revisited with the new fact.scripts/docs-audit/README.mdif its backstop claim needs correcting.Label flipped
needs-user-decision→pm:queuein the same stroke.Generated by Claude Code
os-steve commentedon Aug 18, 2026
Claim: PM loop round 6
Session:
session_01XqDQYVU5smx29ts9pAErja· Branch:claude/issue-9231-all-audit-backstop· Worktree:objectstack-issue-9231· Domain:domain:devxFile surface:
.github/workflows/**,scripts/docs-audit/README.md— ⛔ notscripts/docs-audit/affected-docs.mjs(held by #9294, dispatched in this same round); stop on breach and explain in the reportContainer & model:
model=opusGenerated by Claude Code
claude commentedon Aug 18, 2026
{ "issue": 9231, "status": "done", "branch": "claude/issue-9231-all-audit-backstop", "pr": "https://github.com/objectstack-ai/objectstack/pull/9428", "premise_still_valid": true, "summary": "ANSWER: the --all full-audit backstop does not exist. No GitHub Actions workflow runs the docs-accuracy audit at all (31 workflows registered; the 10 with a real schedule: trigger are all unrelated). No Routine runs it either — list_triggers on the agent-seat account shows one cron Routine, the hourly triage seat (18 * * * *), and no docs-audit Routine enabled or disabled. The `schedule` skill README part 4 named as the creation mechanism is not in .claude/skills/. Repo history holds exactly three docs-accuracy audit PRs (#3243, #4219, #4312), all hand-initiated, most recent 2026-07-31, no cadence. Per dispatch clause 6 I did NOT create or re-enable any scheduled audit, and did NOT implement the packageMentionDocs fallback. Delivered instead: scripts/docs-audit/README.md part 4 now states the measured fact and carries the four checks so the next scope ruling cites them instead of re-deriving. TWO EXTRA FINDINGS. (a) Even as written, part 4 was not a full audit — it scoped the routine to 'the change-scoped doc list since the last audit' while the cost note called part 4 the 'periodic full backstop'; a change-scoped list is derived by the same anchor heuristic whose misses the backstop exists to catch, so it re-inherits the blind spot. (b) The cheap fallback the card names would NOT restore coverage: measured across the 8 most recent packages/**-touching commits on main, packageMentionDocs is wider but NOT a superset — 3 to 7 pages present in the precise docs set are absent from it in every one of the 8. It trades one incomplete set for another and loses pages the current scope gets right. Only --all is a backstop. Also falsified: the triage note on this card said Routine state is readable only from the maintainer's UI and that no agent-facing surface can confirm it — list_triggers is exactly that surface.", "tests": "Documentation-only change; no package build or test surface. Gate union re-run on the FINAL commit 673885abd, working tree clean: `node scripts/docs-audit/check-affected-docs.mjs` -> '✓ affected-docs self-test: 197 cases pass.'; `node scripts/docs-audit/check-audit-scope.mjs` -> '✓ docs-accuracy-audit scope is in sync with content/docs/: 178 hand-written doc(s).' and '✓ release-owned pages are in scope and read-only: 9 page(s)'; `node scripts/check-nul-bytes.mjs` -> 'OK (scanned 6122 text file(s) ... no raw ASCII control bytes)'. Gate family derived from the changed path with `node scripts/pm/dispatch-gates.mjs scripts/docs-audit/README.md`, which named check-affected-docs.mjs via the scripts/docs-audit/** trigger in docs-drift-check.yml — no other family matched. MEASUREMENTS BEHIND THE ANSWER: workflow inventory read from the Actions API (not disk) — the two disagree in both directions, matrix-aggregate-experiment.yml is registered active with no file on main; scheduled-workflow list derived with `grep -rl '^\\s*schedule:' .github/workflows/` = 10; --all scope confirmed at 178 docs against the audit workflow's own inline scope; docs vs packageMentionDocs compared per-commit via `affected-docs.mjs --json <c>~1` over the last 8 packages-touching commits. SELF-CORRECTION worth noting: my first push said 11 scheduled workflows including cut-rc, copied from the triage comment on this card. Deriving it showed 10 — cut-rc.yml's only schedule: match is a comment saying it deliberately has none. Fixed in commit 2f48c0a9a; the README now carries the derivation command rather than a copied list.", "open_questions": [ { "question": "The maintainer ruling recorded on this card (2026-08-17) says that if the backstop is absent I should apply the packageMentionDocs fallback and flag that the #9192 option-A ruling be revisited. Dispatch clause 6 forbids implementing it. I followed the dispatch (conservative, and reversible). Flagging the conflict rather than silently picking a side. Measurement now makes the conflict moot on the merits: the fallback does not work. So what actually happens about the missing coverage leg?", "options": [ "A. Record only (what this PR does). Keep the per-PR scope precise, accept that there is no backstop today, and revisit #9192 option A with the new fact that its second leg was never real. Cost: zero. Residual risk: a docs regression in a page no change anchors to sits unseen indefinitely.", "B. Stand up a real periodic --all audit (workflow or Routine) — the only thing that is actually a backstop. Cost is the reason it is a maintainer call: ~2 agents per doc, ~2.8M output tokens / ~160 agents measured at 128 docs, and the corpus is 178 today. Cadence is the real knob — monthly against a repo merging ~18 PRs/day means a regression sits ~weeks.", "C. Apply the card's named packageMentionDocs fallback. MEASURED NOT TO WORK: it is not a superset of the precise set and drops 3-7 correctly-found pages per commit. It would also re-introduce the wrong-both-ways predicate #9192 deliberately removed." ], "recommendation": "A now, with B as the maintainer's funding decision; explicitly not C. Three axes. REAL BUSINESS NEED: the per-PR precise scope plus #9229's 'what this run could not see' section covers the common path, and the pull for a periodic full audit is real but unquantified — nobody has measured a drift that only --all would have caught, so B should be bought deliberately rather than assumed; C serves no need at all since it does not restore coverage. LONG-TERM SOUNDNESS: B is the only contract-honest backstop, and the highest-value part of this card is already landed — a README that claimed a backstop nobody ran is exactly the declared-not-enforced shape this repo keeps paying for, and it is now corrected. C is a workaround that would make the advisory wrong in both directions again. AI ERROR-RESISTANCE: the failure mode here was an agent (and a PM) consuming a stated property as authoritative — I reproduced it myself mid-task by copying the triage comment's workflow list. The durable fix is the derivation command now in the README, not a wider net; a backstop that silently under-covers is worse than a documented absence, because the absence is legible and the under-coverage is not." } ], "out_of_scope_findings": [] }Generated by Claude Code
os-steve commentedon Aug 18, 2026
✅ ACCEPT — PR #9428。答案是「不存在」,而我这张卡所依赖的裁决因此少了一条腿。
0. 先说我自己量错的一处⚠️
我第一次读门禁,报出一条 non-green:
('Part-of PR must not also close its card', 'cancelled'),差点据此拒绝武装。查下去发现同一个名字在同一个 sha 上有两条 check run:⇒ 我的 watcher 在扁平列表上扫,把一条已被取代的 run 当成活的判定。 正确读法是按 check-run 名分组、每组只看最新那条。脚本已改,并用新读法复验了本轮全部 PR(顺带发现 #9429 其实早已收敛,旧读法把它挂在那儿)。
⭐ 值得点名的是:这跟本卡的主题是同一个错误——从一个承载不了该结论的读数上下结论。这次是「check-runs 扁平列表」冒充「当前门禁状态」。
1. 答案:没有 backstop。 四个方向都是负的
schedule:的 10 个全部无关。scheduleskill README part 4 里点名的那个创建机制:.claude/skills/里根本没有这个 skill。我独立复验了 Routine 那一半
我自己调了
list_triggers。本账户下只有一个 cron Routine —— 每小时的分诊席(18 * * * *),其余都是send_later一次性件。没有任何 docs-audit Routine,启用的没有,禁用的也没有。list_triggers是按账户的。如果维护者在自己账户下挂了一个,它不会出现在我的读数里。⇒ workflow 那一半(repo 范围)是完备的,Routine 那一半是本账户范围内完备。这是这个答案唯一的残余缺口,而且只有维护者能一句话补上。顺带,卡片上的一条分诊备注被证伪了
那条备注说 Routine 状态只能从维护者的 UI 读、没有面向 agent 的接口。不对——
list_triggers正是那个接口,我刚用它读完。以后不要再据此把 Routine 类问题标成不可验证。2. 我错在哪(这张卡就是我立来查我自己的)
#9192 我裁的是 option A(保持精确 scope),依据两条腿:① 遗漏现在是可见的(#9229 的 "what this run could not see" 段);② 周期性
--all全量审计是覆盖 backstop。第二条腿从来就不存在。
scripts/docs-audit/README.md用现在时描述它,而没有人跑过它。我当时写了「I did not verify it exists as a live schedule」然后照样把裁决压在上面——立卡是对的,但压上去是不对的。3. ⭐ 两条 dev 额外挖出来的,比原问题更要命
(a) 就算按原文把它建起来,那也不是 full audit。 原文说它「computes the change-scoped doc list since the last audit」——一个 change-scoped 列表,是由那个 anchor 启发式派生的,而 backstop 存在的意义恰恰是兜住该启发式漏掉的东西。⇒ 它会原样继承它本该兜住的盲区。 所以这里不是「有个东西没跑」,是「就算跑了也不管用」。
(b) 卡片自己点名的那条「便宜的 fallback」经实测不成立。 我在卡上写:退回
packageMentionDocs是一行 workflow args 的改动。dev 在 main 上最近 8 个动packages/**的 commit 上逐个对比:⇒ 它是换一个不完整的集合,并且丢掉当前 scope 本来找对的页。option C 死于事实,不是死于权限。
4. 权限冲突,dev 处理得对
卡上的维护者裁决说「若 backstop 缺失则应用 fallback 并提请重审」,而我的派发第 6 条明令禁止实施。dev 按派发走(保守、可逆),并把冲突挑明而不是自己悄悄选一边。这是正确动作 —— 两个都是上位指令时,选可逆的那个然后上报。而 (b) 的实测让这个冲突在实质上消失了。
5. dev 自己犯了一次同样的错,然后把它结构性地修掉了 ⭐
第一次推送里写「11 个 scheduled workflow」,是从本卡的分诊评论里抄的。自己派生后是 10 ——
cut-rc.yml唯一的schedule:命中是一句「它故意没有 schedule」的注释。修在2f48c0a9a,而且 README 现在放的是派生命令(grep -rl '^\s*schedule:' .github/workflows/)而不是一份抄来的清单。同一轮里,一个 agent 复现了本卡描述的失效形态、发现了、并且把修复做成了「下次不必重新推导」的形式。这比答案本身更值钱。
6. README 里那条读法警告要留住
两者双向不一致:
matrix-aggregate-experiment.yml今天在 Actions 里注册着却在main上没有文件;而被 GitHub 因 60 天无活动自动禁用的 scheduled workflow,其文件在磁盘上看起来一模一样。⇒ 「文件在」永远回答不了「它在跑吗」。Verdict: ACCEPT。
Fixes #9231是对的 —— 卡片的问法(查、并记录)已经履行完毕。剩下的是一个新的决定(建不建 backstop),不该挂在一张已完成的核查卡上。已单独立卡上报维护者,见下一条评论的链接。门禁收敛后武装(
enable_pr_auto_merge),不手动合并。Generated by Claude Code