From 317c06177e7c63118c57df6ce4e76ce9d37fa089 Mon Sep 17 00:00:00 2001 From: Felix Date: Sat, 15 Aug 2026 21:14:59 +0800 Subject: [PATCH 1/9] Add one-time unittest exit-five updater --- .../workflows/one-time-unittest-exit-five.yml | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 .github/workflows/one-time-unittest-exit-five.yml diff --git a/.github/workflows/one-time-unittest-exit-five.yml b/.github/workflows/one-time-unittest-exit-five.yml new file mode 100644 index 0000000..9cf0932 --- /dev/null +++ b/.github/workflows/one-time-unittest-exit-five.yml @@ -0,0 +1,69 @@ +name: One-time unittest exit-five updater + +on: + push: + branches: + - fix/unittest-exit-five-semantics + paths: + - .github/workflows/one-time-unittest-exit-five.yml + +permissions: + contents: write + +jobs: + update: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + ref: fix/unittest-exit-five-semantics + - uses: actions/setup-node@v7 + with: + node-version: 24 + cache: npm + - run: npm ci + - name: Patch exit-code semantics and regression + env: + TEST_BLOCK_B64: dGVzdCgidW5pdHRlc3QgZXhpdCA1IHJlbWFpbnMgYSBmYWlsdXJlIGluc3RlYWQgb2YgYm9ycm93aW5nIHB5dGVzdCdzIG5vLWNvbGxlY3Rpb24gbWVhbmluZyIsIGFzeW5jIChjb250ZXh0KSA9PiB7CiAgY29uc3Qgcm9vdCA9IGF3YWl0IGluaXRpYWxpemVSZXBvc2l0b3J5KHsKICAgICJ1bml0dGVzdC5weSI6ICJyYWlzZSBTeXN0ZW1FeGl0KDUpXG4iLAogICAgInZhbHVlLnB5IjogImRlZiB2YWx1ZSgpOlxuICAgIHJldHVybiAxXG4iLAogICAgInRlc3RzL3Rlc3RfdmFsdWUucHkiOiAiaW1wb3J0IHVuaXR0ZXN0XG5mcm9tIHZhbHVlIGltcG9ydCB2YWx1ZVxuY2xhc3MgVmFsdWVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKTpcbiAgICBkZWYgdGVzdF92YWx1ZShzZWxmKTpcbiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSgpLCAyKVxuIiwKICB9KTsKICBjb250ZXh0LmFmdGVyKCgpID0+IHJtKHJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KSk7CiAgYXdhaXQgd3JpdGVGaWxlcyhyb290LCB7ICJ2YWx1ZS5weSI6ICJkZWYgdmFsdWUoKTpcbiAgICByZXR1cm4gMlxuIiB9KTsKICBjb25zdCByZXBvcnQgPSBhd2FpdCBhbmFseXplUmVwb3NpdG9yeSh7IHJlcG86IHJvb3QsIHJ1bkNoZWNrczogdHJ1ZSwgdGltZW91dE1zOiAyMF8wMDAgfSk7CiAgY29uc3QgdW5pdHRlc3RDaGVja3MgPSByZXBvcnQuY2hlY2tzLmZpbHRlcigoY2hlY2spID0+IGNoZWNrLnRhcmdldFJ1bm5lciA9PT0gInVuaXR0ZXN0IiAmJiBjaGVjay5leGl0Q29kZSA9PT0gNSk7CiAgYXNzZXJ0Lm9rKHVuaXR0ZXN0Q2hlY2tzLmxlbmd0aCA+PSAxKTsKICBhc3NlcnQub2sodW5pdHRlc3RDaGVja3MuZXZlcnkoKGNoZWNrKSA9PiBjaGVjay5zdGF0dXMgPT09ICJmYWlsZWQiKSk7CiAgYXNzZXJ0LmVxdWFsKHJlcG9ydC5hc3Nlc3NtZW50c1swXT8uc3RhdHVzLCAidmVyaWZpY2F0aW9uLWZhaWxlZCIpOwogIGFzc2VydC5vayhyZXBvcnQuYXNzZXNzbWVudHNbMF0/LmV2aWRlbmNlLnNvbWUoKGl0ZW0pID0+IGl0ZW0ua2luZCA9PT0gImZhaWxpbmctY2hlY2siKSk7CiAgYXNzZXJ0LmVxdWFsKHJlcG9ydC5hc3Nlc3NtZW50c1swXT8uZXZpZGVuY2VCb3VuZGFyeS5yZWFzb24sICJmYWlsdXJlLXVuYXR0cmlidXRlZCIpOwp9KTsKCg== + CHANGELOG_BULLET_B64: LSBTdG9wcGVkIHRyZWF0aW5nIGV4aXQgY29kZSA1IGFzIGEgbm8tdGVzdHMgcmVzdWx0IGZvciBgdW5pdHRlc3RgLiBFeGl0IDUgaGFzIHRoYXQgc3BlY2lhbCBtZWFuaW5nIG9ubHkgZm9yIHB5dGVzdDsgYSB1bml0dGVzdCBjb21tYW5kIG9yIG9ic2VydmVyIHRoYXQgZXhpdHMgNSBub3cgcmVtYWlucyBhIHZlcmlmaWNhdGlvbiBmYWlsdXJlIGluc3RlYWQgb2YgYmVpbmcgc2lsZW50bHkgZG93bmdyYWRlZCB0byBub24tZmFpbGluZyBuby1jb2xsZWN0aW9uIGV2aWRlbmNlLgo= + run: | + python - <<'PY' + import base64 + import os + from pathlib import Path + + old = 'check.exitCode === 5 && (check.targetRunner === "pytest" || check.targetRunner === "unittest")' + new = 'check.exitCode === 5 && check.targetRunner === "pytest"' + for name in ["src/evidence.ts", "src/explanation.ts"]: + path = Path(name) + text = path.read_text() + if text.count(old) != 1: + raise SystemExit(f"expected one exit-five semantic match in {name}, found {text.count(old)}") + path.write_text(text.replace(old, new)) + + test_path = Path("tests/analyze.test.ts") + text = test_path.read_text() + marker = 'test("a unittest loader failure without an attributable test failure fails closed", async (context) => {' + if text.count(marker) != 1: + raise SystemExit("unittest loader regression marker was not unique") + block = base64.b64decode(os.environ["TEST_BLOCK_B64"]).decode() + test_path.write_text(text.replace(marker, block + marker)) + + changelog = Path("CHANGELOG.md") + text = changelog.read_text() + marker = "## [Unreleased]\n\n### Fixed\n\n" + if text.count(marker) != 1: + raise SystemExit("unreleased changelog marker was not unique") + bullet = base64.b64decode(os.environ["CHANGELOG_BULLET_B64"]).decode() + changelog.write_text(text.replace(marker, marker + bullet, 1)) + PY + - run: npm test + - run: npm run clean && npm run build + - run: git diff --check + - name: Commit generated change + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add src/evidence.ts src/explanation.ts tests/analyze.test.ts CHANGELOG.md dist + git commit -m "Restrict exit-code 5 semantics to pytest" + git push origin HEAD:fix/unittest-exit-five-semantics From d23a2fdb2e0af1bfe5d7ed19ab309eaa75606682 Mon Sep 17 00:00:00 2001 From: Felix Date: Sat, 15 Aug 2026 21:15:58 +0800 Subject: [PATCH 2/9] Fix one-time unittest exit-five regression --- .github/workflows/one-time-unittest-exit-five.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/one-time-unittest-exit-five.yml b/.github/workflows/one-time-unittest-exit-five.yml index 9cf0932..e0efdb6 100644 --- a/.github/workflows/one-time-unittest-exit-five.yml +++ b/.github/workflows/one-time-unittest-exit-five.yml @@ -24,7 +24,7 @@ jobs: - run: npm ci - name: Patch exit-code semantics and regression env: - TEST_BLOCK_B64: dGVzdCgidW5pdHRlc3QgZXhpdCA1IHJlbWFpbnMgYSBmYWlsdXJlIGluc3RlYWQgb2YgYm9ycm93aW5nIHB5dGVzdCdzIG5vLWNvbGxlY3Rpb24gbWVhbmluZyIsIGFzeW5jIChjb250ZXh0KSA9PiB7CiAgY29uc3Qgcm9vdCA9IGF3YWl0IGluaXRpYWxpemVSZXBvc2l0b3J5KHsKICAgICJ1bml0dGVzdC5weSI6ICJyYWlzZSBTeXN0ZW1FeGl0KDUpXG4iLAogICAgInZhbHVlLnB5IjogImRlZiB2YWx1ZSgpOlxuICAgIHJldHVybiAxXG4iLAogICAgInRlc3RzL3Rlc3RfdmFsdWUucHkiOiAiaW1wb3J0IHVuaXR0ZXN0XG5mcm9tIHZhbHVlIGltcG9ydCB2YWx1ZVxuY2xhc3MgVmFsdWVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKTpcbiAgICBkZWYgdGVzdF92YWx1ZShzZWxmKTpcbiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSgpLCAyKVxuIiwKICB9KTsKICBjb250ZXh0LmFmdGVyKCgpID0+IHJtKHJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KSk7CiAgYXdhaXQgd3JpdGVGaWxlcyhyb290LCB7ICJ2YWx1ZS5weSI6ICJkZWYgdmFsdWUoKTpcbiAgICByZXR1cm4gMlxuIiB9KTsKICBjb25zdCByZXBvcnQgPSBhd2FpdCBhbmFseXplUmVwb3NpdG9yeSh7IHJlcG86IHJvb3QsIHJ1bkNoZWNrczogdHJ1ZSwgdGltZW91dE1zOiAyMF8wMDAgfSk7CiAgY29uc3QgdW5pdHRlc3RDaGVja3MgPSByZXBvcnQuY2hlY2tzLmZpbHRlcigoY2hlY2spID0+IGNoZWNrLnRhcmdldFJ1bm5lciA9PT0gInVuaXR0ZXN0IiAmJiBjaGVjay5leGl0Q29kZSA9PT0gNSk7CiAgYXNzZXJ0Lm9rKHVuaXR0ZXN0Q2hlY2tzLmxlbmd0aCA+PSAxKTsKICBhc3NlcnQub2sodW5pdHRlc3RDaGVja3MuZXZlcnkoKGNoZWNrKSA9PiBjaGVjay5zdGF0dXMgPT09ICJmYWlsZWQiKSk7CiAgYXNzZXJ0LmVxdWFsKHJlcG9ydC5hc3Nlc3NtZW50c1swXT8uc3RhdHVzLCAidmVyaWZpY2F0aW9uLWZhaWxlZCIpOwogIGFzc2VydC5vayhyZXBvcnQuYXNzZXNzbWVudHNbMF0/LmV2aWRlbmNlLnNvbWUoKGl0ZW0pID0+IGl0ZW0ua2luZCA9PT0gImZhaWxpbmctY2hlY2siKSk7CiAgYXNzZXJ0LmVxdWFsKHJlcG9ydC5hc3Nlc3NtZW50c1swXT8uZXZpZGVuY2VCb3VuZGFyeS5yZWFzb24sICJmYWlsdXJlLXVuYXR0cmlidXRlZCIpOwp9KTsKCg== + TEST_BLOCK_B64: dGVzdCgidW5pdHRlc3QgZXhpdCA1IHJlbWFpbnMgYSBmYWlsdXJlIGluc3RlYWQgb2YgYm9ycm93aW5nIHB5dGVzdCdzIG5vLWNvbGxlY3Rpb24gbWVhbmluZyIsIGFzeW5jIChjb250ZXh0KSA9PiB7CiAgY29uc3Qgcm9vdCA9IGF3YWl0IGluaXRpYWxpemVSZXBvc2l0b3J5KHsKICAgICJ1bml0dGVzdC5weSI6ICJyYWlzZSBTeXN0ZW1FeGl0KDUpXG4iLAogICAgInZhbHVlLnB5IjogImRlZiB2YWx1ZSgpOlxuICAgIHJldHVybiAxXG4iLAogICAgInRlc3RzL3Rlc3RfdmFsdWUucHkiOiAiaW1wb3J0IHVuaXR0ZXN0XG5mcm9tIHZhbHVlIGltcG9ydCB2YWx1ZVxuY2xhc3MgVmFsdWVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKTpcbiAgICBkZWYgdGVzdF92YWx1ZShzZWxmKTpcbiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSgpLCAyKVxuIiwKICB9KTsKICBjb250ZXh0LmFmdGVyKCgpID0+IHJtKHJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KSk7CiAgYXdhaXQgd3JpdGVGaWxlcyhyb290LCB7ICJ2YWx1ZS5weSI6ICJkZWYgdmFsdWUoKTpcbiAgICByZXR1cm4gMlxuIiB9KTsKICBjb25zdCByZXBvcnQgPSBhd2FpdCBhbmFseXplUmVwb3NpdG9yeSh7IHJlcG86IHJvb3QsIHJ1bkNoZWNrczogdHJ1ZSwgdGltZW91dE1zOiAyMF8wMDAgfSk7CiAgY29uc3QgdW5pdHRlc3RDaGVja3MgPSByZXBvcnQuY2hlY2tzLmZpbHRlcigoY2hlY2spID0+IGNoZWNrLnRhcmdldFJ1bm5lciA9PT0gInVuaXR0ZXN0IiAmJiBjaGVjay5leGl0Q29kZSA9PT0gNSk7CiAgYXNzZXJ0Lm9rKHVuaXR0ZXN0Q2hlY2tzLmxlbmd0aCA+PSAxKTsKICBhc3NlcnQub2sodW5pdHRlc3RDaGVja3MuZXZlcnkoKGNoZWNrKSA9PiBjaGVjay5zdGF0dXMgPT09ICJmYWlsZWQiKSk7CiAgYXNzZXJ0LmVxdWFsKHJlcG9ydC5hc3Nlc3NtZW50c1swXT8uc3RhdHVzLCAidmVyaWZpY2F0aW9uLWZhaWxlZCIpOwogIGFzc2VydC5vayhyZXBvcnQuYXNzZXNzbWVudHNbMF0/LmV2aWRlbmNlLnNvbWUoKGl0ZW0pID0+IGl0ZW0ua2luZCA9PT0gImZhaWxpbmctY2hlY2siKSk7CiAgYXNzZXJ0LmVxdWFsKHJlcG9ydC5hc3Nlc3NtZW50c1swXT8uZXZpZGVuY2VCb3VuZGFyeT8ucmVhc29uLCAiZmFpbHVyZS11bmF0dHJpYnV0ZWQiKTsKfSk7Cgo= CHANGELOG_BULLET_B64: LSBTdG9wcGVkIHRyZWF0aW5nIGV4aXQgY29kZSA1IGFzIGEgbm8tdGVzdHMgcmVzdWx0IGZvciBgdW5pdHRlc3RgLiBFeGl0IDUgaGFzIHRoYXQgc3BlY2lhbCBtZWFuaW5nIG9ubHkgZm9yIHB5dGVzdDsgYSB1bml0dGVzdCBjb21tYW5kIG9yIG9ic2VydmVyIHRoYXQgZXhpdHMgNSBub3cgcmVtYWlucyBhIHZlcmlmaWNhdGlvbiBmYWlsdXJlIGluc3RlYWQgb2YgYmVpbmcgc2lsZW50bHkgZG93bmdyYWRlZCB0byBub24tZmFpbGluZyBuby1jb2xsZWN0aW9uIGV2aWRlbmNlLgo= run: | python - <<'PY' From 3a6a1a91da8d788d184310f48783a2513606ab16 Mon Sep 17 00:00:00 2001 From: Felix Date: Sat, 15 Aug 2026 21:20:27 +0800 Subject: [PATCH 3/9] Add refined unittest exit-five updater --- .../one-time-unittest-exit-five-v3.yml | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 .github/workflows/one-time-unittest-exit-five-v3.yml diff --git a/.github/workflows/one-time-unittest-exit-five-v3.yml b/.github/workflows/one-time-unittest-exit-five-v3.yml new file mode 100644 index 0000000..dfca640 --- /dev/null +++ b/.github/workflows/one-time-unittest-exit-five-v3.yml @@ -0,0 +1,110 @@ +name: Refined unittest exit-five updater + +on: + push: + branches: + - fix/unittest-exit-five-semantics + paths: + - .github/workflows/one-time-unittest-exit-five-v3.yml + +permissions: + contents: write + +jobs: + update: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + ref: fix/unittest-exit-five-semantics + - uses: actions/setup-node@v7 + with: + node-version: 24 + cache: npm + - run: npm ci + - name: Patch corroborated unittest exit-five semantics + run: | + python - <<'PY' + from pathlib import Path + + evidence_old = '\n'.join([ + 'function isRecognizedNoTestsExit(check: CheckResult): boolean {', + ' return check.status === "failed" && check.exitCode === 5 && (check.targetRunner === "pytest" || check.targetRunner === "unittest");', + '}', + ]) + evidence_new = '\n'.join([ + 'function isRecognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean {', + ' if (check.status !== "failed" || check.exitCode !== 5) return false;', + ' if (check.targetRunner === "pytest") return true;', + ' if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) return false;', + ' const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`);', + ' const observations = targeted?.targetObservations ?? [];', + ' return targeted?.status === "passed"', + ' && observations.length > 0', + ' && observations.every((observation) => observation.outcome === "zero-tests"', + ' && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high"', + ' && qualification.path === observation.path', + ' && qualification.runnerPath === observation.runnerPath) === true);', + '}', + ]) + explanation_old = evidence_old.replace('isRecognizedNoTestsExit', 'recognizedNoTestsExit') + explanation_new = evidence_new.replace('isRecognizedNoTestsExit', 'recognizedNoTestsExit') + + for name, old, new, call, replacement, expected_calls in [ + ('src/evidence.ts', evidence_old, evidence_new, 'isRecognizedNoTestsExit(check)', 'isRecognizedNoTestsExit(check, applicable)', 3), + ('src/explanation.ts', explanation_old, explanation_new, 'recognizedNoTestsExit(check)', 'recognizedNoTestsExit(check, applicable)', 1), + ]: + path = Path(name) + text = path.read_text() + if text.count(old) != 1: + raise SystemExit(f'expected one helper block in {name}, found {text.count(old)}') + text = text.replace(old, new) + if text.count(call) != expected_calls: + raise SystemExit(f'expected {expected_calls} helper calls in {name}, found {text.count(call)}') + path.write_text(text.replace(call, replacement)) + + test_path = Path('tests/analyze.test.ts') + text = test_path.read_text() + marker = 'test("a unittest loader failure without an attributable test failure fails closed", async (context) => {' + if text.count(marker) != 1: + raise SystemExit('unittest loader regression marker was not unique') + block = '\n'.join([ + 'test("unittest exit 5 requires corroborating zero-test observations instead of being blindly suppressed", async (context) => {', + ' const root = await initializeRepository({', + ' "unittest.py": "raise SystemExit(5)\\n",', + ' "value.py": "def value():\\n return 1\\n",', + ' "tests/test_value.py": "import unittest\\nfrom value import value\\nclass ValueTest(unittest.TestCase):\\n def test_value(self):\\n self.assertEqual(value(), 2)\\n",', + ' });', + ' context.after(() => rm(root, { recursive: true, force: true }));', + ' await writeFiles(root, { "value.py": "def value():\\n return 2\\n" });', + ' const report = await analyzeRepository({ repo: root, runChecks: true, timeoutMs: 20_000 });', + ' const unittestChecks = report.checks.filter((check) => check.targetRunner === "unittest" && check.exitCode === 5);', + ' assert.ok(unittestChecks.length >= 1);', + ' assert.ok(unittestChecks.every((check) => check.status === "failed"));', + ' assert.equal(report.assessments[0]?.status, "verification-failed");', + ' assert.ok(report.assessments[0]?.evidence.some((item) => item.kind === "failing-check"));', + ' assert.equal(report.assessments[0]?.evidenceBoundary?.reason, "failure-unattributed");', + '});', + '', + '', + ]) + test_path.write_text(text.replace(marker, block + marker)) + + changelog = Path('CHANGELOG.md') + text = changelog.read_text() + marker = '## [Unreleased]\n\n### Fixed\n\n' + if text.count(marker) != 1: + raise SystemExit('unreleased changelog marker was not unique') + bullet = '- Tightened `unittest` exit-code 5 handling. The stdlib CLI uses code 5 when zero tests run, but a repository-local module can also make `python -m unittest` exit 5 before the real runner starts. ProofDiff now treats an opaque `unittest` exit 5 as benign only when the paired high-confidence targeted observer independently succeeds with exact zero-test observations; targeted or uncorroborated exit-5 failures remain verification failures. Pytest\'s exit-5 no-collection handling is unchanged.\n' + changelog.write_text(text.replace(marker, marker + bullet, 1)) + PY + - run: npm test + - run: npm run clean && npm run build + - run: git diff --check + - name: Commit generated change + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add src/evidence.ts src/explanation.ts tests/analyze.test.ts CHANGELOG.md dist + git commit -m "Corroborate unittest exit-five no-test results" + git push origin HEAD:fix/unittest-exit-five-semantics From 574c817fa3b5acd328db61e477e7226fe870ff19 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 15 Aug 2026 13:21:06 +0000 Subject: [PATCH 4/9] Corroborate unittest exit-five no-test results --- CHANGELOG.md | 1 + dist/evidence.d.ts.map | 2 +- dist/evidence.js | 23 ++++++++++++++++++----- dist/evidence.js.map | 2 +- dist/explanation.d.ts.map | 2 +- dist/explanation.js | 19 ++++++++++++++++--- dist/explanation.js.map | 2 +- src/evidence.ts | 20 +++++++++++++++----- src/explanation.ts | 16 +++++++++++++--- tests/analyze.test.ts | 17 +++++++++++++++++ 10 files changed, 84 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 90bc20a..e505a00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes are documented here. This project follows Semantic Versionin ### Fixed +- Tightened `unittest` exit-code 5 handling. The stdlib CLI uses code 5 when zero tests run, but a repository-local module can also make `python -m unittest` exit 5 before the real runner starts. ProofDiff now treats an opaque `unittest` exit 5 as benign only when the paired high-confidence targeted observer independently succeeds with exact zero-test observations; targeted or uncorroborated exit-5 failures remain verification failures. Pytest's exit-5 no-collection handling is unchanged. - Preserved LCOV `SF:` source paths exactly instead of applying JavaScript-style whitespace trimming. Leading or trailing spaces and Unicode whitespace are valid path characters, so silently erasing them could alias artifact coverage for one path onto a different changed repository file and overstate changed-line evidence. - Restricted recognized Node/Jest/Vitest package-script trimming to ASCII spaces and tabs. JavaScript `String.trim()` also removes non-ASCII whitespace such as NBSP, which shells do not treat as ordinary script separators; leading or trailing Unicode whitespace can therefore no longer be erased into a different executable command and accidentally qualify for exact targeted evidence. - Stopped `.pyi` stub files with test-like names from inventing executable pytest or `unittest` checks. Stubs remain available to static Python analysis and relationship discovery, but framework discovery now requires an executable `.py` test file; this prevents `--run-checks` from launching a Python test runner merely because a repository contains test-shaped type stubs. diff --git a/dist/evidence.d.ts.map b/dist/evidence.d.ts.map index 06765ba..9f46976 100644 --- a/dist/evidence.d.ts.map +++ b/dist/evidence.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,WAAW,EAAE,WAAW,EAAgB,cAAc,EAAiD,MAAM,YAAY,CAAC;AAClJ,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAqMlD,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG,cAAc,CAkEzI"} \ No newline at end of file +{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,WAAW,EAAE,WAAW,EAAgB,cAAc,EAAiD,MAAM,YAAY,CAAC;AAClJ,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA+MlD,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG,cAAc,CAkEzI"} \ No newline at end of file diff --git a/dist/evidence.js b/dist/evidence.js index b00beb9..464df5a 100644 --- a/dist/evidence.js +++ b/dist/evidence.js @@ -10,8 +10,21 @@ function checkApplies(check, file, relatedTests) { return file.language === "python"; return true; } -function isRecognizedNoTestsExit(check) { - return check.status === "failed" && check.exitCode === 5 && (check.targetRunner === "pytest" || check.targetRunner === "unittest"); +function isRecognizedNoTestsExit(check, checks) { + if (check.status !== "failed" || check.exitCode !== 5) + return false; + if (check.targetRunner === "pytest") + return true; + if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) + return false; + const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); + const observations = targeted?.targetObservations ?? []; + return targeted?.status === "passed" + && observations.length > 0 + && observations.every((observation) => observation.outcome === "zero-tests" + && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high" + && qualification.path === observation.path + && qualification.runnerPath === observation.runnerPath) === true); } function verificationFor(file, relatedTests, checks, declaredTests) { const evidence = []; @@ -28,17 +41,17 @@ function verificationFor(file, relatedTests, checks, declaredTests) { const hasUnavailableRelatedTarget = (check) => check.targetObservations?.some((observation) => relatedTests.includes(observation.path) && observation.outcome === "not-observed" && qualificationForObservation(check, observation)?.confidence === "high") === true; const localizedTargetedProcessFailures = applicable.filter((check) => check.targetQualifications !== undefined && check.status === "failed" - && !isRecognizedNoTestsExit(check) + && !isRecognizedNoTestsExit(check, applicable) && hasExactTargetFailure(check) && !hasUnavailableRelatedTarget(check)); const unlocalizedTargetedFailures = applicable.filter((check) => check.targetQualifications !== undefined && check.status === "failed" - && !isRecognizedNoTestsExit(check) + && !isRecognizedNoTestsExit(check, applicable) && (!hasExactTargetFailure(check) || hasUnavailableRelatedTarget(check))); const opaqueFailures = applicable.filter((check) => check.targetQualifications === undefined && ["failed", "error", "timed-out"].includes(check.status) && !(check.kind === "test" && check.targetRunner !== undefined && localizedTargetedProcessFailures.some((targeted) => targeted.id === `${check.id}:targeted`)) - && !isRecognizedNoTestsExit(check)); + && !isRecognizedNoTestsExit(check, applicable)); const operationalFailures = applicable.filter((check) => check.targetQualifications !== undefined && ["error", "timed-out"].includes(check.status)); const passing = applicable.filter((check) => check.status === "passed" && check.targetQualifications === undefined); const testExecutions = exactObservations diff --git a/dist/evidence.js.map b/dist/evidence.js.map index 6fe73dd..e2bc6e0 100644 --- a/dist/evidence.js.map +++ b/dist/evidence.js.map @@ -1 +1 @@ -{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/explanation.d.ts.map b/dist/explanation.d.ts.map index 3231dbd..6123749 100644 --- a/dist/explanation.d.ts.map +++ b/dist/explanation.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"explanation.d.ts","sourceRoot":"","sources":["../src/explanation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAsB,cAAc,EAAE,MAAM,YAAY,CAAC;AAiBpG,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAyLrG"} \ No newline at end of file +{"version":3,"file":"explanation.d.ts","sourceRoot":"","sources":["../src/explanation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAsB,cAAc,EAAE,MAAM,YAAY,CAAC;AA2BpG,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAyLrG"} \ No newline at end of file diff --git a/dist/explanation.js b/dist/explanation.js index 2613fc4..3097344 100644 --- a/dist/explanation.js +++ b/dist/explanation.js @@ -7,8 +7,21 @@ function checkApplies(check, item) { return item.file.language === "python"; return true; } -function recognizedNoTestsExit(check) { - return check.status === "failed" && check.exitCode === 5 && (check.targetRunner === "pytest" || check.targetRunner === "unittest"); +function recognizedNoTestsExit(check, checks) { + if (check.status !== "failed" || check.exitCode !== 5) + return false; + if (check.targetRunner === "pytest") + return true; + if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) + return false; + const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); + const observations = targeted?.targetObservations ?? []; + return targeted?.status === "passed" + && observations.length > 0 + && observations.every((observation) => observation.outcome === "zero-tests" + && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high" + && qualification.path === observation.path + && qualification.runnerPath === observation.runnerPath) === true); } function action(kind, detail, requiresRepositoryCodeExecution = false) { return { kind, detail, requiresRepositoryCodeExecution }; @@ -30,7 +43,7 @@ export function explainEvidenceBoundary(item, checks) { const skippedObservation = exactObservations.find(({ observation }) => observation.outcome === "skipped"); const unlocalizedTargetFailure = applicable.some((check) => check.targetQualifications !== undefined && check.status === "failed" - && !recognizedNoTestsExit(check) + && !recognizedNoTestsExit(check, applicable) && (check.targetObservations?.some((observation) => observation.outcome === "failed" && qualificationForObservation(check, observation)?.confidence === "high") !== true || check.targetObservations?.some((observation) => item.relatedTests.includes(observation.path) && observation.outcome === "not-observed" && qualificationForObservation(check, observation)?.confidence === "high") === true)); const passingOpaqueCheck = applicable.some((check) => check.status === "passed" && check.targetQualifications === undefined); diff --git a/dist/explanation.js.map b/dist/explanation.js.map index cc8bf0d..6262c7a 100644 --- a/dist/explanation.js.map +++ b/dist/explanation.js.map @@ -1 +1 @@ -{"version":3,"file":"explanation.js","sourceRoot":"","sources":["../src/explanation.ts"],"names":[],"mappings":"AAEA,SAAS,YAAY,CAAC,KAAkB,EAAE,IAAoB;IAC5D,IAAI,KAAK,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACrG,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,YAAY,CAAC;IAClH,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAkB;IAC/C,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,KAAK,CAAC,YAAY,KAAK,UAAU,CAAC,CAAC;AACrI,CAAC;AAED,SAAS,MAAM,CAAC,IAAgC,EAAE,MAAc,EAAE,+BAA+B,GAAG,KAAK;IACvG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAoB,EAAE,MAAqB;IACjF,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IACzE,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACrK,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACjK,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC;SAChF,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SACrE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,2BAA2B,GAAG,CAAC,KAAkB,EAAE,WAAmE,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,IAAI,aAAa,CAAC,UAAU,KAAK,WAAW,CAAC,UAAU,CAAC,CAAC;IACrR,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC;IAClJ,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;IACxG,MAAM,sBAAsB,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC;IACnH,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;IAC1G,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IAC1G,MAAM,wBAAwB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,KAAK,SAAS;WAC/F,KAAK,CAAC,MAAM,KAAK,QAAQ;WACzB,CAAC,qBAAqB,CAAC,KAAK,CAAC;WAC7B,CACD,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,QAAQ,IAAI,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,KAAK,IAAI;eACjK,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,KAAK,cAAc,IAAI,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,KAAK,IAAI,CAC9N,CAAC,CAAC;IACL,MAAM,kBAAkB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC;IAC7H,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS;WACxD,IAAI,CAAC,IAAI,CAAC,MAAM;WAChB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC;IACxE,MAAM,sBAAsB,GAAG,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAE/I,IAAI,IAAI,CAAC,MAAM,KAAK,qBAAqB,EAAE,CAAC;QAC1C,IAAI,wBAAwB,EAAE,CAAC;YAC7B,OAAO;gBACL,iBAAiB,EAAE,sBAAsB;gBACzC,KAAK,EAAE,qBAAqB;gBAC5B,MAAM,EAAE,sBAAsB;gBAC9B,MAAM,EAAE,4KAA4K;gBACpL,mBAAmB,EAAE,IAAI;gBACzB,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,sGAAsG,CAAC;aAC9I,CAAC;QACJ,CAAC;QACD,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO;gBACL,iBAAiB,EAAE,sBAAsB;gBACzC,KAAK,EAAE,qBAAqB;gBAC5B,MAAM,EAAE,eAAe;gBACvB,MAAM,EAAE,iFAAiF;gBACzF,mBAAmB,EAAE,KAAK;gBAC1B,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,kFAAkF,CAAC;aAC1H,CAAC;QACJ,CAAC;QACD,OAAO;YACL,iBAAiB,EAAE,sBAAsB;YACzC,KAAK,EAAE,mBAAmB;YAC1B,MAAM,EAAE,cAAc;YACtB,MAAM,EAAE,yHAAyH;YACjI,mBAAmB,EAAE,KAAK;YAC1B,UAAU,EAAE,MAAM,CAAC,iBAAiB,EAAE,oGAAoG,CAAC;SAC5I,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO;YACL,iBAAiB,EAAE,0BAA0B;YAC7C,KAAK,EAAE,wBAAwB;YAC/B,MAAM,EAAE,mCAAmC;YAC3C,MAAM,EAAE,uJAAuJ;YAC/J,mBAAmB,EAAE,IAAI;YACzB,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,CAAC;IAED,IAAI,sBAAsB,EAAE,CAAC;QAC3B,OAAO;YACL,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB;YAChG,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,uBAAuB;YAC/B,MAAM,EAAE,0JAA0J;YAClK,mBAAmB,EAAE,IAAI;YACzB,UAAU,EAAE,MAAM,CAAC,kBAAkB,EAAE,wHAAwH,CAAC;SACjK,CAAC;IACJ,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO;YACL,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB;YAChG,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,2GAA2G;YACnH,mBAAmB,EAAE,KAAK;YAC1B,UAAU,EAAE,MAAM,CAAC,0BAA0B,EAAE,8FAA8F,CAAC;SAC/I,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB,EAAE,CAAC;QACvB,OAAO;YACL,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB;YAChG,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,uGAAuG;YAC/G,mBAAmB,EAAE,KAAK;YAC1B,UAAU,EAAE,MAAM,CAAC,0BAA0B,EAAE,iGAAiG,CAAC;SAClJ,CAAC;IACJ,CAAC;IAED,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO;YACL,iBAAiB,EAAE,sBAAsB;YACzC,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,uBAAuB;YAC/B,MAAM,EAAE,+IAA+I;YACvJ,mBAAmB,EAAE,IAAI;YACzB,UAAU,EAAE,MAAM,CAAC,4BAA4B,EAAE,kPAAkP,CAAC;SACrS,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO;YACL,iBAAiB,EAAE,sBAAsB;YACzC,KAAK,EAAE,qBAAqB;YAC5B,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,kBAAkB;gBACxB,CAAC,CAAC,8GAA8G;gBAChH,CAAC,CAAC,4EAA4E;YAChF,mBAAmB,EAAE,KAAK;YAC1B,UAAU,EAAE,MAAM,CAAC,4BAA4B,EAAE,oSAAoS,CAAC;SACvV,CAAC;IACJ,CAAC;IAED,IAAI,cAAc,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,iBAAiB,EAAE,sBAAsB;YACzC,KAAK,EAAE,sBAAsB;YAC7B,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,oBAAoB;YAC1E,MAAM,EAAE,kBAAkB;gBACxB,CAAC,CAAC,iJAAiJ;gBACnJ,CAAC,CAAC,6IAA6I;YACjJ,mBAAmB,EAAE,IAAI;YACzB,UAAU,EAAE,MAAM,CAAC,sBAAsB,EAAE,qNAAqN,CAAC;SAClQ,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,EAAE,CAAC;QACrG,OAAO;YACL,iBAAiB,EAAE,qBAAqB;YACxC,KAAK,EAAE,mBAAmB;YAC1B,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,iHAAiH;YACzH,mBAAmB,EAAE,KAAK;YAC1B,UAAU,EAAE,MAAM,CAChB,mBAAmB,EACnB,gLAAgL,EAChL,IAAI,CACL;SACF,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1F,OAAO;YACL,iBAAiB,EAAE,sBAAsB;YACzC,KAAK,EAAE,mBAAmB;YAC1B,MAAM,EAAE,oBAAoB;YAC5B,MAAM,EAAE,uGAAuG;YAC/G,mBAAmB,EAAE,KAAK;YAC1B,UAAU,EAAE,MAAM,CAAC,0BAA0B,EAAE,mGAAmG,CAAC;SACpJ,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO;YACL,iBAAiB,EAAE,qBAAqB;YACxC,KAAK,EAAE,mBAAmB;YAC1B,MAAM,EAAE,qBAAqB;YAC7B,MAAM,EAAE,8FAA8F;YACtG,mBAAmB,EAAE,KAAK;YAC1B,UAAU,EAAE,MAAM,CAAC,qBAAqB,EAAE,2GAA2G,CAAC;SACvJ,CAAC;IACJ,CAAC;IAED,OAAO;QACL,iBAAiB,EAAE,sBAAsB;QACzC,KAAK,EAAE,qBAAqB;QAC5B,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,iJAAiJ;QACzJ,mBAAmB,EAAE,IAAI;QACzB,UAAU,EAAE,MAAM,CAAC,kBAAkB,EAAE,yFAAyF,CAAC;KAClI,CAAC;AACJ,CAAC"} \ No newline at end of file +{"version":3,"file":"explanation.js","sourceRoot":"","sources":["../src/explanation.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/evidence.ts b/src/evidence.ts index 1a341d3..4751e98 100644 --- a/src/evidence.ts +++ b/src/evidence.ts @@ -11,8 +11,18 @@ function checkApplies(check: CheckResult, file: ChangedFile, relatedTests: strin return true; } -function isRecognizedNoTestsExit(check: CheckResult): boolean { - return check.status === "failed" && check.exitCode === 5 && (check.targetRunner === "pytest" || check.targetRunner === "unittest"); +function isRecognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean { + if (check.status !== "failed" || check.exitCode !== 5) return false; + if (check.targetRunner === "pytest") return true; + if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) return false; + const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); + const observations = targeted?.targetObservations ?? []; + return targeted?.status === "passed" + && observations.length > 0 + && observations.every((observation) => observation.outcome === "zero-tests" + && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high" + && qualification.path === observation.path + && qualification.runnerPath === observation.runnerPath) === true); } function verificationFor(file: ChangedFile, relatedTests: string[], checks: CheckResult[], declaredTests: string[]): { status: VerificationStatus; evidence: EvidenceItem[]; executedTests: string[]; testExecutions: FileAssessment["testExecutions"] } { @@ -30,17 +40,17 @@ function verificationFor(file: ChangedFile, relatedTests: string[], checks: Chec const hasUnavailableRelatedTarget = (check: CheckResult): boolean => check.targetObservations?.some((observation) => relatedTests.includes(observation.path) && observation.outcome === "not-observed" && qualificationForObservation(check, observation)?.confidence === "high") === true; const localizedTargetedProcessFailures = applicable.filter((check) => check.targetQualifications !== undefined && check.status === "failed" - && !isRecognizedNoTestsExit(check) + && !isRecognizedNoTestsExit(check, applicable) && hasExactTargetFailure(check) && !hasUnavailableRelatedTarget(check)); const unlocalizedTargetedFailures = applicable.filter((check) => check.targetQualifications !== undefined && check.status === "failed" - && !isRecognizedNoTestsExit(check) + && !isRecognizedNoTestsExit(check, applicable) && (!hasExactTargetFailure(check) || hasUnavailableRelatedTarget(check))); const opaqueFailures = applicable.filter((check) => check.targetQualifications === undefined && ["failed", "error", "timed-out"].includes(check.status) && !(check.kind === "test" && check.targetRunner !== undefined && localizedTargetedProcessFailures.some((targeted) => targeted.id === `${check.id}:targeted`)) - && !isRecognizedNoTestsExit(check)); + && !isRecognizedNoTestsExit(check, applicable)); const operationalFailures = applicable.filter((check) => check.targetQualifications !== undefined && ["error", "timed-out"].includes(check.status)); const passing = applicable.filter((check) => check.status === "passed" && check.targetQualifications === undefined); const testExecutions: FileAssessment["testExecutions"] = exactObservations diff --git a/src/explanation.ts b/src/explanation.ts index 6470695..48b1399 100644 --- a/src/explanation.ts +++ b/src/explanation.ts @@ -7,8 +7,18 @@ function checkApplies(check: CheckResult, item: FileAssessment): boolean { return true; } -function recognizedNoTestsExit(check: CheckResult): boolean { - return check.status === "failed" && check.exitCode === 5 && (check.targetRunner === "pytest" || check.targetRunner === "unittest"); +function recognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean { + if (check.status !== "failed" || check.exitCode !== 5) return false; + if (check.targetRunner === "pytest") return true; + if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) return false; + const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); + const observations = targeted?.targetObservations ?? []; + return targeted?.status === "passed" + && observations.length > 0 + && observations.every((observation) => observation.outcome === "zero-tests" + && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high" + && qualification.path === observation.path + && qualification.runnerPath === observation.runnerPath) === true); } function action(kind: EvidenceNextAction["kind"], detail: string, requiresRepositoryCodeExecution = false): EvidenceNextAction { @@ -32,7 +42,7 @@ export function explainEvidenceBoundary(item: FileAssessment, checks: CheckResul const skippedObservation = exactObservations.find(({ observation }) => observation.outcome === "skipped"); const unlocalizedTargetFailure = applicable.some((check) => check.targetQualifications !== undefined && check.status === "failed" - && !recognizedNoTestsExit(check) + && !recognizedNoTestsExit(check, applicable) && ( check.targetObservations?.some((observation) => observation.outcome === "failed" && qualificationForObservation(check, observation)?.confidence === "high") !== true || check.targetObservations?.some((observation) => item.relatedTests.includes(observation.path) && observation.outcome === "not-observed" && qualificationForObservation(check, observation)?.confidence === "high") === true diff --git a/tests/analyze.test.ts b/tests/analyze.test.ts index fe7a497..a146883 100644 --- a/tests/analyze.test.ts +++ b/tests/analyze.test.ts @@ -327,6 +327,23 @@ test("pytest exit 5 remains a non-failing no-collection outcome", async (context assert.ok(!report.assessments[0]?.evidence.some((item) => item.kind === "failing-check")); }); +test("unittest exit 5 requires corroborating zero-test observations instead of being blindly suppressed", async (context) => { + const root = await initializeRepository({ + "unittest.py": "raise SystemExit(5)\n", + "value.py": "def value():\n return 1\n", + "tests/test_value.py": "import unittest\nfrom value import value\nclass ValueTest(unittest.TestCase):\n def test_value(self):\n self.assertEqual(value(), 2)\n", + }); + context.after(() => rm(root, { recursive: true, force: true })); + await writeFiles(root, { "value.py": "def value():\n return 2\n" }); + const report = await analyzeRepository({ repo: root, runChecks: true, timeoutMs: 20_000 }); + const unittestChecks = report.checks.filter((check) => check.targetRunner === "unittest" && check.exitCode === 5); + assert.ok(unittestChecks.length >= 1); + assert.ok(unittestChecks.every((check) => check.status === "failed")); + assert.equal(report.assessments[0]?.status, "verification-failed"); + assert.ok(report.assessments[0]?.evidence.some((item) => item.kind === "failing-check")); + assert.equal(report.assessments[0]?.evidenceBoundary?.reason, "failure-unattributed"); +}); + test("a unittest loader failure without an attributable test failure fails closed", async (context) => { const root = await initializeRepository({ "value.py": "def value():\n return 1\n", From fbb1323ff2f87b664fe05e0a965e0f61e40c5134 Mon Sep 17 00:00:00 2001 From: Felix Date: Sat, 15 Aug 2026 21:21:40 +0800 Subject: [PATCH 5/9] Remove obsolete unittest exit-five updater --- .../workflows/one-time-unittest-exit-five.yml | 69 ------------------- 1 file changed, 69 deletions(-) delete mode 100644 .github/workflows/one-time-unittest-exit-five.yml diff --git a/.github/workflows/one-time-unittest-exit-five.yml b/.github/workflows/one-time-unittest-exit-five.yml deleted file mode 100644 index e0efdb6..0000000 --- a/.github/workflows/one-time-unittest-exit-five.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: One-time unittest exit-five updater - -on: - push: - branches: - - fix/unittest-exit-five-semantics - paths: - - .github/workflows/one-time-unittest-exit-five.yml - -permissions: - contents: write - -jobs: - update: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v7 - with: - ref: fix/unittest-exit-five-semantics - - uses: actions/setup-node@v7 - with: - node-version: 24 - cache: npm - - run: npm ci - - name: Patch exit-code semantics and regression - env: - TEST_BLOCK_B64: dGVzdCgidW5pdHRlc3QgZXhpdCA1IHJlbWFpbnMgYSBmYWlsdXJlIGluc3RlYWQgb2YgYm9ycm93aW5nIHB5dGVzdCdzIG5vLWNvbGxlY3Rpb24gbWVhbmluZyIsIGFzeW5jIChjb250ZXh0KSA9PiB7CiAgY29uc3Qgcm9vdCA9IGF3YWl0IGluaXRpYWxpemVSZXBvc2l0b3J5KHsKICAgICJ1bml0dGVzdC5weSI6ICJyYWlzZSBTeXN0ZW1FeGl0KDUpXG4iLAogICAgInZhbHVlLnB5IjogImRlZiB2YWx1ZSgpOlxuICAgIHJldHVybiAxXG4iLAogICAgInRlc3RzL3Rlc3RfdmFsdWUucHkiOiAiaW1wb3J0IHVuaXR0ZXN0XG5mcm9tIHZhbHVlIGltcG9ydCB2YWx1ZVxuY2xhc3MgVmFsdWVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKTpcbiAgICBkZWYgdGVzdF92YWx1ZShzZWxmKTpcbiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSgpLCAyKVxuIiwKICB9KTsKICBjb250ZXh0LmFmdGVyKCgpID0+IHJtKHJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KSk7CiAgYXdhaXQgd3JpdGVGaWxlcyhyb290LCB7ICJ2YWx1ZS5weSI6ICJkZWYgdmFsdWUoKTpcbiAgICByZXR1cm4gMlxuIiB9KTsKICBjb25zdCByZXBvcnQgPSBhd2FpdCBhbmFseXplUmVwb3NpdG9yeSh7IHJlcG86IHJvb3QsIHJ1bkNoZWNrczogdHJ1ZSwgdGltZW91dE1zOiAyMF8wMDAgfSk7CiAgY29uc3QgdW5pdHRlc3RDaGVja3MgPSByZXBvcnQuY2hlY2tzLmZpbHRlcigoY2hlY2spID0+IGNoZWNrLnRhcmdldFJ1bm5lciA9PT0gInVuaXR0ZXN0IiAmJiBjaGVjay5leGl0Q29kZSA9PT0gNSk7CiAgYXNzZXJ0Lm9rKHVuaXR0ZXN0Q2hlY2tzLmxlbmd0aCA+PSAxKTsKICBhc3NlcnQub2sodW5pdHRlc3RDaGVja3MuZXZlcnkoKGNoZWNrKSA9PiBjaGVjay5zdGF0dXMgPT09ICJmYWlsZWQiKSk7CiAgYXNzZXJ0LmVxdWFsKHJlcG9ydC5hc3Nlc3NtZW50c1swXT8uc3RhdHVzLCAidmVyaWZpY2F0aW9uLWZhaWxlZCIpOwogIGFzc2VydC5vayhyZXBvcnQuYXNzZXNzbWVudHNbMF0/LmV2aWRlbmNlLnNvbWUoKGl0ZW0pID0+IGl0ZW0ua2luZCA9PT0gImZhaWxpbmctY2hlY2siKSk7CiAgYXNzZXJ0LmVxdWFsKHJlcG9ydC5hc3Nlc3NtZW50c1swXT8uZXZpZGVuY2VCb3VuZGFyeT8ucmVhc29uLCAiZmFpbHVyZS11bmF0dHJpYnV0ZWQiKTsKfSk7Cgo= - CHANGELOG_BULLET_B64: LSBTdG9wcGVkIHRyZWF0aW5nIGV4aXQgY29kZSA1IGFzIGEgbm8tdGVzdHMgcmVzdWx0IGZvciBgdW5pdHRlc3RgLiBFeGl0IDUgaGFzIHRoYXQgc3BlY2lhbCBtZWFuaW5nIG9ubHkgZm9yIHB5dGVzdDsgYSB1bml0dGVzdCBjb21tYW5kIG9yIG9ic2VydmVyIHRoYXQgZXhpdHMgNSBub3cgcmVtYWlucyBhIHZlcmlmaWNhdGlvbiBmYWlsdXJlIGluc3RlYWQgb2YgYmVpbmcgc2lsZW50bHkgZG93bmdyYWRlZCB0byBub24tZmFpbGluZyBuby1jb2xsZWN0aW9uIGV2aWRlbmNlLgo= - run: | - python - <<'PY' - import base64 - import os - from pathlib import Path - - old = 'check.exitCode === 5 && (check.targetRunner === "pytest" || check.targetRunner === "unittest")' - new = 'check.exitCode === 5 && check.targetRunner === "pytest"' - for name in ["src/evidence.ts", "src/explanation.ts"]: - path = Path(name) - text = path.read_text() - if text.count(old) != 1: - raise SystemExit(f"expected one exit-five semantic match in {name}, found {text.count(old)}") - path.write_text(text.replace(old, new)) - - test_path = Path("tests/analyze.test.ts") - text = test_path.read_text() - marker = 'test("a unittest loader failure without an attributable test failure fails closed", async (context) => {' - if text.count(marker) != 1: - raise SystemExit("unittest loader regression marker was not unique") - block = base64.b64decode(os.environ["TEST_BLOCK_B64"]).decode() - test_path.write_text(text.replace(marker, block + marker)) - - changelog = Path("CHANGELOG.md") - text = changelog.read_text() - marker = "## [Unreleased]\n\n### Fixed\n\n" - if text.count(marker) != 1: - raise SystemExit("unreleased changelog marker was not unique") - bullet = base64.b64decode(os.environ["CHANGELOG_BULLET_B64"]).decode() - changelog.write_text(text.replace(marker, marker + bullet, 1)) - PY - - run: npm test - - run: npm run clean && npm run build - - run: git diff --check - - name: Commit generated change - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add src/evidence.ts src/explanation.ts tests/analyze.test.ts CHANGELOG.md dist - git commit -m "Restrict exit-code 5 semantics to pytest" - git push origin HEAD:fix/unittest-exit-five-semantics From d83665bbd38102428b8da275f8fce72afcd5b591 Mon Sep 17 00:00:00 2001 From: Felix Date: Sat, 15 Aug 2026 21:21:55 +0800 Subject: [PATCH 6/9] Remove refined unittest exit-five updater --- .../one-time-unittest-exit-five-v3.yml | 110 ------------------ 1 file changed, 110 deletions(-) delete mode 100644 .github/workflows/one-time-unittest-exit-five-v3.yml diff --git a/.github/workflows/one-time-unittest-exit-five-v3.yml b/.github/workflows/one-time-unittest-exit-five-v3.yml deleted file mode 100644 index dfca640..0000000 --- a/.github/workflows/one-time-unittest-exit-five-v3.yml +++ /dev/null @@ -1,110 +0,0 @@ -name: Refined unittest exit-five updater - -on: - push: - branches: - - fix/unittest-exit-five-semantics - paths: - - .github/workflows/one-time-unittest-exit-five-v3.yml - -permissions: - contents: write - -jobs: - update: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v7 - with: - ref: fix/unittest-exit-five-semantics - - uses: actions/setup-node@v7 - with: - node-version: 24 - cache: npm - - run: npm ci - - name: Patch corroborated unittest exit-five semantics - run: | - python - <<'PY' - from pathlib import Path - - evidence_old = '\n'.join([ - 'function isRecognizedNoTestsExit(check: CheckResult): boolean {', - ' return check.status === "failed" && check.exitCode === 5 && (check.targetRunner === "pytest" || check.targetRunner === "unittest");', - '}', - ]) - evidence_new = '\n'.join([ - 'function isRecognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean {', - ' if (check.status !== "failed" || check.exitCode !== 5) return false;', - ' if (check.targetRunner === "pytest") return true;', - ' if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) return false;', - ' const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`);', - ' const observations = targeted?.targetObservations ?? [];', - ' return targeted?.status === "passed"', - ' && observations.length > 0', - ' && observations.every((observation) => observation.outcome === "zero-tests"', - ' && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high"', - ' && qualification.path === observation.path', - ' && qualification.runnerPath === observation.runnerPath) === true);', - '}', - ]) - explanation_old = evidence_old.replace('isRecognizedNoTestsExit', 'recognizedNoTestsExit') - explanation_new = evidence_new.replace('isRecognizedNoTestsExit', 'recognizedNoTestsExit') - - for name, old, new, call, replacement, expected_calls in [ - ('src/evidence.ts', evidence_old, evidence_new, 'isRecognizedNoTestsExit(check)', 'isRecognizedNoTestsExit(check, applicable)', 3), - ('src/explanation.ts', explanation_old, explanation_new, 'recognizedNoTestsExit(check)', 'recognizedNoTestsExit(check, applicable)', 1), - ]: - path = Path(name) - text = path.read_text() - if text.count(old) != 1: - raise SystemExit(f'expected one helper block in {name}, found {text.count(old)}') - text = text.replace(old, new) - if text.count(call) != expected_calls: - raise SystemExit(f'expected {expected_calls} helper calls in {name}, found {text.count(call)}') - path.write_text(text.replace(call, replacement)) - - test_path = Path('tests/analyze.test.ts') - text = test_path.read_text() - marker = 'test("a unittest loader failure without an attributable test failure fails closed", async (context) => {' - if text.count(marker) != 1: - raise SystemExit('unittest loader regression marker was not unique') - block = '\n'.join([ - 'test("unittest exit 5 requires corroborating zero-test observations instead of being blindly suppressed", async (context) => {', - ' const root = await initializeRepository({', - ' "unittest.py": "raise SystemExit(5)\\n",', - ' "value.py": "def value():\\n return 1\\n",', - ' "tests/test_value.py": "import unittest\\nfrom value import value\\nclass ValueTest(unittest.TestCase):\\n def test_value(self):\\n self.assertEqual(value(), 2)\\n",', - ' });', - ' context.after(() => rm(root, { recursive: true, force: true }));', - ' await writeFiles(root, { "value.py": "def value():\\n return 2\\n" });', - ' const report = await analyzeRepository({ repo: root, runChecks: true, timeoutMs: 20_000 });', - ' const unittestChecks = report.checks.filter((check) => check.targetRunner === "unittest" && check.exitCode === 5);', - ' assert.ok(unittestChecks.length >= 1);', - ' assert.ok(unittestChecks.every((check) => check.status === "failed"));', - ' assert.equal(report.assessments[0]?.status, "verification-failed");', - ' assert.ok(report.assessments[0]?.evidence.some((item) => item.kind === "failing-check"));', - ' assert.equal(report.assessments[0]?.evidenceBoundary?.reason, "failure-unattributed");', - '});', - '', - '', - ]) - test_path.write_text(text.replace(marker, block + marker)) - - changelog = Path('CHANGELOG.md') - text = changelog.read_text() - marker = '## [Unreleased]\n\n### Fixed\n\n' - if text.count(marker) != 1: - raise SystemExit('unreleased changelog marker was not unique') - bullet = '- Tightened `unittest` exit-code 5 handling. The stdlib CLI uses code 5 when zero tests run, but a repository-local module can also make `python -m unittest` exit 5 before the real runner starts. ProofDiff now treats an opaque `unittest` exit 5 as benign only when the paired high-confidence targeted observer independently succeeds with exact zero-test observations; targeted or uncorroborated exit-5 failures remain verification failures. Pytest\'s exit-5 no-collection handling is unchanged.\n' - changelog.write_text(text.replace(marker, marker + bullet, 1)) - PY - - run: npm test - - run: npm run clean && npm run build - - run: git diff --check - - name: Commit generated change - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add src/evidence.ts src/explanation.ts tests/analyze.test.ts CHANGELOG.md dist - git commit -m "Corroborate unittest exit-five no-test results" - git push origin HEAD:fix/unittest-exit-five-semantics From cd1181a4b177041decf903b9c5ebae329c3c3626 Mon Sep 17 00:00:00 2001 From: Felix Date: Sat, 15 Aug 2026 21:24:14 +0800 Subject: [PATCH 7/9] Generalize exit-five corroboration to pytest --- .../one-time-python-exit-five-v4.yml | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 .github/workflows/one-time-python-exit-five-v4.yml diff --git a/.github/workflows/one-time-python-exit-five-v4.yml b/.github/workflows/one-time-python-exit-five-v4.yml new file mode 100644 index 0000000..48354b3 --- /dev/null +++ b/.github/workflows/one-time-python-exit-five-v4.yml @@ -0,0 +1,120 @@ +name: Python exit-five corroboration updater + +on: + push: + branches: + - fix/unittest-exit-five-semantics + paths: + - .github/workflows/one-time-python-exit-five-v4.yml + +permissions: + contents: write + +jobs: + update: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + ref: fix/unittest-exit-five-semantics + - uses: actions/setup-node@v7 + with: + node-version: 24 + cache: npm + - run: npm ci + - name: Require observer corroboration for Python exit five + run: | + python - <<'PY' + from pathlib import Path + + current = '\n'.join([ + 'function isRecognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean {', + ' if (check.status !== "failed" || check.exitCode !== 5) return false;', + ' if (check.targetRunner === "pytest") return true;', + ' if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) return false;', + ' const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`);', + ' const observations = targeted?.targetObservations ?? [];', + ' return targeted?.status === "passed"', + ' && observations.length > 0', + ' && observations.every((observation) => observation.outcome === "zero-tests"', + ' && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high"', + ' && qualification.path === observation.path', + ' && qualification.runnerPath === observation.runnerPath) === true);', + '}', + ]) + refined = '\n'.join([ + 'function hasExactZeroTestObservations(check: CheckResult): boolean {', + ' const observations = check.targetObservations ?? [];', + ' return observations.length > 0', + ' && observations.every((observation) => observation.outcome === "zero-tests"', + ' && check.targetQualifications?.some((qualification) => qualification.confidence === "high"', + ' && qualification.path === observation.path', + ' && qualification.runnerPath === observation.runnerPath) === true);', + '}', + '', + 'function isRecognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean {', + ' if (check.status !== "failed" || check.exitCode !== 5 || (check.targetRunner !== "pytest" && check.targetRunner !== "unittest")) return false;', + ' if (check.targetQualifications !== undefined) {', + ' return check.targetRunner === "pytest" && hasExactZeroTestObservations(check);', + ' }', + ' const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`);', + ' if (targeted === undefined || !hasExactZeroTestObservations(targeted)) return false;', + ' return targeted.status === "passed"', + ' || (targeted.status === "failed" && targeted.exitCode === 5 && targeted.targetRunner === "pytest");', + '}', + ]) + for name in ['src/evidence.ts', 'src/explanation.ts']: + path = Path(name) + text = path.read_text() + old = current if name.endswith('evidence.ts') else current.replace('isRecognizedNoTestsExit', 'recognizedNoTestsExit') + new = refined if name.endswith('evidence.ts') else refined.replace('isRecognizedNoTestsExit', 'recognizedNoTestsExit') + if text.count(old) != 1: + raise SystemExit(f'expected one current helper in {name}, found {text.count(old)}') + path.write_text(text.replace(old, new)) + + test_path = Path('tests/analyze.test.ts') + text = test_path.read_text() + marker = 'test("unittest exit 5 requires corroborating zero-test observations instead of being blindly suppressed", async (context) => {' + if text.count(marker) != 1: + raise SystemExit('unittest exit-five regression marker was not unique') + block = '\n'.join([ + 'test("pytest exit 5 without lifecycle observations remains a verification failure", async (context) => {', + ' const root = await initializeRepository({', + ' "pyproject.toml": "[tool.pytest]\\n",', + ' "pytest.py": "raise SystemExit(5)\\n",', + ' "value.py": "def value():\\n return 1\\n",', + ' "tests/test_value.py": "from value import value\\ndef test_value():\\n assert value() == 2\\n",', + ' });', + ' context.after(() => rm(root, { recursive: true, force: true }));', + ' await writeFiles(root, { "value.py": "def value():\\n return 2\\n" });', + ' const report = await analyzeRepository({ repo: root, runChecks: true, timeoutMs: 20_000 });', + ' const pytestChecks = report.checks.filter((check) => check.targetRunner === "pytest" && check.exitCode === 5);', + ' assert.ok(pytestChecks.length >= 1);', + ' assert.ok(pytestChecks.some((check) => check.targetQualifications !== undefined && check.targetObservations?.[0]?.outcome === "not-observed"));', + ' assert.equal(report.assessments[0]?.status, "verification-failed");', + ' assert.ok(report.assessments[0]?.evidence.some((item) => item.kind === "failing-check"));', + ' assert.equal(report.assessments[0]?.evidenceBoundary?.reason, "failure-unattributed");', + '});', + '', + '', + ]) + test_path.write_text(text.replace(marker, block + marker)) + + changelog = Path('CHANGELOG.md') + text = changelog.read_text() + old = '- Tightened `unittest` exit-code 5 handling. The stdlib CLI uses code 5 when zero tests run, but a repository-local module can also make `python -m unittest` exit 5 before the real runner starts. ProofDiff now treats an opaque `unittest` exit 5 as benign only when the paired high-confidence targeted observer independently succeeds with exact zero-test observations; targeted or uncorroborated exit-5 failures remain verification failures. Pytest\'s exit-5 no-collection handling is unchanged.\n' + new = '- Tightened Python test-runner exit-code 5 handling. Pytest and the stdlib `unittest` CLI use code 5 for no-test outcomes, but repository-local modules can also terminate runner imports with code 5 before trustworthy lifecycle observation. ProofDiff now accepts exit 5 as non-failing only when high-confidence exact zero-test observer data corroborates it: directly for targeted pytest, or through the paired targeted observer for opaque pytest/unittest commands. Uncorroborated exit-5 failures remain verification failures.\n' + if text.count(old) != 1: + raise SystemExit('expected one previous exit-five changelog bullet') + changelog.write_text(text.replace(old, new)) + PY + - run: npm test + - run: npm run clean && npm run build + - run: git diff --check + - name: Commit refined change + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add src/evidence.ts src/explanation.ts tests/analyze.test.ts CHANGELOG.md dist + git commit -m "Require evidence for Python no-test exit five" + git push origin HEAD:fix/unittest-exit-five-semantics From 154a1c2e75aeffb8b91f42780aaaadf4a5eaf174 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 15 Aug 2026 13:24:54 +0000 Subject: [PATCH 8/9] Require evidence for Python no-test exit five --- CHANGELOG.md | 2 +- dist/evidence.d.ts.map | 2 +- dist/evidence.js | 28 ++++++++++++++++------------ dist/evidence.js.map | 2 +- dist/explanation.d.ts.map | 2 +- dist/explanation.js | 28 ++++++++++++++++------------ dist/explanation.js.map | 2 +- src/evidence.ts | 24 +++++++++++++++--------- src/explanation.ts | 24 +++++++++++++++--------- tests/analyze.test.ts | 18 ++++++++++++++++++ 10 files changed, 85 insertions(+), 47 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e505a00..1afbf78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All notable changes are documented here. This project follows Semantic Versionin ### Fixed -- Tightened `unittest` exit-code 5 handling. The stdlib CLI uses code 5 when zero tests run, but a repository-local module can also make `python -m unittest` exit 5 before the real runner starts. ProofDiff now treats an opaque `unittest` exit 5 as benign only when the paired high-confidence targeted observer independently succeeds with exact zero-test observations; targeted or uncorroborated exit-5 failures remain verification failures. Pytest's exit-5 no-collection handling is unchanged. +- Tightened Python test-runner exit-code 5 handling. Pytest and the stdlib `unittest` CLI use code 5 for no-test outcomes, but repository-local modules can also terminate runner imports with code 5 before trustworthy lifecycle observation. ProofDiff now accepts exit 5 as non-failing only when high-confidence exact zero-test observer data corroborates it: directly for targeted pytest, or through the paired targeted observer for opaque pytest/unittest commands. Uncorroborated exit-5 failures remain verification failures. - Preserved LCOV `SF:` source paths exactly instead of applying JavaScript-style whitespace trimming. Leading or trailing spaces and Unicode whitespace are valid path characters, so silently erasing them could alias artifact coverage for one path onto a different changed repository file and overstate changed-line evidence. - Restricted recognized Node/Jest/Vitest package-script trimming to ASCII spaces and tabs. JavaScript `String.trim()` also removes non-ASCII whitespace such as NBSP, which shells do not treat as ordinary script separators; leading or trailing Unicode whitespace can therefore no longer be erased into a different executable command and accidentally qualify for exact targeted evidence. - Stopped `.pyi` stub files with test-like names from inventing executable pytest or `unittest` checks. Stubs remain available to static Python analysis and relationship discovery, but framework discovery now requires an executable `.py` test file; this prevents `--run-checks` from launching a Python test runner merely because a repository contains test-shaped type stubs. diff --git a/dist/evidence.d.ts.map b/dist/evidence.d.ts.map index 9f46976..0bcfe31 100644 --- a/dist/evidence.d.ts.map +++ b/dist/evidence.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,WAAW,EAAE,WAAW,EAAgB,cAAc,EAAiD,MAAM,YAAY,CAAC;AAClJ,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA+MlD,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG,cAAc,CAkEzI"} \ No newline at end of file +{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAY,WAAW,EAAE,WAAW,EAAgB,cAAc,EAAiD,MAAM,YAAY,CAAC;AAClJ,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAqNlD,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,aAAa,GAAE,MAAM,EAAO,GAAG,cAAc,CAkEzI"} \ No newline at end of file diff --git a/dist/evidence.js b/dist/evidence.js index 464df5a..0b4b46b 100644 --- a/dist/evidence.js +++ b/dist/evidence.js @@ -10,22 +10,26 @@ function checkApplies(check, file, relatedTests) { return file.language === "python"; return true; } -function isRecognizedNoTestsExit(check, checks) { - if (check.status !== "failed" || check.exitCode !== 5) - return false; - if (check.targetRunner === "pytest") - return true; - if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) - return false; - const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); - const observations = targeted?.targetObservations ?? []; - return targeted?.status === "passed" - && observations.length > 0 +function hasExactZeroTestObservations(check) { + const observations = check.targetObservations ?? []; + return observations.length > 0 && observations.every((observation) => observation.outcome === "zero-tests" - && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high" + && check.targetQualifications?.some((qualification) => qualification.confidence === "high" && qualification.path === observation.path && qualification.runnerPath === observation.runnerPath) === true); } +function isRecognizedNoTestsExit(check, checks) { + if (check.status !== "failed" || check.exitCode !== 5 || (check.targetRunner !== "pytest" && check.targetRunner !== "unittest")) + return false; + if (check.targetQualifications !== undefined) { + return check.targetRunner === "pytest" && hasExactZeroTestObservations(check); + } + const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); + if (targeted === undefined || !hasExactZeroTestObservations(targeted)) + return false; + return targeted.status === "passed" + || (targeted.status === "failed" && targeted.exitCode === 5 && targeted.targetRunner === "pytest"); +} function verificationFor(file, relatedTests, checks, declaredTests) { const evidence = []; const executed = checks.filter((check) => check.status !== "not-run"); diff --git a/dist/evidence.js.map b/dist/evidence.js.map index e2bc6e0..27fe02d 100644 --- a/dist/evidence.js.map +++ b/dist/evidence.js.map @@ -1 +1 @@ -{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"evidence.js","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5E,SAAS,YAAY,CAAC,KAAkB,EAAE,IAAiB,EAAE,YAAsB;IACjF,IAAI,KAAK,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAChG,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY,CAAC;IACxG,IAAI,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACtE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAkB;IACtD,MAAM,YAAY,GAAG,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACpD,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC;WACzB,YAAY,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,YAAY;eACtE,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,KAAK,MAAM;mBACrF,aAAa,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI;mBACvC,aAAa,CAAC,UAAU,KAAK,WAAW,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAkB,EAAE,MAAqB;IACxE,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,KAAK,CAAC,YAAY,KAAK,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9I,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;IACrF,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACpF,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ;WAC9B,CAAC,QAAQ,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,CAAC,IAAI,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC;AACvG,CAAC;AAED,SAAS,eAAe,CAAC,IAAiB,EAAE,YAAsB,EAAE,MAAqB,EAAE,aAAuB;IAChH,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC;IACvF,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC;SAChF,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SAChE,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,2BAA2B,GAAG,CAAC,KAAkB,EAAE,WAAmE,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI,IAAI,aAAa,CAAC,UAAU,KAAK,WAAW,CAAC,UAAU,CAAC,CAAC;IACrR,MAAM,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC;IAClJ,MAAM,uBAAuB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC;IACxJ,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;IACzG,MAAM,qBAAqB,GAAG,CAAC,KAAkB,EAAW,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,QAAQ,IAAI,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC;IACpO,MAAM,2BAA2B,GAAG,CAAC,KAAkB,EAAW,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,KAAK,cAAc,IAAI,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC,KAAK,IAAI,CAAC;IAC3R,MAAM,gCAAgC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,KAAK,SAAS;WACzG,KAAK,CAAC,MAAM,KAAK,QAAQ;WACzB,CAAC,uBAAuB,CAAC,KAAK,EAAE,UAAU,CAAC;WAC3C,qBAAqB,CAAC,KAAK,CAAC;WAC5B,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,MAAM,2BAA2B,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,KAAK,SAAS;WACpG,KAAK,CAAC,MAAM,KAAK,QAAQ;WACzB,CAAC,uBAAuB,CAAC,KAAK,EAAE,UAAU,CAAC;WAC3C,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,KAAK,SAAS;WACvF,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;WACvD,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,gCAAgC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,EAAE,WAAW,CAAC,CAAC;WAC3J,CAAC,uBAAuB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAClD,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,KAAK,SAAS,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpJ,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC;IACpH,MAAM,cAAc,GAAqC,iBAAiB;SACvE,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,QAAQ,IAAI,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC;SACjG,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpJ,MAAM,aAAa,GAAG,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,KAAK,QAAQ,IAAI,WAAW,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEjM,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,cAAc,EAAE,GAAG,mBAAmB,CAAC,EAAE,CAAC;QAChE,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,WAAW;YACzB,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,KAAK,CAAC,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,2BAA2B,EAAE,CAAC;QAChD,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,2LAA2L;YACvN,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,KAAK,CAAC,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,gBAAgB,EAAE,CAAC;QACtD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,KAAK,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,+DAA+D,WAAW,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7N,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,oBAAoB,KAAK,SAAS,CAAC,EAAE,CAAC;QAChG,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;gBACtD,CAAC,CAAC,6FAA6F;gBAC/F,CAAC,CAAC,yGAAyG;YAC7G,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,KAAK,CAAC,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QACxF,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,IAAI,aAAa,GAAG,CAAC;YAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,aAAa,wEAAwE,CAAC,CAAC;QACxI,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;YAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,8BAA8B,CAAC,CAAC;QAC5G,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,GAAG,YAAY,CAAC,MAAM,0BAA0B,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;YAC7F,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,oKAAoK;YAC3M,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,GAAG,aAAa,CAAC,MAAM,mCAAmC,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;YACxG,MAAM,EAAE,sOAAsO;YAC9O,UAAU,EAAE,MAAM;SACnB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,eAAe;YACrB,KAAK,EAAE,GAAG,aAAa,CAAC,MAAM,4CAA4C,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,mBAAmB;YAClI,MAAM,EAAE,oQAAoQ;YAC5Q,UAAU,EAAE,MAAM;SACnB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,uBAAuB,EAAE,CAAC;QAC7D,MAAM,aAAa,GAAG,2BAA2B,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACtE,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,YAAY;YAClB,KAAK,EAAE,GAAG,WAAW,CAAC,IAAI,KAAK,aAAa,EAAE,UAAU,IAAI,SAAS,6BAA6B;YAClG,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,IAAI,aAAa,EAAE,UAAU,IAAI,gFAAgF,yJAAyJ;YACvS,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,KAAK,CAAC,EAAE;SAClB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACxI,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACjK,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,2BAA2B,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;IAC5N,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,+FAA+F,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;YACjM,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;IACrG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;IACzG,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAiB,EAAE,QAAoC,EAAE,KAAK,GAAG,GAAG;IAC/F,IAAI,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC7G,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QAClD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACjH,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,OAAO,CACd,IAAiB,EACjB,MAA0B,EAC1B,wBAAiC,EACjC,eAAwB,EACxB,QAAkB,EAClB,QAAoC;IAEpC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAErD,IAAI,MAAM,KAAK,qBAAqB,EAAE,CAAC;QAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAAC,CAAC;SAC3G,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAAC,CAAC;SAC1H,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAAC,CAAC;SAC5G,IAAI,MAAM,KAAK,oBAAoB,EAAE,CAAC;QAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAAC,CAAC;IAE3I,IAAI,CAAC,wBAAwB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,KAAK,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,eAAe;YAC1B,CAAC,CAAC,oIAAoI;YACtI,CAAC,CAAC,iDAAiD,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAAC,CAAC;IAC7H,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAAC,CAAC;IACnG,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAAC,CAAC;IAC3G,IAAI,QAAQ,EAAE,UAAU,KAAK,KAAK,EAAE,CAAC;QAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAAC,CAAC;IACzH,IAAI,QAAQ,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAAC,KAAK,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAAC,CAAC;IAClH,IAAI,YAAY,IAAI,GAAG,EAAE,CAAC;QAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,yBAAyB,YAAY,kBAAkB,CAAC,CAAC;IAAC,CAAC;SAC3G,IAAI,YAAY,IAAI,GAAG,EAAE,CAAC;QAAC,KAAK,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,yBAAyB,YAAY,kBAAkB,CAAC,CAAC;IAAC,CAAC;IACpH,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAAC,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,QAAQ,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAAC,CAAC;SAC/G,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAAC,KAAK,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,MAAM,mBAAmB,CAAC,CAAC;IAAC,CAAC;IAC9G,IAAI,iGAAiG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACrI,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,4EAA4E,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjG,KAAK,IAAI,EAAE,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,MAAM,KAAK,GAAc,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAChH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAiB,EAAE,KAAsB,EAAE,MAAqB,EAAE,gBAA0B,EAAE;IACvH,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,kBAAkB,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9G,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IACjM,MAAM,SAAS,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpF,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3J,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,SAAS,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5F,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACjI,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,WAAW,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACrI,IAAI,QAAQ,EAAE,WAAW,CAAC,MAAM;QAAE,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC5E,IAAI,MAAM,CAAC,SAAS;QAAE,WAAW,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAC3F,IAAI,kBAAkB,CAAC,SAAS;QAAE,WAAW,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;IAC3I,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,+GAA+G,CAAC,CAAC;IAC1K,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,WAAW,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAC/G,IAAI,IAAI,CAAC,MAAM;QAAE,WAAW,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC9E,IAAI,gBAAgB,CAAC,SAAS;QAAE,WAAW,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;IAC1I,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,qBAAqB,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,4JAA4J,CAAC,CAAC;IACvS,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,6IAA6I,CAAC,CAAC;SAC1L,IAAI,YAAY,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,wJAAwJ,CAAC,CAAC;;QACxN,WAAW,CAAC,IAAI,CAAC,4KAA4K,CAAC,CAAC;IACpM,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7G,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,qCAAqC,mBAAmB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,yFAAyF,CAAC,CAAC;IACtQ,MAAM,mBAAmB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACxG,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC;QAAE,WAAW,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,mCAAmC,mBAAmB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,0IAA0I,CAAC,CAAC;IAErT,MAAM,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;QACtL,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAqB;YAC3B,KAAK,EAAE,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,kBAAkB,gBAAgB,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,mBAAmB;YAC1H,MAAM,EAAE,yCAAyC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,kEAAkE;YAChO,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,iBAAiB,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,qHAAqH,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5R,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,MAAM,sBAAsB,EAAE,MAAM,EAAE,sBAAsB,QAAQ,CAAC,UAAU,uEAAuE,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACnP,CAAC;IAED,OAAO;QACL,IAAI;QACJ,cAAc,EAAE,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC9C,YAAY,EAAE,gBAAgB,CAAC,KAAK;QACpC,aAAa,EAAE,MAAM,CAAC,KAAK;QAC3B,YAAY;QACZ,aAAa,EAAE,YAAY,CAAC,aAAa;QACzC,cAAc,EAAE,YAAY,CAAC,cAAc;QAC3C,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,IAAI,EAAE,IAAI,CAAC,KAAK;QAChB,SAAS,EAAE,IAAI,CAAC,KAAK;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,QAAQ;QACR,WAAW;KACZ,CAAC;AACJ,CAAC"} \ No newline at end of file diff --git a/dist/explanation.d.ts.map b/dist/explanation.d.ts.map index 6123749..4a5d02b 100644 --- a/dist/explanation.d.ts.map +++ b/dist/explanation.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"explanation.d.ts","sourceRoot":"","sources":["../src/explanation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAsB,cAAc,EAAE,MAAM,YAAY,CAAC;AA2BpG,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAyLrG"} \ No newline at end of file +{"version":3,"file":"explanation.d.ts","sourceRoot":"","sources":["../src/explanation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAsB,cAAc,EAAE,MAAM,YAAY,CAAC;AAiCpG,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAyLrG"} \ No newline at end of file diff --git a/dist/explanation.js b/dist/explanation.js index 3097344..80ecbeb 100644 --- a/dist/explanation.js +++ b/dist/explanation.js @@ -7,22 +7,26 @@ function checkApplies(check, item) { return item.file.language === "python"; return true; } -function recognizedNoTestsExit(check, checks) { - if (check.status !== "failed" || check.exitCode !== 5) - return false; - if (check.targetRunner === "pytest") - return true; - if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) - return false; - const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); - const observations = targeted?.targetObservations ?? []; - return targeted?.status === "passed" - && observations.length > 0 +function hasExactZeroTestObservations(check) { + const observations = check.targetObservations ?? []; + return observations.length > 0 && observations.every((observation) => observation.outcome === "zero-tests" - && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high" + && check.targetQualifications?.some((qualification) => qualification.confidence === "high" && qualification.path === observation.path && qualification.runnerPath === observation.runnerPath) === true); } +function recognizedNoTestsExit(check, checks) { + if (check.status !== "failed" || check.exitCode !== 5 || (check.targetRunner !== "pytest" && check.targetRunner !== "unittest")) + return false; + if (check.targetQualifications !== undefined) { + return check.targetRunner === "pytest" && hasExactZeroTestObservations(check); + } + const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); + if (targeted === undefined || !hasExactZeroTestObservations(targeted)) + return false; + return targeted.status === "passed" + || (targeted.status === "failed" && targeted.exitCode === 5 && targeted.targetRunner === "pytest"); +} function action(kind, detail, requiresRepositoryCodeExecution = false) { return { kind, detail, requiresRepositoryCodeExecution }; } diff --git a/dist/explanation.js.map b/dist/explanation.js.map index 6262c7a..8f303fc 100644 --- a/dist/explanation.js.map +++ b/dist/explanation.js.map @@ -1 +1 @@ -{"version":3,"file":"explanation.js","sourceRoot":"","sources":["../src/explanation.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"explanation.js","sourceRoot":"","sources":["../src/explanation.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/evidence.ts b/src/evidence.ts index 4751e98..6ac166f 100644 --- a/src/evidence.ts +++ b/src/evidence.ts @@ -11,20 +11,26 @@ function checkApplies(check: CheckResult, file: ChangedFile, relatedTests: strin return true; } -function isRecognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean { - if (check.status !== "failed" || check.exitCode !== 5) return false; - if (check.targetRunner === "pytest") return true; - if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) return false; - const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); - const observations = targeted?.targetObservations ?? []; - return targeted?.status === "passed" - && observations.length > 0 +function hasExactZeroTestObservations(check: CheckResult): boolean { + const observations = check.targetObservations ?? []; + return observations.length > 0 && observations.every((observation) => observation.outcome === "zero-tests" - && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high" + && check.targetQualifications?.some((qualification) => qualification.confidence === "high" && qualification.path === observation.path && qualification.runnerPath === observation.runnerPath) === true); } +function isRecognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean { + if (check.status !== "failed" || check.exitCode !== 5 || (check.targetRunner !== "pytest" && check.targetRunner !== "unittest")) return false; + if (check.targetQualifications !== undefined) { + return check.targetRunner === "pytest" && hasExactZeroTestObservations(check); + } + const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); + if (targeted === undefined || !hasExactZeroTestObservations(targeted)) return false; + return targeted.status === "passed" + || (targeted.status === "failed" && targeted.exitCode === 5 && targeted.targetRunner === "pytest"); +} + function verificationFor(file: ChangedFile, relatedTests: string[], checks: CheckResult[], declaredTests: string[]): { status: VerificationStatus; evidence: EvidenceItem[]; executedTests: string[]; testExecutions: FileAssessment["testExecutions"] } { const evidence: EvidenceItem[] = []; const executed = checks.filter((check) => check.status !== "not-run"); diff --git a/src/explanation.ts b/src/explanation.ts index 48b1399..74291e3 100644 --- a/src/explanation.ts +++ b/src/explanation.ts @@ -7,20 +7,26 @@ function checkApplies(check: CheckResult, item: FileAssessment): boolean { return true; } -function recognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean { - if (check.status !== "failed" || check.exitCode !== 5) return false; - if (check.targetRunner === "pytest") return true; - if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) return false; - const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); - const observations = targeted?.targetObservations ?? []; - return targeted?.status === "passed" - && observations.length > 0 +function hasExactZeroTestObservations(check: CheckResult): boolean { + const observations = check.targetObservations ?? []; + return observations.length > 0 && observations.every((observation) => observation.outcome === "zero-tests" - && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high" + && check.targetQualifications?.some((qualification) => qualification.confidence === "high" && qualification.path === observation.path && qualification.runnerPath === observation.runnerPath) === true); } +function recognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean { + if (check.status !== "failed" || check.exitCode !== 5 || (check.targetRunner !== "pytest" && check.targetRunner !== "unittest")) return false; + if (check.targetQualifications !== undefined) { + return check.targetRunner === "pytest" && hasExactZeroTestObservations(check); + } + const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`); + if (targeted === undefined || !hasExactZeroTestObservations(targeted)) return false; + return targeted.status === "passed" + || (targeted.status === "failed" && targeted.exitCode === 5 && targeted.targetRunner === "pytest"); +} + function action(kind: EvidenceNextAction["kind"], detail: string, requiresRepositoryCodeExecution = false): EvidenceNextAction { return { kind, detail, requiresRepositoryCodeExecution }; } diff --git a/tests/analyze.test.ts b/tests/analyze.test.ts index a146883..f74efa9 100644 --- a/tests/analyze.test.ts +++ b/tests/analyze.test.ts @@ -327,6 +327,24 @@ test("pytest exit 5 remains a non-failing no-collection outcome", async (context assert.ok(!report.assessments[0]?.evidence.some((item) => item.kind === "failing-check")); }); +test("pytest exit 5 without lifecycle observations remains a verification failure", async (context) => { + const root = await initializeRepository({ + "pyproject.toml": "[tool.pytest]\n", + "pytest.py": "raise SystemExit(5)\n", + "value.py": "def value():\n return 1\n", + "tests/test_value.py": "from value import value\ndef test_value():\n assert value() == 2\n", + }); + context.after(() => rm(root, { recursive: true, force: true })); + await writeFiles(root, { "value.py": "def value():\n return 2\n" }); + const report = await analyzeRepository({ repo: root, runChecks: true, timeoutMs: 20_000 }); + const pytestChecks = report.checks.filter((check) => check.targetRunner === "pytest" && check.exitCode === 5); + assert.ok(pytestChecks.length >= 1); + assert.ok(pytestChecks.some((check) => check.targetQualifications !== undefined && check.targetObservations?.[0]?.outcome === "not-observed")); + assert.equal(report.assessments[0]?.status, "verification-failed"); + assert.ok(report.assessments[0]?.evidence.some((item) => item.kind === "failing-check")); + assert.equal(report.assessments[0]?.evidenceBoundary?.reason, "failure-unattributed"); +}); + test("unittest exit 5 requires corroborating zero-test observations instead of being blindly suppressed", async (context) => { const root = await initializeRepository({ "unittest.py": "raise SystemExit(5)\n", From 112fb54cb8ae19c0e5da41faaeff14cfdcf7ce3d Mon Sep 17 00:00:00 2001 From: Felix Date: Sat, 15 Aug 2026 21:25:12 +0800 Subject: [PATCH 9/9] Remove one-time Python exit-five updater --- .../one-time-python-exit-five-v4.yml | 120 ------------------ 1 file changed, 120 deletions(-) delete mode 100644 .github/workflows/one-time-python-exit-five-v4.yml diff --git a/.github/workflows/one-time-python-exit-five-v4.yml b/.github/workflows/one-time-python-exit-five-v4.yml deleted file mode 100644 index 48354b3..0000000 --- a/.github/workflows/one-time-python-exit-five-v4.yml +++ /dev/null @@ -1,120 +0,0 @@ -name: Python exit-five corroboration updater - -on: - push: - branches: - - fix/unittest-exit-five-semantics - paths: - - .github/workflows/one-time-python-exit-five-v4.yml - -permissions: - contents: write - -jobs: - update: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v7 - with: - ref: fix/unittest-exit-five-semantics - - uses: actions/setup-node@v7 - with: - node-version: 24 - cache: npm - - run: npm ci - - name: Require observer corroboration for Python exit five - run: | - python - <<'PY' - from pathlib import Path - - current = '\n'.join([ - 'function isRecognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean {', - ' if (check.status !== "failed" || check.exitCode !== 5) return false;', - ' if (check.targetRunner === "pytest") return true;', - ' if (check.targetRunner !== "unittest" || check.targetQualifications !== undefined) return false;', - ' const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`);', - ' const observations = targeted?.targetObservations ?? [];', - ' return targeted?.status === "passed"', - ' && observations.length > 0', - ' && observations.every((observation) => observation.outcome === "zero-tests"', - ' && targeted.targetQualifications?.some((qualification) => qualification.confidence === "high"', - ' && qualification.path === observation.path', - ' && qualification.runnerPath === observation.runnerPath) === true);', - '}', - ]) - refined = '\n'.join([ - 'function hasExactZeroTestObservations(check: CheckResult): boolean {', - ' const observations = check.targetObservations ?? [];', - ' return observations.length > 0', - ' && observations.every((observation) => observation.outcome === "zero-tests"', - ' && check.targetQualifications?.some((qualification) => qualification.confidence === "high"', - ' && qualification.path === observation.path', - ' && qualification.runnerPath === observation.runnerPath) === true);', - '}', - '', - 'function isRecognizedNoTestsExit(check: CheckResult, checks: CheckResult[]): boolean {', - ' if (check.status !== "failed" || check.exitCode !== 5 || (check.targetRunner !== "pytest" && check.targetRunner !== "unittest")) return false;', - ' if (check.targetQualifications !== undefined) {', - ' return check.targetRunner === "pytest" && hasExactZeroTestObservations(check);', - ' }', - ' const targeted = checks.find((candidate) => candidate.id === `${check.id}:targeted`);', - ' if (targeted === undefined || !hasExactZeroTestObservations(targeted)) return false;', - ' return targeted.status === "passed"', - ' || (targeted.status === "failed" && targeted.exitCode === 5 && targeted.targetRunner === "pytest");', - '}', - ]) - for name in ['src/evidence.ts', 'src/explanation.ts']: - path = Path(name) - text = path.read_text() - old = current if name.endswith('evidence.ts') else current.replace('isRecognizedNoTestsExit', 'recognizedNoTestsExit') - new = refined if name.endswith('evidence.ts') else refined.replace('isRecognizedNoTestsExit', 'recognizedNoTestsExit') - if text.count(old) != 1: - raise SystemExit(f'expected one current helper in {name}, found {text.count(old)}') - path.write_text(text.replace(old, new)) - - test_path = Path('tests/analyze.test.ts') - text = test_path.read_text() - marker = 'test("unittest exit 5 requires corroborating zero-test observations instead of being blindly suppressed", async (context) => {' - if text.count(marker) != 1: - raise SystemExit('unittest exit-five regression marker was not unique') - block = '\n'.join([ - 'test("pytest exit 5 without lifecycle observations remains a verification failure", async (context) => {', - ' const root = await initializeRepository({', - ' "pyproject.toml": "[tool.pytest]\\n",', - ' "pytest.py": "raise SystemExit(5)\\n",', - ' "value.py": "def value():\\n return 1\\n",', - ' "tests/test_value.py": "from value import value\\ndef test_value():\\n assert value() == 2\\n",', - ' });', - ' context.after(() => rm(root, { recursive: true, force: true }));', - ' await writeFiles(root, { "value.py": "def value():\\n return 2\\n" });', - ' const report = await analyzeRepository({ repo: root, runChecks: true, timeoutMs: 20_000 });', - ' const pytestChecks = report.checks.filter((check) => check.targetRunner === "pytest" && check.exitCode === 5);', - ' assert.ok(pytestChecks.length >= 1);', - ' assert.ok(pytestChecks.some((check) => check.targetQualifications !== undefined && check.targetObservations?.[0]?.outcome === "not-observed"));', - ' assert.equal(report.assessments[0]?.status, "verification-failed");', - ' assert.ok(report.assessments[0]?.evidence.some((item) => item.kind === "failing-check"));', - ' assert.equal(report.assessments[0]?.evidenceBoundary?.reason, "failure-unattributed");', - '});', - '', - '', - ]) - test_path.write_text(text.replace(marker, block + marker)) - - changelog = Path('CHANGELOG.md') - text = changelog.read_text() - old = '- Tightened `unittest` exit-code 5 handling. The stdlib CLI uses code 5 when zero tests run, but a repository-local module can also make `python -m unittest` exit 5 before the real runner starts. ProofDiff now treats an opaque `unittest` exit 5 as benign only when the paired high-confidence targeted observer independently succeeds with exact zero-test observations; targeted or uncorroborated exit-5 failures remain verification failures. Pytest\'s exit-5 no-collection handling is unchanged.\n' - new = '- Tightened Python test-runner exit-code 5 handling. Pytest and the stdlib `unittest` CLI use code 5 for no-test outcomes, but repository-local modules can also terminate runner imports with code 5 before trustworthy lifecycle observation. ProofDiff now accepts exit 5 as non-failing only when high-confidence exact zero-test observer data corroborates it: directly for targeted pytest, or through the paired targeted observer for opaque pytest/unittest commands. Uncorroborated exit-5 failures remain verification failures.\n' - if text.count(old) != 1: - raise SystemExit('expected one previous exit-five changelog bullet') - changelog.write_text(text.replace(old, new)) - PY - - run: npm test - - run: npm run clean && npm run build - - run: git diff --check - - name: Commit refined change - run: | - git config user.name "github-actions[bot]" - git config user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add src/evidence.ts src/explanation.ts tests/analyze.test.ts CHANGELOG.md dist - git commit -m "Require evidence for Python no-test exit five" - git push origin HEAD:fix/unittest-exit-five-semantics