Follow-up to #41 (PR #48).
Problem
scripts/gates/structure.sh Stages C and D now build two lists: --cached (executes) and --others --exclude-standard (refused with a FAIL). --exclude-standard drops gitignored files, and --cached never had them, so a gitignored */skills/*/scripts/test_*.py or scripts/gates/test_*.sh lands in neither list. It is not executed, which is correct, and not reported, which is not.
Confirmed empirically during the #41 security review: with a suite added to .gitignore and a deliberately failing assertion in it, the gate printed NOTE no python test suites found, skipping Stage C and exited 0.
Why this is worth fixing
#41 chose to refuse rather than skip precisely so an unstaged suite fails loudly instead of silently not running. The gitignore path is exactly the silent skip that reasoning rejects, and it is reachable by adding one line to .gitignore in the same change that introduces a defect. The gate stays green with no diagnostic.
Acceptance Criteria
Follow-up to #41 (PR #48).
Problem
scripts/gates/structure.shStages C and D now build two lists:--cached(executes) and--others --exclude-standard(refused with a FAIL).--exclude-standarddrops gitignored files, and--cachednever had them, so a gitignored*/skills/*/scripts/test_*.pyorscripts/gates/test_*.shlands in neither list. It is not executed, which is correct, and not reported, which is not.Confirmed empirically during the #41 security review: with a suite added to
.gitignoreand a deliberately failing assertion in it, the gate printedNOTE no python test suites found, skipping Stage Cand exited 0.Why this is worth fixing
#41 chose to refuse rather than skip precisely so an unstaged suite fails loudly instead of silently not running. The gitignore path is exactly the silent skip that reasoning rejects, and it is reachable by adding one line to
.gitignorein the same change that introduces a defect. The gate stays green with no diagnostic.Acceptance Criteria