feat!: installation only from a release, into an empty folder; upstream merge/verify and private-instance.md removed, dist adopt, shell-neutral instructions (#153)
CI / verify (push) Successful in 5m19s
CI / pwsh (push) Successful in 1m55s
Release / release (push) Successful in 36s

Files changed:
- .gitea/workflows/ci.yml
- .gitea/workflows/release.yml
- AGENTS.md
- CHANGES.md
- DEVELOPMENT.md
- EVALS.md
- INSTALL.md
- README.md
- VERSION
- docs/ownership-and-templates.md
- instructions/CONTRACT.md
- instructions/bootstrap.md
- instructions/dev/dev-setup.md
- instructions/dev/stack-dev/SKILL.md
- instructions/gates.md
- instructions/ingest-large-tree.md
- instructions/kb-profiles.md
- instructions/mcp-read-server.md
- instructions/migrations/3.0.0-authoring-conventions.md
- instructions/preflight.md
- instructions/private-instance.md
- instructions/session-setup.md
- instructions/setup-instance.md
- instructions/upgrade-instance.md
- tools/CONTRACT.md
- tools/README.md
- tools/chemenu/cli.py
- tools/chemenu/cli_contract.py
- tools/chemenu/commands/dist_cmd.py
- tools/chemenu/commands/docs_verify.py
- tools/chemenu/commands/doctor.py
- tools/chemenu/commands/git_publish.py
- tools/chemenu/commands/upstream_cmd.py
- tools/chemenu/commands/work_cmd.py
- tools/chemenu/config.py
- tools/chemenu/ownership.py
- tools/chemenu/tests/test_cli.py
- tools/chemenu/tests/test_dist_cmd.py
- tools/chemenu/tests/test_instructions_shell.py
- tools/chemenu/tests/test_preflight.py
- tools/chemenu/tests/test_preflight_pwsh.py
- tools/chemenu/tests/test_run_budget.py
- tools/chemenu/tests/test_upstream_cmd.py
- tools/chemenu/toc.py
- tools/preflight.ps1
- tools/preflight.sh
This commit is contained in:
torben committed 2026-10-01 22:12:09 +02:00
1 parent d0f08d1fba
commit a6d07f97c4
46 files changed
+1314 -1936

No files matched your search

+62 -4
View File
@@ -13,6 +13,62 @@ Grund steht dort als Kommentar, damit eine spätere Sitzung die vermeintliche L
`INSTALL.md` oder `EVALS.md`, die `instructions verify` auf genau diesen Punkt prüft - nach
`instructions/dev/` verlinken.
## Entwicklungsumgebung
Am Stack wird in einem Klon dieses Repos gearbeitet. Ein solcher Klon ist **keine Instanz** und
wird nie eine. Instanzen entstehen ausschließlich aus Releases, siehe [INSTALL.md](INSTALL.md).
```bash
git clone https://gitea.nehmer.net/torben/chemenu.git
cd chemenu
```
Danach den Agenten `instructions/bootstrap.md` ausführen lassen: Preflight, dann
`tools/wikitool instructions sync`. Die Agenten-Seite dazu - was hier anders ist als in einer
Instanz und wie `dist export` als Testwerkzeug läuft - steht in
[instructions/dev/dev-setup.md](instructions/dev/dev-setup.md).
Was ein Klon mitbringt und eine Instanz nicht:
- **Den Demo-Korpus.** Rund 170 Seiten, die den Stack selbst dokumentieren: Gates, Lint,
Versionierung, Suche, das Wiki-Muster. Er ist Testbett und begehbares Beispiel, keine
produktive Wissensbasis. Was an ihm geändert werden darf, regelt
[instructions/dev/corpus-policy.md](instructions/dev/corpus-policy.md).
- **Eine Demo-Persona** in `USER.md`/`SOUL.md`. `doctor` meldet beide als ausgefüllt. Sie
beschreiben den Demo-Betrieb, nicht dich.
- **Telemetrie an.** Ohne `.wikitool-release.json` ist der Klon die Messstation, mit der der
Stack sich selbst bewertet ([EVALS.md](EVALS.md) § „Whether it runs at all“).
- **`instructions/dev/`, `commonplace/`, `.gitea/` und diese Datei.** `dist export` liefert
davon nichts aus.
`ENVIRONMENT.md` fehlt nach jedem Klon, weil die Datei gitignored ist: Sie beschreibt einen
Checkout, nicht das Repo. Wer sie anlegt (Vorlage `ENVIRONMENT.md.template`, Schritt 5 in
`instructions/bootstrap.md`), erspart jeder Stack-Sitzung die Fragen nach Harness, `gitea-mcp`
und Remote.
### `dist export` als Build- und Testwerkzeug
`tools/wikitool dist export <leeres Verzeichnis>` schreibt genau den Baum, den ein Release
ausliefert: Maschinerie ohne Wiki-Inhalt, ohne Git-Historie, ohne `instructions/dev/`. Damit
prüft man vor einem Release, was ausgeliefert würde (`--dry-run` listet es nur). Und man spielt
den Installationsweg nach, ohne auf ein Release zu warten: Tarball daraus bauen wie
`.gitea/workflows/release.yml`, dann das Preflight-Skript in einem leeren Verzeichnis mit
`--archive <tarball>` starten. Der CI-Schritt „The distribution works as a fresh instance“ in
`.gitea/workflows/ci.yml` macht genau das.
Für eine echte Instanz ist ein solcher Export kein Weg. Ihm fehlen die Release-Herkunft im
Stamp, und `dist upgrade --latest` vergleicht später gegen einen Stand, den es nie als Release
gab.
### Ein Release-Feed in einem nicht öffentlichen Repo
Wer den Stack in einem eigenen, nicht öffentlichen Repo betreibt und Instanzen von dort
aktualisiert, lässt `WIKITOOL_UPDATE_URL` auf dessen Feed zeigen. Dabei gibt es eine Eigenheit:
Gitea antwortet anonymen Aufrufern für ein unsichtbares Repo mit demselben `404` wie für ein gar
nicht existierendes. Ein fehlendes Release und ein fehlender Zugriff sehen dann identisch aus –
„kein Update gefunden“ wäre in dem Fall schlicht falsch. Dagegen hilft ein Gitea-Token mit
Lesezugriff in `WIKITOOL_UPDATE_TOKEN`. Es geht nur an Downloads auf demselben Host wie der Feed.
## Der Release-Ablauf
Zwischen zwei Releases führt der Stack **einen** laufenden Versionskandidaten statt einer neuen
@@ -75,8 +131,9 @@ eine Sitzung ihn tatsächlich durchläuft:
`VERSION` bewegt: Eine suffixbehaftete `VERSION` (ein Kandidat) lässt den Job sauber
überspringen, bevor er die Releases-API überhaupt anfragt - Betas werden nie veröffentlicht.
Eine suffixfreie `VERSION` baut die Distribution (`dist export`), erzeugt Tag und Release und
lädt Tarball plus Prüfsumme hoch. **CI setzt den Tag, nie eine Sitzung** - das hält
Invariante 5 intakt.
lädt Tarball und Prüfsumme hoch, dazu die beiden Preflight-Skripte und die Anleitungen
`setup-instance.md` und `preflight.md`, auf die der Installationssatz in `INSTALL.md` zeigt.
**CI setzt den Tag, nie eine Sitzung** - das hält Invariante 5 intakt.
Die drei Verify-Befehle stehen oben in Schritt 3; was jeder von ihnen prüft, steht in
[tools/CONTRACT.md](tools/CONTRACT.md) und wird dort von `docs verify` gegen die tatsächliche
@@ -90,8 +147,9 @@ Drift also niemandem auf. Was `pytest` an dieser Stelle vom Entwickler erwartet,
`.gitea/workflows/ci.yml` läuft auf jeden Push/PR gegen `main` (Content-Pfade ausgenommen) und
führt Testsuite, `docs verify`, `instructions verify` sowie einen vollständigen
`setup-instance.md`-Replay gegen einen frischen `dist export` aus - derselbe Pfad, den ein neuer
Nutzer tatsächlich geht. `.gitea/workflows/nightly.yml` ist der Drift-Check gegen die Zeit statt
`setup-instance.md`-Replay aus: ein lokal gebauter Release-Tarball, das Preflight-Skript mit
`--archive` in einem leeren Verzeichnis, dann die Schritte der Anleitung - derselbe Pfad, den
ein neuer Nutzer tatsächlich geht, nur ohne Download. `.gitea/workflows/nightly.yml` ist der Drift-Check gegen die Zeit statt
gegen einen Commit. `.gitea/workflows/release.yml` ist Schritt 6 oben.
Drei weitere Workflows tragen die Live-Tests der Tracker-Adapter (Super Productivity, CalDAV):