ENVIRONMENT.md veraltet unbemerkt: kein Stack-Schritt und kein Check haelt sie aktuell - in der Breite pruefen, wo das passiert #238

Open
opened 2026-10-19 05:02:29 +00:00 by torben · 0 comments
Owner

Befund

In einer ausgelieferten Instanz war ENVIRONMENT.md nach einem Upgrade-Lauf sachlich falsch, ohne dass irgendein Werkzeug es gemeldet hat. Gemessen (Abgleich der Datei mit dem Checkout, 2026-10-19):

Aussage in der Datei Tatsaechlicher Stand
Stack "per upgrade-instance.md auf 8.0.0 gehoben" wikitool version: 10.0.0, exportiert 2026-10-13; Upgrade-Commits vom selben Tag liegen im Git-Log
".wikitool-remotes.json existiert noch nicht, das Publish-Remote-Gate ist daher nicht scharf" Die Datei ist seit 10.0.0 kein Konzept mehr (instructions/migrations/10.0.0-settings-tiers.md:1-20); das Gate haengt an remotes.allowed_push_urls in .wikitool-local.json. Die Schlussfolgerung (nicht scharf) stimmt zufaellig noch, die Begruendung nicht
"Telemetrie ist eingeschaltet (.wikitool-telemetry.json)" Die Datei existiert nicht mehr; die Einstellung steht in .wikitool-local.json (telemetry.enabled)
Abschnitt "Connectoren" fehlte ganz Ein Aufgaben-Backend (CalDAV) ist seit dem Upgrade konfiguriert (wikitool.json, doctor: tasks-provider) - genau die Art Konstante, die der Abschnitt aufnehmen soll

doctor meldete in dieser Zeit durchgehend environment: OK ... present and filled.

Es ist nicht der erste Fall dieser Art: #34 (Datei beschrieb ein Gate als gesetzt, das im Checkout inert war) hatte dieselbe Wurzel.

Ursache

Die Datei wird genau einmal angelegt und danach von nichts mehr beruehrt:

  • instructions/bootstrap.md:64-73 und instructions/setup-instance.md:271-276 legen sie an bzw. bieten es an. Beide sind Einmal-Schritte.
  • instructions/upgrade-instance.md hat keinen Schritt, der sie anfasst. Sie kommt dort nur in der Klassifizierungstabelle vor (Zeile 130) mit der Aussage, dass sie nie klassifiziert wird. Das ist richtig fuer die Dateiebene, laesst aber die inhaltliche Ebene unbeachtet: ein Upgrade aendert Dinge, die in der Datei stehen koennen.
  • tools/chemenu/commands/doctor.py:402-428 (check_environment) prueft nur "fehlt" und "Template-Sentinel noch drin". Das ist so gewollt (Docstring: optional, kein FAIL), aber es heisst auch: ein gefuellter, falscher Inhalt ist fuer doctor nicht von einem richtigen zu unterscheiden.
  • ENVIRONMENT.md.template:23-25 sagt "when something here stops being true, correct it" - wer das tun soll und wann, sagt nichts.
  • Die Vorlage und die Setup-Anweisung ermuntern implizit, ableitbare Werte (Version, Dateinamen der Einstellungen) als Freitext festzuhalten. Diese haben eine eigene Quelle (.wikitool-release.json, config) und veralten damit zwangslaeufig: Verstoss gegen "eine Regel, ein Ort" im Kleinen.

Nicht gemessen, sondern angenommen: dass jede Instanz mit einer vor dem Upgrade gefuellten Datei denselben Drift hat.

In der Breite: wo kann eine ENVIRONMENT.md noch veralten?

Zu pruefen und je Zeile zu entscheiden (Hinweis im Schritt, Check, Vorlage aendern, nichts tun):

