👷 Gate CI at 100% coverage
test:ci now runs c8 with --all --include "src/**/*.ts" --100, so the build job fails when any runtime file under src/ is untested. --all is what makes the gate non-vacuous: without it c8 counts only the files the suite happened to load, and a new untested module stays invisible. Add src/index.test.ts to load the public barrel, which was previously never imported at runtime and so read as 0% under --all. matcher-shared.ts is types-only (an empty runtime image) and carries a file-level c8 ignore with the reason. Why 100% and the rejected alternatives: development/ci.md § Coverage threshold.
This commit is contained in:
1 parent
76327a8c47
commit
52ce655d8e
9 files changed
+75
-7
No files matched your search
@@ -97,6 +97,39 @@ Leave `act_runner`'s `force_pull` disabled.
|
||||
(`docker rmi gitea.e1nsnull.de/tmu/act-ci:<version>`); do not reach for
|
||||
force-pull.
|
||||
|
||||
## Coverage threshold
|
||||
|
||||
#### Decision (2026-09)
|
||||
|
||||
`npm run test:ci` fails below 100% statements / branches / functions / lines
|
||||
across `src/**/*.ts` (`c8 --all --include "src/**/*.ts" --100`). The gate rides
|
||||
the `build` job; `npm run verify` stays coverage-free.
|
||||
|
||||
#### Why
|
||||
|
||||
- The types are the feature, so an untested branch is a hole in the contract,
|
||||
not a metric to trade off; 100% is the only threshold that means "no hole".
|
||||
- `--all` counts a `src/` file no test imports. Without it c8 reports only the
|
||||
files the suite happened to load, so a new untested module is invisible and
|
||||
the threshold passes vacuously.
|
||||
- The gate rides `test:ci`, which `build` already runs — no new job or step.
|
||||
- `verify` stays fast and local; the slower coverage run is a CI-only tier (see
|
||||
[workflow.md § Feedback tiers](./workflow.md#feedback-tiers)).
|
||||
|
||||
#### Rejected
|
||||
|
||||
- Per-file thresholds: a global 100% already forces every counted file to 100%.
|
||||
- A `check:coverage` script: it would re-run the suite or read c8's temp dir,
|
||||
and no `check:*` script runs tests.
|
||||
- `--all` without `--include`: it would also sweep `scripts/`, which is not the
|
||||
shipped surface.
|
||||
|
||||
#### Known issue
|
||||
|
||||
- `src/matcher-shared.ts` is types only, so its runtime image is empty; c8 still
|
||||
lists it under `--all`. It carries a file-level `/* c8 ignore start */` with
|
||||
the reason. Adding runtime code there means removing that directive.
|
||||
|
||||
## Coverage serving
|
||||
|
||||
#### Decision (2026-09)
|
||||
|
||||
Reference in new issue
Block a user