testsAndMisc/docs/superpowers/contracts/wire-shell-coverage-ratchet-2026-08-23.json
Krzysztof kuhy Rudnicki 46c8f065e8 Wire the shell ratchet into pre-commit, and test the coverage tooling
check_shell_coverage.sh has existed for a while and was never in
.pre-commit-config.yaml, so nothing ran it: a new shell library with no
suite beside it could land freely. Wiring it was unaffordable while the
gate measured a jail-run 100% bar (--all took over 600s). After 578c4a6c
dropped that, --all is 0.31s and the per-file mode this hook uses is
milliseconds, so it goes in.

Also fixes a bug 578c4a6c introduced: the failure path still interpolated
${COVERAGE_BAR}, which that commit deleted, so every rejection printed
"COVERAGE_BAR: unbound variable" and advised a 100% line-coverage bar
that no longer exists. The message now describes what is enforced.

Three libs blocked the wiring -- meta/scripts/lib/shell_coverage_{bar,
case_runner,jail_setup}.sh, the code that BUILDS the jail, and so the one
corner of the repo the jail cannot measure itself. They are pure
file-writers, so they get a suite that calls them against a temp $JAIL
and asserts on what was written: 48 assertions, nothing mounted, no
unshare, no kcov.

Several assertions check that an emitted file contains an UNEXPANDED
${BASH_SOURCE} or $1 -- the whole point of the quoted heredocs the jail
relies on. Written as single-quoted literals that is SC2016 on every
line, so the needles compose the dollar from an exported constant
instead. No suppressions were added.

  check_shell_coverage.sh --all:  3 BLOCK  ->  0 BLOCK
  hook, repo-wide:                0.16s
  new suite:                      48 assertions, green

Proved the ratchet still bites: an untested lib dropped into
mtk_root/lib is refused with "needs: .../tests/run_all.sh". Probe removed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PJrqKERAo5QUeEHWS5Asgp
2026-08-23 15:51:29 +02:00

20 lines
1.5 KiB
JSON

{
"title": "Wire the shell coverage ratchet into pre-commit and test the coverage tooling",
"objective": "Make the shell ratchet enforceable at commit time rather than existing but never running, and close the gap where the three libs that build the coverage jail had no tests of their own.",
"acceptance_criteria": [
"A new shell library in a directory with no tests/run_all.sh is refused by pre-commit.",
"A shell library in a directory that has a suite, or one on the allowlist, is accepted.",
"check_shell_coverage.sh --all reports zero BLOCK entries and completes in under 5 seconds.",
"check_shell_coverage.sh emits no 'unbound variable' error on its failure path.",
"The new suite runs green standalone via bash meta/scripts/lib/tests/run_all.sh.",
"No lint suppression (noqa, shellcheck disable, per-file ignore) is added anywhere.",
"The allowlist is not grown; entries may only be removed."
],
"out_of_scope": [
"Restoring the jail-measured 100% bar removed in 578c4a6c.",
"Writing suites for the 8 allowlisted directories that still have none.",
"Changing shell_coverage_jail.sh, which is still used by ci_mirror.sh."
],
"verifier": "bash meta/scripts/lib/tests/run_all.sh exits 0 with 48 assertions; pre-commit run shell-coverage-ratchet --all-files passes; creating an untested lib under mtk_root/lib and running the hook on it fails with a 'needs: .../tests/run_all.sh' message; shellcheck -x and shfmt -l are clean on every touched file."
}