Ausloeser Was in der Datei falsch werden kann Heute abgedeckt?
dist upgrade / Migrationen (z.B. 10.0.0: Einstellungsdateien aufgeloest) Version, Dateinamen, Gate-/Telemetrie-Beschreibung, Skill-Liste nein
instructions sync mit neuen oder entfernten Skills Abschnitt "Skills" nein
config set / config migrate (neues Backend, Tracker, Backup, Intake) Abschnitt "Connectoren", Hinweise zu Gate und Telemetrie nein
MCP-Server kommt hinzu oder faellt weg (Harness-Konfiguration liegt ausserhalb des Repos) Tabelle "MCP-Server" nein, und von aussen nicht pruefbar
git remote add/set-url, Umzug des Publish-Ziels Abschnitt "Git-Remotes" doctor zeigt den Remote, vergleicht ihn aber nicht
Wechsel oder Dazukommen eines Harness Abschnitt "Harness" nein
CI wird eingefuehrt oder abgeschaltet Abschnitt "CI" nein
Zweiter Checkout derselben Instanz Datei ist pro Checkout, also je Maschine eigener Drift; backup spiegelt sie nur (tools/chemenu/backup.py:57) nur gespiegelt, nicht geprueft

Loesungsvorschlag

Gestaffelt, billigstes zuerst - die Auswahl ist zu entscheiden:

  1. Upgrade-Anweisung: ein Schritt in instructions/upgrade-instance.md nach dem Verifizieren (Schritt 9 oder 13): "ENVIRONMENT.md gegen den Checkout lesen" mit der Liste oben als Pruefpunkten. Plus ein Satz in jeder Migration, die Einstellungen, Dateien oder Gates verschiebt (zuerst 10.0.0-settings-tiers).
  2. Vorlage: Abschnitt "Nichts festschreiben, was eine Quelle hat" - Version und Einstellungswerte nicht als Wert eintragen, sondern den Befehl nennen, der sie liefert. Dazu ein Datum "zuletzt geprueft" als Pflichtzeile, damit Alter sichtbar wird.
  3. doctor: kein FAIL (die Optionalitaet bleibt), aber eine WARN bei Behauptungen, die sich billig pruefen lassen: genannte Dateinamen im Wurzelverzeichnis, die es nicht gibt (z.B. .wikitool-*.json), genannte Remote-URLs, die nicht in git remote -v stehen, und ein "zuletzt geprueft"-Datum, das aelter ist als das letzte Upgrade (.wikitool-release.json).
  4. Pruefpunkt in wiki-lint: ein Schritt, der die Datei neben doctor liest. Verworfen: ein eigenes Kommando - bei einer optionalen Datei zu viel Apparat.

Verworfen: die Datei zu generieren. Sie soll genau das festhalten, was sich nicht aus dem Checkout ableiten laesst (Harness, MCP-Server, Absicht); ein generierter Inhalt waere die Dublette der Quellen.

Akzeptanzkriterien

  • Entscheidung dokumentiert, welche der Stufen 1-4 umgesetzt werden und warum
  • instructions/upgrade-instance.md nennt den Pruefschritt und die Pruefpunkte (falls Stufe 1)
  • ENVIRONMENT.md.template trennt Konstanten von ableitbaren Werten und traegt eine "zuletzt geprueft"-Zeile (falls Stufe 2)
  • check_environment meldet WARN fuer mindestens: nicht (mehr) existierende genannte Einstellungsdateien und veraltetes Pruefdatum; bleibt bei absent und bei gefuellter, plausibler Datei OK (falls Stufe 3)
  • Test fuer check_environment mit veralteter Datei
  • docs verify, instructions verify sauber, CHANGES.md und betroffene Referenzseiten nachgezogen

Herkunft

Aufgefallen in einem Lint-Lauf einer ausgelieferten, privaten Instanz nach drei Upgrade-Spruengen. Der Issue-Text enthaelt keine Inhalte der Instanz; die genannten Werte sind Stack-Versionen, Dateinamen und Zeilen des Stacks. Verwandt: #24 (Einfuehrung der Datei), #34 (gleiche Wurzel, anderer Anlass), #81 (Harness-Drift beim Laden).

