Nichts erzwingt, dass eine neue Tool-Umgebungsvariable in _WIKITOOL_ENV landet #23

Open
opened 2026-08-31 18:18:33 +00:00 by torben · 1 comment
Owner

Der Anlass

1.7.1 (#8) hat die Testsuite gegen stille Umgebungsabhängigkeiten gehärtet: die autouse-Fixture hermetic_environment in tools/chemenu/tests/conftest.py löscht vor jedem Test die Variablen, die wikitool selbst liest, und listet sie dafür in _WIKITOOL_ENV auf.

Stand 2026-09-04, geprüft gegen 4.5.0:

_WIKITOOL_ENV = (
    "WIKI_AUTHOR",
    "WIKI_TRACE",
    "WIKI_TRACE_CONTENT",
    "WIKI_TRACE_MAX_CONTENT",
    "WIKITOOL_SESSION_ID",
    "WIKITOOL_UPDATE_URL",
    "WIKITOOL_UPDATE_TOKEN",
    "CHEMENU_ROOT",
)

Diese Liste ist von Hand gepflegt. instructions/dev/testing-conventions.md schreibt in Schritt 4 vor, eine neue Variable in derselben Änderung nachzutragen — aber das ist eine Prosa-Regel, und die Prämisse von #8 war gerade, dass eine Prosa-Regel diesen Fehler nicht verhindert. Vier Tests haben die Abhängigkeit nacheinander eingeschleppt, der dritte und vierte von jemandem, der das Issue vorher gelesen hatte.

Der Befund ist inzwischen belegt, nicht mehr vermutet

CHEMENU_ROOT ist der achte Eintrag oben und kam mit 2.3.0 (#31, Root-Auflösung) dazu — von Hand nachgetragen, genau auf dem Weg, den dieses Issue als unzuverlässig beschreibt. Es hat diesmal geklappt. Das ist die Sorte Beleg, die nichts entkräftet: das Issue behauptet nicht, dass der Nachtrag immer vergessen wird, sondern dass nichts ihn erzwingt. #36 führt denselben Punkt als sein einziges nicht mitgelöstes loses Ende.

Wichtig für eine kalte Sitzung: der vollständig aussehende Codeblock oben heißt nicht, dass das Issue erledigt ist. Er ist der Ist-Zustand, den der geforderte Test absichern soll — die Lücke ist der fehlende Test, nicht ein fehlender Listeneintrag.

Die Lücke, konkret

Wer WIKI_SOMETHING_NEW in chemenu/ einführt und conftest.py nicht anfasst, bekommt keinen roten Test. Er bekommt eine Suite, die auf seiner Maschine grün ist, weil er die Variable nicht gesetzt hat — und die irgendwann bei jemandem umfällt, der sie gesetzt hat. Also exakt das Versagen aus #8, eine Ebene höher verschoben: von „ein Test liest die Umgebung" zu „der Schutz vor dem Lesen der Umgebung ist unvollständig, und nichts sagt es".

test_hermetic_env.py prüft, dass die gelisteten Variablen geleert sind. Es kann nicht prüfen, dass die Liste vollständig ist — dafür müsste es wissen, was der Code liest.

Vorschlag

Ein Test, der chemenu/ (ohne tests/) nach den Namen absucht, die an os.environ.get, os.environ[...] und os.getenv übergeben werden, und die Menge gegen _WIKITOOL_ENV ∪ {"WIKI_TRACE_DIR"} abgleicht. Statisch über ast, nicht per Regex: ein ast.walk über die geparsten Module findet die Aufrufe zuverlässig und ignoriert Vorkommen in Kommentaren und Docstrings.

Bewusst offen zu halten sind zwei Kategorien, und beide brauchen eine explizite Ausnahmeliste mit Begründung im Code:

  • Variablen, die nicht dem Tool gehörenHOME, PATH, EDITOR und Ähnliches. Die Fixture behandelt HOME separat (setzen statt löschen), und PATH zu löschen wäre absurd.
  • Dynamisch gebildete Namen, falls es sie je gibt. Ein os.environ.get(prefix + name) kann der Test nicht auflösen; er sollte dann fehlschlagen und zur Ausnahmeliste zwingen, statt still nichts zu finden.

WIKI_TRACE_DIR ist der dokumentierte Sonderfall: gesetzt statt gelöscht, von isolated_trace_dir. Der Test muss ihn als abgedeckt akzeptieren, sonst schlägt er sofort fehl.

Zu prüfen beim Bauen: conftest.py führt neben _WIKITOOL_ENV ein zweites Tupel _GIT_ENV für die Variablen, die git für Identität und Repo-Ort liest (Zeile 144 löscht beide gemeinsam). Der neue Test darf _GIT_ENV nicht als „unbekannt" melden, sondern muss die Vereinigung beider prüfen — oder _GIT_ENV bewusst ausklammern, weil dort nicht chemenu-Code die Variable liest, sondern ein Subprozess.

Warum nicht sofort in 1.7.1

Der Schnitt war „Suite härten", und die Härtung stand. Diesen Test dazuzupacken hätte eine zweite, andersartige Prüfung (statische Analyse des Quelltexts) in dieselbe Änderung gezogen. Er ist außerdem für sich genommen nützlich und für sich genommen prüfbar.

Akzeptanzkriterien

  • Ein Test findet jede Umgebungsvariable, die chemenu/ außerhalb von tests/ liest, und schlägt fehl, wenn sie weder in _WIKITOOL_ENV noch in der begründeten Ausnahmeliste steht.
  • Gegenprobe im Test selbst: eine künstlich hinzugefügte, nicht gelistete Variable lässt ihn fallen. Ohne diese Probe ist nicht gezeigt, dass er etwas findet.
  • Dynamisch gebildete Namen führen zu einem Fehlschlag mit verständlicher Meldung, nicht zu stillem Übergehen.
  • Verhältnis zu _GIT_ENV entschieden und im Code begründet.
  • instructions/dev/testing-conventions.md Schritt 4 verweist auf den Test statt nur zu ermahnen.
  • Changelog-Eintrag, PATCH.

Herkunft

Aufgefallen beim Schreiben von testing-conventions.md in der Sitzung zu #8: die Regel ließ sich aufschreiben, aber nicht erzwingen. Pfade und der _WIKITOOL_ENV-Auszug in diesem Body sind am 2026-09-04 auf den Stand von 4.5.0 nachgezogen worden — sie zeigten bis dahin tools/wiki_tools/… und die siebenstellige Liste ohne CHEMENU_ROOT. Teilerledigung von #29.

## Der Anlass `1.7.1` (#8) hat die Testsuite gegen stille Umgebungsabhängigkeiten gehärtet: die autouse-Fixture `hermetic_environment` in `tools/chemenu/tests/conftest.py` löscht vor jedem Test die Variablen, die `wikitool` selbst liest, und listet sie dafür in `_WIKITOOL_ENV` auf. **Stand 2026-09-04, geprüft gegen 4.5.0:** ```python _WIKITOOL_ENV = ( "WIKI_AUTHOR", "WIKI_TRACE", "WIKI_TRACE_CONTENT", "WIKI_TRACE_MAX_CONTENT", "WIKITOOL_SESSION_ID", "WIKITOOL_UPDATE_URL", "WIKITOOL_UPDATE_TOKEN", "CHEMENU_ROOT", ) ``` Diese Liste ist **von Hand gepflegt**. `instructions/dev/testing-conventions.md` schreibt in Schritt 4 vor, eine neue Variable in derselben Änderung nachzutragen — aber das ist eine Prosa-Regel, und die Prämisse von #8 war gerade, dass eine Prosa-Regel diesen Fehler nicht verhindert. Vier Tests haben die Abhängigkeit nacheinander eingeschleppt, der dritte und vierte von jemandem, der das Issue vorher gelesen hatte. ## Der Befund ist inzwischen belegt, nicht mehr vermutet `CHEMENU_ROOT` ist der achte Eintrag oben und kam mit 2.3.0 (#31, Root-Auflösung) dazu — **von Hand nachgetragen**, genau auf dem Weg, den dieses Issue als unzuverlässig beschreibt. Es hat diesmal geklappt. Das ist die Sorte Beleg, die nichts entkräftet: das Issue behauptet nicht, dass der Nachtrag *immer* vergessen wird, sondern dass nichts ihn erzwingt. #36 führt denselben Punkt als sein einziges nicht mitgelöstes loses Ende. **Wichtig für eine kalte Sitzung:** der vollständig aussehende Codeblock oben heißt *nicht*, dass das Issue erledigt ist. Er ist der Ist-Zustand, den der geforderte Test absichern soll — die Lücke ist der fehlende Test, nicht ein fehlender Listeneintrag. ## Die Lücke, konkret Wer `WIKI_SOMETHING_NEW` in `chemenu/` einführt und `conftest.py` nicht anfasst, bekommt keinen roten Test. Er bekommt eine Suite, die auf seiner Maschine grün ist, weil er die Variable nicht gesetzt hat — und die irgendwann bei jemandem umfällt, der sie gesetzt hat. Also exakt das Versagen aus #8, eine Ebene höher verschoben: von „ein Test liest die Umgebung" zu „der Schutz vor dem Lesen der Umgebung ist unvollständig, und nichts sagt es". `test_hermetic_env.py` prüft, dass die *gelisteten* Variablen geleert sind. Es kann nicht prüfen, dass die Liste vollständig ist — dafür müsste es wissen, was der Code liest. ## Vorschlag Ein Test, der `chemenu/` (ohne `tests/`) nach den Namen absucht, die an `os.environ.get`, `os.environ[...]` und `os.getenv` übergeben werden, und die Menge gegen `_WIKITOOL_ENV ∪ {"WIKI_TRACE_DIR"}` abgleicht. Statisch über `ast`, nicht per Regex: ein `ast.walk` über die geparsten Module findet die Aufrufe zuverlässig und ignoriert Vorkommen in Kommentaren und Docstrings. Bewusst offen zu halten sind zwei Kategorien, und beide brauchen eine explizite Ausnahmeliste mit Begründung im Code: - **Variablen, die nicht dem Tool gehören** — `HOME`, `PATH`, `EDITOR` und Ähnliches. Die Fixture behandelt `HOME` separat (setzen statt löschen), und `PATH` zu löschen wäre absurd. - **Dynamisch gebildete Namen**, falls es sie je gibt. Ein `os.environ.get(prefix + name)` kann der Test nicht auflösen; er sollte dann fehlschlagen und zur Ausnahmeliste zwingen, statt still nichts zu finden. `WIKI_TRACE_DIR` ist der dokumentierte Sonderfall: gesetzt statt gelöscht, von `isolated_trace_dir`. Der Test muss ihn als abgedeckt akzeptieren, sonst schlägt er sofort fehl. Zu prüfen beim Bauen: `conftest.py` führt neben `_WIKITOOL_ENV` ein zweites Tupel `_GIT_ENV` für die Variablen, die git für Identität und Repo-Ort liest (Zeile 144 löscht beide gemeinsam). Der neue Test darf `_GIT_ENV` nicht als „unbekannt" melden, sondern muss die Vereinigung beider prüfen — oder `_GIT_ENV` bewusst ausklammern, weil dort nicht `chemenu`-Code die Variable liest, sondern ein Subprozess. ## Warum nicht sofort in 1.7.1 Der Schnitt war „Suite härten", und die Härtung stand. Diesen Test dazuzupacken hätte eine zweite, andersartige Prüfung (statische Analyse des Quelltexts) in dieselbe Änderung gezogen. Er ist außerdem für sich genommen nützlich und für sich genommen prüfbar. ## Akzeptanzkriterien - [ ] Ein Test findet jede Umgebungsvariable, die `chemenu/` außerhalb von `tests/` liest, und schlägt fehl, wenn sie weder in `_WIKITOOL_ENV` noch in der begründeten Ausnahmeliste steht. - [ ] Gegenprobe im Test selbst: eine künstlich hinzugefügte, nicht gelistete Variable lässt ihn fallen. Ohne diese Probe ist nicht gezeigt, dass er etwas findet. - [ ] Dynamisch gebildete Namen führen zu einem Fehlschlag mit verständlicher Meldung, nicht zu stillem Übergehen. - [ ] Verhältnis zu `_GIT_ENV` entschieden und im Code begründet. - [ ] `instructions/dev/testing-conventions.md` Schritt 4 verweist auf den Test statt nur zu ermahnen. - [ ] Changelog-Eintrag, PATCH. ## Herkunft Aufgefallen beim Schreiben von `testing-conventions.md` in der Sitzung zu #8: die Regel ließ sich aufschreiben, aber nicht erzwingen. Pfade und der `_WIKITOOL_ENV`-Auszug in diesem Body sind am 2026-09-04 auf den Stand von 4.5.0 nachgezogen worden — sie zeigten bis dahin `tools/wiki_tools/…` und die siebenstellige Liste ohne `CHEMENU_ROOT`. Teilerledigung von #29.
torben added the prio/plannedsize/S labels 2026-08-31 18:18:33 +00:00
torben added the area/processkind/build labels 2026-09-02 21:24:53 +00:00
Author
Owner

Changelog: Body auf den Stand von 4.5.0 gebracht (Triage-Sitzung 2026-09-04).

  • _WIKITOOL_ENV-Auszug korrigiert: er zeigte sieben Einträge, tatsächlich sind es achtCHEMENU_ROOT kam mit 2.3.0 (#31) dazu. Das war der schädlichste Teil: eine kalte Sitzung konnte den Codeblock gegen conftest.py halten, eine Abweichung sehen, die keine ist, und daraus die falsche Aufgabe ableiten.
  • Neuer Abschnitt „Der Befund ist inzwischen belegt, nicht mehr vermutet": CHEMENU_ROOT wurde von Hand nachgetragen, auf genau dem Weg, den dieses Issue als unzuverlässig beschreibt. Es hat diesmal geklappt — das entkräftet nichts, weil die Behauptung nicht „wird immer vergessen" lautet, sondern „nichts erzwingt es". #36 führt denselben Punkt als sein einziges nicht mitgelöstes loses Ende.
  • Ausdrücklicher Satz dazu, dass der vollständig aussehende Codeblock nicht heißt, das Issue sei erledigt.
  • Neues Akzeptanzkriterium: Verhältnis zu _GIT_ENV entscheiden. conftest.py führt das zweite Tupel für die Variablen, die git liest, und löscht beide gemeinsam (Zeile 144); der geplante ast-Test darf sie nicht als „unbekannt" melden.
  • Pfade tools/wiki_tools/…tools/chemenu/…, wiki_tools/chemenu/ (Teilerledigung von #29).

Labels unverändert: area/process, kind/build, prio/planned, size/S. Der Zuschnitt ist derselbe — ein Test plus eine Zeile in testing-conventions.md.

**Changelog:** Body auf den Stand von 4.5.0 gebracht (Triage-Sitzung 2026-09-04). - `_WIKITOOL_ENV`-Auszug korrigiert: er zeigte sieben Einträge, tatsächlich sind es **acht** — `CHEMENU_ROOT` kam mit 2.3.0 (#31) dazu. Das war der schädlichste Teil: eine kalte Sitzung konnte den Codeblock gegen `conftest.py` halten, eine Abweichung sehen, die keine ist, und daraus die falsche Aufgabe ableiten. - Neuer Abschnitt „Der Befund ist inzwischen belegt, nicht mehr vermutet": `CHEMENU_ROOT` wurde von Hand nachgetragen, auf genau dem Weg, den dieses Issue als unzuverlässig beschreibt. Es hat diesmal geklappt — das entkräftet nichts, weil die Behauptung nicht „wird immer vergessen" lautet, sondern „nichts erzwingt es". #36 führt denselben Punkt als sein einziges nicht mitgelöstes loses Ende. - Ausdrücklicher Satz dazu, dass der vollständig aussehende Codeblock **nicht** heißt, das Issue sei erledigt. - Neues Akzeptanzkriterium: Verhältnis zu `_GIT_ENV` entscheiden. `conftest.py` führt das zweite Tupel für die Variablen, die git liest, und löscht beide gemeinsam (Zeile 144); der geplante `ast`-Test darf sie nicht als „unbekannt" melden. - Pfade `tools/wiki_tools/…` → `tools/chemenu/…`, `wiki_tools/` → `chemenu/` (Teilerledigung von #29). Labels unverändert: `area/process`, `kind/build`, `prio/planned`, `size/S`. Der Zuschnitt ist derselbe — ein Test plus eine Zeile in `testing-conventions.md`.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#23