00220f8b07
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
132 lines
8.3 KiB
Markdown
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]]
|