diff --git a/CHANGES.md b/CHANGES.md index 74d5156..021627d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -59,7 +59,7 @@ concern - readable here, never shipped as something to parse. --- -## 7.1.0-beta.5 - 2026-09-26 - wikitool: usage lines name wikitool, and the -h acceptance checks become tests +## 7.1.0-beta.6 - 2026-09-26 - dist export no longer cuts the dist export record out of the shipped tools/CONTRACT.md **Author:** Torben Nehmer @@ -69,6 +69,7 @@ concern - readable here, never shipped as something to parse. **Medium impact** - CalDAV task-tracker provider (Nextcloud Tasks, iOS Reminders); review reports unknown-value findings instead of skipping them +- dist export no longer cuts the dist export record out of the shipped tools/CONTRACT.md **Low impact** - version bump no longer points at version release in its output @@ -162,6 +163,17 @@ frame characters in help or in a usage error, the top-level index listing at lea non-idempotent commands - had only been checked by hand; they are now pinned in `test_cli.py`. +### dist export no longer cuts the dist export record out of the shipped tools/CONTRACT.md + +`dist export` removes every `dist:strip-start`/`dist:strip-end` marker span from the files it +ships, and the `dist export` record's own notes quoted that marker pair literally - so the export +cut a piece out of the middle of the generated command region, and the fresh instance's own +`docs verify` then reported that region stale. CI's fresh-instance replay caught it on the first +push. The old table row carried the same quote and was mangled the same way; nothing compared the +shipped copy against its source until the region became generated. The record now names the +markers without spelling out the pair, and a new test pins that the export plan ships +`tools/CONTRACT.md` byte-identical to the working tree. + --- ## 7.0.0 - 2026-09-22 - Task-Tracker-Anbindung: Vorhaben als Seitenart, Verpflichtungsschicht, Weekly Review als Read-Time-Join diff --git a/VERSION b/VERSION index 6f5da9d..8d618bc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.1.0-beta.5 +7.1.0-beta.6 diff --git a/tools/CONTRACT.md b/tools/CONTRACT.md index 5f7de37..0cee91a 100644 --- a/tools/CONTRACT.md +++ b/tools/CONTRACT.md @@ -1469,7 +1469,7 @@ Write a contentless, distributable copy of this repo's machinery. **NOTES** -Write a contentless, distributable copy of this repo's machinery into an empty `` directory: `AGENTS.md`/`README.md`/`EVALS.md` with any `...` region removed, `instructions/` (minus `instructions/dev/`), `types/` (the `root: kb` page type-specs and their schemas re-keyed as `.template`, the stack's own verbatim), `docs/` verbatim, `tools/` (no venv/caches), the `.github/hooks/`+`.vibe/` session-tracing config plus `.claude/settings.json`, `kb/CONTRACT.md` (no pages, no areas), the two flat anchors `raw/.gitkeep` and `incoming/.gitkeep` (both roots are flat now that a file's location under `raw/` is a date shard rather than a hand-picked type, so a fresh export no longer creates any type subdirectories under either root; `incoming/.gitkeep` is trackable and survives becoming a git repository, so a plain clone gets the directory without any bootstrap step re-creating it), `VERSION`, `USER.md.template`/`SOUL.md.template` plus `kb/CONVENTIONS.md.template` and each collection's contract re-keyed as `kb//COLLECTION.md.template` (the templates ship; the filled `USER.md`/`SOUL.md`/`kb/CONVENTIONS.md`/`kb//COLLECTION.md`/`types/.md` never do - all of them bind their instance and none are the stack's to decide, and `find_leaks` refuses a plan carrying one), and a generated `.wikitool-release.json` stamp (version, export date, origin, and a sha256 per exported file - the base a later upgrade would compare against). The four origin options only fill stamp fields: `export` never calls git and cannot discover them. Refuses a non-empty target, and a tree with no `VERSION`. See `instructions/setup-instance.md`. One-way: there is no command that reconstructs a distributed instance into a dev instance - work on the stack in the origin repo (or a new dev instance exported from it) instead +Write a contentless, distributable copy of this repo's machinery into an empty `` directory: `AGENTS.md`/`README.md`/`EVALS.md` with any `dist:strip-start`...`dist:strip-end` marker region removed, `instructions/` (minus `instructions/dev/`), `types/` (the `root: kb` page type-specs and their schemas re-keyed as `.template`, the stack's own verbatim), `docs/` verbatim, `tools/` (no venv/caches), the `.github/hooks/`+`.vibe/` session-tracing config plus `.claude/settings.json`, `kb/CONTRACT.md` (no pages, no areas), the two flat anchors `raw/.gitkeep` and `incoming/.gitkeep` (both roots are flat now that a file's location under `raw/` is a date shard rather than a hand-picked type, so a fresh export no longer creates any type subdirectories under either root; `incoming/.gitkeep` is trackable and survives becoming a git repository, so a plain clone gets the directory without any bootstrap step re-creating it), `VERSION`, `USER.md.template`/`SOUL.md.template` plus `kb/CONVENTIONS.md.template` and each collection's contract re-keyed as `kb//COLLECTION.md.template` (the templates ship; the filled `USER.md`/`SOUL.md`/`kb/CONVENTIONS.md`/`kb//COLLECTION.md`/`types/.md` never do - all of them bind their instance and none are the stack's to decide, and `find_leaks` refuses a plan carrying one), and a generated `.wikitool-release.json` stamp (version, export date, origin, and a sha256 per exported file - the base a later upgrade would compare against). The four origin options only fill stamp fields: `export` never calls git and cannot discover them. Refuses a non-empty target, and a tree with no `VERSION`. See `instructions/setup-instance.md`. One-way: there is no command that reconstructs a distributed instance into a dev instance - work on the stack in the origin repo (or a new dev instance exported from it) instead #### `dist upgrade` diff --git a/tools/chemenu/commands/dist_cmd.py b/tools/chemenu/commands/dist_cmd.py index 8e8de0c..c0d6905 100644 --- a/tools/chemenu/commands/dist_cmd.py +++ b/tools/chemenu/commands/dist_cmd.py @@ -585,7 +585,7 @@ def _write_plan(target: Path, plan: dict[str, PlannedFile]) -> None: ), notes="Write a contentless, distributable copy of this repo's machinery into an empty " "`` directory: `AGENTS.md`/`README.md`/`EVALS.md` with any " - "`...` region removed, `instructions/` " + "`dist:strip-start`...`dist:strip-end` marker region removed, `instructions/` " "(minus `instructions/dev/`), `types/` (the `root: kb` page type-specs and their schemas " "re-keyed as `.template`, the stack's own verbatim), `docs/` verbatim, `tools/` (no " "venv/caches), the `.github/hooks/`+`.vibe/` session-tracing config plus " diff --git a/tools/chemenu/tests/test_docs_verify.py b/tools/chemenu/tests/test_docs_verify.py index 6c648b6..bb203a3 100644 --- a/tools/chemenu/tests/test_docs_verify.py +++ b/tools/chemenu/tests/test_docs_verify.py @@ -107,6 +107,18 @@ def test_the_real_commands_region_is_current(): assert docs_verify.check_commands_region() == [] +def test_the_commands_region_survives_dist_export_unchanged(): + """`dist export` removes `dist:strip` marker spans from shipped files, so a + record whose prose quotes the literal marker pair gets cut in the + exported `tools/CONTRACT.md` - and the fresh instance's own `docs verify` + then reports its generated region stale. That is what failed CI's + fresh-instance step the first time this region shipped; this pins it + without needing the full replay.""" + plan = dist_cmd.build_plan() + shipped = plan["tools/CONTRACT.md"].content + assert shipped == (config.ROOT / "tools" / "CONTRACT.md").read_text(encoding="utf-8") + + def test_every_registered_commands_flags_are_documented(): """Forward direction against the real tree and the real Click app: every non-hidden flag of every command must appear in its cli_contract