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.
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.
## 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.
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.
**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`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Der Anlass
1.7.1(#8) hat die Testsuite gegen stille Umgebungsabhängigkeiten gehärtet: die autouse-Fixturehermetic_environmentintools/chemenu/tests/conftest.pylöscht vor jedem Test die Variablen, diewikitoolselbst liest, und listet sie dafür in_WIKITOOL_ENVauf.Stand 2026-09-04, geprüft gegen 4.5.0:
Diese Liste ist von Hand gepflegt.
instructions/dev/testing-conventions.mdschreibt 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_ROOTist 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_NEWinchemenu/einführt undconftest.pynicht 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.pyprü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/(ohnetests/) nach den Namen absucht, die anos.environ.get,os.environ[...]undos.getenvübergeben werden, und die Menge gegen_WIKITOOL_ENV ∪ {"WIKI_TRACE_DIR"}abgleicht. Statisch überast, nicht per Regex: einast.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:
HOME,PATH,EDITORund Ähnliches. Die Fixture behandeltHOMEseparat (setzen statt löschen), undPATHzu löschen wäre absurd.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_DIRist der dokumentierte Sonderfall: gesetzt statt gelöscht, vonisolated_trace_dir. Der Test muss ihn als abgedeckt akzeptieren, sonst schlägt er sofort fehl.Zu prüfen beim Bauen:
conftest.pyführt neben_WIKITOOL_ENVein zweites Tupel_GIT_ENVfür die Variablen, die git für Identität und Repo-Ort liest (Zeile 144 löscht beide gemeinsam). Der neue Test darf_GIT_ENVnicht als „unbekannt" melden, sondern muss die Vereinigung beider prüfen — oder_GIT_ENVbewusst ausklammern, weil dort nichtchemenu-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
chemenu/außerhalb vontests/liest, und schlägt fehl, wenn sie weder in_WIKITOOL_ENVnoch in der begründeten Ausnahmeliste steht._GIT_ENVentschieden und im Code begründet.instructions/dev/testing-conventions.mdSchritt 4 verweist auf den Test statt nur zu ermahnen.Herkunft
Aufgefallen beim Schreiben von
testing-conventions.mdin 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 dahintools/wiki_tools/…und die siebenstellige Liste ohneCHEMENU_ROOT. Teilerledigung von #29.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_ROOTkam mit 2.3.0 (#31) dazu. Das war der schädlichste Teil: eine kalte Sitzung konnte den Codeblock gegenconftest.pyhalten, eine Abweichung sehen, die keine ist, und daraus die falsche Aufgabe ableiten.CHEMENU_ROOTwurde 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._GIT_ENVentscheiden.conftest.pyführt das zweite Tupel für die Variablen, die git liest, und löscht beide gemeinsam (Zeile 144); der geplanteast-Test darf sie nicht als „unbekannt" melden.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 intesting-conventions.md.torben referenced this issue2026-09-27 08:46:11 +00:00