Files
chemenu/kb/sources/transcripts/Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31.md
T
torben b138fd8e64
CI / verify (push) Successful in 53s
Release / release (push) Successful in 35s
move: source_type: Default streichen, unclassified als sichtbares Fach, layout: fuer source (schliesst #66)
Files changed:
- CHANGES.md
- VERSION
- instructions/dev/corpus-policy.md
- instructions/wiki-ingest/SKILL.md
- kb/index.md
- kb/log.md
- kb/sources/COLLECTION.md
- kb/sources/INDEX.md
- kb/sources/Source - AMD Powermanagement CPU.md
- kb/sources/Source - Arch Linux Cheat Sheet.md
- kb/sources/Source - Conversation - AGENTS.md Skill Restructuring Session 2026-08-04.md
- kb/sources/Source - Conversation - Auto Mode and Tool Choice Session 2026-08-31.md
- kb/sources/Source - Conversation - Comma Bug Budget Refund and Lint Report Path Session 2026-08-31.md
- kb/sources/Source - Conversation - ENVIRONMENT.md as an Optional Third Session-Level File Session 2026-08-31.md
- kb/sources/Source - Conversation - Gate Counting and Measured Calibration Session 2026-08-31.md
- kb/sources/Source - Conversation - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31.md
- kb/sources/Source - Conversation - Issue Triage Labels and TODO Retirement Session 2026-08-31.md
- kb/sources/Source - Conversation - Nightly Drift-Check Workflow and doctor's Bootstrap Gap Session 2026-08-31.md
- kb/sources/Source - Conversation - Two Round-Trip Defects Found by an Ingest Session 2026-08-31.md
- kb/sources/Source - Conversation - Versioning CI-CD and Content Migration Session 2026-08-30.md
- kb/sources/Source - Conversation - Write-Once Frontmatter Fields and touch --set Session 2026-08-31.md
- kb/sources/Source - Copilot Skill Restructure Instructions.md
- kb/sources/Source - Docker Cheatsheet.md
- kb/sources/Source - Gitea Issue 41 - Issue Management and Label Scheme 2026-09-02.md
- kb/sources/Source - Gitea Issues 62-63 - status-incoming Label Introduction 2026-09-04.md
- kb/sources/Source - LLM Improvements Codex Analysis.md
- kb/sources/Source - LLM Improvements Production Agent Gaps 2026.md
- kb/sources/Source - LLM Improvements Sonnet Analysis.md
- kb/sources/Source - LLM Wiki Pattern.md
- kb/sources/Source - LLM Wiki v2.md
- kb/sources/Source - MCP Read Server Implementation Session 2026-09-02.md
- kb/sources/Source - Private-Instance Merge Correction and Issue 30 Session 2026-09-01.md
- kb/sources/Source - Public Release, Corpus Purge and History Squash Session 2026-09-01.md
- kb/sources/Source - Publish-Remote Gate and Issue Triage Session 2026-09-01.md
- kb/sources/Source - Version Part Nomenclature and Breaking Change Gate Session 2026-09-02.md
- kb/sources/Source - Wine.md
- kb/sources/Source - qmd - GitHub Repository.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
- tools/CONTRACT.md
- tools/chemenu/lint_core.py
- tools/chemenu/tests/conftest.py
- tools/chemenu/tests/test_lint.py
- tools/chemenu/tests/test_new_page.py
- tools/chemenu/tests/test_provenance.py
- tools/chemenu/tests/test_touch.py
- tools/chemenu/tests/test_type_resolver.py
- tools/chemenu/tests/test_xref.py
- types/source.md
- types/source.schema.yaml
- types/type-spec.md
- work/reclassify-source-types/README.md
- work/reclassify-source-types/plan.md
2026-09-08 20:38:15 +02:00

8.3 KiB

type, source_type, author, raw_files, source_language, date, tags, entities, concepts, summary
type source_type author raw_files source_language date tags entities concepts summary
types/source.md transcript Torben
raw/notes/Conversation Transcript - Hardening the Test Suite Against Silent Environment Dependencies Session 2026-08-31.md
en 2026-08-31
tests
ci
tooling
quality
wikitool
Chemenu
Gitea Actions
AGENTS.md
Green Suite Blind Spot
Ambient Environment Dependency
Structural Enforcement over Documented Rule
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

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

  • 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

Verwandte Concepts