Comfy-Org / Comfy-Org/github-workflows
[groom] Declared-vs-documented input drift is machine-checked for 1 of the 16 reusable workflows
- Dominant language
- Shell
- Stars
- 6
- Forks
- 1
- Avg merge
- 14h 4m
- Merged PRs (30d)
- 98
Description
**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](https://github.com/Comfy-Org/github-workflows/actions/runs/33739264302)
## 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/.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.
Contributor guide
Assessment
This issue has not been assessed yet.