Testsuite gegen stille Umgebungsabhängigkeiten härten #8

Closed
opened 2026-08-30 19:22:26 +00:00 by torben · 3 comments
Owner

Der Anlass

Der erste CI-Lauf, der überhaupt bis pytest kam (Run 52, 2026-08-30), hat zwei Tests umgeworfen, die auf jeder Entwicklermaschine seit Monaten grün sind:

FAILED wiki_tools/tests/test_new_page.py::test_new_source_author_falls_back_to_git_config
FAILED wiki_tools/tests/test_provenance.py::test_new_source_with_multiple_raw_files
AssertionError: ERROR No author configured for this instance.
                Set `git config user.name`, or export WIKI_AUTHOR to override it, then retry.
2 failed, 628 passed

Ursache: config.default_author() ruft git config user.name mit cwd=config.ROOT auf. Die Fixture-Wurzel ist kein Repository, also antwortete die globale git-Konfiguration dessen, der die Suite laufen ließ. Im Job-Container als root gibt es keine.

Beide Tests sind in 1.0.1 repariert (siehe CHANGES.md): der erste macht die Fixture-Wurzel jetzt selbst zu einem Repository mit lokalem user.name und behauptet den konkreten Namen; der zweite setzt WIKI_AUTHOR, weil es dort gar nicht um Autorschaft geht.

Was offen bleibt

Der Fix behebt zwei bekannte Fälle. Die Frage ist, wie viele unbekannte es gibt. Die Suite hat 630 Tests und hing an der Umgebung, ohne es zu sagen — sie hat nicht gewarnt, sie war einfach grün, weil die Umgebung zufällig passte. Dass CI das gefunden hat, war Glück im Sinne von „endlich lief sie mal woanders", nicht Systematik.

Ohne diesen Schutz gilt: jeder neue Test kann dieselbe Abhängigkeit einführen, und gemerkt wird es erst, wenn jemand die Suite auf einer fremden Maschine startet — oder gar nicht, weil die verteilte Instanz die Tests nie fährt.

Vorschlag

Bevorzugt: eine autouse-Fixture in tools/wiki_tools/tests/conftest.py. Dort steht bereits isolated_trace_dir als autouse-Fixture; eine Schwester daneben ist der natürliche Ort. Sie neutralisiert die Umgebung für jeden Test:

  • HOME auf ein tmp_path-Unterverzeichnis
  • GIT_CONFIG_GLOBAL und GIT_CONFIG_SYSTEM auf /dev/null
  • WIKI_AUTHOR, WIKITOOL_UPDATE_URL, WIKITOOL_UPDATE_TOKEN, WIKITOOL_SESSION_ID löschen

Vorteil gegenüber einem zweiten CI-Job: die Härte gilt lokal genauso, ein Test kann die Abhängigkeit gar nicht erst einschleppen, und niemand muss sich an einen Sondermodus erinnern. Tests, die eine Identität brauchen, setzen sie dann explizit — was sie ohnehin tun sollten, siehe die zwei Fixes oben.

Alternative, falls das zu viel auf einmal umwirft: ein zweiter Schritt in .gitea/workflows/ci.yml mit

GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=/dev/null HOME=/tmp/empty-home \
  .venv/bin/python -m pytest -q

Das ist genau der Befehl, mit dem der 1.0.1-Fix lokal verifiziert wurde (630 passed). Schwächer, weil es die Abhängigkeit erst nach dem Push meldet, aber sofort machbar.

