diff --git a/tests/test_pre_tag_audit_provenance.py b/tests/test_pre_tag_audit_provenance.py index f4b0812..21e56fe 100644 --- a/tests/test_pre_tag_audit_provenance.py +++ b/tests/test_pre_tag_audit_provenance.py @@ -156,15 +156,21 @@ def test_F6_eine_prosa_attestierungszeile_erteilt_keinen_pass_mehr(self): changelog_text="nothing about audits here at all"), VERSION) self.assertFalse(r["ok"], "eine Prosa-Zeile hat weiterhin einen PASS erteilt (F6 nicht geschlossen)") - @unittest.skipUnless(_conftest.running_in_repo_checkout(), - "liest das ECHTE Repo indirekt ueber das Gate (kein Pfad-Literal im Modul, also " - "von der conftest-Ableitung nicht erkennbar) — N/A ausserhalb eines Checkouts") def test_gegenrichtung_das_echte_repo_besteht_weiterhin(self): - """makellose-500 F6: ohne signierten Receipt fuer DIESEN Tree ist fail-closed der KORREKTE + """makellose-500 F6: ohne signierten Receipt fuer einen Tree ist fail-closed der KORREKTE Zustand. Dass der Riegel nicht ALLES ablehnt, zeigt die Positiv-Kontrolle in - test_pre_tag_receipt_gate.py (ein gueltiger Receipt verifiziert).""" - r = g.evaluate(REPO) - self.assertFalse(r["ok"], "das echte Repo hat ohne signierten Receipt einen PASS erteilt") + test_pre_tag_receipt_gate.py (ein gueltiger Receipt verifiziert). + ISOLIERT (Post-Release-Cleanup 2026-08-27): geprueft wird ein garantiert BELEG-FREIER Temp-Baum, + NICHT das echte Repo — das traegt nach einem Release einen gueltigen Receipt und erteilt dort + korrekt einen PASS (bewiesen von der Positiv-Kontrolle). Das skipUnless(running_in_repo_checkout) + entfaellt, weil der Test nicht mehr vom echten Checkout abhaengt. QITEM-PB5-POST-RELEASE-CLEANUP-01.""" + import tempfile # noqa: PLC0415 + with tempfile.TemporaryDirectory() as td: + r = g.evaluate(pathlib.Path(td), version="5.0.0") + self.assertFalse(r["ok"], "ein beleg-freier Baum hat ohne signierten Receipt einen PASS erteilt") + # STRUKTURELLE Invariante statt Keyword (Gegenlesung un, Fund B): fail-closed WEIL 0 Belege + # verifiziert wurden, nicht aus einem anderen Grund, dessen reason zufaellig "receipt" enthaelt. + self.assertEqual(r.get("verified_receipts") or [], [], r) self.assertIn("receipt", (r["reason"] or "").lower()) def test_die_attestierung_ist_eine_ganze_zeile_kein_teilstring(self): diff --git a/tests/test_roadmap_frontload_foundations.py b/tests/test_roadmap_frontload_foundations.py index 6504b05..3055e55 100644 --- a/tests/test_roadmap_frontload_foundations.py +++ b/tests/test_roadmap_frontload_foundations.py @@ -153,10 +153,21 @@ def setUp(self): def test_released_repo_without_signed_receipt_is_fail_closed(self): # makellose-500 F6: der Verdikt kommt aus einem SIGNIERTEN, tree-gebundenen Receipt, nicht aus - # einer Prosa-Zeile. Ein Dev-Tree ohne signierten Receipt ist FAIL-CLOSED (korrekt). Die + # einer Prosa-Zeile. Ein Tree OHNE signierten Receipt ist FAIL-CLOSED (korrekt). Die # Positiv-Kontrolle (ein gueltiger Receipt verifiziert) steht in tests/test_pre_tag_receipt_gate.py. - result = self.gate.evaluate(REPO) + # ISOLIERT (Post-Release-Cleanup 2026-08-27): geprueft wird ein BELEG-FREIER Temp-Baum, NICHT das + # echte Repo. Sobald ein Release einen gueltigen Receipt in den echten Baum committet, erteilt das + # Gate dort korrekt einen PASS — die Negativkontrolle muss die fail-closed-Invariante deshalb auf + # einem garantiert receipt-freien Baum fangen (wie die Nachbar-Tests in dieser Datei), sonst kippt + # sie bei jedem Release. QITEM-PB5-POST-RELEASE-CLEANUP-01. + import tempfile # noqa: PLC0415 + with tempfile.TemporaryDirectory() as td: + result = self.gate.evaluate(Path(td), version="5.0.0") self.assertFalse(result["ok"], result) + # STRUKTURELLE Invariante statt Keyword (Gegenlesung un, Fund B): fail-closed muss WEIL 0 Belege + # verifiziert wurden eintreten, nicht aus einem anderen Grund, dessen reason zufaellig "receipt" + # enthaelt. Sonst waere gruen eine Tautologie. + self.assertEqual(result.get("verified_receipts") or [], [], result) self.assertIn("receipt", (result["reason"] or "").lower()) def test_missing_audit_is_caught(self):