Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions tests/test_pre_tag_audit_provenance.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
15 changes: 13 additions & 2 deletions tests/test_roadmap_frontload_foundations.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
Loading