Akzeptanzkriterien

  • Die volle Suite läuft grün mit leerem HOME und ohne globale/systemweite git-Konfiguration.
  • Jeder Test, der eine Autor-Identität braucht, stellt sie selbst her (lokales git config im Fixture-Repo oder WIKI_AUTHOR) — nicht die Fixture-Basis für alle, sonst ist default_author()s Fallback gar nicht mehr getestet.
  • test_new_source_fails_hard_without_any_author muss weiterhin genau das prüfen, was sein Name sagt; es patcht default_author direkt und darf durch die Härtung nicht tautologisch werden.
  • Die zwei Telemetrie-Tests bleiben grün. WIKI_TRACE darf nicht global abgeschaltet werden — sie behaupten, dass ein Trace geschrieben wird. Deshalb setzt CI WIKI_TRACE_DIR außerhalb des Workspace, statt das Tracing zu deaktivieren.
  • Changelog-Eintrag, PATCH (kein Verhalten der Kommandos ändert sich).

Hinweise

  • tools/pytest.ini ist die Konfigurationsdatei, tools/requirements.txt enthält bewusst kein pytest — CI installiert es separat (pip install --quiet pytest).
  • Beim Prüfen nicht vergessen, dass git init in einer Fixture die init.defaultBranch-Warnung erzeugen kann, wenn keine Konfiguration existiert. Harmlos, aber verwirrend in der Ausgabe; git init -q -b main vermeidet es.
## Der Anlass Der **erste CI-Lauf, der überhaupt bis `pytest` kam** (Run 52, 2026-08-30), hat zwei Tests umgeworfen, die auf jeder Entwicklermaschine seit Monaten grün sind: ``` FAILED wiki_tools/tests/test_new_page.py::test_new_source_author_falls_back_to_git_config FAILED wiki_tools/tests/test_provenance.py::test_new_source_with_multiple_raw_files AssertionError: ERROR No author configured for this instance. Set `git config user.name`, or export WIKI_AUTHOR to override it, then retry. 2 failed, 628 passed ``` Ursache: `config.default_author()` ruft `git config user.name` mit `cwd=config.ROOT` auf. Die Fixture-Wurzel ist kein Repository, also antwortete die **globale git-Konfiguration dessen, der die Suite laufen ließ**. Im Job-Container als `root` gibt es keine. Beide Tests sind in `1.0.1` repariert (siehe `CHANGES.md`): der erste macht die Fixture-Wurzel jetzt selbst zu einem Repository mit lokalem `user.name` und behauptet den konkreten Namen; der zweite setzt `WIKI_AUTHOR`, weil es dort gar nicht um Autorschaft geht. ## Was offen bleibt Der Fix behebt zwei bekannte Fälle. **Die Frage ist, wie viele unbekannte es gibt.** Die Suite hat 630 Tests und hing an der Umgebung, ohne es zu sagen — sie hat nicht gewarnt, sie war einfach grün, weil die Umgebung zufällig passte. Dass CI das gefunden hat, war Glück im Sinne von „endlich lief sie mal woanders", nicht Systematik. Ohne diesen Schutz gilt: jeder neue Test kann dieselbe Abhängigkeit einführen, und gemerkt wird es erst, wenn jemand die Suite auf einer fremden Maschine startet — oder gar nicht, weil die verteilte Instanz die Tests nie fährt. ## Vorschlag **Bevorzugt: eine autouse-Fixture in `tools/wiki_tools/tests/conftest.py`.** Dort steht bereits `isolated_trace_dir` als autouse-Fixture; eine Schwester daneben ist der natürliche Ort. Sie neutralisiert die Umgebung für *jeden* Test: - `HOME` auf ein `tmp_path`-Unterverzeichnis - `GIT_CONFIG_GLOBAL` und `GIT_CONFIG_SYSTEM` auf `/dev/null` - `WIKI_AUTHOR`, `WIKITOOL_UPDATE_URL`, `WIKITOOL_UPDATE_TOKEN`, `WIKITOOL_SESSION_ID` löschen Vorteil gegenüber einem zweiten CI-Job: die Härte gilt **lokal genauso**, ein Test kann die Abhängigkeit gar nicht erst einschleppen, und niemand muss sich an einen Sondermodus erinnern. Tests, die eine Identität *brauchen*, setzen sie dann explizit — was sie ohnehin tun sollten, siehe die zwei Fixes oben. **Alternative, falls das zu viel auf einmal umwirft:** ein zweiter Schritt in `.gitea/workflows/ci.yml` mit ```bash GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=/dev/null HOME=/tmp/empty-home \ .venv/bin/python -m pytest -q ``` Das ist genau der Befehl, mit dem der `1.0.1`-Fix lokal verifiziert wurde (630 passed). Schwächer, weil es die Abhängigkeit erst nach dem Push meldet, aber sofort machbar. ## Akzeptanzkriterien - [ ] Die volle Suite läuft grün mit leerem `HOME` **und** ohne globale/systemweite git-Konfiguration. - [ ] Jeder Test, der eine Autor-Identität braucht, stellt sie selbst her (lokales `git config` im Fixture-Repo oder `WIKI_AUTHOR`) — nicht die Fixture-Basis für alle, sonst ist `default_author()`s Fallback gar nicht mehr getestet. - [ ] `test_new_source_fails_hard_without_any_author` muss weiterhin genau das prüfen, was sein Name sagt; es patcht `default_author` direkt und darf durch die Härtung nicht tautologisch werden. - [ ] Die zwei Telemetrie-Tests bleiben grün. `WIKI_TRACE` darf **nicht** global abgeschaltet werden — sie behaupten, dass ein Trace geschrieben wird. Deshalb setzt CI `WIKI_TRACE_DIR` außerhalb des Workspace, statt das Tracing zu deaktivieren. - [ ] Changelog-Eintrag, **PATCH** (kein Verhalten der Kommandos ändert sich). ## Hinweise - `tools/pytest.ini` ist die Konfigurationsdatei, `tools/requirements.txt` enthält bewusst kein `pytest` — CI installiert es separat (`pip install --quiet pytest`). - Beim Prüfen nicht vergessen, dass `git init` in einer Fixture die `init.defaultBranch`-Warnung erzeugen kann, wenn keine Konfiguration existiert. Harmlos, aber verwirrend in der Ausgabe; `git init -q -b main` vermeidet es.
Author
Owner

