dist export liefert tools/chemenu/tests/, tools/pytest.ini und tools/.coveragerc nicht mehr aus. Der Ausschluss geht per exaktem Pfad (TOOLS_DEV_ONLY).
dist upgrade entscheidet eine nicht mehr ausgelieferte Datei im selben Lauf, der sie verschwinden sieht:
unverändert seit der Installation: Sie wird gelöscht, samt leer gewordener Verzeichnisse.
geändert seit der Installation: Das Upgrade blockiert, bis --take-release (löscht sie) oder --keep-local (sie gehört ab dann der Instanz) entscheidet.
--prune wird akzeptiert und bewirkt nichts.
Verifiziert:
Lokal:
volle Suite: 2175 passed, 3 skipped, auch unter env -i mit leerem HOME
docs verify und instructions verify grün
ein echter Export ohne Suite und ohne Konfiguration
Upgrade von Ende zu Ende: Der Export von dd565d2 (8.0.0-beta.32, mit Suite und __pycache__) wurde mit dem neuen Code auf den neuen Export gehoben. Gelöscht wurden genau die 78 nicht mehr ausgelieferten Dateien und die 4 leer gewordenen Verzeichnisse.
CI: Läufe 521 und 522 sind grün, einschließlich des Replays von setup-instance.md gegen den frischen Export.
Abweichung vom Entwurf:
tools/README.md § Tests steht in dist:strip-Markern.
tools/CONTRACT.md § Tests ist dagegen umformuliert statt gestrippt: Suite und Konfiguration liegen nur im Ursprungs-Repo. Grund: test_the_commands_region_survives_dist_export_unchanged verlangt, dass die Datei byte-gleich ausgeliefert wird.
Der Link auf README.md#tests ist dort entfallen, weil er in einer Instanz ins Leere zeigen würde.
Abschlussphase:
docs/ownership-and-templates.md § „The consequence in practice“ trägt jetzt die Begründung für die Lösch-Seite. Vorher stand sie nur hier im Issue: Eine weggefallene Datei muss im Lauf entschieden werden, der sie verschwinden sieht, weil der nächste Stamp sie nicht mehr kennt.
INSTALL.md wurde gegen die geänderte instructions/upgrade-instance.md gegengelesen. Ergebnis: kein Widerspruch. INSTALL beschreibt removed/--prune nicht und verweist für die Details auf den Record.
Weitere geprüfte Dokumente: README.md, INSTALL-MCP.md, DEVELOPMENT.md, docs/version-model.md. Keines trifft eine Aussage über die Suite in einer Instanz oder über weggefallene Dateien.
Problem (wie vorgefunden)
1. Die Testsuite wurde ausgeliefert, obwohl sie in einer Instanz nicht lief
dist export kopierte tools/ ganz, bis auf Build-Ausgabe. Damit landeten in jeder Instanz alle 76 getrackten Dateien unter tools/chemenu/tests/, dazu tools/pytest.ini und tools/.coveragerc. Das war etwa ein Viertel der 280 exportierten Dateien.
Geprüft auf dd565d2 mit einem frischen Export, darin pytest -q: 257 failed, 1905 passed, 5 skipped. Die Suite liest die types/, kb/CONVENTIONS.md und Collections des Ursprungs-Repos. In einer Instanz liegen dort Templates oder eigene Festlegungen.
Außerdem:
Kein Laufzeit-Modul importierte chemenu.tests.
Kein CI-Schritt führte die Suite in einem Export aus.
pytest steht nicht in requirements.txt.
2. dist upgrade vergaß eine weggefallene Datei nach einem Lauf
removed-Pfade wurden nur mit --prune gelöscht, und nur, wenn sie unverändert waren. Danach schrieb der Lauf einen Stamp ohne diese Pfade, und ab dem nächsten Upgrade waren die Dateien endgültig verwaist.
Wie schlimm das ist, hängt vom Ort ab:
Unter instructions/ und types/ schädlich: Beide werden per Glob gelesen. Ein verwaister Skill wird weiter publiziert, ein verwaister Type-Spec bleibt ein Typ.
Unter tools/chemenu/ nur Ballast.
Leer gewordene Verzeichnisse blieben stehen.
Ausgelieferte Pfade, die in einem Release-Tag standen und in HEAD fehlen. Ermittelt über git ls-tree aller Tags, ohne instructions/dev/ und Tests:
Pfad
zuletzt ausgeliefert
tools/chemenu/sections.py
v3.0.0
instructions/claude-code-model-selection.md
v4.7.4
tools/chemenu/commands/confidence_decay.py
v4.7.4
instructions/private-instance.md
v7.0.0, entfällt mit 8.0.0
tools/chemenu/commands/upstream_cmd.py
v7.0.0, entfällt mit 8.0.0
Die Reihenfolgefalle
dist upgrade läuft mit dem Code der installierten Version. Das Upgrade in das Release mit diesem Paket führt also noch der alte Code aus. Deshalb sagt das Changeset dem Betreiber zwei Dinge:
Dieses eine Upgrade muss mit --prune laufen.
Für Dateien, die schon liegen geblieben sind, gibt es einen fertigen git rm-Befehl. Er nennt Tests, Konfiguration, beide 8.0.0-Waisen und die drei Altpfade.
Entscheidungen (Betreiber, 2026-10-03)
D1: Testsuite und Testkonfiguration werden nicht mehr ausgeliefert.Verworfen: die Suite instanzfest machen.
D2: Unveränderte weggefallene Dateien werden standardmäßig gelöscht.--prune wird akzeptiert und bewirkt nichts; einen Opt-out gibt es nicht. Verworfen: Opt-in plus Pflicht in der Instruction.
D3: Eine geänderte weggefallene Datei blockiert wie jede lokale Änderung.--take-release löscht sie, --keep-local macht sie zur Datei der Instanz. Verworfen: einmal warnen und behalten.
D4: Leer gewordene Verzeichnisse werden mit entfernt. Als leer gilt ein Verzeichnis, in dem höchstens noch __pycache__/*.pyc liegt. Entfernt wird nie bis zur Instanz-Wurzel selbst.
D5: Für Waisen früherer Upgrades gibt es keinen Code. Draußen läuft genau eine Instanz; der Release-Text nennt die Altpfade.
Invarianten (eingehalten, je durch Test belegt)
Wann eine Datei gelöscht wird. Es müssen alle drei Bedingungen zutreffen:
(a) Sie steht im alten Stamp mit Digest.
(b) Sie fehlt im neuen Stamp.
(c) Sie trägt beim Lauf genau diesen Digest.
Ausnahme: Ein ausdrückliches --take-release löscht sie auch ohne (c).
Was nie gelöscht wird:
instanzeigene Seeds
Dateien, die in keinem Stamp stehen
Wann ein Verzeichnis entfernt wird. Nur wenn darin nichts mehr liegt außer __pycache__/*.pyc. Das wird beim Löschen erneut geprüft, und rmdir verweigert ein nicht leeres Verzeichnis.
Was nie etwas löscht:--dry-run und jede Weigerung.
Akzeptanzkriterien
Der Plan von dist export enthält keinen Pfad unter tools/chemenu/tests/, keine tools/pytest.ini und keine tools/.coveragerc. Belegt durch test_plan_excludes_the_test_suite_and_its_configuration_by_exact_path und den echten Export.
pytest -q läuft im Ursprungs-Repo unverändert grün.
Ohne Flags wird eine unveränderte weggefallene Datei gelöscht, samt Verzeichnis, wenn darin nur __pycache__/*.pyc zurückbleibt.
Eine geänderte weggefallene Datei:
ohne Antwort: Der Lauf bricht ab und löscht nichts.
mit --keep-local: Sie bleibt.
mit --take-release: Sie ist weg.
Eine Datei, die in keinem der beiden Stamps steht, überlebt jedes Upgrade.
--prune wird akzeptiert und ändert nichts.
--dry-run meldet, was gelöscht würde, und lässt den Baum byte-gleich.
Das CHANGES.md-Changeset (8.0.0-beta.33) nennt --prune für den einen Sprung und den git rm-Befehl. Es sagt auch, dass das Aufräumen danach automatisch geschieht.
Kein ausgeliefertes Dokument gibt die Suite oder ihre Konfiguration als vorhanden aus (siehe „Abweichung“).
docs verify, instructions verify und CI sind grün (521, 522, 523).
Betroffene Dateien
tools/chemenu/commands/dist_cmd.py: Export-Ausschluss, Klassifikation retired/retired_modified, Verzeichnis-Aufräumen, Bericht, Weigerungstext und die Records.
Instruction:instructions/upgrade-instance.md, Schritte 5 und 6.
Weitere Doku:
tools/README.md
tools/CONTRACT.md
tools/requirements-mcp.txt
instructions/mcp-read-server.md
EVALS.md
CHANGES.md
docs/ownership-and-templates.md
Versionsteil
--minor. Der 8.0.0-Kandidat hatte die Kompatibilitätsgrenze schon überschritten.
Für sich genommen ist das Paket drop-in:
Vorwärts: Kein Flag fällt weg. Gelöscht wird nur, was das Release nicht mehr ausliefert.
Rückwärts: Das Stamp-Format bleibt gleich.
D3: Die Weigerung erklärt sich selbst und greift erst ab dem Upgrade nach der Installation.
## Ergebnis
**Erledigt am 2026-10-03.** Ausgeliefert im 8.0.0-Kandidaten als `8.0.0-beta.33`; die Bump war `--minor`.
| Commit | Inhalt | CI |
|---|---|---|
| `0d3499a` | Code, Tests, Doku-Abgleich | [521](https://gitea.nehmer.net/torben/chemenu/actions/runs/521), [522](https://gitea.nehmer.net/torben/chemenu/actions/runs/522) grün |
| `bd12831` | Abschlussphase: `docs/ownership-and-templates.md` | [523](https://gitea.nehmer.net/torben/chemenu/actions/runs/523) grün |
Seitdem gilt:
- **`dist export`** liefert `tools/chemenu/tests/`, `tools/pytest.ini` und `tools/.coveragerc` nicht mehr aus. Der Ausschluss geht per exaktem Pfad (`TOOLS_DEV_ONLY`).
- **`dist upgrade`** entscheidet eine nicht mehr ausgelieferte Datei im selben Lauf, der sie verschwinden sieht:
- unverändert seit der Installation: Sie wird gelöscht, samt leer gewordener Verzeichnisse.
- geändert seit der Installation: Das Upgrade blockiert, bis `--take-release` (löscht sie) oder `--keep-local` (sie gehört ab dann der Instanz) entscheidet.
- `--prune` wird akzeptiert und bewirkt nichts.
Verifiziert:
- **Lokal:**
- volle Suite: 2175 passed, 3 skipped, auch unter `env -i` mit leerem `HOME`
- `docs verify` und `instructions verify` grün
- ein echter Export ohne Suite und ohne Konfiguration
- **Upgrade von Ende zu Ende:** Der Export von `dd565d2` (8.0.0-beta.32, mit Suite und `__pycache__`) wurde mit dem neuen Code auf den neuen Export gehoben. Gelöscht wurden genau die 78 nicht mehr ausgelieferten Dateien und die 4 leer gewordenen Verzeichnisse.
- **CI:** Läufe 521 und 522 sind grün, einschließlich des Replays von `setup-instance.md` gegen den frischen Export.
**Abweichung vom Entwurf:**
- `tools/README.md` § Tests steht in `dist:strip`-Markern.
- `tools/CONTRACT.md` § Tests ist dagegen **umformuliert statt gestrippt**: Suite und Konfiguration liegen nur im Ursprungs-Repo. Grund: `test_the_commands_region_survives_dist_export_unchanged` verlangt, dass die Datei byte-gleich ausgeliefert wird.
- Der Link auf `README.md#tests` ist dort entfallen, weil er in einer Instanz ins Leere zeigen würde.
**Abschlussphase:**
- `docs/ownership-and-templates.md` § „The consequence in practice“ trägt jetzt die Begründung für die Lösch-Seite. Vorher stand sie nur hier im Issue: Eine weggefallene Datei muss im Lauf entschieden werden, der sie verschwinden sieht, weil der nächste Stamp sie nicht mehr kennt.
- `INSTALL.md` wurde gegen die geänderte `instructions/upgrade-instance.md` gegengelesen. Ergebnis: kein Widerspruch. INSTALL beschreibt `removed`/`--prune` nicht und verweist für die Details auf den Record.
- Weitere geprüfte Dokumente: `README.md`, `INSTALL-MCP.md`, `DEVELOPMENT.md`, `docs/version-model.md`. Keines trifft eine Aussage über die Suite in einer Instanz oder über weggefallene Dateien.
## Problem (wie vorgefunden)
### 1. Die Testsuite wurde ausgeliefert, obwohl sie in einer Instanz nicht lief
`dist export` kopierte `tools/` ganz, bis auf Build-Ausgabe. Damit landeten in jeder Instanz alle 76 getrackten Dateien unter `tools/chemenu/tests/`, dazu `tools/pytest.ini` und `tools/.coveragerc`. Das war etwa ein Viertel der 280 exportierten Dateien.
Geprüft auf `dd565d2` mit einem frischen Export, darin `pytest -q`: **257 failed, 1905 passed, 5 skipped.** Die Suite liest die `types/`, `kb/CONVENTIONS.md` und Collections des Ursprungs-Repos. In einer Instanz liegen dort Templates oder eigene Festlegungen.
Außerdem:
- Kein Laufzeit-Modul importierte `chemenu.tests`.
- Kein CI-Schritt führte die Suite in einem Export aus.
- `pytest` steht nicht in `requirements.txt`.
### 2. `dist upgrade` vergaß eine weggefallene Datei nach einem Lauf
`removed`-Pfade wurden nur mit `--prune` gelöscht, und nur, wenn sie unverändert waren. Danach schrieb der Lauf einen Stamp ohne diese Pfade, und ab dem nächsten Upgrade waren die Dateien endgültig verwaist.
Wie schlimm das ist, hängt vom Ort ab:
- **Unter `instructions/` und `types/` schädlich:** Beide werden per Glob gelesen. Ein verwaister Skill wird weiter publiziert, ein verwaister Type-Spec bleibt ein Typ.
- **Unter `tools/chemenu/` nur Ballast.**
Leer gewordene Verzeichnisse blieben stehen.
**Ausgelieferte Pfade, die in einem Release-Tag standen und in `HEAD` fehlen.** Ermittelt über `git ls-tree` aller Tags, ohne `instructions/dev/` und Tests:
| Pfad | zuletzt ausgeliefert |
|---|---|
| `tools/chemenu/sections.py` | v3.0.0 |
| `instructions/claude-code-model-selection.md` | v4.7.4 |
| `tools/chemenu/commands/confidence_decay.py` | v4.7.4 |
| `instructions/private-instance.md` | v7.0.0, entfällt mit 8.0.0 |
| `tools/chemenu/commands/upstream_cmd.py` | v7.0.0, entfällt mit 8.0.0 |
### Die Reihenfolgefalle
`dist upgrade` läuft mit dem Code der *installierten* Version. Das Upgrade in das Release mit diesem Paket führt also noch der alte Code aus. Deshalb sagt das Changeset dem Betreiber zwei Dinge:
- Dieses eine Upgrade muss mit `--prune` laufen.
- Für Dateien, die schon liegen geblieben sind, gibt es einen fertigen `git rm`-Befehl. Er nennt Tests, Konfiguration, beide 8.0.0-Waisen und die drei Altpfade.
## Entscheidungen (Betreiber, 2026-10-03)
- **D1: Testsuite und Testkonfiguration werden nicht mehr ausgeliefert.** *Verworfen:* die Suite instanzfest machen.
- **D2: Unveränderte weggefallene Dateien werden standardmäßig gelöscht.** `--prune` wird akzeptiert und bewirkt nichts; einen Opt-out gibt es nicht. *Verworfen:* Opt-in plus Pflicht in der Instruction.
- **D3: Eine geänderte weggefallene Datei blockiert wie jede lokale Änderung.** `--take-release` löscht sie, `--keep-local` macht sie zur Datei der Instanz. *Verworfen:* einmal warnen und behalten.
- **D4: Leer gewordene Verzeichnisse werden mit entfernt.** Als leer gilt ein Verzeichnis, in dem höchstens noch `__pycache__/*.pyc` liegt. Entfernt wird nie bis zur Instanz-Wurzel selbst.
- **D5: Für Waisen früherer Upgrades gibt es keinen Code.** Draußen läuft genau eine Instanz; der Release-Text nennt die Altpfade.
## Invarianten (eingehalten, je durch Test belegt)
**Wann eine Datei gelöscht wird.** Es müssen alle drei Bedingungen zutreffen:
- (a) Sie steht im alten Stamp mit Digest.
- (b) Sie fehlt im neuen Stamp.
- (c) Sie trägt beim Lauf genau diesen Digest.
Ausnahme: Ein ausdrückliches `--take-release` löscht sie auch ohne (c).
**Was nie gelöscht wird:**
- instanzeigene Seeds
- Dateien, die in keinem Stamp stehen
**Wann ein Verzeichnis entfernt wird.** Nur wenn darin nichts mehr liegt außer `__pycache__/*.pyc`. Das wird beim Löschen erneut geprüft, und `rmdir` verweigert ein nicht leeres Verzeichnis.
**Was nie etwas löscht:** `--dry-run` und jede Weigerung.
## Akzeptanzkriterien
- [x] Der Plan von `dist export` enthält keinen Pfad unter `tools/chemenu/tests/`, keine `tools/pytest.ini` und keine `tools/.coveragerc`. Belegt durch `test_plan_excludes_the_test_suite_and_its_configuration_by_exact_path` und den echten Export.
- [x] `pytest -q` läuft im Ursprungs-Repo unverändert grün.
- [x] Ohne Flags wird eine unveränderte weggefallene Datei gelöscht, samt Verzeichnis, wenn darin nur `__pycache__/*.pyc` zurückbleibt.
- [x] Eine geänderte weggefallene Datei:
- ohne Antwort: Der Lauf bricht ab und löscht nichts.
- mit `--keep-local`: Sie bleibt.
- mit `--take-release`: Sie ist weg.
- [x] Eine Datei, die in keinem der beiden Stamps steht, überlebt jedes Upgrade.
- [x] `--prune` wird akzeptiert und ändert nichts.
- [x] `--dry-run` meldet, was gelöscht würde, und lässt den Baum byte-gleich.
- [x] Das `CHANGES.md`-Changeset (8.0.0-beta.33) nennt `--prune` für den einen Sprung und den `git rm`-Befehl. Es sagt auch, dass das Aufräumen danach automatisch geschieht.
- [x] Kein ausgeliefertes Dokument gibt die Suite oder ihre Konfiguration als vorhanden aus (siehe „Abweichung“).
- [x] `docs verify`, `instructions verify` und CI sind grün (521, 522, 523).
## Betroffene Dateien
- **`tools/chemenu/commands/dist_cmd.py`:** Export-Ausschluss, Klassifikation `retired`/`retired_modified`, Verzeichnis-Aufräumen, Bericht, Weigerungstext und die Records.
- **Tests:** `tools/chemenu/tests/test_dist_cmd.py`, `tools/chemenu/tests/test_dist_upgrade.py`.
- **Instruction:** `instructions/upgrade-instance.md`, Schritte 5 und 6.
- **Weitere Doku:**
- `tools/README.md`
- `tools/CONTRACT.md`
- `tools/requirements-mcp.txt`
- `instructions/mcp-read-server.md`
- `EVALS.md`
- `CHANGES.md`
- `docs/ownership-and-templates.md`
## Versionsteil
**`--minor`.** Der 8.0.0-Kandidat hatte die Kompatibilitätsgrenze schon überschritten.
Für sich genommen ist das Paket drop-in:
- **Vorwärts:** Kein Flag fällt weg. Gelöscht wird nur, was das Release nicht mehr ausliefert.
- **Rückwärts:** Das Stamp-Format bleibt gleich.
- **D3:** Die Weigerung erklärt sich selbst und greift erst ab dem Upgrade nach der Installation.
Ausarbeitung des Stubs. Ursprünglicher Text, wörtlich:
brauchen wir die python tests in der distribution
die ganzen test...py werden ausgeliefert
macht das sinn?
wollen/brauchen wir das?
In der Sitzung dazugekommen (Betreiber, 2026-10-03): „Zusammen mit der Frage, wie wir bei einem Update nicht mehr nötige Dateien loswerden."
Changelog: Stub gegen den Baum geprüft und zum Arbeitspaket ausgearbeitet. Belege: ein frischer dist export trägt 76 Dateien unter tools/chemenu/tests/, und darin schlagen 257 Tests fehl. Zweite Frage aufgenommen: dist upgrade vergisst eine nicht mehr ausgelieferte Datei nach genau einem Lauf. Entscheidungen D1–D5 sind offen, deshalb kind/decision. status/incoming entfernt.
**Ausarbeitung des Stubs.** Ursprünglicher Text, wörtlich:
> **brauchen wir die python tests in der distribution**
>
> die ganzen test...py werden ausgeliefert
> macht das sinn?
> wollen/brauchen wir das?
In der Sitzung dazugekommen (Betreiber, 2026-10-03): *„Zusammen mit der Frage, wie wir bei einem Update nicht mehr nötige Dateien loswerden."*
**Changelog:** Stub gegen den Baum geprüft und zum Arbeitspaket ausgearbeitet. Belege: ein frischer `dist export` trägt 76 Dateien unter `tools/chemenu/tests/`, und darin schlagen 257 Tests fehl. Zweite Frage aufgenommen: `dist upgrade` vergisst eine nicht mehr ausgelieferte Datei nach genau einem Lauf. Entscheidungen D1–D5 sind offen, deshalb `kind/decision`. `status/incoming` entfernt.
torben
changed title from brauchen wir die python tests in der distribution to Testsuite nicht mehr ausliefern, und `dist upgrade` räumt weggefallene Dateien verlässlich ab2026-10-03 17:14:56 +00:00
Changelog: D1–D4 wie empfohlen entschieden. D5 ist entschieden: kein Code, weil draußen genau eine Instanz läuft, der Release-Text nennt die Altpfade. Korrigiert: private-instance.md und upstream_cmd.py sind nicht in 7.0.0 entfallen, sondern entfallen mit dem laufenden 8.0.0-Kandidaten. Die Waisenliste ist jetzt vollständig, ermittelt aus allen Release-Tags gegen HEAD. Der Versionsteil nennt den 8.0.0-Kandidaten, der die Grenze bereits überschritten hat. kind/decision → kind/build.
**Changelog:** D1–D4 wie empfohlen entschieden. D5 ist entschieden: kein Code, weil draußen genau eine Instanz läuft, der Release-Text nennt die Altpfade. Korrigiert: `private-instance.md` und `upstream_cmd.py` sind nicht in 7.0.0 entfallen, sondern entfallen mit dem laufenden 8.0.0-Kandidaten. Die Waisenliste ist jetzt vollständig, ermittelt aus allen Release-Tags gegen `HEAD`. Der Versionsteil nennt den 8.0.0-Kandidaten, der die Grenze bereits überschritten hat. `kind/decision` → `kind/build`.
Changelog: Gebaut und publiziert als 8.0.0-beta.33, Commit 0d3499a. CI-Läufe 521 und 522 sind grün, alle Kriterien abgehakt. Neu im Body ist ein Abschnitt „Stand“ mit den lokalen Prüfungen und dem Upgrade-Test von Ende zu Ende. Abweichung: tools/CONTRACT.md § Tests wurde umformuliert, nicht gestrippt, weil die Datei byte-gleich ausgeliefert werden muss. Offen ist nur noch die Abschlussphase.
**Changelog:** Gebaut und publiziert als `8.0.0-beta.33`, Commit `0d3499a`. CI-Läufe 521 und 522 sind grün, alle Kriterien abgehakt. Neu im Body ist ein Abschnitt „Stand“ mit den lokalen Prüfungen und dem Upgrade-Test von Ende zu Ende. Abweichung: `tools/CONTRACT.md` § Tests wurde umformuliert, nicht gestrippt, weil die Datei byte-gleich ausgeliefert werden muss. Offen ist nur noch die Abschlussphase.
Changelog: Body in Endfassung, das Problem steht jetzt in der Vergangenheit. In der Abschlussphase kam docs/ownership-and-templates.md dazu, mit der Begründung für die Lösch-Seite (bd12831, CI 523 grün). Der Abgleich von INSTALL.md mit upgrade-instance.md ergab keinen Widerspruch. Geschlossen.
**Changelog:** Body in Endfassung, das Problem steht jetzt in der Vergangenheit. In der Abschlussphase kam `docs/ownership-and-templates.md` dazu, mit der Begründung für die Lösch-Seite (`bd12831`, CI 523 grün). Der Abgleich von INSTALL.md mit upgrade-instance.md ergab keinen Widerspruch. Geschlossen.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ergebnis
Erledigt am 2026-10-03. Ausgeliefert im 8.0.0-Kandidaten als
8.0.0-beta.33; die Bump war--minor.0d3499abd12831docs/ownership-and-templates.mdSeitdem gilt:
dist exportlieferttools/chemenu/tests/,tools/pytest.iniundtools/.coveragercnicht mehr aus. Der Ausschluss geht per exaktem Pfad (TOOLS_DEV_ONLY).dist upgradeentscheidet eine nicht mehr ausgelieferte Datei im selben Lauf, der sie verschwinden sieht:--take-release(löscht sie) oder--keep-local(sie gehört ab dann der Instanz) entscheidet.--prunewird akzeptiert und bewirkt nichts.Verifiziert:
env -imit leeremHOMEdocs verifyundinstructions verifygründd565d2(8.0.0-beta.32, mit Suite und__pycache__) wurde mit dem neuen Code auf den neuen Export gehoben. Gelöscht wurden genau die 78 nicht mehr ausgelieferten Dateien und die 4 leer gewordenen Verzeichnisse.setup-instance.mdgegen den frischen Export.Abweichung vom Entwurf:
tools/README.md§ Tests steht indist:strip-Markern.tools/CONTRACT.md§ Tests ist dagegen umformuliert statt gestrippt: Suite und Konfiguration liegen nur im Ursprungs-Repo. Grund:test_the_commands_region_survives_dist_export_unchangedverlangt, dass die Datei byte-gleich ausgeliefert wird.README.md#testsist dort entfallen, weil er in einer Instanz ins Leere zeigen würde.Abschlussphase:
docs/ownership-and-templates.md§ „The consequence in practice“ trägt jetzt die Begründung für die Lösch-Seite. Vorher stand sie nur hier im Issue: Eine weggefallene Datei muss im Lauf entschieden werden, der sie verschwinden sieht, weil der nächste Stamp sie nicht mehr kennt.INSTALL.mdwurde gegen die geänderteinstructions/upgrade-instance.mdgegengelesen. Ergebnis: kein Widerspruch. INSTALL beschreibtremoved/--prunenicht und verweist für die Details auf den Record.README.md,INSTALL-MCP.md,DEVELOPMENT.md,docs/version-model.md. Keines trifft eine Aussage über die Suite in einer Instanz oder über weggefallene Dateien.Problem (wie vorgefunden)
1. Die Testsuite wurde ausgeliefert, obwohl sie in einer Instanz nicht lief
dist exportkopiertetools/ganz, bis auf Build-Ausgabe. Damit landeten in jeder Instanz alle 76 getrackten Dateien untertools/chemenu/tests/, dazutools/pytest.iniundtools/.coveragerc. Das war etwa ein Viertel der 280 exportierten Dateien.Geprüft auf
dd565d2mit einem frischen Export, darinpytest -q: 257 failed, 1905 passed, 5 skipped. Die Suite liest dietypes/,kb/CONVENTIONS.mdund Collections des Ursprungs-Repos. In einer Instanz liegen dort Templates oder eigene Festlegungen.Außerdem:
chemenu.tests.pyteststeht nicht inrequirements.txt.2.
dist upgradevergaß eine weggefallene Datei nach einem Laufremoved-Pfade wurden nur mit--prunegelöscht, und nur, wenn sie unverändert waren. Danach schrieb der Lauf einen Stamp ohne diese Pfade, und ab dem nächsten Upgrade waren die Dateien endgültig verwaist.Wie schlimm das ist, hängt vom Ort ab:
instructions/undtypes/schädlich: Beide werden per Glob gelesen. Ein verwaister Skill wird weiter publiziert, ein verwaister Type-Spec bleibt ein Typ.tools/chemenu/nur Ballast.Leer gewordene Verzeichnisse blieben stehen.
Ausgelieferte Pfade, die in einem Release-Tag standen und in
HEADfehlen. Ermittelt übergit ls-treealler Tags, ohneinstructions/dev/und Tests:tools/chemenu/sections.pyinstructions/claude-code-model-selection.mdtools/chemenu/commands/confidence_decay.pyinstructions/private-instance.mdtools/chemenu/commands/upstream_cmd.pyDie Reihenfolgefalle
dist upgradeläuft mit dem Code der installierten Version. Das Upgrade in das Release mit diesem Paket führt also noch der alte Code aus. Deshalb sagt das Changeset dem Betreiber zwei Dinge:--prunelaufen.git rm-Befehl. Er nennt Tests, Konfiguration, beide 8.0.0-Waisen und die drei Altpfade.Entscheidungen (Betreiber, 2026-10-03)
--prunewird akzeptiert und bewirkt nichts; einen Opt-out gibt es nicht. Verworfen: Opt-in plus Pflicht in der Instruction.--take-releaselöscht sie,--keep-localmacht sie zur Datei der Instanz. Verworfen: einmal warnen und behalten.__pycache__/*.pycliegt. Entfernt wird nie bis zur Instanz-Wurzel selbst.Invarianten (eingehalten, je durch Test belegt)
Wann eine Datei gelöscht wird. Es müssen alle drei Bedingungen zutreffen:
Ausnahme: Ein ausdrückliches
--take-releaselöscht sie auch ohne (c).Was nie gelöscht wird:
Wann ein Verzeichnis entfernt wird. Nur wenn darin nichts mehr liegt außer
__pycache__/*.pyc. Das wird beim Löschen erneut geprüft, undrmdirverweigert ein nicht leeres Verzeichnis.Was nie etwas löscht:
--dry-runund jede Weigerung.Akzeptanzkriterien
dist exportenthält keinen Pfad untertools/chemenu/tests/, keinetools/pytest.iniund keinetools/.coveragerc. Belegt durchtest_plan_excludes_the_test_suite_and_its_configuration_by_exact_pathund den echten Export.pytest -qläuft im Ursprungs-Repo unverändert grün.__pycache__/*.pyczurückbleibt.--keep-local: Sie bleibt.--take-release: Sie ist weg.--prunewird akzeptiert und ändert nichts.--dry-runmeldet, was gelöscht würde, und lässt den Baum byte-gleich.CHANGES.md-Changeset (8.0.0-beta.33) nennt--prunefür den einen Sprung und dengit rm-Befehl. Es sagt auch, dass das Aufräumen danach automatisch geschieht.docs verify,instructions verifyund CI sind grün (521, 522, 523).Betroffene Dateien
tools/chemenu/commands/dist_cmd.py: Export-Ausschluss, Klassifikationretired/retired_modified, Verzeichnis-Aufräumen, Bericht, Weigerungstext und die Records.tools/chemenu/tests/test_dist_cmd.py,tools/chemenu/tests/test_dist_upgrade.py.instructions/upgrade-instance.md, Schritte 5 und 6.tools/README.mdtools/CONTRACT.mdtools/requirements-mcp.txtinstructions/mcp-read-server.mdEVALS.mdCHANGES.mddocs/ownership-and-templates.mdVersionsteil
--minor. Der 8.0.0-Kandidat hatte die Kompatibilitätsgrenze schon überschritten.Für sich genommen ist das Paket drop-in:
Ausarbeitung des Stubs. Ursprünglicher Text, wörtlich:
In der Sitzung dazugekommen (Betreiber, 2026-10-03): „Zusammen mit der Frage, wie wir bei einem Update nicht mehr nötige Dateien loswerden."
Changelog: Stub gegen den Baum geprüft und zum Arbeitspaket ausgearbeitet. Belege: ein frischer
dist exportträgt 76 Dateien untertools/chemenu/tests/, und darin schlagen 257 Tests fehl. Zweite Frage aufgenommen:dist upgradevergisst eine nicht mehr ausgelieferte Datei nach genau einem Lauf. Entscheidungen D1–D5 sind offen, deshalbkind/decision.status/incomingentfernt.brauchen wir die python tests in der distributionto Testsuite nicht mehr ausliefern, und `dist upgrade` räumt weggefallene Dateien verlässlich abChangelog: D1–D4 wie empfohlen entschieden. D5 ist entschieden: kein Code, weil draußen genau eine Instanz läuft, der Release-Text nennt die Altpfade. Korrigiert:
private-instance.mdundupstream_cmd.pysind nicht in 7.0.0 entfallen, sondern entfallen mit dem laufenden 8.0.0-Kandidaten. Die Waisenliste ist jetzt vollständig, ermittelt aus allen Release-Tags gegenHEAD. Der Versionsteil nennt den 8.0.0-Kandidaten, der die Grenze bereits überschritten hat.kind/decision→kind/build.Changelog: Gebaut und publiziert als
8.0.0-beta.33, Commit0d3499a. CI-Läufe 521 und 522 sind grün, alle Kriterien abgehakt. Neu im Body ist ein Abschnitt „Stand“ mit den lokalen Prüfungen und dem Upgrade-Test von Ende zu Ende. Abweichung:tools/CONTRACT.md§ Tests wurde umformuliert, nicht gestrippt, weil die Datei byte-gleich ausgeliefert werden muss. Offen ist nur noch die Abschlussphase.Changelog: Body in Endfassung, das Problem steht jetzt in der Vergangenheit. In der Abschlussphase kam
docs/ownership-and-templates.mddazu, mit der Begründung für die Lösch-Seite (bd12831, CI 523 grün). Der Abgleich von INSTALL.md mit upgrade-instance.md ergab keinen Widerspruch. Geschlossen.