Problem
scripts/run-plugin-tests.sh exits 0 while silently not running the session-flow retro Python suite. A green run is therefore not evidence that a change to parse_transcript.py or test_parse_transcript.py is safe.
Reproduced this session:
$ bash plugins/session-flow/skills/retro/scripts/parse-transcript.test.sh
SKIP: pytest not installed for python3
The runner's own header documents the behavior as intentional:
Each test is self-contained and cwd-independent; an individual test SKIPs (exit 0) when an optional tool it needs (shellcheck, shfmt, ...) is absent, so this runner gates on real failures without requiring every tool to be present.
That trade is defensible for a linter like shfmt. It is a different thing for the only test coverage a Python module has: the skip converts "I have no coverage right now" into "everything passed", and the difference is invisible in the runner's output unless you read every line.
Why it nearly caused a wrong claim
While preparing PR #1296 (which removes a field from the handoff frontmatter and from that suite's chain fixtures), the runner returned exit 0 and I was one step from reporting the change as test-verified. It was not — nothing had run. The 30 passes eventually reported came from invoking pytest directly:
$ uvx --with pytest pytest test_parse_transcript.py -q
30 passed
An agent or a human reading only the exit code would have shipped an unverified change with a green checkmark next to it.
Note on the existing gate
The repo already ships scripts/check-silent-skips.sh, and it passes here — but its scope is hook entry scripts ("No silent prerequisite skips found in hook entry scripts"). Plugin test harnesses are not covered. The concept is already endorsed in this repo; it just has not been extended to this surface.
Candidate directions (not a decision)
- Make the skip loud and counted — a summary line naming which suites skipped and why, so exit 0 with skips is visibly different from exit 0 with all-green
- Treat a skipped suite as a failure in CI while remaining a skip locally, since CI has the toolchain and a skip there means the environment regressed
- Declare each harness's prerequisites so a missing one is an explicit environment error rather than a per-run judgment
- Extend
check-silent-skips.sh beyond hook entry scripts to test harnesses
Relations
Problem
scripts/run-plugin-tests.shexits 0 while silently not running thesession-flowretro Python suite. A green run is therefore not evidence that a change toparse_transcript.pyortest_parse_transcript.pyis safe.Reproduced this session:
The runner's own header documents the behavior as intentional:
That trade is defensible for a linter like
shfmt. It is a different thing for the only test coverage a Python module has: the skip converts "I have no coverage right now" into "everything passed", and the difference is invisible in the runner's output unless you read every line.Why it nearly caused a wrong claim
While preparing PR #1296 (which removes a field from the handoff frontmatter and from that suite's chain fixtures), the runner returned exit 0 and I was one step from reporting the change as test-verified. It was not — nothing had run. The 30 passes eventually reported came from invoking pytest directly:
An agent or a human reading only the exit code would have shipped an unverified change with a green checkmark next to it.
Note on the existing gate
The repo already ships
scripts/check-silent-skips.sh, and it passes here — but its scope is hook entry scripts ("No silent prerequisite skips found in hook entry scripts"). Plugin test harnesses are not covered. The concept is already endorsed in this repo; it just has not been extended to this surface.Candidate directions (not a decision)
check-silent-skips.shbeyond hook entry scripts to test harnessesRelations
session-flowhandoff taxonomy restructure)scripts/check-silent-skips.sh— same concept, currently scoped to hook entry scripts