Kleiner Datenpunkt aus 1.2.0, der die Prämisse dieses Issues bestätigt.

Beim Fix von #12 habe ich zwei neue Tests geschrieben, die wikitool new source über den CliRunner aufrufen. Lokal grün. Unter der Gegenprobe aus diesem Issue —

GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=/dev/null HOME=<leer> \
  .venv/bin/python -m pytest -q

— fielen beide um, mit exakt der Meldung aus dem Anlass hier:

FAILED test_new_page.py::test_raw_files_error_points_at_the_comma_split
FAILED test_new_page.py::test_source_page_accepts_a_raw_file_whose_name_has_a_comma
AssertionError: ERROR No author configured for this instance.

Das ist der dritte und vierte Fall derselben Abhängigkeit, geschrieben von jemandem, der das Issue vorher gelesen hatte. Die Frage aus dem Issue-Text — „wie viele unbekannte gibt es" — ist damit weniger interessant als die andere: die Suite lädt neue Fälle schneller ein, als jemand sie findet. Ein zweiter CI-Job hätte das erst nach dem Push gemeldet; die bevorzugte autouse-Fixture hätte es beim ersten Lauf verhindert.

Beide Tests setzen jetzt WIKI_AUTHOR selbst, mit Kommentar — konform zum zweiten Akzeptanzkriterium hier. 658 Tests grün in beiden Umgebungen. Das ist ein Pflaster auf zwei Stellen, kein Ersatz für die Fixture.

