> **Relayed** to mgf-fed#PAPER-121 by the supervisor (FB-05).

### PAPER — `drift-check`/`app-doctor` should assert required pipeline COMMANDS, not just step names (bespoke pipelines fall behind silently)

- **Severity:** 🟡 Sharp edge
- **Filed by:** mgf-standard (WF-13 re-render wave; mgf-standard PAPER-120) on 2026-07-10
- **What hurts:** repos in `templates/policy.toml [exempt].woodpecker`
  (`mgf-hrb`, `mgf-test-supervisor`, `mgf-website-template`, `mgf-standard`)
  keep hand-maintained pipelines, so `scaffold` never regenerates them and
  `drift-check` skips the generation-currency comparison. A gate added to the
  canonical template therefore reaches every repo EXCEPT them, with no signal.
  `policy.toml`'s `required` list checks step *names*, which stay identical
  while the commands inside them rot.
- **Why it matters:** proven live this wave — after mgf-standard PAPER-115
  added `ruff format --check` to the canonical lint step and the fleet
  re-rendered, all three Python-linting exempt repos still lacked the gate AND
  carried real format drift (including **mgf-standard itself**, the repo that
  authored the gate). Every future gate inherits the same hole.
- **Evidence:** mgf-standard FEEDBACK PAPER-120 (full evidence);
  post-wave `origin/main:.woodpecker.yml` for mgf-hrb / mgf-test-supervisor /
  mgf-standard — `ruff check src tests` present, `ruff format --check` absent;
  `uv run ruff format --check src tests` → 1 drifted file in each.
- **Suggested shape:** add a `required_commands` concept sourced from
  `policy.toml` (e.g. `["ruff check", "ruff format --check",
  "check_commit_trailers.py"]`) and assert it against EVERY repo's
  `.woodpecker.yml` — exempt or not — in `drift-check` (and/or
  `app-doctor --standards`). Exempt means "we don't regenerate your file," not
  "you may silently drop a federation gate." Keep it a substring/step-scoped
  match so bespoke pipelines stay free in shape while staying honest on gates.
- **Status:** OPEN