## Befund In einer ausgelieferten Instanz war `ENVIRONMENT.md` nach einem Upgrade-Lauf sachlich falsch, ohne dass irgendein Werkzeug es gemeldet hat. Gemessen (Abgleich der Datei mit dem Checkout, 2026-10-19): | Aussage in der Datei | Tatsaechlicher Stand | |---|---| | Stack "per `upgrade-instance.md` auf 8.0.0 gehoben" | `wikitool version`: 10.0.0, exportiert 2026-10-13; Upgrade-Commits vom selben Tag liegen im Git-Log | | "`.wikitool-remotes.json` existiert noch nicht, das Publish-Remote-Gate ist daher nicht scharf" | Die Datei ist seit 10.0.0 kein Konzept mehr (`instructions/migrations/10.0.0-settings-tiers.md:1-20`); das Gate haengt an `remotes.allowed_push_urls` in `.wikitool-local.json`. Die Schlussfolgerung (nicht scharf) stimmt zufaellig noch, die Begruendung nicht | | "Telemetrie ist eingeschaltet (`.wikitool-telemetry.json`)" | Die Datei existiert nicht mehr; die Einstellung steht in `.wikitool-local.json` (`telemetry.enabled`) | | Abschnitt "Connectoren" fehlte ganz | Ein Aufgaben-Backend (CalDAV) ist seit dem Upgrade konfiguriert (`wikitool.json`, `doctor`: `tasks-provider`) - genau die Art Konstante, die der Abschnitt aufnehmen soll | `doctor` meldete in dieser Zeit durchgehend `environment: OK ... present and filled`. Es ist nicht der erste Fall dieser Art: #34 (Datei beschrieb ein Gate als gesetzt, das im Checkout inert war) hatte dieselbe Wurzel. ## Ursache Die Datei wird genau einmal angelegt und danach von nichts mehr beruehrt: - `instructions/bootstrap.md:64-73` und `instructions/setup-instance.md:271-276` legen sie an bzw. bieten es an. Beide sind Einmal-Schritte. - `instructions/upgrade-instance.md` hat keinen Schritt, der sie anfasst. Sie kommt dort nur in der Klassifizierungstabelle vor (Zeile 130) mit der Aussage, dass sie nie klassifiziert wird. Das ist richtig fuer die Dateiebene, laesst aber die inhaltliche Ebene unbeachtet: ein Upgrade aendert Dinge, die in der Datei stehen koennen. - `tools/chemenu/commands/doctor.py:402-428` (`check_environment`) prueft nur "fehlt" und "Template-Sentinel noch drin". Das ist so gewollt (Docstring: optional, kein FAIL), aber es heisst auch: ein gefuellter, falscher Inhalt ist fuer `doctor` nicht von einem richtigen zu unterscheiden. - `ENVIRONMENT.md.template:23-25` sagt "when something here stops being true, correct it" - wer das tun soll und wann, sagt nichts. - Die Vorlage und die Setup-Anweisung ermuntern implizit, ableitbare Werte (Version, Dateinamen der Einstellungen) als Freitext festzuhalten. Diese haben eine eigene Quelle (`.wikitool-release.json`, `config`) und veralten damit zwangslaeufig: Verstoss gegen "eine Regel, ein Ort" im Kleinen. Nicht gemessen, sondern angenommen: dass jede Instanz mit einer vor dem Upgrade gefuellten Datei denselben Drift hat. ## In der Breite: wo kann eine ENVIRONMENT.md noch veralten? Zu pruefen und je Zeile zu entscheiden (Hinweis im Schritt, Check, Vorlage aendern, nichts tun): | Ausloeser | Was in der Datei falsch werden kann | Heute abgedeckt? | |---|---|---| | `dist upgrade` / Migrationen (z.B. 10.0.0: Einstellungsdateien aufgeloest) | Version, Dateinamen, Gate-/Telemetrie-Beschreibung, Skill-Liste | nein | | `instructions sync` mit neuen oder entfernten Skills | Abschnitt "Skills" | nein | | `config set` / `config migrate` (neues Backend, Tracker, Backup, Intake) | Abschnitt "Connectoren", Hinweise zu Gate und Telemetrie | nein | | MCP-Server kommt hinzu oder faellt weg (Harness-Konfiguration liegt ausserhalb des Repos) | Tabelle "MCP-Server" | nein, und von aussen nicht pruefbar | | `git remote add/set-url`, Umzug des Publish-Ziels | Abschnitt "Git-Remotes" | `doctor` zeigt den Remote, vergleicht ihn aber nicht | | Wechsel oder Dazukommen eines Harness | Abschnitt "Harness" | nein | | CI wird eingefuehrt oder abgeschaltet | Abschnitt "CI" | nein | | Zweiter Checkout derselben Instanz | Datei ist pro Checkout, also je Maschine eigener Drift; `backup` spiegelt sie nur (`tools/chemenu/backup.py:57`) | nur gespiegelt, nicht geprueft | ## Loesungsvorschlag Gestaffelt, billigstes zuerst - die Auswahl ist zu entscheiden: 1. **Upgrade-Anweisung:** ein Schritt in `instructions/upgrade-instance.md` nach dem Verifizieren (Schritt 9 oder 13): "ENVIRONMENT.md gegen den Checkout lesen" mit der Liste oben als Pruefpunkten. Plus ein Satz in jeder Migration, die Einstellungen, Dateien oder Gates verschiebt (zuerst `10.0.0-settings-tiers`). 2. **Vorlage:** Abschnitt "Nichts festschreiben, was eine Quelle hat" - Version und Einstellungswerte nicht als Wert eintragen, sondern den Befehl nennen, der sie liefert. Dazu ein Datum "zuletzt geprueft" als Pflichtzeile, damit Alter sichtbar wird. 3. **`doctor`:** kein FAIL (die Optionalitaet bleibt), aber eine WARN bei Behauptungen, die sich billig pruefen lassen: genannte Dateinamen im Wurzelverzeichnis, die es nicht gibt (z.B. `.wikitool-*.json`), genannte Remote-URLs, die nicht in `git remote -v` stehen, und ein "zuletzt geprueft"-Datum, das aelter ist als das letzte Upgrade (`.wikitool-release.json`). 4. **Pruefpunkt in `wiki-lint`:** ein Schritt, der die Datei neben `doctor` liest. Verworfen: ein eigenes Kommando - bei einer optionalen Datei zu viel Apparat. Verworfen: die Datei zu generieren. Sie soll genau das festhalten, was sich nicht aus dem Checkout ableiten laesst (Harness, MCP-Server, Absicht); ein generierter Inhalt waere die Dublette der Quellen. ## Akzeptanzkriterien - [ ] Entscheidung dokumentiert, welche der Stufen 1-4 umgesetzt werden und warum - [ ] `instructions/upgrade-instance.md` nennt den Pruefschritt und die Pruefpunkte (falls Stufe 1) - [ ] `ENVIRONMENT.md.template` trennt Konstanten von ableitbaren Werten und traegt eine "zuletzt geprueft"-Zeile (falls Stufe 2) - [ ] `check_environment` meldet WARN fuer mindestens: nicht (mehr) existierende genannte Einstellungsdateien und veraltetes Pruefdatum; bleibt bei `absent` und bei gefuellter, plausibler Datei `OK` (falls Stufe 3) - [ ] Test fuer `check_environment` mit veralteter Datei - [ ] `docs verify`, `instructions verify` sauber, `CHANGES.md` und betroffene Referenzseiten nachgezogen ## Herkunft Aufgefallen in einem Lint-Lauf einer ausgelieferten, privaten Instanz nach drei Upgrade-Spruengen. Der Issue-Text enthaelt keine Inhalte der Instanz; die genannten Werte sind Stack-Versionen, Dateinamen und Zeilen des Stacks. Verwandt: #24 (Einfuehrung der Datei), #34 (gleiche Wurzel, anderer Anlass), #81 (Harness-Drift beim Laden).
torben added the size/Marea/processkind/defectstatus/incoming labels 2026-10-19 05:02:29 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: torben/chemenu#238