Kleiner Datenpunkt aus 1.2.0, der die Prämisse dieses Issues bestätigt. Beim Fix von #12 habe ich zwei neue Tests geschrieben, die `wikitool new source` über den CliRunner aufrufen. Lokal grün. Unter der Gegenprobe aus diesem Issue — ```bash GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=/dev/null HOME=<leer> \ .venv/bin/python -m pytest -q ``` — fielen beide um, mit exakt der Meldung aus dem Anlass hier: ``` FAILED test_new_page.py::test_raw_files_error_points_at_the_comma_split FAILED test_new_page.py::test_source_page_accepts_a_raw_file_whose_name_has_a_comma AssertionError: ERROR No author configured for this instance. ``` Das ist der dritte und vierte Fall derselben Abhängigkeit, geschrieben von jemandem, der das Issue vorher gelesen hatte. Die Frage aus dem Issue-Text — „wie viele unbekannte gibt es" — ist damit weniger interessant als die andere: **die Suite lädt neue Fälle schneller ein, als jemand sie findet.** Ein zweiter CI-Job hätte das erst nach dem Push gemeldet; die bevorzugte autouse-Fixture hätte es beim ersten Lauf verhindert. Beide Tests setzen jetzt `WIKI_AUTHOR` selbst, mit Kommentar — konform zum zweiten Akzeptanzkriterium hier. 658 Tests grün in beiden Umgebungen. Das ist ein Pflaster auf zwei Stellen, kein Ersatz für die Fixture.
torben added the prio/blockingsize/M labels 2026-08-31 06:56:36 +00:00
Author
Owner

Umgesetzt in 1.7.1, Commit 31c9b81. Die bevorzugte Variante, nicht der zweite CI-Job.

Was gebaut wurde

hermetic_environment, autouse-Fixture in tools/wiki_tools/tests/conftest.py, direkt neben isolated_trace_dir. Vor jedem Test:

  • HOME und XDG_CONFIG_HOME in den tmp_path dieses Tests
  • GIT_CONFIG_GLOBAL und GIT_CONFIG_SYSTEM auf /dev/null
  • gelöscht: WIKI_AUTHOR, WIKI_TRACE, WIKI_TRACE_CONTENT, WIKI_TRACE_MAX_CONTENT, WIKITOOL_SESSION_ID, WIKITOOL_UPDATE_URL, WIKITOOL_UPDATE_TOKEN

Über den Vorschlag hinaus gelöscht werden auch git-eigene Identitäts- und Ortsvariablen: GIT_DIR, GIT_WORK_TREE, GIT_AUTHOR_*, GIT_COMMITTER_*, EMAIL. GIT_AUTHOR_NAME sticht git config user.name, ist also derselbe Fall wie der im Anlass beschriebene; ein verirrtes GIT_DIR würde jedes Fixture-Repo auf den Checkout des Entwicklers zeigen lassen.

isolated_trace_dir deklariert jetzt hermetic_environment als Abhängigkeit — nicht für einen Wert, sondern für die Reihenfolge: die eine Fixture löscht WIKI_TRACE, die andere setzt WIKI_TRACE_DIR, und diese Reihenfolge sollte ausgesprochen sein statt aus der Deklarationsreihenfolge zu folgen. WIKI_TRACE_DIR bleibt als einzige Variable gesetzt, Tracing wird nirgends global abgeschaltet.

Zu den Akzeptanzkriterien

  • Volle Suite grün mit leerem HOME und ohne git-Konfiguration. Drei Umgebungen, die jetzt exakt übereinstimmen — je 702 passed: die Entwickler-Shell; eine absichtlich vergiftete (WIKI_AUTHOR, WIKI_TRACE=0, WIKITOOL_* und GIT_* auf Müll gesetzt); und env -i PATH=… HOME=<leer> GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=/dev/null. Die dritte war vor der Änderung die, die fiel.
  • Jeder Test stellt seine Identität selbst her. Kein WIKI_AUTHOR in der Fixture-Basis. Die vier bekannten Fälle taten das schon (1.0.1 und 1.2.0); weitere gab es nicht, was hier die interessante Antwort auf „wie viele unbekannte gibt es" ist: zum Zeitpunkt der Härtung genau null, aber der Kommentar oben zeigt, dass das ein Momentanwert ist, kein Zustand.
  • test_new_source_fails_hard_without_any_author bleibt, was sein Name sagt. Es patcht default_author weiter direkt. Der Patch ist durch die Härtung nicht redundant geworden: er pinnt den Rückgabewert unabhängig davon, was die Umgebung aufgelöst hätte, und hält den Test damit bei der Fehlerbehandlung der CLI statt bei der Umgebung.
  • Telemetrie-Tests grün, WIKI_TRACE nicht global abgeschaltet.
  • Changelog-Eintrag, PATCH.

