{"_id":"testguard-cli","_rev":"31-476d0a8540ca625cc4935e55cb150ed3","name":"testguard-cli","dist-tags":{"latest":"0.14.2"},"versions":{"0.1.0":{"name":"testguard-cli","version":"0.1.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.1.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"8beb70adc388c1160177eb8b5f48aaa978051b59","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.1.0.tgz","fileCount":36,"integrity":"sha512-oUugph3yovpUPFf4kHH+RqveZqDzXxgoF770B3uJgCWapQc5URq+CiXs+qVhBmycKpI3vqm8cE7XjoMI2pRJyQ==","signatures":[{"sig":"MEQCID+Wc763mqccGBu/SYuLvgzqO/5v4p/d81Yqc+dKGD1WAiBW/5JLQ3ISUBUwPiE4uRO3E4rKqjRB1li6sFcQawrDGA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97397},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"9fe5d61ea002954e3d2088f0641b48a41705e934","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"raitec","email":"raccioly@gmail.com"},"deprecated":"0.1.0 crashes on startup (missing runtime dependency ajv). Use 0.1.1 or later.","repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.16.0","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ajv":"^8.20.0","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.1.0_1789617075199_0.5511914308334487","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"testguard-cli","version":"0.1.1","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.1.1","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"80e70c442cd5884fd0864c1bcec562bad6db0ce3","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.1.1.tgz","fileCount":36,"integrity":"sha512-GEwhKluQAFPfFB3cJElxB1Adru2iIGemofzjnpRxr6vOIVzj08C0dpkX4vekXZHQHaF4glXiW0j4LE8tCj/o/w==","signatures":[{"sig":"MEYCIQDKElvaCdmXP2t8XJS5Gjb959wV/zqzmU8B5BtMPLBkJwIhAJo/0qrwEwIvNfnq8rFfnmSPJDFId09IyfJ0C4W85wUP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":98239},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"d42b085c35e952bbf7087234f217e8484cfd8e60","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.1.1_1789618605455_0.9024650986402483","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"testguard-cli","version":"0.1.2","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.1.2","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"964436c9f7a31f5a3a2538471d291dbd41193cc8","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.1.2.tgz","fileCount":36,"integrity":"sha512-Nujw1SG1ZkDXnx3Z5dB+A7ASKOf7SH5MBJ5PfPtsZZklrR1gK8MTivQq95PfHN8gz26RMyq9v5m16JQXK7m6/A==","signatures":[{"sig":"MEQCIE/uIe0l0GIgIfwNcIHCjSP2Czo2CzqXwReGrGMvqXebAiAqw37QxeRA68n97y9W0Xd4yJsTKQzXK0xcKCgKZ2MTlg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":112215},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"2935974391dd9b2a703d3d466edfd6ef72a9a368","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.1.2_1789622682259_0.036318807839420764","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"testguard-cli","version":"0.1.3","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.1.3","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"baf11b2d2ead3c17af3d888ae12a6802ff15a631","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.1.3.tgz","fileCount":37,"integrity":"sha512-YW1ZQUWRZvK7gHnBJXYfKRjv1Ckp3Mo+Yy/jUbT0lMPydWQ/QI7TWKRYB5ql9T1n3ZFDN8f3SKqxC6oh/Nw+TA==","signatures":[{"sig":"MEQCIF/Ou9oFfHelwkMB+C/CVlxk1Yw5KpFx9qO9fBSiANA3AiB46ZcpckcwrAZ8bSGn6/ay/C3A7Rx5YgQrZF+EFDtxuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":125080},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"1934a33dc69155d30cdb9492bad4555a56161175","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.1.3_1789624431042_0.7058607890764883","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"testguard-cli","version":"0.2.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.2.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"f65ff9bd2548333415c396e5bbe027c27a688963","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.2.0.tgz","fileCount":40,"integrity":"sha512-hNM38qoeDKiZWXM70lTeeNgEKp4fhakNcpZ+HctBbvwtc3ube9xanl0A85ZIy+qeKe/2Fb8ynsuXIm9vNiYOFw==","signatures":[{"sig":"MEQCIHMRItaDMxUcTMyCAcP8RfbVTlahbso/Ohl9eQXacGgDAiBDnlOibMszPkT119CBOthDbDb91INpvS0lBUoOzIaeOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":140323},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"f12a61f0f22a5a37b1816494c97d01c437876b3d","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.2.0_1789626474163_0.6384752326060261","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"testguard-cli","version":"0.2.1","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.2.1","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"71789be3a9531acaa5be741d7ec6a749ee0bd6aa","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.2.1.tgz","fileCount":40,"integrity":"sha512-+rCL/h95RLJ2tcmyALqEtDlY52ygSJypuQQpKfYaGiIu4MicN6re5WdQaa2ePvNIhxgxRZhxq7RRMOm1T03rNw==","signatures":[{"sig":"MEQCIE5IkCWyn15oV5tFQXJxetLXP02lLNBH6adCkIMUn8G3AiBerYSaCtfKo0XYkiT2IsVsQi085lNIPIckyv5BA59ulQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":144131},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"d28fc314ede7f83ccbef9aacb388a135214d4758","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.2.1_1789656891818_0.010464787128891873","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"testguard-cli","version":"0.3.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.3.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"2e4bfc4f21d0ae6f165785424302b8ddeae7215e","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.3.0.tgz","fileCount":46,"integrity":"sha512-HKAJ+kHDmrOnWaZn2p5NQ0XAWby5qN7o15vdzPI+5MAYGGdUt2tAc10ToNK99vpnPLQzqqcyGH8SZW43zdKp8g==","signatures":[{"sig":"MEQCIHt+2jFt28otBNIo1QeTvJgP88MiEkKLYQCgfLzXKwZmAiBQndqCwH4lnSkGcrUAI0v2RUQ/cQZt4C3P1gFASw6jIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":175888},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"ac32ce504fc42f9b50389a5a8092a0e2ca1c5c9d","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.3.0_1789658768309_0.6459948364577466","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"testguard-cli","version":"0.3.1","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.3.1","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"51648dd2d86970c9c98243b4ad0b015d84f91ab3","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.3.1.tgz","fileCount":46,"integrity":"sha512-y7CbbaFxnQIanbudQw6E3NdJtIzw49jeBoY3D8hfpfj0iXvZkUNJhYBqgQurPcqz9+BXaC3ByO62Lln6/qUDhg==","signatures":[{"sig":"MEUCIBLb3Byo2zCyn9hd4sjSOOc0bXUdUWwl5l+9sjQshjXfAiEAis86b0sPXVyxJtDFHHRwnoVCO04anh5FUWOD25MC1/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":176684},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"c3c584c337bf977ba68b5f18f8a0635d397cd9fb","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.3.1_1789660133286_0.484389989261218","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"testguard-cli","version":"0.4.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.4.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"7b8bebcd962458b78ce36a27591ca2af81f0aa2d","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.4.0.tgz","fileCount":49,"integrity":"sha512-1fhN7r3ShRVD8D4iDBV4dGQ2+hp83ufc244VgGX1zpWt+qe3BD8uNtJinEKPFFG/zja912dFsxGgScNYPnVW9w==","signatures":[{"sig":"MEUCIDy+hj6+7TnlwYpbQWn9X2pwCYYycHrDMAjHk5C02GkuAiEAjuRMZvjbr6xN4FOl0NWmhN00xAT70h2Ak6Pn6DAnO3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":181032},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"011ff08e5d66494efd5d3c41cdead0d1b3cae651","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.4.0_1789665191586_0.173361282750486","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"testguard-cli","version":"0.5.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.5.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"775ad9adcb3050828ba703d16610f7871503e619","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.5.0.tgz","fileCount":52,"integrity":"sha512-cQVssBn0pnzdxG75BNNWyRCvyY/8b5r7jzrhdbLd3AY2pQXb8tUkq5d+DdueMiOhtHGpSK4/DPgz4zEKzHiFtg==","signatures":[{"sig":"MEUCIA5kOyWDxv0Q3bG22sjFC0eb3Okg6ZyMteygIekqN/D2AiEAyiQavx1UrHbEVPy3zfmgTHZKfLei4X3FFyh5XEr3Irk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD8d0URD1UsSfcRZwQfqGAlQGInR+rq2B+Uq/DhOWLn6gIgZZO+On69wshZzI2PC8CPphn7rA+FgOq839aw1LNYNNQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":220621},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"1b7f0830a16566e2ee1fad704049e4a5f1f6053c","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.5.0_1789667889337_0.3002925068184532","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"testguard-cli","version":"0.6.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.6.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"aca495e0d2afc740f58efc5249371f41fa5507f1","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.6.0.tgz","fileCount":66,"integrity":"sha512-adNO6IzKGy9eUT4Pj2xQ4jI2NdVxq0jgD8kbsLsGdUjbKgkimETt/15cBnzuoQgY6EB8VZykogb+KyFrm2zYCA==","signatures":[{"sig":"MEYCIQCSvyEH7JqHUKJxSRTh2bJTtDs7RCI3yKI5EW4Q77PzywIhAOorduJHuUy+E8KiOyF5BDUed+qwS+ugNLmq+8k2ihE7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCMomEJW4XO+LLjk3qvF7DiXW0h+mD3V7+zdHu6ChWEnwIhAKGbJQzQEFU3BXp4qELFEaaaF0DlPWiNqLUJ7fijdaBf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":403892},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"0bf0f64295bd7562c64be5ad654ec5644ee042f7","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Proves a test suite defends the claims a project makes: injects the faults those claims forbid and reports every one the tests fail to detect.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.6.0_1789694372262_0.6729957396343467","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"testguard-cli","version":"0.7.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.7.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"531d047d313962d821157ebbf28e00e1e509a57b","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.7.0.tgz","fileCount":75,"integrity":"sha512-deOZV8cPzkXe9aJPcahzCyy+u1eKzOAecVo2Hed+W5tPr0UY0MWvk5B+Q2jdnoOSgYyOFbU+UG+6f1Iln+AZWA==","signatures":[{"sig":"MEQCIGeHaJ3Vm1Z1sAQD6ErfW+PaI3V/HvRKyuyQ4M2oKP7iAiAPFLY+ApCFbbTqB+xFrl+Ox6awP7O9GEATp8pL8DuxYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDSJku4oMKdd9+7hfuWNzN6nNgFHNt+jEevgjXYMr6SKgIhANVq84elGI8oBtxfEJnrcDRS8j2fnBMPAtDJSoGE/XnU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":557633},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"3889982d5e9795c121f538f91940c627f8e5bcdb","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.7.0_1789731924691_0.8174860835888522","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"testguard-cli","version":"0.8.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.8.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"ba8765f675bda09eee8a3158d68a35acf56c2f68","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.8.0.tgz","fileCount":76,"integrity":"sha512-nCTM8y1irDyvHWrMCBs3xL972McXUxujIC9wLnqx/UYDwVWYdfw6vHdWPPWCWuuZ9xS3oPzwhJPiWPmSpbmojA==","signatures":[{"sig":"MEUCIBp+9ZLvyrL0gOoSh/Uwgkrt9SM7jMM8O2i+NkguuFh4AiEA4hZX7/SuL/miUKgYAaZnWTwsNYIfoaNlX7DDnXI5jJ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDlAHZYGcClwMuvSTLRoODFSlT6gbrGSH/2GyRxYYAmUgIgQMLV9/e94QCgMROK5zAXj7tp/RHBo6/0aAp5mFcbjaI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":592150},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"728bf116c358979570f63ca257ac5f98e3b844a1","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.8.0_1789748775534_0.02121115085665859","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"testguard-cli","version":"0.8.1","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.8.1","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"188d3672bd3500d54a209189c6537c539a4857d2","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.8.1.tgz","fileCount":76,"integrity":"sha512-cnG2LIwdJf//GXJePTzlGij16rck5k56Btwf4NXFCnwSq28rGGzFT/oO7Ti1bFkWgGuLGPHRQfysEqys7e3orw==","signatures":[{"sig":"MEUCIEjPA8R6q0Zkx+pgq0X5DBPbKQtEBGEsklNpPIhpfJScAiEAhmafqNMraYryjouRM4m3OEwej3N/RXIUbzi98J8KUbI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFn3/+vk5bGo6AHBY5ZFt073E1/JJ1yoHWqeVVSbcnFqAiA5GCzquklHbBd6MJV0l3jOV2G8lZpnr1Wn8utfd0lNvw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":596382},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"8ddad99ee740017ae9882c7176c593f77f1f86f5","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.1","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.8.1_1789761690316_0.40733583891097047","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"testguard-cli","version":"0.9.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.9.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"333cd2f79085285fbb6f96ce37ef27155f596b1a","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.9.0.tgz","fileCount":76,"integrity":"sha512-HnWhylXppnp4sgCHz1AWw484LGUyto4KkjkGT5x4S3YsT/1d+qW+Xok8pP/7e0k4iwdQHiKiqwQrIDgHEeTdqA==","signatures":[{"sig":"MEYCIQCCTcemzUOc8NVYFZYshPU7q7iP62kD8lE6xpk87+nsyAIhALJM/k0qE0iCCgAuxVBJnEez2uODfGMPVpP3d91Ct00X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCo4i0iVBamyQqfzarZbT8jpuRckrHGyE2lNkq7Tg/kdQIgJvHyXQAgHijVQ6k5h2QhJ3geDD2JTK2XgcsWXaYaYIw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":617411},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"3780e6ea613571a55479c14dfde5f132b26454e4","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.9.0_1789770396190_0.13625225288137943","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"testguard-cli","version":"0.9.1","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.9.1","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"853bdda8a63adb000b3c036e4bbd9d04bf592ace","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.9.1.tgz","fileCount":76,"integrity":"sha512-YpLrNtc778ngh4MlwMfCUS7gzT9KqWL5/LjlzalGi3fufNrPNB1sefDa14rn7ivQ8LFB09msKQPkZD2ym7V63Q==","signatures":[{"sig":"MEYCIQCO904Ve9itMtp2GfVDCLrDQtHJ7B7fZ664fUXuGBw07gIhALI0dmKcBy950i6VAsM4ImhYDfRQdbhD9g0yfW8x/qiM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDscEZZsoueAvbko5obIwlvpmT2sXhJjiNC3ks25rExfgIgPLiW3pNnu+eDaQnbfRRZE3Ex4Z/XkPqhwcKsmGMeWfo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":626084},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"e354625dedee82bed5dc00a679abb0b3fcff833f","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.9.1_1789835913442_0.8329832355012705","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"testguard-cli","version":"0.9.2","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.9.2","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"249e0f510311da21eaa81851da87fef820ebb1ba","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.9.2.tgz","fileCount":77,"integrity":"sha512-XsajZm3xovSqErDVxUdsX7GYMR3c8ojLpYBxlx8F1G25Qn8CEcv9cDvnS9JdZ/5EdZvFibLSx4oDgrp45wZYIw==","signatures":[{"sig":"MEUCIQD0qv+ETA3sh2+sMyFNl5i/70H6Pb4veIqjppxSRDc0iwIgQQp0nV3FZnn6Al/ryPvvDpdULD8TfUthwIw6fL1qYf4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDl4LG78bpgABrY6xhPfZRaKXAmzx0p5MaTegetnAdrwAIgBocnr6Uqrh4F47GmKqIBQaTbLThe4jVRVFW7mts0KgI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.9.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":641532},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"1b8a71fb6da94cd657e074d19bd9dda9f459afc1","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.9.2_1789847415660_0.48953060996564934","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"testguard-cli","version":"0.9.3","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.9.3","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"3094c350f497776b632f65d9386302127ffea021","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.9.3.tgz","fileCount":77,"integrity":"sha512-LSdaFGUC+hGMM7aAMiQW8dnPFW60CFrO+G/SVD0ltC3M8pzZlaloi0fIHrs3P+i0mgTeS/NMBE5b66xf4PDrIA==","signatures":[{"sig":"MEUCIQCR3TwKly9OkGp+hbaSaImO11dRiuUHpbmrA5zwjWq+AQIgWJXheeL+4/eXCsKNGm8nWANFS52WTwgsXkdK1pasF1U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDhVFhdX0vfwTfxWqyB+9GHugpL/l3qS+rd8UjEWzlvCQIgTLLZPDmMAW7I9F00/QgB43xZogQx9lcIar+cv+fNKl4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.9.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":642029},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"47776f40287929d99dd5bada28a4b3665dac6a28","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.9.3_1789850996402_0.8208974136337301","host":"s3://npm-registry-packages-npm-production"}},"0.9.4":{"name":"testguard-cli","version":"0.9.4","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.9.4","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"fa4d364ba677f573eecce33cb8d67cf27b9697e1","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.9.4.tgz","fileCount":77,"integrity":"sha512-H57ZSdgfHt+UDt3ogO/aN8zuQgjQSQGFSpMtEBeA827NSSmuPf6JH/JGvH+OdSpP2dHoGGZqodhELRRSQTzmTQ==","signatures":[{"sig":"MEQCIAVIM6lLx80oC++ZJP9yOVaSYdCuCjyDJVmJDlPYxMHlAiBtyvencOD06kIowE6HNImol6YFcq7/qsDa6oG0tQt41A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICJ16/05Rc0OVr4F2id0ymtRqE3DqBfJnhQIrQIrr/57AiBaK3oy+YMwci6ADECxicXn7nWFWF5Ju4vOmZPTLSWQEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.9.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":642472},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"dd0a9986d7396ca4b6da605ea1369a8a944687d3","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.9.4_1789853718269_0.48382741727369094","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"testguard-cli","version":"0.10.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.10.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"e22e9a9c3d2eb4b4e512b0536eb14ddb355c0758","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.10.0.tgz","fileCount":78,"integrity":"sha512-z3iq9w/LUPGBybR+RPjTe22etBXOWQ/Zy4iBixGRgKO2AT4Y18Wva8Hww0p3SDPohf5Y0V9G6Ng1CxFWOmlmQw==","signatures":[{"sig":"MEUCIQCahFr4AFqygoDXY1J7SPyahGmRi81aiqqb1UP72BUMEwIgDVCRPBH3fXVyEAFJaBBAeueqRbQHfukxP5ujr8dMrWk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIA6cfPPdj90u6oueO1PPVeA9c/A0AADrVcPYgHxKEtV1AiEAunl4lhTZFC4yA8E2VTDV5zqcOLeJFmBfSEXdHh2wkoU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":654551},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"587e1de888e3c5b4d8b732350c2d4f95aca870d3","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.10.0_1789856474585_0.859323794734296","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"testguard-cli","version":"0.10.1","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.10.1","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"086359ec0e9fa37b1a3dc023715e119cd1623f76","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.10.1.tgz","fileCount":78,"integrity":"sha512-wQu4Jb+jDPpDTw+qpuBss35EzUA6Qfmow2y1WJwwpM7stdNt0xOMLFo+0BZJVFxgh5RpQOLpWlNttkBVZz/L8A==","signatures":[{"sig":"MEYCIQCM6baew9s/a9KrH1lwGJD71ry01LgxZ8aDBUs/o9qMqgIhALWiQeWQIL0KkFfq1qfuein7Ju8GIKW/VQJa7oct2njj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDR5As0bWHXn9Mjt6yrI8kbfBIBd4zyBD8onfnWhN7E/wIgKevMVMKvT/HHugCVgi6JS2ukmjV9gdzT9DiEevCIUug=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.10.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":662238},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"70e9d61faed724779c756a1dfabd268d499717b9","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.10.1_1789860335152_0.09019052100354408","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"name":"testguard-cli","version":"0.10.2","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.10.2","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"a17a91e8f50dc5562bb175d21851c5bdc26f0d1a","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.10.2.tgz","fileCount":78,"integrity":"sha512-jcCZQH6JYMOjD0d9CLFyyUJ7TITPAa61iTuY+crzFwOlM+tG8k1r1Et4GdAqqQCD9EyWEv+EdqUikvQhKzryMA==","signatures":[{"sig":"MEQCIEziPOTXvNlHIIIsuBpqfo0IS80ysR5U2sl20lZ+ZTqaAiBd6Dc/OsHH22fx/dwE3CMSoHHhIeADzgPAlMQGu5l9Ag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCtZd2+hsbu6Je7vNhtc4xnBaB/AjPrUQkCZfaTmdiCRwIgE0FtyUEa4rvXyWSgSosHNf03sn6JSHHuv52OHkcmo7A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.10.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":663071},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"4c8333b7f6b485e8a1b5268b082a42dc1c47343f","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.10.2_1789864688806_0.19453987261630856","host":"s3://npm-registry-packages-npm-production"}},"0.10.3":{"name":"testguard-cli","version":"0.10.3","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.10.3","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"fe0cee9fefb1836a8a33b3e8bd83ff027b361384","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.10.3.tgz","fileCount":78,"integrity":"sha512-13kB0nLegVYRZXO1UOI6WWglPqtUWQCJ5g5nyxYuunE8L6DzhLpzb6zISsWo59kZbj/8EplfPkgeaTb3K93QOA==","signatures":[{"sig":"MEUCIFmuDfxyaDFcu0+egOImsFLGWTm9Ki4NcrypE3VpEhFxAiEAgsHbl+9Gjit0wV6BYVBdvguvU1znNgqRj423LR1XJgM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDbPq6LAbqtXvlBDt9GfWeN8Rlglt35b88SqpvJDttAbwIhAP59wHqt1R00vy1+WHvvtl65JzWS3O7Dp7d5YXgHhhxU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.10.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":666739},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"7bd74eb0fa8886658a8d9ccf2099ef9de8d3524f","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.10.3_1789869373666_0.054603400290076376","host":"s3://npm-registry-packages-npm-production"}},"0.10.4":{"name":"testguard-cli","version":"0.10.4","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.10.4","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"62c47933d441876d7eb99e51083f51c619b91133","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.10.4.tgz","fileCount":78,"integrity":"sha512-rW/kc2kO4o6ZxSroQmc2ERpt1gng1puH6awcnv0AsxuYiC6UPXIzVhsKOmm+f8qL8CrGR6YprLa9VwpnqrYtag==","signatures":[{"sig":"MEYCIQC+b/8//YNycAyCYk7mKOZiXjRtdj2273FdKUZZE0V3CQIhAOw+IeE8ldkw6988NU5abvi3u55wLgAAVJEpT3eGk1FV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIH1K1kp1BEG8sfhjNz02c/Es5Gy/0S1aShwx33uUqoZAAiBO3j7ILWdFV8AYqZnfOFA37S+14dWR5gyBVWmtFUtEvQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.10.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":666890},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"0dabd4b9d6daa9de4be8e4a0b41893b93e64d6d3","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.10.4_1789987548551_0.016780604555300282","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"testguard-cli","version":"0.11.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.11.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"87a546772825e015b5a3f53a58f67d70252c8c4a","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.11.0.tgz","fileCount":83,"integrity":"sha512-Rj1WcjYMoH3MtWkQxb4Zz5bUB87RgXLtncB/MwS/dsrdlRugNkH6ZBjhU/pySluFRtOMOYQeBUhi15lE3hiWeg==","signatures":[{"sig":"MEYCIQDXyYcfcrbgC31ooBo7+FpRKHSCSEtxHJfJ4iLzS6d7zQIhAPw3cWoC3QoxcbQfLWGDw12W/0oE5rCWpjkI78UA3ItK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDDggjy+yLlipgCMoTELw6MKH5AgBDe13wkOXxIly9C9gIgEGDyHwqnPx8ZUXJ8lcvuM/lgf1G+Hgc83oHrx09palg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":714999},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"b83087c918454342f6097e87337331813fc99b8a","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.11.0_1790030470104_0.23904885239646423","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"testguard-cli","version":"0.12.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.12.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"6f38d5f2e122557ed037df8240e5fea3dff197e3","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.12.0.tgz","fileCount":84,"integrity":"sha512-LQNcB5mdCGZ4p78tkwNqM/nKpKvQ7va6iNjfaxNu/DIeZzIyvI68g8BJ00EY1mI4024SZN4AJC6g5wwogQpDww==","signatures":[{"sig":"MEQCIGSew2M/bZYzQrlAFh6clyd3mmeuMlDGpKJBnuPldQFSAiB/4Dnts3hkzQ0V10EsnZDlxviQ6ZqkXvvqrlNCI0iRCQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDdCGZBVznbcdK+Iz8WvmUL6BkHbvhzbSU37+TqS5rxzwIhAN6q8HBPkSoU9AKR/n9aObW8hmKIgGc6J38X5MHnR+0M","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":736748},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"462af16ecc4aa4077976ff967ae0bf4e61dcabd2","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.12.0_1790039689845_0.43495611518725097","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"testguard-cli","version":"0.13.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.13.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"bfe87da447b7e875c45d49c74f710e0973a3f2b3","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.13.0.tgz","fileCount":88,"integrity":"sha512-Tz+Krm1T2hXEsamq/d40/ogXoY+vWMU0F4TWm8n3BZ8+sg+pWYJT6XXkC2InVUi8qwqhjgCz2tUyG7Pg3Ku8Lg==","signatures":[{"sig":"MEYCIQCvOroEbzy5OeguFlCmp5UGzOmVuCWCsxSql/t6jVFHfAIhAPvdTEQb6q6he4+LQBXSNN0ki/MYioKyhm/MAk6D4ovR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIF3DiZnkVCER+s5IgXkyzGoiV7dRyNQ5JOaDbutTUizyAiEAlDdI1/G30w0FO+IvAZjBKcw/Rcw5YvZZqDXt6rCWrVY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":775659},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"53dd25d2c962230cdf0046f769c27637f8ea9708","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.13.0_1790073889610_0.4401229914762894","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"testguard-cli","version":"0.14.0","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.14.0","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"2e1e600ede13610dc4e08d41096429061884ebf3","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.14.0.tgz","fileCount":88,"integrity":"sha512-7Wuo2MABtnGlq3i4Ehe7M7YZ77w3bdGSw4Ht9h5r1jXyfTUU3llnCvIb7wOP2NwF/5D6O9sVcHfwrtf2y9o2TA==","signatures":[{"sig":"MEQCIHgy9gRWnURZlGYdUoZ4IwV7jcHXeR6HRVe4QDltytlrAiBEHr+6uZISspXZ5f6Wlpf2HRbkOp20NU4d8/yX5VSksQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDQTj/hp02+bmmrmCB1kv3+0UM9oTw4oMq/2uJc1dF6ygIhAIiePXiDH9cCCZdMFs3n+saeU5OX92DnaoD+5AV41eSY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":793933},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"057e9216a168f96cd05c925ab5e54aa3be46d707","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.19.1","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.14.0_1790093925935_0.15482820731489166","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"name":"testguard-cli","version":"0.14.1","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","_id":"testguard-cli@0.14.1","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"homepage":"https://github.com/raccioly/testguard#readme","bugs":{"url":"https://github.com/raccioly/testguard/issues"},"bin":{"testguard":"cli/testguard.mjs"},"dist":{"shasum":"9c82185dc4db90b312659a7259e81a3a24543f40","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.14.1.tgz","fileCount":88,"integrity":"sha512-zke4G+APrc2tXvNIK5M7QSIDHNNaGLLcOEaCu8Q/97inR78kLeK09U9vbgb6GPO/ZzDqPxTUjyzgFEo/3PqNxQ==","signatures":[{"sig":"MEQCIBRYgddostbiYGF7OMshUSbL2ctdEXbZ4rgROe2ClXgMAiB0HhCPw9PTXI7/EiBU0S2egzU96rGLT+T/TliCN2aP1g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCID6a7Npjp8ouYD6BY2oOshYRZnRWrz/1wdAPfNMPbpeVAiBP4oEf8pZG14/WpV5rCLllLSFVPCzaPon3N4dWea1/0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.14.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":805458},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"532a236d2a933e89f128b4857b0934afdfc6c207","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.20.0","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"tmp":"tmp/testguard-cli_0.14.1_1790538109452_0.9025328347159713","host":"s3://npm-registry-packages-npm-production"}},"0.14.2":{"_id":"testguard-cli@0.14.2","bin":{"testguard":"cli/testguard.mjs"},"bugs":{"url":"https://github.com/raccioly/testguard/issues"},"dist":{"shasum":"d404bfa869f12158a08e3b4477e0736d14a936a6","tarball":"https://registry.npmjs.org/testguard-cli/-/testguard-cli-0.14.2.tgz","fileCount":88,"integrity":"sha512-UYlwS4/yLRf4GJ+OrGihX6YK74mG1dysxPfqFEMsv0cfbNHGeoQGpQtAX1G7bMxvXUY9a7FOO+VTOxzOy3Ju6Q==","signatures":[{"sig":"MEUCIAmtuifE3TK9BdbqxYs9Tcb43G9DclThy2BwavEHJfzUAiEA3oegI/XivIKYA9ox4EVS+6wzNO1V1FpVhdHFGFBA1dw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGlCrMCSlpcBZ88Wb9cV3SQGqWOJbYnB1w1Btafxn3YkAiBRKHFrt3KE8iiepR/MAmWMaSb5Dyyfn7x/M1dG6jLsLQ=="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/testguard-cli@0.14.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":805609},"name":"testguard-cli","type":"module","author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"engines":{"node":">=20.0.0"},"gitHead":"e63f4cc696ffcb76b65ea255dd42b5697ee1080e","license":"MIT","scripts":{"test":"vitest run","brief":"node cli/testguard.mjs brief","probe":"node cli/testguard.mjs probe","claims":"node cli/testguard.mjs claims","baseline":"node cli/testguard.mjs baseline","test:spec":"vitest run spec/conformance","testguard":"node cli/testguard.mjs","self:probe":"node cli/testguard.mjs probe . --budget 180000","release:sync":"node .github/scripts/sync-release-version.mjs","test:install":"node .github/scripts/install-smoke.mjs","prepublishOnly":"node cli/testguard.mjs --version && node .github/scripts/sync-release-version.mjs --check"},"version":"0.14.2","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7d9fe5b3-06ce-49bf-bc52-6256f596099e"}},"homepage":"https://github.com/raccioly/testguard#readme","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"_npmVersion":"11.20.0","description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","directories":{},"maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"ajv":"8.20.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.5.2","vitest":"^5.0.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/testguard-cli_0.14.2_1790592463995_0.7012036912588504"}}},"time":{"created":"2026-09-17T03:51:14.964Z","modified":"2026-09-28T10:47:44.439Z","0.1.0":"2026-09-17T03:51:15.327Z","0.1.1":"2026-09-17T04:16:45.587Z","0.1.2":"2026-09-17T05:24:42.385Z","0.1.3":"2026-09-17T05:53:51.181Z","0.2.0":"2026-09-17T06:27:54.310Z","0.2.1":"2026-09-17T14:54:51.954Z","0.3.0":"2026-09-17T15:26:08.439Z","0.3.1":"2026-09-17T15:48:53.467Z","0.4.0":"2026-09-17T17:13:11.748Z","0.5.0":"2026-09-17T17:58:09.423Z","0.6.0":"2026-09-18T01:19:32.403Z","0.7.0":"2026-09-18T11:45:24.796Z","0.8.0":"2026-09-18T16:26:15.661Z","0.8.1":"2026-09-18T20:01:30.413Z","0.9.0":"2026-09-18T22:26:36.325Z","0.9.1":"2026-09-19T16:38:33.551Z","0.9.2":"2026-09-19T19:50:15.735Z","0.9.3":"2026-09-19T20:49:56.489Z","0.9.4":"2026-09-19T21:35:18.383Z","0.10.0":"2026-09-19T22:21:14.690Z","0.10.1":"2026-09-19T23:25:35.249Z","0.10.2":"2026-09-20T00:38:08.924Z","0.10.3":"2026-09-20T01:56:13.762Z","0.10.4":"2026-09-21T10:45:48.683Z","0.11.0":"2026-09-21T22:41:10.199Z","0.12.0":"2026-09-22T01:14:49.954Z","0.13.0":"2026-09-22T10:44:49.696Z","0.14.0":"2026-09-22T16:18:46.026Z","0.14.1":"2026-09-27T19:41:49.577Z","0.14.2":"2026-09-28T10:47:44.112Z"},"bugs":{"url":"https://github.com/raccioly/testguard/issues"},"author":{"name":"Ricardo Accioly","email":"raccioly@gmail.com"},"license":"MIT","homepage":"https://github.com/raccioly/testguard#readme","keywords":["testing","fault-injection","mutation-testing","test-quality","claims","verification","vitest","ai-agents","test-generation","claim-verification","github-actions","quality-gate"],"repository":{"url":"git+https://github.com/raccioly/testguard.git","type":"git"},"description":"Breaks your code on purpose and reports every promise your tests did not notice breaking. Mutation testing bound to the claims a project makes — vitest, jest, Playwright, pytest and unittest.","maintainers":[{"name":"raitec","email":"raccioly@gmail.com"}],"readme":"# TestGuard\n\n<!-- docguard:quality negation-load off — this README explains a tool defined by what must not happen; the negations are the product. -->\n<!-- docguard:quality passive-voice off — verdicts and artifacts are the subjects throughout (\"a fault is applied\", \"evidence is written\"); naming an actor would misdescribe a tool nobody operates interactively. -->\n\n[![CI](https://github.com/raccioly/testguard/actions/workflows/ci.yml/badge.svg)](https://github.com/raccioly/testguard/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/testguard-cli.svg)](https://www.npmjs.com/package/testguard-cli)\n[![PyPI](https://img.shields.io/pypi/v/testguard-cli.svg)](https://pypi.org/project/testguard-cli/)\n[![node](https://img.shields.io/node/v/testguard-cli.svg)](https://nodejs.org)\n[![license](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)\n[![deps](https://img.shields.io/badge/runtime%20deps-1%20pinned-brightgreen.svg)](./package.json)\n\n> Breaks your code on purpose and reports every promise your tests did not\n> notice breaking.\n\n**Not a test generator. A claim verifier.** Test generation is what happens\nafter a claim turns out to be unfalsifiable.\n\nThird tool following the Guard pattern, alongside\n[`docguard-cli`](https://www.npmjs.com/package/docguard-cli) (docs ↔ code) and\n[`websec-validator`](https://pypi.org/project/websec-validator/) (attack\nsurface ↔ code). All three run one loop:\n\n> declare what must be true → try mechanically to falsify it → freeze a\n> baseline → gate only the delta → brief the agent before it writes code.\n\n## In one minute\n\n**Coverage tells you a line ran. It never tells you anyone checked the\nresult.** So a codebase can be fully covered and completely undefended, and\nnothing in CI will say a word.\n\nHere is a real test, from this repository's own fixture:\n\n```js\nexpect(store.writeAudit).toHaveBeenCalledWith(\n  expect.objectContaining({ action: 'MASK', scope: 'g1', ruleCount: 1 }),\n);  // `content` is never named — so nothing checks it\n```\n\n`objectContaining` ignores keys it does not list. Swap the redacted text for\nthe **raw secret** and this test still passes. Coverage of that line: 100%.\nThe audit log now leaks the very thing it exists to protect.\n\n**The method: break the code deliberately, then watch what the tests do.**\n\n- **killed** — you broke it, a test failed. Good. That behaviour is genuinely\n  defended.\n- **SURVIVED** — you broke it, everything stayed green. A blind spot.\n\nThe word trips everyone once: it is the *fault* that survived, not the test.\n**SURVIVED is the bad news.** A healthy report is full of `killed`.\n\nBut *\"did the tests fail?\"* is a sloppy question — a red suite is not proof of\ndetection. So there are seven verdicts, and each means something different:\n\n| Verdict | What it means |\n|---|---|\n| `killed` | A test body ran and rejected the behaviour. The only good outcome. |\n| `SURVIVED` | Everything passed. A real blind spot in the tests. |\n| `NOCOVER` | No test even looks at this code. Not \"weak tests\" — *no* tests. |\n| `UNVERIFIABLE` | The fault could not be applied: its anchor moved, or matches twice. Nothing was learned. |\n| `FAULT-INVALID` | The break itself was broken — it did not compile. Our fault, not yours. |\n| `TIMEOUT` | The suite hung. A hang is not a detection. |\n| `FLAKY-DEFENDER` | The tests are not reliable enough on untouched code to be asked the question. |\n\nEvery ambiguity rounds toward *unproven*: three runs rather than one, a green\nbaseline required before any fault is injected, and a timeout, a load failure\nor a mixed result is never a kill. The reason is the constraint the whole\ndesign follows from — **a tool that reports everything as caught is worse than\nno tool at all, because nobody questions good news.**\n\n**What is not new:** breaking code to test your tests is *mutation testing*,\nand it dates to the 1970s. Stryker, PIT, mutmut and Cosmic Ray all do it.\n\n**What is different is the question.** Classic mutation testing mutates\neverything mechanically and hands you *\"mutation score: 73%\"* — a number that\nis not actionable, not auditable, and cannot tell you which promise is at\nrisk. TestGuard binds every fault to a **stated claim**, so the output is not\na score but a finding: *\"Your project says a missing scope fails closed.\nNothing checks that.\"* That is the difference between a metric and an audit.\n\n📄 **[Read the six-page technical brief (PDF)](docs/testguard-explained.pdf)**\n— the idea on page one, then the field evidence, the anatomy of a run, the\nverdicts, the loop and its calibration, and the prior art.\n\n## Why\n\nCoverage cannot tell a test that pins *correct* behaviour from one that pins\na *defect*. An agent that writes both the code and its tests encodes whatever\nit believed — including its bugs — and the suite goes green.\n\nMeasured on a real, entirely AI-authored production codebase with ~4,900\ndisciplined tests (no snapshots, 0.4% zero-assertion): **8 of 9 real\nhistorical bugs were invisible to the suite**, worst case 2,451 tests green\non known-broken code. The largest gap was a compliance-critical path with\n100% coverage, where the one assertion that mattered used\n`expect.objectContaining({...})` and omitted the field carrying the data.\n\nA second, independent run on a different AI-authored codebase (63 test\nfiles, 458 tests, 24 hand-written security claims, 39 faults): **21 of 39\nfaults survived a fully green suite — 9 of them critical.** Super-admin\ngating, membership checks, cookie flags and the whole authorization callback\ncould be disabled without a single test noticing. One test file had\nre-implemented the authorization logic *inside the test* and asserted\nagainst the copy: fifteen green tests, zero detection. After wrapper-level\ntests were written against the survivors, 39/39 were killed.\n\nThe peer-reviewed picture in 2026 says the same thing from the other side.\nCoverage and mutation score of LLM-generated suites track effectiveness only\nwhen the code under test is assumed correct; once it may be buggy they \"no\nlonger serve as reliable indicators\" ([Zhao, Zhou and Cohen, ISSTA 2026](https://arxiv.org/abs/2607.22880)).\nBuggy code steers a model toward tests that assert the bug, and prompting\nwith the specification is the mitigation that works ([arXiv 2607.22883](https://arxiv.org/abs/2607.22883)) —\nwhich is why a claim here comes from intent, a fault is bound to the claim,\nand the brief hands the agent the claim before it writes. And agents\nsaturate whatever tests they can see, with the gap to held-out tests\ngrowing about 28 points per tenfold increase in code size ([SpecBench](https://arxiv.org/abs/2605.21384)).\nEvery generator on the market admits a test because it compiles, passes and\nraises coverage. TestGuard admits it because it fails when the claim is false.\n\n## Install\n\n| How | Command |\n|---|---|\n| npx (no install) | `npx testguard-cli probe` |\n| npm | `npm i -D testguard-cli` then `npx testguard probe` |\n| pip | `pip install testguard-cli` then `testguard probe` (needs Node ≥ 20) |\n| Homebrew | `brew tap raccioly/tap && brew install testguard` |\n| GitHub Action | `uses: raccioly/testguard@v0.14.2` — see [`action.yml`](./action.yml) |\n| pre-commit | `repo: https://github.com/raccioly/testguard`, hooks `testguard-claims`, `testguard-probe` |\n| GitLab CI | `include: - remote: https://raw.githubusercontent.com/raccioly/testguard/v0.14.2/packaging/gitlab/testguard.gitlab-ci.yml` with `inputs:` — see [`packaging/gitlab/`](./packaging/gitlab/testguard.gitlab-ci.yml) |\n\nProjects that set `min-release-age` in `.npmrc` cannot see a version published\nless than that many days ago (`ENOVERSIONS`); install that one with\n`npm i -D testguard-cli --min-release-age=0`.\n\n## Usage\n\n```bash\nnpx testguard-cli init                      # install the agent layer at the git root\nnpx testguard-cli status --json             # where the project is, and the ONE next action\nnpx testguard-cli claims                    # what does this project claim, and is each claim probeable?\nnpx testguard-cli claims --check-anchors    # fail fast if an exact anchor moved or a replacement no longer parses\nnpx testguard-cli scaffold src/auth.ts      # propose faults for a file, as a draft to keep or drop\nnpx testguard-cli probe                     # try to falsify each claim; report what the tests missed\nnpx testguard-cli admit test/auth.test.ts --claim AUTH-ADMIN   # does this test satisfy the two-gate rule?\nnpx testguard-cli baseline                  # freeze today's unproven findings; only new ones gate\nnpx testguard-cli gate --changed origin/main # fail when a changed source file carries no claim\nnpx testguard-cli sweep --changed origin/main # no claims yet? propose faults for the changed files and report what nothing noticed\nnpx testguard-cli brief --text              # tell the agent where the suite is blind, before it writes\nnpx testguard-cli replay --since v1.0..HEAD # would this suite have caught the bugs that escaped?\nnpx testguard-cli mcp                       # serve the read-only loop over MCP, on stdio\n```\n\nExit codes are the contract: `0` nothing new to prove, `1` unproven claims,\nunclaimed changes or invalid fault anchors, `2` a precondition failed and\nnothing was probed, `3` usage.\nEvery command accepts `--json`.\n\n## How it works\n\n```bash\nnpx testguard-cli init        # install the agent layer: skill, session-start hook, AGENTS.md section\nnpx testguard-cli status --json   # where the project is and the ONE next action — the machine entry point\nnpx testguard-cli claims      # what does this project claim, and is every claim probeable?\nnpx testguard-cli probe       # try to falsify each claim; report what the tests missed\nnpx testguard-cli baseline    # freeze today's unproven findings; from now on only new ones gate\nnpx testguard-cli brief       # tell the agent where the suite is blind, before it writes\nnpx testguard-cli gate --changed origin/main   # fail when a changed source file carries no claim at all\nnpx testguard-cli scaffold src/x.ts   # propose faults for a file, as a draft to keep or drop\nnpx testguard-cli admit test/x.test.ts --claim X   # is this test green on HEAD and does it fail on every fault of X? ADMITTED or NOT ADMITTED\n```\n\n1. **Claims** live in `testguard.claims.json` (editors validate it against\n   `\"$schema\": \"./node_modules/testguard-cli/spec/schemas/claims.schema.json\"`):\n   a statement, where it comes from, which tests supposedly defend it, and\n   one or more *faults* — each a deterministic source change that would make\n   the statement false. Every\n   claim and every fault records who produced it. `testguard claims`\n   validates the file and reports drift against `@claim <ID>` annotations in\n   source. Test files are deliberately not scanned — a claim asserted by a test is the authorship trap the tool exists for — and annotation ids must contain a hyphen so prose is never mistaken for one.\n   `claims --check-anchors` additionally locates every exact anchor and parses\n   each in-memory JavaScript or Python replacement. It runs no tests, creates\n   no worktree and changes no file, so a moved anchor is reported before an\n   expensive probe. It reports and stops; it never guesses a new anchor.\n2. **Probe** confirms the defenders are green N times unmodified, applies\n   each fault in a scratch git worktree (your tree is never touched), runs\n   the defenders N times, re-runs survivors against the whole suite with\n   N-run attribution (up to N: it stops as soon as no test has failed in\n   every run, because from there none can be named a killer), restores, and\n   classifies. It warns when another test runner is already running — a\n   contended machine turns a slow suite into a `TIMEOUT` verdict about the\n   load, not the claim — records that on the evidence, and offers `--serial`\n   to run one test file at a time. Verdicts are a closed set:\n\n   | Verdict | Meaning |\n   |---|---|\n   | `killed` | a test body rejected the behaviour, N/N — the only pass |\n   | `SURVIVED` | the defenders stayed green while the claim was false |\n   | `NOCOVER` | no test file defends the claim at all |\n   | `UNVERIFIABLE` | the fault's anchor is missing or ambiguous — loud, never a skip |\n   | `TIMEOUT` | the defenders hung; a hang is not a detection |\n   | `FAULT-INVALID` | the replacement does not load — a bad fault, not a finding |\n   | `FLAKY-DEFENDER` | the defenders are not reliably green, or disagreed across runs — `detail.flakeRate` says how often (`failures` of `runs` on unmodified source) |\n\n   Never a single score. Findings are ranked by severity, claim provenance\n   and blast radius (relative imports, `tsconfig` path aliases and\n   `package.json#imports` are resolved; bare package names are not), and\n   written to `.testguard/evidence.json` — validated against the spec before\n   it is written.\n\n   Worktree mode probes a **commit**. If a defender or target file has\n   uncommitted changes and you asked for the implicit HEAD, `probe` refuses\n   and says so — otherwise your new tests would be silently absent and the\n   same survivors would come back with no hint why. `--include-dirty`\n   snapshots the working tree (tracked edits and new files) into a throwaway\n   commit and probes that; your tree, HEAD and index are never touched. An\n   **explicit `--ref`** (a pre-fix commit in a post-mortem, say) is honoured\n   over a dirty tree, as is `--ignore-dirty`: a warning names the files and\n   the evidence records them as `repo.ignoredDirty`, so the run says what it\n   did not look at. Every summary names the commit probed.\n\n   A claim with no `defendedBy` has its defenders **discovered**: the test\n   files that import the fault's target, by relative path or resolved alias\n   (tsconfig `paths`, through `extends` and `references`, vite/vitest\n   `resolve.alias`, package.json `imports`) — **minus the files that mock\n   it**. A test that `vi.mock`s / `jest.mock`s the target cannot detect any\n   fault in it; counting it would make `NOCOVER` under-report and waste runs.\n   `NOCOVER` therefore means exactly \"no test file imports this source\n   without mocking it\". `claims` prints the split (`18 import · 16 mock · 2\n   can detect`), the evidence lists the mocking files, and a mocking file\n   that never `expect(...)`s anything imported from the target carries the\n   static signal `mocked-never-asserted` — the cheapest blind-spot signal\n   there is, and the exact signature of one escaped bug in the field\n   reports. Silence it, visibly, with `// unasserted: <why>` above the mock.\n   Its sibling `persistence-payload-unasserted` is attached to a **survivor\n   on a write path** whose defender mocks the database: the test can prove\n   the call shape and never that the row landed, and the signal names the\n   mocked layer and the file's assertion mix (exact, partial, argument-free).\n\n   Runners: **vitest**, **jest**, **Playwright** and **Python** (`--runner\n   auto` picks the first of vitest, jest, python that resolves). A JavaScript\n   runner is resolved from the **project's own package** first — its pinned\n   version, its own bin script — and only then from an executable on PATH,\n   which the evidence records as `runner.source: \"path\"`; `npx` is never\n   asked, because its cache answers for packages a project does not have.\n   Anything else goes through `--runner-cmd`. Each runner is proven against\n   its own copy of the known-answer fixture.\n\n   **Python** runs under `pytest` when the project's interpreter can import\n   it and stdlib `unittest` when it cannot, and the evidence records the\n   engine that actually ran — `--runner pytest` or `--runner unittest` pins\n   the choice and fails rather than falling back. Nothing is installed into\n   the project: the reporters ship inside TestGuard and reach the interpreter\n   through `PYTHONPATH`, so a codebase whose test dependencies are the\n   standard library stays that way. The interpreter is the project's\n   `.venv`/`venv`, the active `VIRTUAL_ENV`, or `--python <path>`. A `.py`\n   defender runs under Python whatever the project runner is, so one claim\n   can be defended by a vitest test and a pytest test at once.\n\n   Two things Python forces that JavaScript does not. **`patch(\"pkg.mod.fn\")`\n   is not `vi.mock`**: it replaces one attribute, so the file is still a\n   defender of every other fault in that module — it keeps its place and\n   carries a `target-attribute-patched` signal naming the attributes. And\n   **the fault must be the code that ran**: a strict editable install puts an\n   import hook ahead of `sys.path`, so Python can load the original file while\n   TestGuard faults the copy — a green baseline, every claim `SURVIVED`, and a\n   report that reads as a devastating finding while being entirely false. With\n   the fault applied, TestGuard asks which file was actually imported and\n   refuses the run when it is outside the tree being probed. When no defender\n   imported the subject at all, the run continues and the record says so\n   (`detail.targetNotImported`), because that is a fact about the defenders'\n   reach and not about their assertions.\n\n   The two-gate rule, as one verb: `testguard admit <test-file> --claim <ID>`\n   runs the claim's faults against your uncommitted test and answers\n   `ADMITTED` (exit 0: the test is green on unmodified HEAD and fails on\n   every fault, N/N) or `NOT ADMITTED` (exit 1: the first blocking fault and\n   what to do about it). The test must be a declared or discovered defender\n   of the claim. It is sugar over `probe --claim <ID> --include-dirty`, so\n   it can never disagree with the gate. Every generator on the market admits\n   a test because it compiles, passes and raises coverage; `admit` admits it\n   because it fails when the claim is false.\n\n   Practical loop: first pass `--no-escalate` (escalation re-runs the whole\n   suite N times per survivor); iterate on one claim with `--claim <ID>`, or\n   select a batch with commas or repeated flags (`--claim A,B --claim C`).\n   Every occurrence is retained in first-seen order, duplicates are collapsed,\n   and partial human/JSON output names both the requested and probed counts, so\n   a green subset cannot masquerade as the selection the operator asked for.\n   Use either `--include-dirty` or `--in-place` (only fault target files must be\n   clean there; test files may be dirty), optionally `--confirm 1` for a fast\n   **provisional** signal — verdicts print with a `?`, evidence goes to\n   `evidence-provisional.json`, and `baseline` refuses it; final pass with\n   defaults. By default\n   the stream shows only unproven faults plus a killed count — `--verbose`\n   shows every fault. A custom\n   runner (`pnpm --filter`, a specific config) goes in\n   `--runner-cmd \"<cmd> {files} … {out}\"`; if the scratch worktree cannot\n   see your `node_modules`, pass `--node-modules <dir>`.\n3. **Baseline** freezes every non-passing fingerprint. Later probes suppress\n   what was already known and exit non-zero only on what is new. Claims whose\n   source and defenders are unchanged reuse their prior verdict, so a probe\n   in CI costs only what changed. A baseline frozen from `--include-dirty`\n   evidence records the snapshot and points at the *parent* of the commit\n   that will carry your tests; after you commit, a clean `probe` plus\n   `baseline --restamp` moves it to that commit — only when the fingerprints\n   are identical, never otherwise. `status` notes a baseline that predates\n   HEAD without making it a state.\n4. **Brief** turns evidence plus baseline into a ranked, capped\n   `## TEST BLINDSPOT CONTEXT` block, printed and also written to\n   `.testguard/brief.json` (`--text` prints only; `--markdown` prints the same brief as a\n   merge-request note for the human reviewer, unclaimed changes first). Wire it into an agent's session start\n   — for Claude Code, in `.claude/settings.json`:\n\n   ```json\n   { \"hooks\": { \"SessionStart\": [ { \"hooks\": [\n     { \"type\": \"command\", \"command\": \"node_modules/.bin/testguard brief --text 2>/dev/null || { command -v testguard >/dev/null 2>&1 && testguard brief --text 2>/dev/null; } || true\" }\n   ] } ] } }\n   ```\n\n   `--text` prints only, and exits 0 silently when there is no evidence yet;\n   the command resolves the project's own install, then a `testguard` on\n   `PATH`, and ends in `true` — so the hook can never break a session. There\n   is no `npx` in it, in any form: `--no-install` resolves the package from\n   the registry before declining to install it, so it is quiet rather than\n   offline. The brief's first line says which install answered\n   (`local install` or `global`), so a stale one is visible.\n\n### Would this suite have caught the bugs that already escaped?\n\nAn injected fault is a fault somebody thought of. A bug that actually shipped\nis ground truth: a human already confirmed it was a defect, and there is no\nequivalent-mutant argument to have about it.\n\n```bash\nnpx testguard-cli replay --since HEAD~50..HEAD --max 10\n```\n\nFor each fix commit in the range — one that changes source **and** a test\ntogether — `replay` checks it out in a scratch worktree, reverts only its\nsource files to the parent, **deletes the test the fix shipped** (that test\nproves nothing about what the suite knew before it existed), and runs the\ntests that import the reverted code:\n\n| Verdict | Meaning |\n|---|---|\n| `caught` | a remaining test failed by assertion, every run. The suite knew. |\n| `blind` | the suite stayed green on known-broken code. |\n| `nocover` | no test imports the reverted files — worse than blind. |\n| `flaky` | the runs disagreed, so nothing can be concluded. A flaky failure reads as detection, which biases this metric *optimistically*; mixed runs are never `caught`. |\n| `unverifiable` | the revert did not apply, or the suite could not load. |\n\nOne patch counts once (`git patch-id`), because a dual-branch topology\ncarries the same fix under two or three shas. **`replay` reports and never\ngates**: a bug that escaped is history, not a regression in this change.\n\nEach replayed bug is also labelled with the injected-fault class its diff\nmost resembles, which is the join key that turns an uninterpretable mutation\nscore into a statement with a sample size:\n\n```\n  guard-removed          missed  7/9    p=0.78  ci [0.45, 0.94]\n  field-dropped          missed  4/4    p=1.00  ci [0.51, 1.00]\n```\n\nRead as *\"when a real bug of this class escapes, how often does the suite\nmiss it\"* — a miss rate, so a high `p` is bad. It is written as a\n`calibration` document beside the replay one. `caught`, `blind` and\n`nocover` are measurements and enter the ratio, `nocover` as a miss: leaving\nit out would score a project with no tests at all for a subsystem *better*\nthan one with weak tests. `flaky` and `unverifiable` are failed measurements\nand enter neither side. Every `p` and `ci` is recomputable from `n` and the\nmiss count, and the validator recomputes them.\n\n**The open question this exists to answer.** Does a calibration learned on a\nrepository *with* history transfer to a greenfield one that has none? AI\nauthored code has no history, so replay cannot help it directly and\ncalibration is the only bridge. That transfer is unproven, it is the core\nproduct bet, and this is the instrument for testing it — not the answer.\n\n### Read CI's evidence locally\n\nVerdict reuse makes a probe cheap, but the evidence lives where `probe` ran\nand is gitignored. On a fresh clone, or on a laptop where CI does the\nprobing, the session-start brief is empty and `status` says `unprobed` while\nthe default branch has full evidence. Point either command at CI's document:\n\n```bash\ntestguard status . --evidence .testguard/ci/ci-self-evidence.json\ntestguard brief . --text --evidence .testguard/ci/ci-self-evidence.json\n```\n\nA foreign document is not trusted blindly. `status` marks it\n`evidenceSource: provided`, prints the commit it describes next to the\ncommit in your tree, and still computes staleness from the recorded input\nhashes — so a file you have edited since CI probed it goes `evidence-stale`\nfor exactly those claims.\n\n`testguard init --ci-evidence github` (or `gitlab`) writes\n`.testguard/fetch-ci-evidence.sh`, which downloads the branch-named artifact\nwith the platform CLI you already have and then briefs from it. **It is an\non-demand helper, not a hook**: the session-start hook never touches the\nnetwork, and the helper exits 0 with a message when the CLI or the artifact\nis missing. TestGuard itself still makes no network calls.\n\n### Starting from zero claims\n\n`gate` names the changed files that carry no claim, and stops there —\ncorrectly, because stating a claim is a human act. But a project adopting this\ntool reads that list, has nothing to compare it against, and closes the tab.\nThe bottleneck was never verification; it is **oracle supply**.\n\n`sweep` is the lowest rung of that supply. No claim, no concern, nothing\nwritten by anybody:\n\n```bash\nnpx testguard-cli sweep --changed origin/main          # propose, probe a bounded selection, report\nnpx testguard-cli sweep --changed HEAD --include-dirty --cap 20\n```\n\nIt takes the files `gate` just called uncovered, proposes faults with the same\nmechanical producers `scaffold` uses, probes a bounded selection, and reports\nwhat a green suite did not notice. A fault that survives needs no claim to be\nalarming: something was deliberately broken and not one test failed.\n\n```\nswept 13 of 14 unclaimed changed files against origin/main.\nproposed 510 faults, probed 10 (cap 10), deferred 350.\n  The 350 deferred are not a verdict: raise --cap, or sweep a smaller change.\n  150 presentational elements (icons, static wrappers) set aside: nobody writes a test for those, and a survivor there would teach the ordering the wrong lesson.\n\n9 findings — a deliberate break that no test noticed:\n\n  SURVIVED      src/app/actions/register.ts:118  [write path]\n    [line 118] Field dropped: `password_hash` is no longer written.\n    src/tests/actions/register.test.ts mocks @/lib/prisma; 1 exact, 8 partial,\n    31 argument-free call assertions in the file. A field dropped from the write\n    payload fails only against an assertion that names that field exactly.\n    Assert the whole object written by the call this fault changes, including\n    `password_hash` — or read the record back and assert on what was stored.\n```\n\nThree rules make it safe to run on a repository that has never seen this tool:\n\n- **It never writes `testguard.claims.json`**, and never will. A claim is a\n  sentence someone is willing to stand behind; a sentence nobody wrote is not\n  one. Its drafts land beside the evidence to keep or drop.\n- **Its evidence never replaces `.testguard/evidence.json`.** A sweep probes\n  faults nobody stated, under TODO statements; folding that into the document\n  `status` and `baseline` read would corrupt the record of what the project\n  actually claims.\n- **It does not fail on its own bad guess.** Only `survived` and `nocover`\n  exit 1. A proposal that would not compile, or an anchor that did not locate,\n  is reported and never gates — a tool that fails because its own guess was bad\n  is a tool people switch off.\n\nThe ordering **learns from your own runs**. Every evidence record already\ncarries a fault class and a verdict, so \"how often does a fault of this class\nsurvive here\" is a tally, not a new thing to collect — a sweep persists its\nevidence and the next one reads it. A project with no evidence falls back to\nthe shipped prior and says so; one with its own records overrides it in\nproportion to how many it has. The report names which, because an ordering\nnobody can trace is a number nobody should trust.\n\nThe cap and the ordering are Google's: their mutation service surfaces at most\n7 × |files| mutants per change and orders candidates on the measured\nproductivity of their operator in similar context, which took their productive\nrate from 15% to 89%\n([Petrović et al., *Practical Mutation Testing at Scale*, 2021](https://arxiv.org/abs/2102.11378)).\nTestGuard's ordering prior is measured the same way — from probed faults on a\nreal AI-authored codebase — and shrunk toward a neutral value, so one\nobservation of a class surviving never dominates a sweep. The cap is spread\nacross files: a single file with many candidates cannot make the others look\nclean.\n\nA sweep is weaker evidence than a probe, and says so. Nobody stated that the\nbehaviour mattered. It is stronger than nothing, which is what a repository\nwith no claims has — and the survivors worth defending become the first claims.\n\n#### Concerns: one sentence, two hundred screens\n\nA claim names one promise precisely, which is why a repository with two hundred\nscreens never finishes writing them. A **concern** names a *kind* of promise and\nsays where to look for it:\n\n```bash\nnpx testguard-cli concerns                      # what this project can be swept by\nnpx testguard-cli sweep --concern ADMIN-GUARDS  # aim a sweep at one\n```\n\n```json\n{\n  \"schemaVersion\": 1,\n  \"concerns\": [\n    {\n      \"id\": \"ADMIN-GUARDS\",\n      \"statement\": \"Every admin route refuses a caller without the admin role.\",\n      \"severity\": \"critical\",\n      \"targets\": { \"kind\": \"glob\", \"globs\": [\"src/app/api/admin/**\"] },\n      \"faultClasses\": [\"guard-removed\", \"condition-forced\", \"return-altered\"]\n    }\n  ]\n}\n```\n\nFive lines, and the sweep reports:\n\n```\nconcern ADMIN-GUARDS matches 24 files. Swept 23.\n  158 further proposals were outside this concern's fault classes.\n\nSURVIVED   src/app/api/admin/claims/[id]/route.ts\n  [line 41] Guard never triggers: `if (!membership || (membership.role !== 'owner'\n  && membership.role !== 'manager'))` becomes `if (false)`.\n```\n\nThe idea is Meta's: ACH has an engineer describe an area of concern in plain\ntext and gates every generated step by execution. What is taken here is the\n**unit** — the concern as the thing a human writes — not their generator, and\n**no model is required**. A concern's useful core is a named scope plus a\nproducer selection, which the mechanical producers already satisfy, so every\nverifying command stays offline.\n\nTwo concerns ship built in, and only two. An authorization concern would need a\nheuristic for *\"which files check permissions\"*, and a guess there is exactly\nthe noise that gets a check switched off — so `SAVE-PERSISTS` and\n`CHANGED-CODE` are the defaults, and a project that knows its own auth layer\nsays so in three lines. Declaring a concern with a built-in's id replaces it,\nand the replacement is reported rather than silent.\n\nA concern is **not** a claim and never becomes one by itself. It says where to\nlook; the probe says what it found; a human states the sentence worth defending.\n\n#### Sweeping the save surface instead of the diff\n\nA diff cannot answer *\"when the user clicks save, does it actually save?\"* — it\nonly knows what changed today. `--save-paths` points the same sweep at every\nfile that writes to storage:\n\n```bash\nnpx testguard-cli sweep --save-paths --cap 20\n```\n\n```\n119 writes to storage across 37 files, carrying 226 payload fields. Swept 36.\nproposed 762 faults, probed 20 (cap 20), deferred 742.\n\nSURVIVED   src/app/actions/register.ts  [write path]\n  [line 59] Field dropped: `password_hash` is no longer written.\n  src/tests/actions/register.test.ts mocks @/lib/prisma; 1 exact, 8 partial,\n  31 argument-free call assertions in the file. A field dropped from the write\n  payload fails only against an assertion that names that field exactly.\n```\n\nThe first line is the point. A report that lists findings without saying how\nmuch surface it looked at invites you to assume the rest is fine, so the\ndenominator comes first and the document carries `writeSites` and\n`payloadFields` whether or not anything survived. Measured on a real\nAI-authored application: **12 of 26 probed persistence faults survived a fully\ngreen suite, and all 12 were a dropped payload field.**\n\nIt also states, before any verdict, **what the defenders could prove at all**:\n\n```\nof those 37 files: 32 defended only by tests that mock the persistence layer,\n1 with an unmocked defender, 4 with no defender at all.\n```\n\nThat line is the read-back answer. A test that replaced the database can prove\nthe *call shape* and nothing beyond it — a `where` that matches no rows, a\nrolled-back transaction and a rejected constraint all pass against a mock that\nrecorded the arguments and returned a plausible object. So rather than pretend\nto measure persistence, TestGuard states the limit, the same way `nocover` says\n\"no test imports this\" instead of guessing.\n\nWhen every defender mocks the layer, the report says so outright: *nothing in\nthis suite can prove a write reached storage*. A clean probe there is not\nevidence of persistence — it is evidence that nothing could have measured it.\n\n`unmocked` is deliberately weaker than \"proves persistence\": a test that does\nnot replace the database may simply never reach it. Possible is the honest word.\n\n### Every change needs a claim\n\n`probe` can only verify claims that exist. Every escaped defect in the field\nreports so far was a **claim gap**: the feature shipped green with zero\nclaims, and a verifier with no claim about a feature is silent about it by\nconstruction. `gate` closes that hole on the delta:\n\n```bash\nnpx testguard-cli gate --changed origin/main            # in a PR: the files changed since the base branch\nnpx testguard-cli gate --changed HEAD --include-dirty   # before a commit: the working tree, staged or not\n```\n\nEvery changed source file must carry a fault, resolve as a defender of a\nclaim (test files), or be excused by an unexpired `path` entry in\n`testguard.ignore.json` — with a reason a reviewer will accept. One\nunclaimed file exits `1`; there is no percentage. Every reliance on an ignore\nentry is printed, so a reviewer sees *why* the gate passed; an expired entry\nexcuses nothing. Non-source files and documented never-claimed patterns\n(`*.d.ts`, `*.config.*`, fixtures, mocks; `--explain` lists them) are\nexcluded and said so; `--strict` fails a change that evaluated nothing.\n\nAn ignore file is a list of `entries`. The field is `pattern`, and `reason` is\nnot optional — it is the whole point of the mechanism:\n\n```json\n{\n  \"$schema\": \"./node_modules/testguard-cli/spec/schemas/ignore.schema.json\",\n  \"schemaVersion\": 1,\n  \"entries\": [\n    {\n      \"kind\": \"path\",\n      \"pattern\": \"src/commands/**\",\n      \"reason\": \"Thin wrappers: read flags, call the module, print. The logic is claimed in the modules they call.\",\n      \"by\": \"maintainer\",\n      \"at\": \"2026-09-17T00:00:00Z\"\n    },\n    {\n      \"kind\": \"path\",\n      \"pattern\": \"src/legacy/billing.ts\",\n      \"reason\": \"Scheduled for deletion in Q4; claims would outlive the file.\",\n      \"by\": \"maintainer\",\n      \"at\": \"2026-09-17T00:00:00Z\",\n      \"expires\": \"2026-12-31T00:00:00Z\"\n    }\n  ]\n}\n```\n\n`kind: \"claim\"` entries take the same shape and excuse a *removed claim*\ninstead of an unclaimed file. An entry past its `expires` excuses nothing and\nis reported as `EXPIRED`.\n\nWith a reference known, `status --changed <ref>` reports `unclaimed-changes`\n**before** any evidence state and makes the claim the next action; the brief\nlists the unclaimed files first. The claim is written before more code.\nAfter claim coverage, `status` reports `invalid-anchors` before any evidence\nstate when an exact fault anchor is missing or ambiguous, and points at the\nfault definition to repair. Repair preserves the fault's meaning and requires\na re-probe; there is deliberately no `--fix`.\n\n**The base is detected when Git records it.** An explicit `--changed` wins,\nthen `TESTGUARD_CHANGED_REF`, GitHub Actions (`GITHUB_BASE_REF`) and GitLab\nmerge request pipelines (`CI_MERGE_REQUEST_DIFF_BASE_SHA`, then\n`CI_MERGE_REQUEST_TARGET_BRANCH_NAME`). In an ordinary clone on a feature\nbranch, bare `testguard gate` uses the configured remote's symbolic default\nbranch (normally `origin/main`) and says how it chose it. If that symbolic ref\nis absent, a configured upstream is used only when its branch name differs\nfrom the current branch. A feature branch's same-name tracking ref and the\ndefault branch itself are never selected: either could produce a misleading\nempty diff. In those ambiguous cases, pass `--changed` explicitly.\n\nThe base must exist locally: GitHub — `actions/checkout` with `fetch-depth: 0`;\nGitLab — the diff base sha needs nothing extra on a merge request pipeline,\nthe branch name needs `GIT_DEPTH: 0` or a `git fetch origin <target>`. A\ndetected base that does not resolve is a warning for `status` and `brief`\n(they keep working) and an error for `gate` (its whole job is the measurement).\n\n```yaml\n# GitHub Actions\n- uses: actions/checkout@v4\n  with: { fetch-depth: 0 }\n- uses: raccioly/testguard@v0.14.2\n  with: { command: gate }\n\n# GitLab CI — the component-shaped template: gate + probe, brief as an artifact and, opted in, as a merge-request note\ninclude:\n  - remote: 'https://raw.githubusercontent.com/raccioly/testguard/v0.14.2/packaging/gitlab/testguard.gitlab-ci.yml'\n    inputs: { dir: backend, post_note: true }   # post_note needs TESTGUARD_GITLAB_TOKEN (api scope); one note, updated in place\n```\n\nThe template carries `spec: inputs:` (`version`, `dir`, `image`, `severity`,\n`confirm`, `budget`, `no_escalate`, `strict`, `post_note`, `stage`), so\nmirrored into a GitLab project it is a catalog component that a compliance\nframework can require on every project in a group. The CLI itself never\ntalks to the network; only the job posts, and only when told to.\n\n### Properties\n\n- **Deterministic measurement.** No model decides a verdict. Faults are\n  string substitutions from a reviewed file; verdicts come from the test\n  runner's structured report, confirmed N times. The same inputs give the\n  same evidence, which is what makes it replayable for an auditor.\n- **No network, no telemetry.** The CLI never opens a socket. The\n  session-start hook resolves an installed binary and never fetches one.\n  Nothing leaves the machine unless a CI job you configured posts it.\n- **Artifacts are data in the repository.** Claims, evidence, baseline and\n  brief are JSON validated against a published schema before they are\n  written. Nothing is healed, regenerated or re-targeted at run time; a\n  claims file is code, and is reviewed like code.\n- **Never optimistic.** A timeout, a load failure, a mixed N-run result, a\n  flaky defender or a missing anchor is reported as unproven, never rounded\n  toward green. The one pass is `killed`; everything else gates.\n- **One exact-pinned runtime dependency** (`ajv`), Node ≥ 20, MIT.\n\n### Prior art, and what was taken from where\n\nBreaking code to test the tests is mutation testing, and it dates to the 1970s.\nTwo industrial programmes solved the parts that make it usable, and this tool\ntakes from both.\n\n**Google** made it affordable: mutate only *changed* lines, cap what is\nsurfaced at seven per file, and order candidates by the measured productivity\nof the operator in similar context — developer feedback took their productive\nrate from 15% to 89%\n([Petrović et al., 2021](https://arxiv.org/abs/2102.11378)). `sweep`'s diff\nscope, its cap and its ordering are theirs; the productivity prior here is\nmeasured on real probed faults rather than assumed.\n\n**Meta** made it specific: an engineer writes a *concern* in plain text, a\nmodel drafts faults for it, and every step is gated by execution before a\nhuman ever sees it — 73% of the resulting tests were accepted\n([Foster et al., FSE 2025](https://arxiv.org/abs/2501.12862)). The rule that\nnothing a model proposes reaches the claims file without passing `probe` and a\nhuman keep is theirs.\n\nWhat neither does is bind a fault to a **stated promise**, which is what this\ntool is for. The full record — including what was deliberately *not* taken, the\nmeasured reason no model decides a verdict, and the gaps in what we borrowed —\nis in [`docs-canonical/PRIOR-ART.md`](docs-canonical/PRIOR-ART.md).\n\n### What TestGuard is not\n\n- **Not a test generator.** It judges a test the agent wrote (`admit`); the\n  generating half stays with the agent, where the market is putting it.\n- **Not a mutation-score dashboard.** No blanket mutants, no single score, no\n  threshold. Faults are few and bound to stated claims; findings are ranked,\n  never summed.\n- **Not a self-healing runner.** A defender that adapts itself to a change is\n  a defender that did not observe it; TestGuard reports that, it does not do\n  it.\n- **Not a coverage tool.** A line executed says nothing about whether an\n  assertion would notice. `NOCOVER` here means no test even imports the\n  file; everything above that is measured by injecting the fault.\n\nA claim that **disappeared** is invisible to all of the above: `probe`\nverifies the claims that exist, `gate` sees the source file covered by some\nother claim, and `status` says clean. Deleting a claim is therefore cheaper\nthan weakening its fault — and `changedFaults` exists precisely because\nweakening was the cheap escape. So:\n\n```bash\nnpx testguard-cli claims --since origin/main    # what existed there and does not now\n```\n\n`removed-claim` and `removed-fault` gate; a rename that keeps the statement\nverbatim is reported as `renamed-claim` and does not. Where evidence is\npresent, the line names the verdict the claim last had, because *\"it was\nSURVIVED when it was removed\"* is the sentence that matters. The escape hatch\nis the same one as everywhere else: a `claim` entry in\n`testguard.ignore.json` with a reason, expiring if you give it an `expires`.\nRemoval is allowed — claims can be wrong, superseded or split — and it is\nnever silent.\n\n### Probing a Python project\n\nNothing is installed into your project. TestGuard carries its own reporters and\nputs them on the interpreter's `PYTHONPATH`, so a codebase whose test\ndependencies are the standard library keeps none.\n\n```bash\nnpx testguard-cli probe .                        # auto: pytest if importable, else stdlib unittest\nnpx testguard-cli probe . --runner unittest      # pin the stdlib engine\nnpx testguard-cli probe . --python .venv/bin/python\n```\n\nThe evidence records the engine that actually ran, and `--runner pytest` fails\nrather than quietly using `unittest` — which engine ran changes what the\nevidence means.\n\nThree things behave differently from JavaScript, and each one is a place a\nnaive port would have produced a confident wrong answer:\n\n- **Defenders are matched by module name**, the way Python itself matches, so\n  a test that reaches your package through `sys.path`, a `conftest.py` or an\n  installed distribution is found either way.\n- **`patch(\"pkg.mod.fn\")` is not `vi.mock`.** It replaces one attribute, so the\n  file still detects a fault anywhere else in that module: it stays a defender\n  and carries a `target-attribute-patched` signal naming the attributes. Only a\n  patch of the module *itself* removes a defender.\n- **The fault has to be the code that ran.** A strict editable install puts an\n  import hook ahead of `sys.path`, so Python can load your original file while\n  TestGuard faults its copy — green baseline, every claim `SURVIVED`, and a\n  report that reads as a catastrophe while being entirely false. With the fault\n  applied TestGuard asks which file was really imported and **refuses the run**\n  if it came from outside the tree being probed. If no defender imported the\n  subject at all, the run continues and the record says so\n  (`detail.targetNotImported`): that is a fact about the tests' reach, not\n  about their assertions, and the two must not read alike.\n\n`testguard scaffold path/to/module.py` proposes Python faults the same way it\ndoes for JavaScript.\n\n### Run it from any harness\n\nThe operating loop above lives in a Claude Code skill and a session-start\nhook. Both vanish the moment the harness is Cursor, Codex, Devin or whatever\ncomes next — and the harness is exactly the layer most likely to change. So\nthe same documents are also served over the Model Context Protocol:\n\n```bash\nnpx testguard-cli mcp            # JSON-RPC 2.0 on stdio\nnpx testguard-cli init --mcp     # prints the config for Claude Code, Cursor and Codex\n```\n\nFive tools, all **read-only**: `testguard_status`, `testguard_brief`,\n`testguard_claims`, `testguard_evidence`, `testguard_next_command`.\n\n**No tool runs a probe.** A probe is long-running, budgeted, and the person\nshould see it happen, so `next_command` hands back the exact shell line for\nthe agent to run in its own terminal. Nothing here writes a file either —\nediting a claims file through a connector would defeat the point of recording\nevery fault edit. The server declares only a `tools` capability: no prompts,\nno resources, no sampling.\n\nIt is hand-written against a pinned protocol version rather than built on the\nofficial SDK, because this tool has one exact-pinned runtime dependency and\nkeeps it that way. The surface is three methods and five tools and will not\ngrow; tests speak the wire format to a real child process and check each\ntool against the CLI's own `--json` output, so the two cannot drift.\n\n### Built for agents to run\n\nTestGuard is meant to be driven by an AI agent, not typed by a person. Three\nthings make that safe:\n\n- **One source of truth.** `testguard status --json` computes `state` and the\n  one `next` action from the claims file, the evidence, the baseline and the\n  working tree. Every human rendering — the CLI text, the session-start\n  brief, the skill — derives from it, so they cannot disagree. Every command\n  accepts `--json`.\n- **An installable operating loop.** `testguard init [dir]` writes the\n  **agent layer at the git root**, where agent sessions run —\n  `.claude/skills/testguard/SKILL.md` (state → action, verdict → the only\n  acceptable fix, the two-gate rule for any test the agent writes), the\n  `brief --text` session-start hook, an `AGENTS.md` section — and the\n  **project layer** (`.gitignore` lines) beside the claims file. A second\n  project in the same repository adds a hook line and an `AGENTS.md`\n  bullet; `--here` keeps everything in the subdirectory. The hook\n  resolves the project's `node_modules/.bin/testguard`, then the git root's,\n  then a `testguard` on `PATH` via `command -v`, then does nothing — **no\n  `npx` in any form, so no path to the network**; a pre-0.6 `npx -y` or\n  `npx --no-install` hook is replaced. A written file that\n  `.gitignore` swallows is reported, not offered for commit. Idempotent.\n- **Independence is recorded (L3).** `probe` measures *power* — would this\n  test notice if the code were wrong. It also records, on every kill, whether\n  the killing test was last touched by the same change (or the same author) as\n  the code it guards: `detail.independence` is `co-authored`,\n  `separate-change` or `unknown`. A co-authored kill is legitimate — a fix\n  *should* ship with its regression test — but a repository where every kill\n  is co-authored has no independent verification, whatever its claim\n  verification rate says. It is a **signal**: ranking reads it, verdicts never\n  do, and `probe`, `status` and the brief all say it in one line. Nothing else in this category\n  measures it, and agents saturate the tests they can see\n  ([SpecBench](https://arxiv.org/abs/2605.21384)).\n- **Claimed surface is visible.** A clean probe is only about claims that\n  exist. `status` therefore reports claimed source modules over the current\n  module denominator, how many of the 20 highest-churn modules are claimed,\n  and the concrete unclaimed modules worth examining next over a bounded\n  200-commit window. Churn and path-risk signals stay separate; there is no\n  synthetic health score. When most modules remain unclaimed and the existing\n  evidence is clean, the next action expands the denominator instead of\n  congratulating the same small set of claims again.\n- **Gaming is visible.** The cheapest way to make a survivor disappear is to\n  weaken its fault, not to write a test. Evidence records every fault's\n  content hash; `status` lists any fault edited after it survived, with its\n  previous verdict, and makes reviewing that edit the next action. Editing a\n  claim is allowed — claims can be wrong — but it is never invisible.\n\n### Watching a probe that is still running\n\nA probe runs the defenders N times clean and N times per fault, which takes\nminutes. It used to print its stage line only when `stderr` was a terminal —\nso CI, a redirected log and an agent harness saw **nothing at all** for the\nwhole run, which is indistinguishable from a hang. A gate you cannot tell\nfrom a hang is a gate people start killing.\n\nThe rewriting is a rendering choice, not a reason to withhold the\ninformation:\n\n| `--progress` | What you get |\n|---|---|\n| `auto` (default) | `tty` at a terminal, `plain` everywhere else |\n| `tty` | one line, rewritten in place — for a human watching |\n| `plain` | one append-only line per stage — a log file, CI, an agent |\n| `ndjson` | one JSON object per line, stages **and** verdicts as they land |\n| `none` | silence |\n\n```bash\nnpx testguard-cli probe . > probe.log 2>&1          # now reports; used to be silent\nnpx testguard-cli probe . --progress ndjson 2>events.ndjson\n```\n\n```\n{\"event\":\"stage\",\"claim\":\"TG-COST-NAMES-SHARED-DEFENDERS\",\"fault\":\"F1\",\"stage\":\"baseline\",\"run\":1,\"of\":3,\"at\":\"…\"}\n{\"event\":\"verdict\",\"claim\":\"TG-COST-NAMES-SHARED-DEFENDERS\",\"fault\":\"F1\",\"verdict\":\"killed\",\"severity\":\"medium\",\"file\":\"src/probe/cost.mjs\",\"at\":\"…\"}\n```\n\n**Progress always goes to stderr**, so `--json` leaves stdout as one document\nand nothing else. `--quiet` and `--json` imply `none`, and an explicit\n`--progress` overrides both: an operator who asks for a stream of events has\nsaid what they want.\n\n### What the probe costs, and why a gate gets slow\n\nA probe's wall clock is not a function of how many claims you have. Per claim\nit is roughly\n\n```\n(baseline runs + faults × --confirm) × the cost of that claim's defender SET\n```\n\nso one slow acceptance test, named as a defender by five claims, is paid for\nthirty times. The symptom is a gate that takes twenty minutes; the cause is a\nsingle line in the claims file, and nothing in the output used to say which.\n\n```bash\nnpx testguard-cli claims . --cost     # read back from the last probe's evidence\nnpx testguard-cli probe . --cost      # what the run you just made spent\n```\n\n```\n63 fault records cost 24m across 378 defender runs.\n\nmost expensive claims\n    4m 58s  TG-FAULT-EDIT-VISIBLE              1 fault  · 6 runs\n\ndefender files, by the time of the runs that included them\n  (a claim runs its whole defender set at once, so these overlap and do not sum to the total)\n    24m 3s  test/probe.fixture.test.mjs                  5 claims\n\nshared defenders — each claim pays the file's full cost again\n    24m 3s  test/probe.fixture.test.mjs\n            named by TG-ESCALATION-N-RUNS, TG-FAULT-EDIT-VISIBLE, …\n```\n\nEvery number is read back out of the `durationMs` the probe already records.\n`--cost` re-measures nothing, spawns nothing, and costs the price of reading\none JSON file.\n\n**The per-file figures overlap.** A run executes a claim's whole defender set\nat once, so the runner never says how much of it belonged to which file. A\nfile's `ms` is the time of every run that *included* it: an upper bound on\nwhat removing it could save, which is the decision you are making. Only\n`totalMs` is additive.\n\n**What to do about a shared defender.** Extract the decision it proves into a\npure function, unit-test that, and point the claim at the unit test. This is\nnot a testing trick — it is the same reason `classify()` in this codebase is\npure. A rule you can state in three lines should not need a fifty-second\nacceptance test to falsify it. When the extraction is right the claim still\nfails on the fault; when it is wrong the claim SURVIVES, and the probe tells\nyou so before you have shipped a weaker gate. Do not narrow `defendedBy` and\nassume — re-probe the claim and read the verdict.\n\n### Authoring faults mechanically\n\nWriting faults by hand means reading the code to find exact anchors. Two\nfield reports found that ~80% of hand-written faults are one of nine shapes,\nso `scaffold` proposes them for you:\n\n```bash\nnpx testguard-cli scaffold src/auth.ts          # → .testguard/scaffold-auth.json (a draft, never your claims file)\nnpx testguard-cli scaffold src/auth.ts --claim AUTH-ADMIN   # every proposal under one claim; copies it if it exists\n```\n\n| Shape | What it proposes |\n|---|---|\n| `condition-forced` | `if (<guard>) {` → `if (false) {` — a guard is a `!…` condition or one whose body returns, throws or 4xx-es |\n| `statement-deleted` | a single-line guard (`if (…) return …;`) or a state change (`x = …;`) removed |\n| `return-altered` | `return <check>;` (`===`, `.includes(`, `&&`, …) → `return true;` |\n| `literal-changed` | `httpOnly`/`secure` flipped, `sameSite` → `none`, a cost/rounds → `1`, a ttl/tolerance/window/limit ×1000 |\n| `call-removed` | a bare `verify…()` / `validate…()` / `check…()` / `authorize…()` call removed |\n| `field-dropped` | a field removed from an object that is returned, built by an arrow, assigned to a payload-ish name, passed to a `save`/`update`/`send`/`write`/… call, or is a `z.object({…})`-style schema; a string entry removed from an allow-list array; a `...base,` line or inline `{ ...base, … }` merge dropped. Only a line that can go on its own (balanced, comma-terminated or followed by the closer); never inside tests, fixtures or migrations |\n| `argument-swapped` | a call kept, its first argument swapped for `undefined` (and `{}` when the argument is itself a call) — only when that argument is derived from a parameter of the enclosing function or a request-like value (`req`, `ctx`, `event`, …). The seam fault: `decide(deriveFrom(input), now)` → `decide(undefined, now)` |\n| `element-removed` | a one-line JSX element — self-closing (`<Toggle … />`) or paired (`<button …>Save</button>`) — removed; the UI shape behind \"the toggle is invisible\", killable by a browser-layer defender |\n| `handler-dropped` | an `on<Event>={…}` prop removed, whether it is its own line or inline in the tag; the control renders and does nothing |\n\nThe table above is JavaScript. `scaffold` reads Python too, and proposes the\nsame fault classes in Python syntax: `if <guard>:` → `if False:`,\n`return <check>` → `return True`, `verify=True` → `verify=False`, a\nparameter-derived argument swapped for `None`, a key dropped from a payload\n`dict` or an allow-list. Three differences are deliberate. A statement is\nremoved by replacing it with `pass`, never by deleting the line, because a\nblock whose only statement is gone is an `IndentationError`; and a line that\nleaves a bracket open (`COLOURS = {`), or sits inside one opened on an earlier\nline (`help=\"…\"` in an `add_argument(`), is never removed at all. Both exist\nbecause a fault that cannot compile is a `fault-invalid` verdict — a probe run\nspent saying nothing about the tests. Third, a **module-level dunder\nassignment** (`__version__`, `__all__`, `__author__`) is not proposed. Deleting\none does change behaviour, so it is not an equivalent mutant; it is something\nnobody writes a test for, which is the disqualification an icon already gets on\nthe JSX side — a survivor there teaches the survival-learned ordering to prefer\na barren class. The rule is narrow on purpose: a module-level *constant*\n(`DEFAULT_MAX_SIZE = 100`) is still proposed, because removing a real default\nchanges a real default. The two JSX shapes (`element-removed`,\n`handler-dropped`) have no Python meaning and are absent rather than faked.\n\nEvery proposal's `find` is the exact line with `expectHits`/`occurrence`\ncomputed from the file, so it is verifiable by construction; provenance is\n`producer: derived`; `defendedBy` is prefilled from the tests that import\nthe module; proposals are grouped under a preceding `@claim <ID>` annotation\nor by enclosing function. Statements are `TODO:` placeholders — a proposal\nbecomes a claim only when a human states what it defends. Deterministic\nheuristics, no AST, no LLM; a proposal the tool cannot anchor is never\nemitted.\n\n**Commit `.testguard/baseline.json`; ignore `evidence.json` and `brief.json`.**\nThe baseline is the frozen contract; the other two are regenerated per run.\n\nThe fault model is the auditable artifact. You never reach 100% of\ncorrectness; you reach **100% of stated claims verified**, and the statement\nof claims is what an assessor reads. A claims file is code — its `replace`\nstrings run under your test runner — so review it like code.\n\n## Try it\n\nThe repository ships a known-answer fixture with a real blind spot:\n\n```bash\ngit clone <this repo> && cd testguard && npm install\nnpm test                                  # includes probing the fixture end to end\n```\n\n`fixtures/known-answer/` is a tiny project whose audit-row test asserts with\n`expect.objectContaining({...})` and omits the `content` key. Swap the\nredacted text for the raw input and the test stays green. `probe` reports it\nas `SURVIVED`; the fixture's [README](fixtures/known-answer/README.md) walks\nthrough every verdict.\n\nThe same blind spot, in Python, is\n[`fixtures/known-answer-python/`](fixtures/known-answer-python/README.md) —\nrun under **both** stdlib `unittest` and `pytest`, which have different report\nshapes and different notions of failure and must still agree on all sixteen\nverdicts.\n\n## Status\n\n**v0.5.** Eleven commands (`status`, `init`, `claims`, `probe`, `admit`,\n`replay`, `baseline`, `brief`, `gate`, `scaffold`, `sweep`, `mcp`), vitest, jest,\nPlaywright and Python (pytest / stdlib unittest) runners, hand-authored faults\nplus a mechanical scaffold for JavaScript and Python, an agent operating layer\n(`status`, `init`) and a change gate (`gate`). The contract spine — eight JSON\nSchemas shared with the other Guard tools — is under [`spec/`](spec/). One\nexact-pinned runtime dependency (`ajv`, for schema validation); Node ≥ 20, and\nPython ≥ 3.8 only when probing Python.\n\nNot yet: test generation (the acceptance half, `admit`, exists; the generating\nhalf stays the agent's), runners beyond those four, AST-aware producers, and\nthe transfer of a calibration between repositories — `replay` measures it now;\nwhether it carries to a repository with no history is unproven. Each is\ndesigned for; none is claimed.\n\n## Licence\n\nMIT.\n","readmeFilename":"README.md"}