A page about a page, for the third time
The playground gate now exempts docs/audits/ · closes #3848 · 2026-08-31
The same shape, three times
| hit on | the diff | what the gate demanded |
|---|---|---|
| #3193 | a one-line README change from an outside contributor | a hand-authored interactive page |
| #3811 | three session explainer pages under docs/playgrounds/ | a fourth page, about the three |
| #3845 | one dated record under docs/audits/ plus a one-line upper bound in pyproject.toml | an interactive page for an evidence record |
The toml was already exempt. The only file failing #3845 was the audit record, which is the written output of a decision, not feature work with something to demonstrate. That is the identical argument already written in the workflow next to the two entries above it.
Fail-closed stays
The list is deliberately fail-closed: a changed file matching nothing still REQUIRES a playground, so a new user-facing directory is never silently exempted just because the list predates it. This adds one path to the two that are already there for the same reason. It does not loosen the default.
The exemption is for the record, never for what the record is about
An audit file riding along with a source change must STILL require a playground. Otherwise "add a docs/audits/ file" becomes a way to launder any diff past a REQUIRED gate. Pinned in tests/ci/test-playground-gate-inertness.sh, which lifts the regex out of the shipped workflow rather than copying it, so the test cannot drift away from what CI actually runs: docs/audits/x.md -> required: no docs/audits/a.md + pyproject.toml -> required: no (the #3845 diff) docs/audits/a.md + src/hooks/.../foo.ts -> required: YES (the laundering case) 23 passed, 0 failed.