Neu: die Fixture wird selbst getestet

tools/wiki_tools/tests/test_hermetic_env.py. Eine Fixture, gegen die nichts assertet, kann geschwächt werden oder eine Variable verlieren, und alles bleibt grün bis zum nächsten Lauf auf einer fremden Maschine — also dasselbe Versagen eine Ebene höher. Die Tests behaupten: die geleerten Variablen, das leere HOME im eigenen tmp_path, dass git config user.name außerhalb eines Repos mit lokaler Identität nichts antwortet, und dass Tracing an und umgeleitet bleibt.

Dazu alle drei Zweige von config.default_author() — inklusive des None-Zweigs, der erst durch die Härtung überhaupt schreibbar wird. Das ist die konkrete Gegenprobe dafür, dass die Fixture etwas tut: ohne sie liefert default_author() in einem Nicht-Repository auf der Entwicklermaschine 'Torben Nehmer' aus der globalen git-Konfiguration; mit ihr None. Genau das ist der Grund, warum Kriterium 2 kein Basis-WIKI_AUTHOR erlaubt — der Fallback wäre sonst nicht nur ungetestet, sondern untestbar.

Dokumentation

instructions/dev/testing-conventions.md, verlinkt aus Schritt 2 des stack-dev-Skills. Was die Fixture neutralisiert (als Tabelle), wie ein Test sich eine Identität herstellt und wonach sich die Wahl richtet, die Regel „neue Tool-Variable → in derselben Änderung nach _WIKITOOL_ENV", und die env -i-Gegenprobe vor dem Publish. Bis jetzt zeigte das Skill für genau diesen Fall auf „die Muster der bestehenden Testdateien" — die Muster waren aber das Problem.

Der Tests-Step in .gitea/workflows/ci.yml bekommt einen Kommentar, warum es beim einen Lauf bleibt: der Container ist keine besondere Umgebung mehr, und ein zweiter gehärteter Lauf würde die Abhängigkeit wieder erst nach dem Push melden. Ohne die Notiz baut ihn irgendwann jemand aus dem alten Grund nach.

git init -q im Fixture-Repo von test_new_source_author_falls_back_to_git_config ist jetzt git init -q -b main — der Hinweis aus dem Issue-Text.

