• v4.1.1 23307c3c5f

    v4.1.1
    CI / verify (push) Successful in 55s
    Release / release (push) Successful in 38s
    Stable

    torben released this 2026-09-03 04:36:40 +00:00 | 79 commits to main since this release

    4.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 unter tmp_path, ließ config.ROOT aber auf dem echten Checkout stehen. Jeder
    Codepfad, der eine Datei über config.ROOT/config.KB_DIR auflö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.json des Repos überschrieb — Applied-Ledger leer statt zwei Einträgen. In
    git status sofort 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_DIR auf. Für eine Seite unter tmp_path/kb/ warf das ValueError, die Funktion
    antwortete „keine Kollektion", und die Label-Autorisierung übersprang die Kante wortlos.
    unauthorised_labels war 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 auf config.KB_DIR zurückzufallen. Der Regressionstest lintet einen Baum, von
    dem ROOT bewusst 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_dir tut, was raw_dir längst tat — ROOT auf
    das eigene tmp_path, plus use_shipped_type_specs(). Der Suite-Lauf kippte dadurch keinen
    einzigen Test. Die lokale rooted_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)
    vergleicht git status --porcelain vor und nach dem Lauf und lässt die Suite scheitern, wenn
    sich im Checkout etwas bewegt hat — zwei git 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=each prü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.md hat dafür einen eigenen Abschnitt („Which tree a test
    writes into"), einen Schritt in der Checkliste und die Regel für neue Fixturen.

    Downloads