From c2c42c34a2568ae307a71ff4ef9cc3a759c1d07e Mon Sep 17 00:00:00 2001 From: Joakim Persson Date: Fri, 2 Oct 2026 10:36:21 +0200 Subject: [PATCH] docs(v1.10.1): cut v1.10.1; v1.10.0 stays tagged-but-never-published MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v1.10.0's build failed one assertion of 104 and published nothing. Rather than re-point a tag CI had already consumed, the number moves: a version that failed its build should stay failed and readable, not be quietly overwritten with different bytes. CHANGELOG gains a v1.10.1 section carrying the smoke fix (moved out of v1.10.0's Fixed list), and states plainly that everything under v1.10.0 ships here so the big section stays the content record. v1.10.0's heading is marked "tagged, never published — superseded by v1.10.1" with a blockquote naming the commit (12f99c4), the run (704), the four jobs that skipped, and the fact that no image carries the tag. Pre-tag doc sweep, because CI reads docs from the TAG and POSTs DOCKER_HUB.md to the Hub as full_description: - README "Terminal UI mode: fullscreen is the default (since v1.10.0)" -> v1.10.1. A "since" marker pointing at an image nobody can pull is a worse lie than no marker. - Dockerfile.variant decision comments for the pi and pi-atelier bumps -> v1.10.1 (these describe which release carries the change). - scripts/smoke-test.sh deliberately KEEPS "the v1.10.0 tag build" — that one is a historical event and v1.10.0 is its correct name. - DOCKER_HUB.md needed no change: its fullscreen note is version-free. No code changes. RELEASE_TAG is derived from github.ref_name, so nothing in the build hardcodes the version. Base layer does NOT rebuild: no base input (Dockerfile.base, rootfs/**, entrypoint.sh, entrypoint-user.sh) has changed since 12f99c4, so base-decide will cache-hit base-dad0f365ff24, which run 704's build-base already pushed at 07:52:38Z. This retry skips the expensive half. Gates: doc-drift 23 OK / 0 DRIFT / 0 SKIP; base-hash, workflow-shell, skill-floor, lint-shell all rc=0. --- CHANGELOG.md | 89 +++++++++++++++++++++++++++++----------------- Dockerfile.variant | 6 ++-- README.md | 2 +- 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95a91ce..088da6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,62 @@ Pre-v1.0.0 tags followed the pi npm version (`v{pi_version}[letter]`). --- -## v1.10.0 — 2026-10-02 +## v1.10.1 — 2026-10-02 + +**v1.10.0 was tagged and never published.** Its tag build (run 704) failed one +assertion out of 104 — a smoke check that required a pi dependency upstream had +deliberately deleted — so every publish job skipped and no image, no `latest`, +no Hub description was ever written. v1.10.1 is that same release plus the fix +to the assertion: **everything described under v1.10.0 below ships here**, and +that section remains the content record for this release. Nothing in it changed. + +The tag number moves rather than being re-pointed because CI had already +consumed v1.10.0; a version that failed its build should stay failed and +readable, not be quietly overwritten with different bytes. + +### Fixed + +- **The smoke suite asserted a pi dependency that upstream deleted, and it cost + this release its first tag build** — `scripts/smoke-test.sh` required + `@mariozechner/clipboard` to be installed and `require()`-able at every install + site. pi **0.86.0** (`#9163`) *"Replaced the external native clipboard + dependency with bundled asynchronous macOS, Windows, and X11 helpers while + preserving platform command and OSC 52 fallbacks"*. Measured in the published + tarballs: pi `0.85.1` declares `@mariozechner/clipboard@0.3.9`; `0.87.1` and + `1.0.0` declare no `@mariozechner/*` at all. So on a correct v1.10.0 image the + package is legitimately absent, the assertion's `if [ -z "$sites" ]; then exit + 1` fired, and run 704 ended **100 passed / 1 failed** on `smoke` and **103 + passed / 1 failed** on `smoke-studio` — same single assertion, every + studio-specific check green. `build-variant`, `build-variant-studio`, + `promote-base-latest` and `update-description` were all skipped, so **nothing + was published**: the gate behaved exactly as designed, against a stale + expectation rather than a real defect. + + The fix does not delete the guard, because the guard was right: "fail when the + family is absent" is what stops `prune_foreign_natives()` from silently + deleting the binding instead of the surplus platform copies. It now **derives + its expectation from what the image's pi actually declares** — if pi declares + the dependency an install must exist and load; if pi does not, no install may + linger. That re-arms by itself should a future pi re-add it, and it still + catches an orphaned install. Verified as a four-quadrant truth table with the + command string extracted verbatim from the file and run through `sh -c` the way + `run()` invokes it: declared+present → rc=0, declared+absent → rc=1, + undeclared+absent → rc=0, undeclared+present → rc=1. + + Worth stating plainly, since it is the whole value of the round: pi 1.0.0, + pi-atelier v0.13.0 and pi-studio v0.9.61 passed **103 of 104** assertions on a + pi MAJOR bump. The one red was the suite describing pi 0.85.1's dependency + graph, not the image. + +--- + +## v1.10.0 — 2026-10-02 (tagged, never published — superseded by v1.10.1) + +> Tagged 2026-10-02 at commit `12f99c4`. Its build (run 704) went red on the +> stale clipboard assertion described under v1.10.1, so `build-variant`, +> `build-variant-studio`, `promote-base-latest` and `update-description` all +> skipped and nothing reached the Hub. No image carries this tag. The content +> below is accurate and shipped as **v1.10.1**. Three small fixes found by the v1.9.4 first-boot acceptance and the CI base hash prediction, plus one boot-time wiring fix that stops a recurring `git push` @@ -209,38 +264,6 @@ jump, four new base packages and a new mailbox feature. The release carrying a ### Fixed -- **The smoke suite asserted a pi dependency that upstream deleted, and it cost - this release its first tag build** — `scripts/smoke-test.sh` required - `@mariozechner/clipboard` to be installed and `require()`-able at every install - site. pi **0.86.0** (`#9163`) *"Replaced the external native clipboard - dependency with bundled asynchronous macOS, Windows, and X11 helpers while - preserving platform command and OSC 52 fallbacks"*. Measured in the published - tarballs: pi `0.85.1` declares `@mariozechner/clipboard@0.3.9`; `0.87.1` and - `1.0.0` declare no `@mariozechner/*` at all. So on a correct v1.10.0 image the - package is legitimately absent, the assertion's `if [ -z "$sites" ]; then exit - 1` fired, and run 704 ended **100 passed / 1 failed** on `smoke` and **103 - passed / 1 failed** on `smoke-studio` — same single assertion, every - studio-specific check green. `build-variant`, `build-variant-studio`, - `promote-base-latest` and `update-description` were all skipped, so **nothing - was published**: the gate behaved exactly as designed, against a stale - expectation rather than a real defect. - - The fix does not delete the guard, because the guard was right: "fail when the - family is absent" is what stops `prune_foreign_natives()` from silently - deleting the binding instead of the surplus platform copies. It now **derives - its expectation from what the image's pi actually declares** — if pi declares - the dependency an install must exist and load; if pi does not, no install may - linger. That re-arms by itself should a future pi re-add it, and it still - catches an orphaned install. Verified as a four-quadrant truth table with the - command string extracted verbatim from the file and run through `sh -c` the way - `run()` invokes it: declared+present → rc=0, declared+absent → rc=1, - undeclared+absent → rc=0, undeclared+present → rc=1. - - Worth stating plainly, since it is the whole value of the round: pi 1.0.0, - pi-atelier v0.13.0 and pi-studio v0.9.61 passed **103 of 104** assertions on a - pi MAJOR bump. The one red was the suite describing pi 0.85.1's dependency - graph, not the image. - - **`git push` from inside the container dies on a read-only ControlPath, and no amount of documentation was fixing it** — `entrypoint-user.sh` now sets `core.sshCommand` to `ssh -F $HOME/.ssh-local/config` when that sidecar exists. diff --git a/Dockerfile.variant b/Dockerfile.variant index 161ead6..dc133a7 100644 --- a/Dockerfile.variant +++ b/Dockerfile.variant @@ -154,11 +154,11 @@ ARG USER_NAME=developer # (e7d77dc -> 1529e14 -> 731c3d4 in the nine days to 2026-10-01), so waiting for # a tag means holding pi indefinitely. A full SHA keeps the one property # `master` does not have: rebuilding this tag later produces the SAME image. -# v1.9.5 SKIPPED 0.99.x and 1.0.0 for lack of evidence. v1.10.0 went and got the +# v1.9.5 SKIPPED 0.99.x and 1.0.0 for lack of evidence. v1.10.1 went and got the # evidence instead of waiting for obsmem to mention a version, because "no issue # names 1.0" is an absence of a statement, not a measurement. # -# v1.10.0: 0.87.1 -> 1.0.0. MEASURED 2026-10-02 against the published npm +# v1.10.1: 0.87.1 -> 1.0.0. MEASURED 2026-10-02 against the published npm # tarballs for 0.87.1 and 1.0.0, unpacked side by side: # 1. NO `### Breaking Changes` SECTION IN 1.0.0 AT ALL. The changelog's # breaking sections belong to 0.87.0, 0.86.0, 0.84.3, 0.84.0, 0.83.0, @@ -273,7 +273,7 @@ ARG PI_ATELIER_REPO=https://github.com/michaelmjhhhh/pi-atelier.git # pi >=0.84.0, so it still spans the pinned 0.85.1. 13 commits v0.10.1..v0.10.3, # all under src/ tests/ docs/ scripts/ plus metadata; no entry-point move. # -# v1.10.0: v0.10.3 -> v0.13.0, closing the two-minor gap v1.9.5 flagged as the +# v1.10.1: v0.10.3 -> v0.13.0, closing the two-minor gap v1.9.5 flagged as the # residual risk of the pi bump. peerDependencies are UNCHANGED at pi >=0.84.0 # across v0.10.3, v0.12.1 and v0.13.0 — still a FLOOR, so still not evidence of # anything; the floor is satisfied by 1.0.0 either way. What was actually diff --git a/README.md b/README.md index 5ca14d3..68f4dae 100644 --- a/README.md +++ b/README.md @@ -358,7 +358,7 @@ DOT syntax errors instead of crashing. Then in Studio: open the PNG (or a `.md` that embeds it) and hit **refresh-from-disk** after each edit. Note: SVG is **not** in Studio's local-image-link allowlist — use PNG. -## Terminal UI mode: fullscreen is the default (since v1.10.0) +## Terminal UI mode: fullscreen is the default (since v1.10.1) pi **1.0.0** changed the default terminal UI mode to **fullscreen**, and this image adopts upstream's default rather than overriding it. Fullscreen draws into