Repository navigation
TestGuard v0.14.1
Automated weekly release — everything merged since v0.14.0.
Changed
- fix: four defects that made
nocoverreport discovery failures as findings (#169) - chore: untrack local agent tooling and a generated fixture artifact (#168)
- chore(homebrew): sha256 for v0.14.0 (#167)
- docs(brief): page 6 carries what 0.14.0 changed there (#166)
Fixed
-
sweepno longer refuses to write after a sweep that learned nothing.
learnedProductivitynamed every evidence document it read as an ordering
source, whileobservedcounts onlykilledandsurvivedrecords. A
document whose records are allnocover— the ordinary shape of a first
sweep — therefore producedsources: [...]withobserved: 0, which the
sweep validator correctly refuses. Because that document is written to
.testguard/sweep-evidence.json, every later sweep failed the same way,
permanently, until someone deleted a gitignored file nothing mentioned. An
ordering now names only the documents that contributed an observation, which
is what "the documents it was learned from" always meant. Measured on an
external corpus: this fired on 10 of 34 sweep invocations. -
replayresolves Python importers with the Python resolver.
replaymatched test files against a reverted source file with the
JavaScript importer for every language.from pkg.mod import xcarries no
quoted specifier, so nothing ever matched, the defender set was always empty
for Python, and every Python verdict wasnocover— "no test imports the
reverted source" — however complete the suite.discoverDefendersDetailed
has always branched on the target's language;replaynow does the same. -
A runner that matches no test file is no longer selected silently.
--runner autotries vitest, jest, then python. A TypeScript project on
Playwright resolves neither JavaScript runner, soautoreached python
wherever apython3existed, globbed for.py, found none, and reported
every fault asnocover.autonow prefers a resolvable runner that can see
test files, and when none can it says so (no runner matched a test file … every verdict will be nocover) instead of letting discovery's failure read
as a finding about the project. An explicitly named--runneris still
honoured; every selection now reportstestFiles. -
replayno longer reportsnocoverwhen it removed the only test file.
Removing the fix's own test removes the whole FILE, and on a project with
few, large test files that also removes tests which pre-dated the fix and
might have caught the bug. Nothing is left to run, so nothing can be
concluded: the verdict is nowunverifiablewith reason
the-fix-shipped-the-only-test-file.nocoveris a statement about the
PROJECT — "no test exercises this" — and it enters the calibration as a
miss, so the old behaviour charged a project for evidence the measurement
itself destroyed. The validator now refuses the mislabelled form, and
GATE-SEMANTICS.mdcarries it as a third rule beside de-duplication and
test removal.
Changed
- Python: a module-level dunder assignment is no longer proposed as a
fault.__version__,__all__and__author__at module level are
metadata nobody writes a test for, so a survivor on one teaches the
survival-learned ordering to prefer a barren class — the same reasoning that
already sets a presentational JSX element aside. Narrow on purpose: a
module-level constant such asDEFAULT_MAX_SIZE = 100is still proposed,
because removing a real default changes a real default.
Changed
- The brief's page 6 says what 0.14.0 changed there: the evidence now names
the mocked layer and the assertion shape beside a save-path survivor's
verdict, and the fourth rule of the lower rungs — whatever a sweep does not
probe, it counts, presentational elements included. Re-rendered; still eight
sheets from eight pages.