Files
chemenu/kb/sources/transcripts/Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31.md
torben 00220f8b07 backfill: fidelity/authority auf allen 29 Source-Seiten (#67, Publish 2/3)
Files changed:
- kb/index.md
- kb/log.md
- kb/sources/analyses/Source - Copilot Skill Restructure Instructions.md
- kb/sources/analyses/Source - LLM Improvements Codex Analysis.md
- kb/sources/analyses/Source - LLM Improvements Production Agent Gaps 2026.md
- kb/sources/analyses/Source - LLM Improvements Sonnet Analysis.md
- kb/sources/articles/Source - AMD Powermanagement CPU.md
- kb/sources/articles/Source - LLM Wiki Pattern.md
- kb/sources/articles/Source - LLM Wiki v2.md
- kb/sources/documents/Source - qmd - GitHub Repository.md
- kb/sources/notes/Source - Arch Linux Cheat Sheet.md
- kb/sources/notes/Source - Docker Cheatsheet.md
- kb/sources/notes/Source - Wine.md
- kb/sources/trackers/Source - Gitea Issue 41 - Issue Management and Label Scheme 2026-09-02.md
- kb/sources/trackers/Source - Gitea Issues 62-63 - status-incoming Label Introduction 2026-09-04.md
- kb/sources/transcripts/Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04.md
- kb/sources/transcripts/Source - Conversation - Auto Mode and Tool Choice Session 2026-08-31.md
- kb/sources/transcripts/Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31.md
- kb/sources/transcripts/Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31.md
- kb/sources/transcripts/Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31.md
- kb/sources/transcripts/Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31.md
- kb/sources/transcripts/Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31.md
- kb/sources/transcripts/Source - Conversation - Nightly Drift-Check Workflow and doctor's Bootstrap Gap Session 2026-08-31.md
- kb/sources/transcripts/Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31.md
- kb/sources/transcripts/Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30.md
- kb/sources/transcripts/Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31.md
- kb/sources/transcripts/Source - MCP Read Server Implementation Session 2026-09-02.md
- kb/sources/transcripts/Source - Private-Instance Merge Correction and Issue 30 Session 2026-09-01.md
- kb/sources/transcripts/Source - Public Release, Corpus Purge and History Squash Session 2026-09-01.md
- kb/sources/transcripts/Source - Publish-Remote Gate and Issue Triage Session 2026-09-01.md
- kb/sources/transcripts/Source - Version Part Nomenclature and Breaking Change Gate Session 2026-09-02.md
- work/backfill-capture-fields/README.md
- work/backfill-capture-fields/plan.md
2026-09-09 06:50:01 +02:00

132 lines
8.3 KiB
Markdown

---
type: types/source.md
source_type: transcript
author: Torben
raw_files: [raw/notes/Conversation Transcript - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31.md]
source_language: en
date: 2026-08-31
tags: [tests, ci, tooling, quality]
entities: [wikitool, Chemenu, Gitea Actions, AGENTS.md]
concepts: [Green Suite Blind Spot, Ambient Environment Dependency, Structural Enforcement over Documented Rule]
summary: 'Sitzung, die die Testsuite gegen stille Umgebungsabhaengigkeiten haertet (1.7.1, Issue #8): autouse-Fixture statt zweitem CI-Job, 702 Tests in vier Umgebungen, plus der Befund, dass checkout@v7 den CI-Container selbst konfiguriert'
fidelity: verbatim
authority: reporting
---
# Source: Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31
**Autor:** Torben
**Datum:** 2026-08-31
**Raw-Dateien:** raw/notes/Conversation Transcript - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31.md
**Typ:** Notes
## Zusammenfassung
Die Sitzung setzt Gitea-Issue #8 um und liefert `1.7.1` (`31c9b81`, Tag `v1.7.1`): eine
autouse-pytest-Fixture, die jeden Test von der Maschine trennt, auf der er läuft. Der Anlass lag
Wochen zurück - der erste CI-Lauf, der überhaupt bis `pytest` kam (Run 52), warf zwei Tests um,
die auf jeder Entwicklermaschine monatelang grün waren, weil `config.default_author()` per
`git config user.name` die *globale* git-Konfiguration desjenigen las, der die Suite startete.
Die Quelle ist vor allem deshalb interessant, weil die Messung vor der Änderung ein anderes Bild
ergab als erwartet: die Suite war unter der gehärteten Umgebung **bereits grün** (695 Tests). Die
vier bekannten Fälle waren in `1.0.1` und `1.2.0` einzeln repariert, ein fünfter existierte in
diesem Moment nicht. Damit war die Änderung keine Reparatur, sondern ein Schutz - und ein Schutz,
dessen Wirkung getrennt nachgewiesen werden muss, weil "alles bleibt grün" über ihn nichts
aussagt. Die Sitzung führt diesen Nachweis explizit: ohne Fixture liefert `default_author()` in
einem Nicht-Repository den globalen git-Namen des Entwicklers, mit Fixture `None`.
Zwei Befunde gehen über den Issue-Text hinaus. Erstens deckt die Fixture auch git-eigene
Identitäts- und Ortsvariablen ab, die der Vorschlag nicht nannte. Zweitens - und für die
Bewertung der verworfenen Alternative entscheidend - zeigt das CI-Log von Run 79, dass
`actions/checkout@v7` inzwischen selbst eine globale git-Konfiguration im Job-Container anlegt.
Der Container ist damit nicht mehr die konfigurationsfreie Maschine, als die Run 52 ihn
vorgefunden hatte.
## Kernaussagen
- **Der Auslöser und seine Wiederholung.** Run 52 (2026-08-30) meldete `2 failed, 628 passed` mit
`AssertionError: ERROR No author configured for this instance.` Beide Tests wurden in `1.0.1`
repariert. In `1.2.0` führten **zwei neue Tests dieselbe Abhängigkeit erneut ein**, geschrieben
von jemandem, der das Issue vorher gelesen hatte. Der Issue-Kommentar zieht daraus den Schluss,
der die Sitzung steuert: "die Suite lädt neue Fälle schneller ein, als jemand sie findet."
- **Zwei Optionen, eine seit dem Kommentar entschieden.** Autouse-Fixture in `conftest.py` gegen
einen zweiten, gehärteten `pytest`-Schritt in CI. Der CI-Schritt meldet erst nach dem Push und
schützt den Lauf des Entwicklers nie - also genau dort nicht, wo die Fälle entstehen.
- **Die Messung vor der Änderung ergab 695 grüne Tests unter der gehärteten Umgebung.** Kein
fünfter Fall war offen. Das verschiebt die Änderung von Reparatur zu Schutz und macht einen
eigenen Wirksamkeitsnachweis nötig.
- **Der Wirksamkeitsnachweis.** In der Sitzung ausgeführt: `default_author() with the ambient
environment: 'Torben Nehmer'`. Unter der Fixture antwortet dieselbe Funktion `None`. Der neue
Test wäre vorher rot gewesen und ist nachher grün - was die Ausgangsmessung nicht zeigen
konnte.
- **Über den Vorschlag hinaus abgedeckt:** `GIT_DIR`, `GIT_WORK_TREE`, `GIT_AUTHOR_NAME`,
`GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_NAME`, `GIT_COMMITTER_EMAIL`, `EMAIL`. Begründung im Code:
`GIT_AUTHOR_NAME` sticht `git config user.name` und ist damit derselbe Fehler durch eine andere
Tür; ein verirrtes `GIT_DIR` würde jedes Fixture-Repo auf den Checkout des Entwicklers zeigen
lassen.
- **`WIKI_TRACE_DIR` bleibt als einzige Variable gesetzt.** Tracing wird nie suite-weit
abgeschaltet, weil zwei Telemetrie-Tests behaupten, dass ein Trace geschrieben wird.
`isolated_trace_dir` nimmt `hermetic_environment` jetzt als Parameter - nicht für einen Wert,
sondern damit die Reihenfolge der beiden autouse-Fixturen ausgesprochen ist statt aus der
Deklarationsreihenfolge zu folgen.
- **Bewusst kein `WIKI_AUTHOR` in der Fixture-Basis.** Der billigere Weg wäre der falsche
gewesen: ein gemeinsamer Default macht den `None`-Zweig von `default_author()` untestbar, weil
dieser Zweig nur auf einer Maschine existiert, die niemanden kennt. Die Suite sähe grüner aus
und bewiese weniger.
- **Ein Test, der direkt patcht, bleibt.** `test_new_source_fails_hard_without_any_author` patcht
`default_author` weiterhin, obwohl die Umgebung jetzt ohnehin `None` liefern würde. Der Patch
pinnt den Wert unabhängig von der Umgebung und hält den Test damit bei der Fehlerbehandlung der
CLI statt bei der Umgebung.
- **Vier Umgebungen, ein Ergebnis: 702 Tests grün.** Entwickler-Shell; absichtlich vergiftet
(`WIKI_AUTHOR`, `WIKI_TRACE=0`, `WIKITOOL_*` und `GIT_*` auf Müll); `env -i` mit leerem `HOME`
und ohne git-Konfiguration; CI-Container (`702 passed in 15.84s`). Der vergiftete Lauf war im
Issue nicht verlangt und prüft die Gegenrichtung: nicht "übersteht die Suite, nichts zu haben",
sondern "übersteht sie, das Falsche zu haben".
- **Die Fixture wird selbst getestet.** `test_hermetic_env.py` behauptet die geleerten Variablen,
das leere `HOME`, dass `git config user.name` nichts antwortet, und alle drei Zweige von
`default_author()`. Begründung: eine Fixture, gegen die nichts assertet, kann eine Variable
verlieren, ohne dass ein Lauf rot wird - dasselbe Versagen eine Ebene höher.
- **`actions/checkout@v7` legt selbst eine globale git-Konfiguration an.** Aus dem Log von Run 79:
`Copying '/root/.gitconfig' to '/tmp/b93ea7a3-.../.gitconfig'` und `Temporarily overriding
HOME='/tmp/b93ea7a3-...' before making global git config changes`; der Tool-Environment-Schritt
schreibt zusätzlich `safe.directory` global. Der Job-Container hatte die Eigenschaft
"keine globale Konfiguration" in Run 52 also zufällig. Ein Guard, der darauf baut, hätte
irgendwann still aufgehört zu greifen.
- **CI bleibt bei einem Testlauf.** Der Kommentar am Tests-Schritt in `.gitea/workflows/ci.yml`
hält fest, warum der zweite Lauf nicht nachgerüstet wird.
- **Der `dist export`-Schritt meldete 11 Instructions und 5 Skills gegen 14 und 6 im Dev-Baum** -
Beleg, dass `instructions/dev/testing-conventions.md` die Distribution nicht erreicht.
## Aufgaben
- [x] Issue #8 umgesetzt, verifiziert und geschlossen (`1.7.1`, `31c9b81`, Tag `v1.7.1`)
- [ ] Gitea-Issue #22 (`prio/3`, `size/XS`): `lint` zählt Zitat-*Zeilen* statt Zitat-Blöcke
(`lint.py:157`), ein umbrochenes Zitat wird als vier gemeldet
- [ ] Gitea-Issue #23 (`prio/2`, `size/S`): nichts erzwingt, dass eine neue Tool-Variable in
`_WIKITOOL_ENV` landet - die Regel steht in `testing-conventions.md`, aber genau eine
Prosa-Regel war die Prämisse von #8
## Nicht übernommen
- **Die konkrete Liste der geleerten Variablen als Wiki-Inhalt.** Sie steht in `conftest.py` und
in `instructions/dev/testing-conventions.md`; eine dritte Kopie im `kb/` wäre die, die driftet
(AGENTS.md-Invariante 8). Die Kernaussagen nennen nur die Kategorien und die Begründung.
- **Die Publish- und Verifikationsmechanik** (`publish` ohne `--message` endet mit Exit 2,
`git ls-remote` als Gegenprobe). Das ist in `publish-cycle.md` und `SOUL.md` geregelt, nicht
Erkenntnis dieser Sitzung.
- **Die vollständigen Issue-Texte von #22 und #23.** Der Tracker hat Zustand und Verlauf, das
Wiki nicht; hier steht nur, dass und warum sie existieren.
- **Der `git init -q -b main`-Hinweis** zur `init.defaultBranch`-Advisory. Werkzeugdetail ohne
eigenen Erkenntniswert, steht in der Instruction.
## Verwandte Entities
- [[wikitool]]
- [[Chemenu]]
- [[Gitea Actions]]
- [[AGENTS.md]]
## Verwandte Concepts
- [[Green Suite Blind Spot]]