Groom auto-builder — Comfy-Org/github-workflows: this CONFIRMED finding could not be auto-built (patch modifies a CI-privileged or dataset-of-record path (per .github/groom/patch_policy.py — workflow/action defs, lockfiles, build/test config that executes in pre-review CI, graded eval cases under a suites/**/cases/ tree, or a symlink into such a tree) — a human must author these changes), so it is filed for a human. · run
Verified
16 workflow files declare a top-level workflow_call: block (agents-md-integrity, assign-prs-to-author, assign-reviewers, coderabbit-config-validate, cursor-review-auto-label, cursor-review, detect-unreviewed-merge, groom, linear-ticket, pr-area-label, pr-derisk, pr-risk, pr-size, public-repo-hygiene, refresh-reviewers, stale). Exactly one - cursor-review - has a drift test: .github/cursor-review/tests/test_workflow_inputs_docs.py asserts set equality between on.workflow_call.inputs, the knob table in .github/cursor-review/README.md and the Inputs table in docs/callers/cursor-review.md. Nothing else compares a workflow's inputs to its docs (grep -rl docs/callers over .github returns only that test plus two unrelated comment mentions).
AGENTS.md:132-136 records the stake and the precedent: GitHub rejects an unknown input at startup, so a phantom input in the docs is a broken caller for whoever copies it - with cursor-review's blocking: input as the worked example, deleted in #31, documented in three places for weeks, restored by BE-4691. Each input surface is written down three or four times (the workflow block, the header caller example, docs/callers/<name>.md, and the README catalog row - README.md:24, the pr-risk row, is a single table cell over 5,000 characters).
Scope note the finder missed
docs/callers/ holds 15 pages, not 16: refresh-reviewers.yml declares workflow_call but has no caller page. And the third leg of the cursor-review test (a directory README knob table) exists only for cursor-review. So the generalisation is over (workflow file, docs/callers page) PAIRS with an optional third leg, and it needs an explicit decision for refresh-reviewers - add a page, or record it as intentionally uncatalogued.
Fix
Parameterise test_workflow_inputs_docs.py over a table of (workflow, docs page, optional directory-README section) triples and move it somewhere shared (e.g. .github/workflow-pins/tests/ or a new docs-drift directory), so adding a reusable workflow adds a row rather than a bespoke test. Keep the existing self-checks - each scanner asserts a non-empty result and the presence of workflows_ref - since they are what makes generalising safe. Test-only; expect the first run to surface real drift across the 15 currently unguarded workflows, and budget for fixing it.
Steelman
Strict set equality across 16 workflows may produce false failures on legitimate presentational choices (a deliberately undocumented internal input, a table split across sections), which trains people to weaken the check. Counter: the assertion is over input NAMES only, it is already proven non-annoying on the most input-heavy workflow in the repo, and the failure it prevents is a zero-log startup_failure in someone else's repo.
Groom auto-builder — Comfy-Org/github-workflows: this CONFIRMED finding could not be auto-built (patch modifies a CI-privileged or dataset-of-record path (per .github/groom/patch_policy.py — workflow/action defs, lockfiles, build/test config that executes in pre-review CI, graded eval cases under a suites/**/cases/ tree, or a symlink into such a tree) — a human must author these changes), so it is filed for a human. · run
Verified
16 workflow files declare a top-level
workflow_call:block (agents-md-integrity, assign-prs-to-author, assign-reviewers, coderabbit-config-validate, cursor-review-auto-label, cursor-review, detect-unreviewed-merge, groom, linear-ticket, pr-area-label, pr-derisk, pr-risk, pr-size, public-repo-hygiene, refresh-reviewers, stale). Exactly one - cursor-review - has a drift test:.github/cursor-review/tests/test_workflow_inputs_docs.pyasserts set equality betweenon.workflow_call.inputs, the knob table in.github/cursor-review/README.mdand the Inputs table indocs/callers/cursor-review.md. Nothing else compares a workflow's inputs to its docs (grep -rl docs/callersover.githubreturns only that test plus two unrelated comment mentions).AGENTS.md:132-136records the stake and the precedent: GitHub rejects an unknown input at startup, so a phantom input in the docs is a broken caller for whoever copies it - with cursor-review'sblocking:input as the worked example, deleted in #31, documented in three places for weeks, restored by BE-4691. Each input surface is written down three or four times (the workflow block, the header caller example,docs/callers/<name>.md, and the README catalog row -README.md:24, the pr-risk row, is a single table cell over 5,000 characters).Scope note the finder missed
docs/callers/holds 15 pages, not 16:refresh-reviewers.ymldeclaresworkflow_callbut has no caller page. And the third leg of the cursor-review test (a directory README knob table) exists only for cursor-review. So the generalisation is over (workflow file, docs/callers page) PAIRS with an optional third leg, and it needs an explicit decision for refresh-reviewers - add a page, or record it as intentionally uncatalogued.Fix
Parameterise
test_workflow_inputs_docs.pyover a table of (workflow, docs page, optional directory-README section) triples and move it somewhere shared (e.g..github/workflow-pins/tests/or a new docs-drift directory), so adding a reusable workflow adds a row rather than a bespoke test. Keep the existing self-checks - each scanner asserts a non-empty result and the presence ofworkflows_ref- since they are what makes generalising safe. Test-only; expect the first run to surface real drift across the 15 currently unguarded workflows, and budget for fixing it.Steelman
Strict set equality across 16 workflows may produce false failures on legitimate presentational choices (a deliberately undocumented internal input, a table split across sections), which trains people to weaken the check. Counter: the assertion is over input NAMES only, it is already proven non-annoying on the most input-heavy workflow in the repo, and the failure it prevents is a zero-log startup_failure in someone else's repo.