Umgesetzt in **1.7.1**, Commit `31c9b81`. Die bevorzugte Variante, nicht der zweite CI-Job. ## Was gebaut wurde **`hermetic_environment`**, autouse-Fixture in `tools/wiki_tools/tests/conftest.py`, direkt neben `isolated_trace_dir`. Vor jedem Test: - `HOME` und `XDG_CONFIG_HOME` in den `tmp_path` dieses Tests - `GIT_CONFIG_GLOBAL` und `GIT_CONFIG_SYSTEM` auf `/dev/null` - gelöscht: `WIKI_AUTHOR`, `WIKI_TRACE`, `WIKI_TRACE_CONTENT`, `WIKI_TRACE_MAX_CONTENT`, `WIKITOOL_SESSION_ID`, `WIKITOOL_UPDATE_URL`, `WIKITOOL_UPDATE_TOKEN` Über den Vorschlag hinaus gelöscht werden auch git-eigene Identitäts- und Ortsvariablen: `GIT_DIR`, `GIT_WORK_TREE`, `GIT_AUTHOR_*`, `GIT_COMMITTER_*`, `EMAIL`. `GIT_AUTHOR_NAME` sticht `git config user.name`, ist also derselbe Fall wie der im Anlass beschriebene; ein verirrtes `GIT_DIR` würde jedes Fixture-Repo auf den Checkout des Entwicklers zeigen lassen. `isolated_trace_dir` deklariert jetzt `hermetic_environment` als Abhängigkeit — nicht für einen Wert, sondern für die Reihenfolge: die eine Fixture löscht `WIKI_TRACE`, die andere setzt `WIKI_TRACE_DIR`, und diese Reihenfolge sollte ausgesprochen sein statt aus der Deklarationsreihenfolge zu folgen. `WIKI_TRACE_DIR` bleibt als einzige Variable gesetzt, Tracing wird nirgends global abgeschaltet. ## Zu den Akzeptanzkriterien - [x] **Volle Suite grün mit leerem `HOME` und ohne git-Konfiguration.** Drei Umgebungen, die jetzt exakt übereinstimmen — je **702 passed**: die Entwickler-Shell; eine absichtlich vergiftete (`WIKI_AUTHOR`, `WIKI_TRACE=0`, `WIKITOOL_*` und `GIT_*` auf Müll gesetzt); und `env -i PATH=… HOME=<leer> GIT_CONFIG_GLOBAL=/dev/null GIT_CONFIG_SYSTEM=/dev/null`. Die dritte war vor der Änderung die, die fiel. - [x] **Jeder Test stellt seine Identität selbst her.** Kein `WIKI_AUTHOR` in der Fixture-Basis. Die vier bekannten Fälle taten das schon (1.0.1 und 1.2.0); weitere gab es nicht, was hier die interessante Antwort auf „wie viele unbekannte gibt es" ist: zum Zeitpunkt der Härtung genau null, aber der Kommentar oben zeigt, dass das ein Momentanwert ist, kein Zustand. - [x] **`test_new_source_fails_hard_without_any_author` bleibt, was sein Name sagt.** Es patcht `default_author` weiter direkt. Der Patch ist durch die Härtung nicht redundant geworden: er pinnt den Rückgabewert unabhängig davon, was die Umgebung aufgelöst hätte, und hält den Test damit bei der Fehlerbehandlung der CLI statt bei der Umgebung. - [x] **Telemetrie-Tests grün**, `WIKI_TRACE` nicht global abgeschaltet. - [x] **Changelog-Eintrag, PATCH.** ## Neu: die Fixture wird selbst getestet `tools/wiki_tools/tests/test_hermetic_env.py`. Eine Fixture, gegen die nichts assertet, kann geschwächt werden oder eine Variable verlieren, und alles bleibt grün bis zum nächsten Lauf auf einer fremden Maschine — also dasselbe Versagen eine Ebene höher. Die Tests behaupten: die geleerten Variablen, das leere `HOME` im eigenen `tmp_path`, dass `git config user.name` außerhalb eines Repos mit lokaler Identität nichts antwortet, und dass Tracing an und umgeleitet bleibt. Dazu alle drei Zweige von `config.default_author()` — inklusive des `None`-Zweigs, **der erst durch die Härtung überhaupt schreibbar wird**. Das ist die konkrete Gegenprobe dafür, dass die Fixture etwas tut: ohne sie liefert `default_author()` in einem Nicht-Repository auf der Entwicklermaschine `'Torben Nehmer'` aus der globalen git-Konfiguration; mit ihr `None`. Genau das ist der Grund, warum Kriterium 2 kein Basis-`WIKI_AUTHOR` erlaubt — der Fallback wäre sonst nicht nur ungetestet, sondern untestbar. ## Dokumentation `instructions/dev/testing-conventions.md`, verlinkt aus Schritt 2 des `stack-dev`-Skills. Was die Fixture neutralisiert (als Tabelle), wie ein Test sich eine Identität herstellt und wonach sich die Wahl richtet, die Regel „neue Tool-Variable → in derselben Änderung nach `_WIKITOOL_ENV`", und die `env -i`-Gegenprobe vor dem Publish. Bis jetzt zeigte das Skill für genau diesen Fall auf „die Muster der bestehenden Testdateien" — die Muster waren aber das Problem. Der Tests-Step in `.gitea/workflows/ci.yml` bekommt einen Kommentar, warum es beim **einen** Lauf bleibt: der Container ist keine besondere Umgebung mehr, und ein zweiter gehärteter Lauf würde die Abhängigkeit wieder erst nach dem Push melden. Ohne die Notiz baut ihn irgendwann jemand aus dem alten Grund nach. `git init -q` im Fixture-Repo von `test_new_source_author_falls_back_to_git_config` ist jetzt `git init -q -b main` — der Hinweis aus dem Issue-Text.
Author
Owner

