-
v4.1.1 Stable
released this
2026-09-03 04:36:40 +00:00 | 79 commits to main since this release4.1.1 - 2026-09-03 - Testisolation: kb_dir repointet config.ROOT, lint löst Kollektionen gegen den übergebenen Baum auf
Author: Torben Nehmer
Issue #44, gefunden beim Bau der Migrations-Gate-Tests für 4.1.0: die
kb_dir-Fixture baute
ihren Baum untertmp_path, ließconfig.ROOTaber auf dem echten Checkout stehen. Jeder
Codepfad, der eine Datei überconfig.ROOT/config.KB_DIRauflöst statt über das übergebene
Verzeichnis, traf damit das echte Repository.Der laute Fall war ein Test, der
kb_state.write_kb_state()rief und dabei das
.wikitool-kb.jsondes Repos überschrieb — Applied-Ledger leer statt zwei Einträgen. In
git statussofort sichtbar und reversibel; bei einer gitignorierten Datei wäre es das nicht
gewesen.Der stillere Fall ist der teurere.
lints Kollektions-Lookup löste eine Seite gegen
config.KB_DIRauf. Für eine Seite untertmp_path/kb/warf dasValueError, die Funktion
antwortete „keine Kollektion", und die Label-Autorisierung übersprang die Kante wortlos.
unauthorised_labelswar damit faktisch ungetestet — jeder Test, der das Finding hätte
auslösen können, bekam eine leere Liste und behauptete nichts. Ein grüner Lauf, der wie eine
Zusicherung aussah.Der Fix ist der Codepfad, nicht die Fixture.
run_lint()bekommt ein Verzeichnis
übergeben und löst jetzt auch intern dagegen auf;authorised_labels()bekommt denselben Baum
gereicht, statt aufconfig.KB_DIRzurückzufallen. Der Regressionstest lintet einen Baum, von
demROOTbewusst wegzeigt — genau der Fall, den die alte Auflösung verschluckte. Eine Funktion,
die ein Verzeichnis entgegennimmt, löst dagegen auf: keine Fixture kann diese Form von außen
reparieren.Beide Korpus-Fixturen repointen jetzt.
kb_dirtut, wasraw_dirlängst tat —ROOTauf
das eigenetmp_path, plususe_shipped_type_specs(). Der Suite-Lauf kippte dadurch keinen
einzigen Test. Die lokalerooted_kb-Umgehung aus 4.1.0 entfällt damit; die Auswahl zwischen
zwei fast gleichen Fixturen war Wissen, das nirgends stand.Und ein Wächter für die ganze Klasse.
repository_tree_guard(session-scoped, autouse)
vergleichtgit status --porcelainvor und nach dem Lauf und lässt die Suite scheitern, wenn
sich im Checkout etwas bewegt hat — zweigit status-Aufrufe pro Lauf, deshalb per Default an.
Er vergleicht vorher gegen nachher statt einen sauberen Baum zu verlangen, sagt also nichts über
die unveröffentlichte Arbeit des Entwicklers. Den Verursacher benennt er nicht;
CHEMENU_TREE_GUARD=eachprüft nach jedem Test und tut es. Ohne git oder außerhalb eines
Repositorys sind beide still.Was der Wächter nicht sieht: eine Prüfung, die unter Test nichts tut, schreibt keine Datei.
Dagegen hilft nur ein Test, der das Finding tatsächlich auslöst — der neue tut das.instructions/dev/testing-conventions.mdhat dafür einen eigenen Abschnitt („Which tree a test
writes into"), einen Schritt in der Checkliste und die Regel für neue Fixturen.Downloads