• pi-devbox v1.10.1 — pi 1.0.0, pi-atelier v0.13.0, and the fix v1.10.0 needed
    Lint / skill-floor (push) Successful in 11s
    Lint / doc-drift (push) Successful in 12s
    Lint / hadolint (push) Successful in 14s
    Lint / actionlint (push) Successful in 19s
    Publish Docker Image / resolve-versions (push) Successful in 12s
    Publish Docker Image / base-decide (push) Successful in 13s
    Publish Docker Image / build-base (push) Has been skipped
    Publish Docker Image / lint-gate (push) Successful in 25s
    Publish Docker Image / smoke-studio (push) Failing after 5m43s
    Publish Docker Image / build-variant-studio (push) Has been skipped
    Publish Docker Image / smoke (push) Failing after 8m21s
    Publish Docker Image / build-variant (push) Has been skipped
    Publish Docker Image / promote-base-latest (push) Has been skipped
    Publish Docker Image / update-description (push) Has been skipped

    joakimp released this 2026-10-02 10:36:46 +02:00

    v1.10.1 is v1.10.0 plus one corrected smoke assertion. v1.10.0 was tagged and
    never published: its build (run 704) failed 1 of 104 assertions, so every
    publish job skipped and no image, no latest, no Hub description was written.

    WHY v1.10.0 FAILED — the test was stale, the image was correct.

    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 npm tarballs, not inferred from the changelog prose:

    pi 0.85.1 -> declares @mariozechner/clipboard@0.3.9
    pi 0.87.1 -> declares no @mariozechner/* at all
    pi 1.0.0 -> declares no @mariozechner/* at all

    So on a correct image the package is legitimately absent, the assertion's
    if [ -z "$sites" ]; then exit 1 fired, and both smoke jobs went red on the
    same line: smoke 100 passed/1 failed, smoke-studio 103 passed/1 failed with
    every studio-specific assertion green. The gate worked exactly as designed —
    it was enforcing pi 0.85.1's dependency graph against a pi 1.0.0 image.

    Worth stating plainly: 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 FIX does not delete the guard. Its "fail when the family is absent" shape
    is precisely what stops prune_foreign_natives() from deleting the native
    binding instead of the surplus platform copies. It now derives its expectation
    from what the image's pi DECLARES:

    declares + install loads -> pass
    declares + no install -> FAIL (prune removed function)
    does not declare + no install -> pass (bundled since 0.86.0)
    does not declare + install -> FAIL (orphan nothing depends on)

    That re-arms automatically if a future pi re-adds the dependency; a
    skip-if-absent would have unblocked the release while disarming the guard
    forever. Verified as that four-quadrant truth table on EXIT CODES, not on
    messages, because run() keys on status — and the final check extracted the
    command string verbatim from the committed file and ran it through sh -c the
    way run() invokes it, so the escaping was tested as shipped, not as drafted.

    Clipboard FUNCTION did not regress: pi bundles it now, and 0.99.x explicitly
    fixed the OSC 52 fallback for containers with no display (#9688). No new base
    package is needed.

    CONTENT (unchanged from v1.10.0 — see that CHANGELOG section):
    pi 0.85.1 -> 1.0.0 (MAJOR; no Breaking Changes section)
    pi-atelier v0.10.3 -> v0.13.0 (commit 34d26f1, annotated tag dd06971)
    pi-studio v0.9.60 -> v0.9.61 (641aa32)
    pi-obsmem pinned 731c3d4 (PR#83 Pi 0.87 fix, merged but never released)
    mempalace-toolkit 2167a1b -> 975ab92 (dormant_unless suppression)
    base packages + sqlite3, bc, dc, bsdextrautils
    entrypoint-user.sh sets core.sshCommand (stops the recurring git push failure)
    TUI fullscreen is now pi's default; revert documented three ways

    WHY THE NUMBER MOVED instead of re-pointing v1.10.0: CI had already consumed
    that tag. A version that failed its build should stay failed and readable
    rather than be overwritten with different bytes.

    Base layer does not rebuild — no base input changed since 12f99c4, so
    base-decide cache-hits base-dad0f365ff24 that run 704 already pushed.

    Gates: doc-drift 23 OK / 0 DRIFT / 0 SKIP / 0 FAIL; base-hash, workflow-shell,
    skill-floor, lint-shell all rc=0.

    Downloads