CI-Bestätigung, und damit die eigentliche Gegenprobe — der Job-Container ist die Umgebung, in der das hier angefangen hat.

Run 79 grün, alle acht Steps. 702 passed in 15.84s — dieselbe Zahl wie in den drei lokalen Umgebungen. Vier Umgebungen, ein Ergebnis; das ist der Zustand, den es vorher nicht gab. Run 80 hat v1.7.1 getaggt (31c9b81).

Ein Detail aus dem Log, das die Entscheidung gegen den zweiten CI-Job nachträglich stützt: actions/checkout@v7 legt inzwischen selbst eine globale git-Konfiguration an (kopiert /root/.gitconfig, überschreibt HOME temporär), und der Tool-Environment-Step schreibt safe.directory global dazu. Der Container ist also nicht mehr verlässlich „die Maschine ohne globale Konfiguration". Er hatte diese Eigenschaft in Run 52 zufällig — ein Guard, der darauf baut, hätte irgendwann still aufgehört zu greifen, ohne dass jemand es merkt. Die Fixture hängt an nichts dergleichen.

Der dist export-Step meldet 11 Instructions und 5 Skills gegen 14 und 6 im Dev-Baum: instructions/dev/testing-conventions.md bleibt korrekt außerhalb der Distribution.

Schließe das Issue.

CI-Bestätigung, und damit die eigentliche Gegenprobe — der Job-Container ist die Umgebung, in der das hier angefangen hat. [Run 79](https://gitea.nehmer.net/torben/llm-wiki-test1/actions/runs/79) grün, alle acht Steps. **`702 passed in 15.84s`** — dieselbe Zahl wie in den drei lokalen Umgebungen. Vier Umgebungen, ein Ergebnis; das ist der Zustand, den es vorher nicht gab. [Run 80](https://gitea.nehmer.net/torben/llm-wiki-test1/actions/runs/80) hat `v1.7.1` getaggt (`31c9b81`). Ein Detail aus dem Log, das die Entscheidung gegen den zweiten CI-Job nachträglich stützt: `actions/checkout@v7` legt inzwischen selbst eine globale git-Konfiguration an (kopiert `/root/.gitconfig`, überschreibt `HOME` temporär), und der Tool-Environment-Step schreibt `safe.directory` global dazu. Der Container ist also nicht mehr verlässlich „die Maschine ohne globale Konfiguration". Er hatte diese Eigenschaft in Run 52 zufällig — ein Guard, der darauf baut, hätte irgendwann still aufgehört zu greifen, ohne dass jemand es merkt. Die Fixture hängt an nichts dergleichen. Der `dist export`-Step meldet 11 Instructions und 5 Skills gegen 14 und 6 im Dev-Baum: `instructions/dev/testing-conventions.md` bleibt korrekt außerhalb der Distribution. Schließe das Issue.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#8