This page is the single source of truth for what current main supports and what evidence backs each claim. Other documents describe how things work and link here for status. When this page and another document disagree, this page wins; please report the mismatch.
v0.7.0 is published as a GitHub pre-release: the six example release archives from its Release qualification run, unchanged, with their SHA-256 files and GitHub artifact attestations. There is no npm release and no signed update channel operated by the project; no release key is pinned. v0.7.1 is published the same way as a GitHub pre-release and is an earlier baseline. v0.8.0 is published the same way as a GitHub pre-release and is an earlier baseline. v0.8.1 is published the same way as a GitHub pre-release and is an earlier baseline. v0.9.0 is published the same way as a GitHub pre-release and is an earlier baseline. v0.9.1 is published the same way as a GitHub pre-release and is an earlier baseline. v0.11.0 is published the same way as a GitHub pre-release and is an earlier baseline, replacing v0.9.1; v0.10.0 was never published and shipped inside it. v0.12.0 is published the same way as a GitHub pre-release and is the previous baseline, replacing v0.11.0. v0.13.0 is published the same way as a GitHub pre-release and is the production-validation baseline, replacing v0.12.0. Every milestone below is a preview milestone.
v0.13.0 is the one PiShip baseline a production consumer pins for production validation, replacing v0.12.0. A production consumer pins tag v0.13.0 and installs its qualified release artifact directly; it does not track main. It is a minor milestone on Pi 1.1.0 and the stable contracts piship/v1 and piship-lock/v1, with piship/v1alpha6 and piship-lock/v1alpha6 accepted for the migration window. The changelog lists every change since v0.12.0.
- Qualification: tag
v0.13.0is commit7f9e167d7e78d54783f47db5455f8196e98dc79c(the squash of #255, which is also the version change). Release qualification run 37887824632 passed on that exact commit on its first attempt: 54 jobs passed and 2 were skipped (the issue-report jobs, which run only on schedule). They are CI on Ubuntu, macOS, and Windows, CodeQL, Portable E2E on all three targets, Reference E2E, and Release candidate (two builds per target foracmecode,mypi, anddevcodewith reproducibility 9 of 9 payload-equal,verify-release, tamper rejection, offline install checks, attestations verified, registry signaturespassedon 9 of 9, and vulnerabilitiespassedon 9 of 9). Thedevcodearchives of the two builds differ in bytes only becausevulnerabilities.jsonrecords the scan time. Release qualification excludes live Chrome startup, which the nightly and manual Portable E2E keep. During the qualification cycle two macOS sandbox conformance test failures (the seatbelt reference tests, which are timing sensitive) appeared on pull-request runs and passed on the next run. The pre-release, published 2026-10-09, carries the nine attested archives with their SHA-256 files; the digests are below (recorded evidence). - Changes since v0.12.0, in short (the changelog has the full list): pi-code's
subagenttool works in a distribution, its children taking the same governed launch (model allowlist, broker credential, print mode's JSON events) only from a running session of the same user, only with the options pi-code passes, and only in the parent's workspace or a verified git worktree; parallel children wait up to about three seconds for the package-configuration lock instead of failing on it;resources.packages[].pretranspilewrites the TypeScript modules a package's extensions import as JavaScript at build time (esbuild 0.28.2); the Pi pin and its seven sibling packages move from 1.0.3 to 1.1.0; and on Windows, looking up a lock owner that had just exited no longer prints PowerShell's error text. - PiShip version:
0.13.0(every@piship/*package andPISHIP_VERSIONincompatibility.ts); every example is relocked with it.piship diffagainst the v0.12.0 locks reports risk high for all three examples only because the Pi runtime changed from 1.0.3 to 1.1.0 (the other changes are the PiShip version and the seam digest). - Schemas: manifest
piship/v1and lockpiship-lock/v1, unchanged;piship/v1alpha6andpiship-lock/v1alpha6stay accepted for the migration window (version map). The optionalresources.packages[].pretranspilefield is new and off by default. A release built with it is not accepted by a runtime built before v0.13.0: v0.12.0 stops withINTEGRITY_FAILED ... Unknown field pretranspileand the installed release stays healthy, so the runtime has to be updated first (manifest, changelog). - Pinned Pi:
@earendil-works/pi-coding-agent1.1.0, exact-pinned inpackages/pi/package.json, with its seven sibling packages pinned exactly.compatibility/pi.jsonand the copy in@piship/corelist 1.1.0 beside 1.0.3, 1.0.2, 1.0.0, and 0.87.1 with the same four surface statuses (personalsupported;managed,governance, andlifecyclecandidate), carried over from 1.0.3 and not earned again. Release qualification run 37887824632 is the first on Pi 1.1.0, so the installed E2E of every target is now recorded on it (Pi compatibility, upgrade to Pi 1.1.0). Pi 1.1.0's interactive mode sends status reports to the terminal (session name and the first line of an error message, never prompts or model output); PiShip leaves Pi's default, andPI_PROGRAM_STATUS=0in the shell turns it off. - Open issues at v0.13.0: #64 and #139, both upstream Pi, as at v0.12.0. #238, open at v0.12.0, is closed. Every other issue cited on this page is closed.
- Open gaps: the same as at v0.12.0 (the macOS
packages/sandbox/src/boundary.test.tsheartbeat test has flaked with no root cause found; the footprint budgets oflinux-x64andwin32-x64are unrecorded; project-trust and permission rule cases run on Linux and macOS only; vendored Pi packages are not checked for registry signatures, follow-ups; no test updates and rolls back a dedupeddevcodepayload; andrepair --from-sourcedoes not exist), plus: the macOS seatbelt reference conformance tests are timing sensitive and failed twice on loaded pull-request runs during this cycle. Not verified: a real pi-code isolated or background agent run (the temp-directory modes and worktree layout were read from pi-code 1.4.2's source, not run), and the package-configuration lock under real Windows contention (a scanner holding a file). - Update channel: the project operates no signed update channel, and the example distributions pin no bootstrap trust root, so the published archives are update-disabled and cannot update through a channel. Key custody belongs to each distribution owner (trust root). A production consumer pins and installs the exact qualified artifact directly, and compares its SHA-256 and pinned update keys with the values the distribution owner published (distribution bootstrap).
- Production evidence: the manual
Live providerworkflow has passed with a real upstream model provider through the reference stack (after v0.7.1). There is still no validation against a real company identity provider or company gateway in production; the production validation protocol says how it is run and what a report may carry. - Supported production-validation platforms:
linux-x64,darwin-arm64, andwin32-x64with Node.js 22.19.0 or later, the release targets the Release candidate builds and the targets in compatibility; npm 11 or later on the machine that runspiship lockfor a distribution that declares Pi packages. Native Windows has no sandbox adapter: a distribution that requires the sandbox fails closed there withSANDBOX_UNAVAILABLE(sandbox backends).
The nine archives on the v0.13.0 pre-release, from Release qualification run 37887824632. The .sha256 file beside each archive carries the same digest. Check an archive's attestation with:
gh attestation verify <archive> --repo tc3oliver/piship --signer-workflow tc3oliver/piship/.github/workflows/release-candidate.yml --source-ref refs/heads/main| Archive | SHA-256 |
|---|---|
acmecode-1.0.0-linux-x64.tar.gz |
f8a02103bc450e1adc41cf94f22a51c50e7071355502c4837ed1b6b643127f02 |
acmecode-1.0.0-darwin-arm64.tar.gz |
5c8a3f9b9d4d6f9e83c32e4c5f4f2a24aca63643839a43375291899df4528c02 |
acmecode-1.0.0-win32-x64.tar.gz |
b9c536224460ccdf0a31b4d94d38201a80b466a23e9253712d1c14c6ecc6e937 |
mypi-1.0.0-linux-x64.tar.gz |
7d5e32f0a349657bc9b190467860a2b3bc0888b47837659ac219f8325eee2652 |
mypi-1.0.0-darwin-arm64.tar.gz |
62a5f449695a1ff0b568075224e4e057d368adff11af205bdf489d1cfa1eebe7 |
mypi-1.0.0-win32-x64.tar.gz |
55981ed59ffbd6f3244f50dbff499db93ed4c42007bcadbdb52796398ea37823 |
devcode-1.0.0-linux-x64.tar.gz |
62739be5d9222326e069fd8845b8e685c848230203306678571dc6c20fe66c50 |
devcode-1.0.0-darwin-arm64.tar.gz |
39d2c45aed7d9da608aadc6f91ce608e901808f50eed790c714e325247686ff5 |
devcode-1.0.0-win32-x64.tar.gz |
cf033451abb96356d995e5e65039a555293f4ddd3d57985e0c0c7c821afdebbf |
v0.12.0 was the one PiShip baseline a production consumer pinned for production validation until v0.13.0 replaced it. It stays published and qualified, and is documented here as the previous baseline. A production consumer pinned tag v0.12.0 and installed its qualified release artifact directly; it did not track main. It is a minor milestone on Pi 1.0.3 and the stable contracts piship/v1 and piship-lock/v1, with piship/v1alpha6 and piship-lock/v1alpha6 accepted for the migration window. The changelog lists every change since v0.11.0.
- Qualification: tag
v0.12.0is commit8d40a68f825b9f527fcf8c52a7869f571f1ae50b(the squash of #246; the version change is #245, commit0404e4842eff2c4477670ac0d8db9212850a6db4). Release qualification run 37678031776 passed on that exact commit on its first attempt: 54 jobs passed and 2 were skipped (the issue-report jobs, which run only on schedule). They are CI on Ubuntu, macOS, and Windows, CodeQL, Portable E2E on all three targets, Reference E2E, and Release candidate (two builds per target foracmecode,mypi, anddevcodewith reproducibility 9 of 9 payload-equal,verify-release, tamper rejection, offline install checks, attestations verified, registry signaturespassedon 9 of 9, and vulnerabilitiespassedon 9 of 9). Thedevcodearchives of the two builds differ in bytes only becausevulnerabilities.jsonrecords the scan time. An earlier run, 37669522371 on the version commit0404e484, failed one Windows end-to-end job (a test downloadedfdandrgfrom GitHub and timed out) and was cancelled; #246 fixed the cause before run 37678031776. The pre-release, published 2026-10-07, carries the nine attested archives with their SHA-256 files; the digests are below (recorded evidence). - Changes since v0.11.0, in short (the changelog has the full list): fixes for the crashes, dead ends, and repeated prompts a user meets from install to daily use; plain HTTP to private hosts by default; remembered project-trust answers (
config trust listandconfig trust forget);<command> uninstall; an optionalruntime.pi; themypiexample's relaxed project-trust defaults (piship diffreports risk high); andexpress-rate-limit8.7.1 indevcode. - PiShip version:
0.12.0(every@piship/*package andPISHIP_VERSIONincompatibility.ts); every example is relocked with it. - Schemas: manifest
piship/v1and lockpiship-lock/v1, unchanged;piship/v1alpha6andpiship-lock/v1alpha6stay accepted for the migration window (version map).runtime.pimay be left out of a manifest. A release that leaves it out cannot be updated to from a runtime built before v0.12.0, so an installed distribution needs one bridge release that still statesruntime.pifirst (changelog). - Pinned Pi:
@earendil-works/pi-coding-agent1.0.3, unchanged from v0.11.0 (Pi compatibility, upgrade to Pi 1.0.3). v0.13.0 moved to Pi 1.1.0 (upgrade to Pi 1.1.0). - Open issues at v0.12.0, #64 and #139 still open at v0.13.0: both upstream Pi, as at v0.11.0. #238 was also open: the nightly Portable E2E failure on
f1b3d7f; its cause is not analyzed here, and Portable E2E passed on the release commit inside the qualification run. It is closed since. Every other issue cited on this page was closed. - Open gaps: the same as at v0.11.0 (the macOS
packages/sandbox/src/boundary.test.tsheartbeat test has flaked with no root cause found; the footprint budgets oflinux-x64andwin32-x64are unrecorded; project-trust and permission rule cases run on Linux and macOS only; and vendored Pi packages are not checked for registry signatures, follow-ups), plus: no test updates and rolls back a dedupeddevcodepayload, andrepair --from-sourcedoes not exist. - Update channel: the project operates no signed update channel, and the example distributions pin no bootstrap trust root, so the published archives are update-disabled and cannot update through a channel. Key custody belongs to each distribution owner (trust root). A production consumer pins and installs the exact qualified artifact directly, and compares its SHA-256 and pinned update keys with the values the distribution owner published (distribution bootstrap).
- Production evidence: the manual
Live providerworkflow has passed with a real upstream model provider through the reference stack (after v0.7.1). There is still no validation against a real company identity provider or company gateway in production; the production validation protocol says how it is run and what a report may carry. - Supported production-validation platforms:
linux-x64,darwin-arm64, andwin32-x64with Node.js 22.19.0 or later, the release targets the Release candidate builds and the targets in compatibility; npm 11 or later on the machine that runspiship lockfor a distribution that declares Pi packages. Native Windows has no sandbox adapter: a distribution that requires the sandbox fails closed there withSANDBOX_UNAVAILABLE(sandbox backends).
The nine archives on the v0.12.0 pre-release, from Release qualification run 37678031776. The .sha256 file beside each archive carries the same digest. Check an archive's attestation with:
gh attestation verify <archive> --repo tc3oliver/piship --signer-workflow tc3oliver/piship/.github/workflows/release-candidate.yml --source-ref refs/heads/main| Archive | SHA-256 |
|---|---|
acmecode-1.0.0-linux-x64.tar.gz |
144d0834b95aa8c70733b5cd288ad714d81ea7aabb63dc561c33018ec8d69f28 |
acmecode-1.0.0-darwin-arm64.tar.gz |
d772946d5052e0b0fb66c3c7f4e7fbd7f3fe80a19c3476853f0ba4a91a974aae |
acmecode-1.0.0-win32-x64.tar.gz |
31123842c18173eebe8ae83c631cc57550815823a11ce4e2984a33751f7843dd |
mypi-1.0.0-linux-x64.tar.gz |
e96aebabb84346d536f6441826c81e07256bdb058e714aa6945485ca2fdaffb1 |
mypi-1.0.0-darwin-arm64.tar.gz |
5b1f3144fa4b4975811970ff5f0dc356fa049b98dbcc863025d8b8286673c034 |
mypi-1.0.0-win32-x64.tar.gz |
aad44bbf5e068731e4bf3a853992a3d5eef891d9667b77f8a6dfd70f7e9f6f75 |
devcode-1.0.0-linux-x64.tar.gz |
1ebb0594428549ff0bafbaab7af7fa732cc0453b268f327da1fd38405c9d986c |
devcode-1.0.0-darwin-arm64.tar.gz |
82c938e0d6c72f534d30fee726561410332d430106c0ba6cd181b65f7c1cf541 |
devcode-1.0.0-win32-x64.tar.gz |
21014c3e451e462fd7bfbde4707ed7be8a38197dae527c01262791e024f1ae16 |
v0.11.0 was the one PiShip baseline a production consumer pinned for production validation until v0.12.0 replaced it. It stays published and qualified, and is documented here as an earlier baseline. A production consumer pinned tag v0.11.0 and installed its qualified release artifact directly; it did not track main. It is the stable-contract milestone on Pi 1.0.3: piship/v1 and piship-lock/v1, with piship/v1alpha6 and piship-lock/v1alpha6 accepted for the migration window. v0.10.0 was never published: it has no tag, release, or archives, and its changes (devcode, session --yolo, package environment and agent-file declarations, package capability providers, and managed Claude project trust controls) shipped inside v0.11.0. The changelog lists every change since v0.9.1.
- Qualification: tag
v0.11.0is commitd4f740f0ce7c1b7bebc244e0d4cfa471ede81813(the squash of #237). Release qualification run 37538011406 passed on that exact commit, all 56 jobs on their first attempt: CI on Ubuntu, macOS, and Windows, CodeQL, Portable E2E on all three targets, Reference E2E, and Release candidate (two builds per target foracmecode,mypi, anddevcodewith reproducibility 9 of 9 equal,verify-release, tamper rejection, offline install with the shipped script on fresh runners, attestations, registry signaturespassedon 9 of 9, and vulnerabilitiespassed). The pre-release, published 2026-10-07, carries that run's nine attested archives with their SHA-256 files; the digests are below (recorded evidence). - Changes since v0.9.1, in short (the changelog has the full list): the stable
piship/v1andpiship-lock/v1contracts andpiship migrate; Pi 1.0.3; the developer distribution and--yolo; project trust for Claude Code configuration; packageenvironmentandagentFilesand package capability providers; the bundled, stripped payload with the authoring snapshot and shared Pi package dependencies; the shared file store, on by default (hardlink) on Windows; and the footprint budgets. - Qualification and security review: a qualification matrix traces every step of the managed, personal, and developer clean-machine qualifications and every supply-chain item to the test that proves it and the workflow that runs it, and lists the gaps with their reasons. Its clean machine is an empty set of temporary homes on a runner, not a fresh operating system image; its model requests go to a fixture gateway, a stand-in server, or a mock upstream, not to a real provider; the interactive terminal is not driven. The security review found and fixed three defects: the registry signature check audited no package in the release candidates examined, those of v0.9.1 and local builds (F1); the SBOM carried no source or integrity for a vendored Pi package's dependencies (F2); and two installs opening a new shared file store at once could leave one of them without it (F3). Run 37538011406 is the first CI evidence of a verified registry signature: it audited the runtime closure and passed on all nine distribution and target combinations. Release candidate checks the evidence every release records about itself (
scripts/check-release-evidence.mjs) and fails a release whose signature check audited nothing. - PiShip version:
0.11.0(every@piship/*package andPISHIP_VERSIONincompatibility.ts); every example is relocked with it. - Schemas: manifest
piship/v1and lockpiship-lock/v1, the same fields, defaults, and validation aspiship/v1alpha6andpiship-lock/v1alpha6, which stay accepted. A runtime built beforepiship/v1rejects apiship/v1release withINTEGRITY_FAILEDwhen it updates, so an installed distribution needs one bridge release built with PiShip 0.11.0 and still onpiship/v1alpha6first (support policy, version map). - Pinned Pi:
@earendil-works/pi-coding-agent1.0.3, exact-pinned inpackages/pi/package.json, with its seven sibling packages pinned exactly.compatibility/pi.jsonand the copy in@piship/corelist 1.0.3 beside 1.0.2, 1.0.0, and 0.87.1 with the same four surface statuses (personalsupported;managed,governance, andlifecyclecandidate), carried over from 1.0.2 and not earned again. Release qualification run 37538011406 is the first on Pi 1.0.3, so the installed E2E of every target is now recorded on it (Pi compatibility, upgrade to Pi 1.0.3). - Open issues at v0.11.0, all three still open at v0.12.0: #64 and #139, both upstream Pi, as at v0.9.1. #238 was also open: the automatic tracking issue for a scheduled Portable E2E failure on
f1b3d7f, the commit before the release commit; its cause is not analyzed here, and Portable E2E passed on the release commit inside the qualification run. Every other issue cited on this page was closed. - Open gaps: the macOS
packages/sandbox/src/boundary.test.tsheartbeat test has flaked with no root cause found; there is no automated update or rollback of a developer (devcode) release; the footprint budgets oflinux-x64andwin32-x64are unrecorded (scripts/performance-budgets.jsonholdsdarwin-arm64only, and the Windows file-count figures are reported, not budgeted); project-trust and permission rule cases run on Linux and macOS only; and vendored Pi packages are not checked for registry signatures (follow-ups). - Update channel: the project operates no signed update channel, and the example distributions pin no bootstrap trust root, so the published archives are update-disabled and cannot update through a channel. Key custody belongs to each distribution owner (trust root). A production consumer pins and installs the exact qualified artifact directly, and compares its SHA-256 and pinned update keys with the values the distribution owner published (distribution bootstrap).
- Production evidence: the manual
Live providerworkflow has passed with a real upstream model provider through the reference stack (after v0.7.1). There is still no validation against a real company identity provider or company gateway in production; the production validation protocol says how it is run and what a report may carry. - Supported production-validation platforms:
linux-x64,darwin-arm64, andwin32-x64with Node.js 22.19.0 or later (qualified on Node 22.19.0), the release targets the Release candidate builds and the targets in compatibility; npm 11 or later on the machine that runspiship lockfor a distribution that declares Pi packages. Native Windows has no sandbox adapter: a distribution that requires the sandbox fails closed there withSANDBOX_UNAVAILABLE(sandbox backends).
The nine archives on the v0.11.0 pre-release, from Release qualification run 37538011406. The .sha256 file beside each archive carries the same digest. Check an archive's attestation with:
gh attestation verify <archive> --repo tc3oliver/piship --signer-workflow tc3oliver/piship/.github/workflows/release-candidate.yml --source-ref refs/heads/main| Archive | SHA-256 |
|---|---|
acmecode-1.0.0-linux-x64.tar.gz |
07da9407a7c8377cf5bc7a20d94dedd63035ed88883639ae0ac791b05c35bfc1 |
acmecode-1.0.0-darwin-arm64.tar.gz |
1f50ee1b0e61f5d8ddef351f1091313f76ca52704256194fdbe2f341ceb275fe |
acmecode-1.0.0-win32-x64.tar.gz |
9562ce966868ba34be8642bf51d9f7ebe873a741d6f5aee7ab0a0e6eed022207 |
mypi-1.0.0-linux-x64.tar.gz |
18d32a15bd661a59cd3d6d2cdd85462450ad42ac79a5006a5705bfd00a95598c |
mypi-1.0.0-darwin-arm64.tar.gz |
257758f326e64e0bb287363202657089716604dba7a25701b2148fb96181dd6d |
mypi-1.0.0-win32-x64.tar.gz |
4744cae3527f270ebd969f11511a3394d021f86828561ebc0041a48dc4c56d12 |
devcode-1.0.0-linux-x64.tar.gz |
187170f2aaf357b707593a043169bd0c8b9db2827bc7a8296ea64c49ee720af9 |
devcode-1.0.0-darwin-arm64.tar.gz |
71a230fa3f67fbddd635b8e6e221b07b52f8d1f8d653c602d8ae6707eeddf706 |
devcode-1.0.0-win32-x64.tar.gz |
442200b99eb75915a3443334a6ca10e352ff12a815c57217f4593fa19aba29a2 |
v0.9.1 was the one PiShip baseline a production consumer pinned for production validation until v0.11.0 replaced it. It stays published and qualified, and is documented here as an earlier baseline. A production consumer pinned tag v0.9.1 and installed its qualified release artifact directly; it did not track main. It is a patch milestone that collects the changes made on main after v0.9.0, on the same schemas and the same Pi; the changelog lists them.
- Qualification: tag
v0.9.1is commita97ba4302f56e3a59464434084f38b2af9556123(the squash of #215). Release qualification run 37297400038 passed on that exact commit, every job on its first attempt: CI on Ubuntu, macOS, and Windows, CodeQL, Portable E2E, Reference E2E, and Release candidate (two byte-identical builds per target, attestation,verify-release, tamper rejection, and install with the shipped script on fresh runners). The pre-release carries that run's six attested archives (acmecodeandmypifor each target), with their SHA-256 files; the digests are below (recorded evidence). - Changes since v0.9.0:
- MCP plain HTTP and identity headers (#212): a
streamable-httpserver may opt in to plain HTTP to a private or internal host withhttpTransport: http-allowed, and may receive a claim of the signed-in OIDC identity as a request header withheaders(manifest). - Plain HTTP to internal endpoints (#213): the gateway, the credential broker, the OIDC issuer, audit sinks, and the sandbox may each opt in to plain HTTP to a private or internal host with
httpTransport: http-allowed; every other host keeps the loopback-only rule, and an opt-in request an inherited publicHTTP_PROXYwould carry is refused (manifest, security). - Bundled search tools (#214):
runtime.searchTools: { mode: bundled }pinsfdandrgper release target in the lock and ships them in the payload, so Pi's find and grep tools and@completion work on a managed machine without the network (manifest). The branded command now sets Pi's agent directory before Pi loads, so Pi no longer uses~/.pi/agent/bin. - Docs (#211): the agent setup guide asks its questions in batches, with a question tool when the agent has one.
- Dependencies (#206):
undici8.11.2 and@biomejs/biome2.5.15.
- MCP plain HTTP and identity headers (#212): a
- PiShip version:
0.9.1(every@piship/*package andPISHIP_VERSIONincompatibility.ts); every example is relocked with it. - Schemas: unchanged from v0.9.0 (manifest
piship/v1alpha6, lockpiship-lock/v1alpha6). The new fields (httpTransport, MCPheaders,runtime.searchTools) are additive and optional, and no schema id changes (version map). - Pinned Pi:
@earendil-works/pi-coding-agent1.0.2, unchanged. - Open issues at v0.9.1. These two were the complete list of open issues, the same as at v0.9.0: #64 and #139, both upstream Pi. Every other issue cited on this page was closed.
- Update channel: the project operates no signed update channel, and the example distributions pin no bootstrap trust root, so the published archives are update-disabled and cannot update through a channel. Key custody belongs to each distribution owner (trust root). A production consumer pins and installs the exact qualified artifact directly, and compares its SHA-256 and pinned update keys with the values the distribution owner published (distribution bootstrap).
- Production evidence: the manual
Live providerworkflow has passed with a real upstream model provider through the reference stack (after v0.7.1). There is still no validation against a real company identity provider or company gateway in production; the production validation protocol says how it is run and what a report may carry. - Supported production-validation platforms:
linux-x64,darwin-arm64, andwin32-x64with Node.js 22.19.0 or later (qualified on Node 22.19.0), the release targets the Release candidate builds and the targets in compatibility; npm 11 or later on the machine that runspiship lockfor a distribution that declares Pi packages. Native Windows has no sandbox adapter: a distribution that requires the sandbox fails closed there withSANDBOX_UNAVAILABLE(sandbox backends).
The six archives on the v0.9.1 pre-release, from Release qualification run 37297400038. The .sha256 file beside each archive carries the same digest, and gh attestation verify checks the archive's attestation.
| Archive | SHA-256 |
|---|---|
acmecode-1.0.0-linux-x64.tar.gz |
5713cb00846671bf920ef1c48c5a0b0f91a3ed7cdad3bbf6b1b40d0b522cd3d4 |
acmecode-1.0.0-darwin-arm64.tar.gz |
04e16dc594972ba15587e662e0cfe3aa4d5b3fdd4f1438f406ad70edb52ad113 |
acmecode-1.0.0-win32-x64.tar.gz |
403ad1032312a4ac285bf185a2157f1e0347ccd597b66f24670d40a2cd5651e1 |
mypi-1.0.0-linux-x64.tar.gz |
13006b8c54e6aacb122ac7f5822d48feed87b775940ac39abf16e57c704880e6 |
mypi-1.0.0-darwin-arm64.tar.gz |
eb6a01dccea679da790021a8327dd6f6db4732b1999c5aadec6b9903d2c4faf0 |
mypi-1.0.0-win32-x64.tar.gz |
05a7c1c3d40540e146bbb060fb2b9ba8d56012e0b6d363a7402501736b1365cb |
v0.9.0 was the one PiShip baseline a production consumer pinned for production validation until v0.9.1 replaced it. It stays published and qualified, and is documented here as an earlier baseline. A production consumer pinned tag v0.9.0 and installed its qualified release artifact directly; it did not track main. It adopts Pi 1.0.2 and brings Pi 1.x-native governance and the last alpha schemas, piship/v1alpha6 and piship-lock/v1alpha6; v0.11 freezes these contracts as piship/v1 and piship-lock/v1. The changelog lists every change.
- Qualification: tag
v0.9.0is commitff3c382c5462373c18e94667f873bb578fb28a20(the squash of #209). Release qualification run 37247881318 passed on that exact commit: CI on Ubuntu, macOS, and Windows, CodeQL, Portable E2E, Reference E2E, and Release candidate (two byte-identical builds per target, attestation,verify-release, tamper rejection, and install with the shipped script on fresh runners). On its first attempt one Windows unit test with a one-second timing window failed; the failed job was rerun on the same commit and passed (recorded evidence). The pre-release carries that run's six attested archives (acmecodeandmypifor each target), with their SHA-256 files. - Changes since v0.8.1:
- Schemas: manifest
piship/v1alpha6, lockpiship-lock/v1alpha6; update root, channel, and signature schemas unchanged. v1alpha5 manifests that nameruntime.pi: "1.0.2"and older locks keep loading; a manifest still pinning Pi 1.0.0 is refused until its pin is updated.piship migratetakes v1alpha5 to v1alpha6 without broadening, and--checkexits non-zero on an effective change (migration). Every example usespiship/v1alpha6. - Pi 1.0.2 (#205), with its sibling packages pinned exactly; #129 is closed by the upgrade (upgrade to Pi 1.0.2).
- Model governance:
model.selectfor the selected model andmodel.dispatchfor the physical model a request reaches, on every request path, with virtual model routes and classifier and image models. - Enforcement status: every action is reported
enforced,audit-only, orunsupportedfrom the runtime seam table; a manageddenyoraskon an unsupported action fails withPOLICY_UNENFORCEABLEunless acknowledged (enforcement status). - Tool exposure,
excludeTools, Codemode, and tool search, with the bypass regression rows in the compatibility suite. - The
datalifecycle (retention sweep after a session ends and at logout, logout purge,data.swept) andsession.exportstatus, always reported in the lock anddoctor;supportcounts as enforced only where Pi runs offline (managed mode). - Pi packages: locked to immutable identities, vendored into the payload by
piship buildwith--ignore-scripts, gated byrelease.sources, the install-script review, andnpm audit, and checked file by file at launch; Pi's installer never runs (manifest). A Portable E2E test locks, builds, installs, and launches a distribution with a local and a git package. - Runtime mutation governance (the enforced prompt sections and tools re-asserted on every request,
runtime.mutation.reverted, a failed repair blocks the session) and cache warming (offunless declared,cache_warming_decisionansweredstop,/settingsrefused unlessuserOverride). doctor(a Governance group) andpiship diffreport the v1alpha6 governance state; install-path tests launch v0.8.1-shaped state with a v1alpha5 manifest without rewriting a state file.- Examples: every example is on
piship/v1alpha6and relocked;examples/enterprise-referenceand its sandbox variant declare thepackages/pi-platformlocal Pi package. - Docs (#208): the guides follow v0.9.0, and the agent setup guide walks an existing distribution through the upgrade.
- Schemas: manifest
- PiShip version:
0.9.0(every@piship/*package andPISHIP_VERSIONincompatibility.ts). - Pinned Pi:
@earendil-works/pi-coding-agent1.0.2, exact-pinned inpackages/pi/package.json, with its seven sibling packages pinned exactly.compatibility/pi.jsonlists 1.0.2 (and 1.0.0 and 0.87.1, kept so that releases built on them are recognized) with thepersonalsurfacesupportedand themanaged,governance, andlifecyclesurfacescandidate(Pi compatibility). - Vulnerability exceptions: none. Pi 1.0.2 ships the fixed
brace-expansion, and the example manifests carry noallowentries. - Open issues at v0.9.0. These two were the complete list of open issues, and were still open at v0.9.1, v0.11.0, v0.12.0, and v0.13.0; every other issue cited on this page was closed. #129 is closed by v0.9.0.
- #64, upstream Pi: a user's
!shell command still writes its full output through Pi's temp file, so a temp filesystem that fills while Pi writes it (ENOSPC) is not contained. - #139, upstream Pi: an identity or credential failure inside the TUI shows PiShip's action, but Pi still adds its own
/bughint.
- #64, upstream Pi: a user's
- Upstream: the Pi gaps v0.9 works around are raised upstream: a model ID on
before_provider_request, a tool-set change event, tool-search discover and activate events, a way to disable or intercept/shareand/export, a capability discovery API, and package installation without lifecycle scripts. - Update channel: the project operates no signed update channel, and the example distributions pin no bootstrap trust root, so the published archives are update-disabled and cannot update through a channel. Key custody belongs to each distribution owner (trust root). A production consumer pins and installs the exact qualified artifact directly, and compares its SHA-256 and pinned update keys with the values the distribution owner published (distribution bootstrap).
- Production evidence: the manual
Live providerworkflow has passed with a real upstream model provider through the reference stack (after v0.7.1). There is still no validation against a real company identity provider or company gateway in production; the production validation protocol says how it is run and what a report may carry. - Supported production-validation platforms:
linux-x64,darwin-arm64, andwin32-x64with Node.js 22.19.0 or later (qualified on Node 22.19.0), the release targets the Release candidate builds and the targets in compatibility; npm 11 or later on the machine that runspiship lockfor a distribution that declares Pi packages. Native Windows has no sandbox adapter: a distribution that requires the sandbox fails closed there withSANDBOX_UNAVAILABLE(sandbox backends).
v0.8.1 was the one PiShip baseline a production consumer pinned for production validation until v0.9.0 replaced it. It stays published and qualified, and is documented here as a previous baseline. A production consumer pinned tag v0.8.1 and installed its qualified release artifact directly; it did not track main. It collects the changes made on main after v0.8.0, on the same schemas and the same Pi; the changelog lists them.
- Qualification: tag
v0.8.1is commitd0691041d4235d208a269b30f79d1ecb8ec352fe(the squash of #203). Release qualification run 37127974973 passed on that exact commit: CI on Ubuntu, macOS, and Windows, CodeQL, Portable E2E, Reference E2E, and Release candidate (two byte-identical builds per target, attestation,verify-release, tamper rejection, and install with the shipped script on fresh runners). The pre-release carries that run's six attested archives (acmecodeandmypifor each target), with their SHA-256 files (recorded evidence). - Changes since v0.8.0:
- Secret store unavailable (#196, #198): a sign-in through a system secret store that cannot be reached leaves no reference behind, and a discarded marker lists the references never confirmed written (
unconfirmed), so only those are dropped when the store command is not installed.purgeanduninstall --purgeapply the same rule, andlogin,logout, andsandbox loginsay which references they dropped. - User auto mode (#197, #200):
policy.userAuto: allowedlets a managed distribution's user switch on an audited auto mode that approves anaskfrom the distribution's defaults without a prompt;denyand every otheraskare untouched (manifest). - Plain-HTTP update channel (#199, #201):
updates.transport: http-allowedlets the update channel use plain HTTP to a private or internal host; it requires a bootstrap trust root, and signature, digest, sequence, expiry, and root-refresh checks are unchanged (manifest). - Review fixes (#202): an explicit shell
askfrom enforced, team, project, or a managed user's own rules also applies to a chained command, so auto mode cannot approvegit push origin main; truepast it; discarded-marker tracking andpurgeas above; a single-label host that is a public top-level domain counts as public for a plain-HTTP update channel; and the auto mode audit: switching off applies first and is audited best effort, so an audit sink that is down cannot keep auto mode on,/auto onrefuses when a required sink has not taken its event, andpolicy explainreportsAUTO-APPROVEDonly for actions a session decides itself. - Docs (#195): the agent setup guide says to sign in with the built command, in the directory where
piship testran, before it is run again.
- Secret store unavailable (#196, #198): a sign-in through a system secret store that cannot be reached leaves no reference behind, and a discarded marker lists the references never confirmed written (
- PiShip version:
0.8.1(every@piship/*package andPISHIP_VERSIONincompatibility.ts). - Schemas: unchanged from v0.8.0 (manifest
piship/v1alpha5, lockpiship-lock/v1alpha5, update rootpiship-update-root/v1).policy.userAutoandupdates.transportare optional, and a manifest without them locks byte-identically. Thepolicy.auto_*audit events are new names inpiship-audit/v1(version map). - Pinned Pi:
@earendil-works/pi-coding-agent1.0.0, unchanged. Pi 1.0.1 was published on 2026-10-03, after the 1.0.0 review below; it is not reviewed or adopted here, so thebrace-expansionexception (#129) is unchanged and expires on 2026-12-31 as before. - Open issues at v0.8.1. These three were the complete list of open issues, the same as at v0.8.0; every other issue cited on this page was closed. #129 is closed by v0.9.0. #196, #197, and #199 are closed by v0.8.1.
- #64, upstream Pi: a user's
!shell command still writes its full output through Pi's temp file, so a temp filesystem that fills while Pi writes it (ENOSPC) is not contained. - #139, upstream Pi: an identity or credential failure inside the TUI shows PiShip's action, but Pi still adds its own
/bughint. - #129: the reviewed
brace-expansionexception above, until upstream Pi shipped a fixed version or the exception expired on 2026-12-31 (GHSA-qhr7-859c-m2p7 and GHSA-6j4f-fj2g-mc7p; GHSA-q2hr-2g5m-vwhr is moderate and reported belowfailOn: high). Details in known limits.
- #64, upstream Pi: a user's
- After v0.8.1: Pi 1.0.2 was pinned, with its sibling packages pinned exactly, and #129 was closed by the upgrade: Pi 1.0.2 ships the fixed
brace-expansion, and the example manifests carry no exception (upgrade to Pi 1.0.2). That upgrade shipped in v0.9.0. - Update channel: the project operates no signed update channel, and the example distributions pin no bootstrap trust root, so the published archives are update-disabled and cannot update through a channel. Key custody belongs to each distribution owner (trust root). A production consumer pins and installs the exact qualified artifact directly, and compares its SHA-256 and pinned update keys with the values the distribution owner published (distribution bootstrap).
- Production evidence: the manual
Live providerworkflow has passed with a real upstream model provider through the reference stack (after v0.7.1). There is still no validation against a real company identity provider or company gateway in production; the production validation protocol says how it is run and what a report may carry. - Supported production-validation platforms:
linux-x64,darwin-arm64, andwin32-x64with Node.js 22.19.0 or later (qualified on Node 22.19.0), the release targets the Release candidate builds and the targets in compatibility. Native Windows has no sandbox adapter: a distribution that requires the sandbox fails closed there withSANDBOX_UNAVAILABLE(sandbox backends).
v0.8.0 was the one PiShip baseline a production consumer pinned for production validation until v0.8.1 replaced it. It stays published and qualified, and is documented here as a previous baseline. A production consumer pinned tag v0.8.0 and installed its qualified release artifact directly; it did not track main. v0.8.0, pre-production trust and validation hardening, freezes the contracts that are expensive to change once real installations exist: manifest piship/v1alpha5 with a bootstrap trust root, an installation trust state with root refresh, multiple signatures with root rotation and emergency channel-key revocation, encrypted PEM signing keys, explicit piship init --personal and --managed, and the production validation protocol. The scope is in the roadmap.
- Qualification: tag
v0.8.0is commit8550282784fc7d85142907fa4632b847d4c96b26(the squash of #193). Release qualification run 37108519783 passed on that exact commit: CI on Ubuntu, macOS, and Windows, CodeQL, Portable E2E, Reference E2E, and Release candidate (two byte-identical builds per target, attestation,verify-release, tamper rejection, and install with the shipped script on fresh runners). The pre-release carries that run's six attested archives (acmecodeandmypifor each target), with their SHA-256 files. The commit includes three fixes made after the release pull request (#190): #191 and #192 make the E2E flows follow the v0.8keygenoutput and the root probe, and #193 builds a release with an update source and no bootstrap trust as update-disabled instead of refusing it (recorded evidence). - PiShip version:
0.8.0(every@piship/*package andPISHIP_VERSIONincompatibility.ts). - Schemas: manifest
piship/v1alpha5, lockpiship-lock/v1alpha5, update rootpiship-update-root/v1. Channel metadata stayspiship-channel/v1, andpiship-signature/v1gains an optionalsignatures[](version map). - Pinned Pi:
@earendil-works/pi-coding-agent1.0.0, exact-pinned inpackages/pi/package.json, reviewed on 2026-10-03 and deliberately kept. 1.0.0 was then the newest published Pi, and itsnpm-shrinkwrap.jsonstill pinsbrace-expansion5.0.9, so the reviewed exception (#129) is not cleared and is not extended: it expires on 2026-12-31 as before.compatibility/pi.jsonlists 1.0.0 (and 0.87.1, kept so that releases built on it are recognized) with thepersonalsurfacesupportedand themanaged,governance, andlifecyclesurfacescandidate(Pi compatibility). - Open issues at v0.8.0. These three were the complete list of open issues; every other issue cited on this page is closed. #181 (signed channel hardening) is closed by v0.8.0, and #187 (the
Pi latest canary) is closed: the canary is green since the upgrade to Pi 1.0.0 (#188).- #64, upstream Pi: a user's
!shell command still writes its full output through Pi's temp file, so a temp filesystem that fills while Pi writes it (ENOSPC) is not contained. - #139, upstream Pi: an identity or credential failure inside the TUI shows PiShip's action, but Pi still adds its own
/bughint. - #129: the reviewed
brace-expansionexception above, until upstream Pi ships a fixed version or the exception expires on 2026-12-31 (GHSA-qhr7-859c-m2p7 and GHSA-6j4f-fj2g-mc7p; GHSA-q2hr-2g5m-vwhr is moderate and reported belowfailOn: high). Details in known limits.
- #64, upstream Pi: a user's
- Update channel: the project operates no signed update channel, and the example distributions pin no bootstrap trust root, so the published archives are update-disabled and cannot update through a channel. Key custody belongs to each distribution owner (trust root). A production consumer pins and installs the exact qualified artifact directly, and compares its SHA-256 and pinned update keys with the values the distribution owner published (distribution bootstrap).
- Production evidence: the manual
Live providerworkflow has passed with a real upstream model provider through the reference stack (after v0.7.1). There is still no validation against a real company identity provider or company gateway in production; the production validation protocol says how it is run and what a report may carry. - Supported production-validation platforms:
linux-x64,darwin-arm64, andwin32-x64with Node.js 22.19.0 or later (qualified on Node 22.19.0), the release targets the Release candidate builds and the targets in compatibility. Native Windows has no sandbox adapter: a distribution that requires the sandbox fails closed there withSANDBOX_UNAVAILABLE(sandbox backends).
v0.7.1 was the one PiShip baseline a production consumer pinned for production validation (#173) until v0.8.0 replaced it. It stays published and qualified, and is documented here as a previous baseline. A production consumer pinned tag v0.7.1 and installed its qualified release artifact directly; it did not track main.
- Qualification: tag
v0.7.1is commitbd4bc09eac22aefdb2b5c576884934e8d6200318(the squash of #174). Release qualification run 36857734987 passed on that exact commit: CI, CodeQL, Portable E2E, Reference E2E, and Release candidate (two byte-identical builds per target,verify-release, tamper rejection, and install on fresh runners). The pre-release carries that run's six attested archives unchanged, with their SHA-256 files. - PiShip version:
0.7.1(every@piship/*package andPISHIP_VERSIONincompatibility.ts). - Pinned Pi:
@earendil-works/pi-coding-agent0.87.1, exact-pinned inpackages/pi/package.jsonat that commit.compatibility/pi.jsonat that commit lists it assupported, with thepersonalsurfacesupportedand themanaged,governance, andlifecyclesurfacescandidate. v0.8.0 pins Pi 1.0.0 (after v0.7.1, Pi compatibility). - Manifest schema:
piship/v1alpha4. Lock schema:piship-lock/v1alpha4. Both unchanged since v0.4 (version map). - Known vulnerability exceptions: GHSA-qhr7-859c-m2p7 and GHSA-6j4f-fj2g-mc7p (high,
brace-expansion5.0.9 pinned by Pi 0.87.1, and by Pi 1.0.0 in v0.8.0), a reviewed exception that every example manifest allows with a reason until 2026-12-31, after which the release vulnerability gate fails again (#129). GHSA-q2hr-2g5m-vwhr (moderate, same package) is not an exception: it is reported belowfailOn: high. Details in known limits. - Open issues at v0.7.1. These five were the complete list of open issues; every other issue cited on this page is closed. #176 is resolved by the upgrade to Pi 1.0.0 in v0.8.0 (after v0.7.1) and #181 is closed by v0.8.0; the other three remain open:
- #64, upstream Pi: a user's
!shell command still writes its full output through Pi's temp file, so a temp filesystem that fills while Pi writes it (ENOSPC) is not contained. - #139, upstream Pi: an identity or credential failure inside the TUI shows PiShip's action, but Pi still adds its own
/bughint. - #129: the reviewed
brace-expansionexception above, until upstream Pi ships a fixed version or the exception expires on 2026-12-31. - #176: the latest Pi adds
AssistantMessage.thinkingLevel, which must be classified in the redaction map, with the governance review a Pi upgrade needs, before any Pi upgrade. No effect on the pinned Pi 0.87.1. Resolved in v0.8.0. - #181: signed channel hardening (key validity, revocation before activation, multiple signatures, signer hardening), needed before a broad rollout that relies on a signed update channel, not before production validation. Closed by v0.8.0.
- #64, upstream Pi: a user's
- Update channel: the project operates no signed update channel and pins no release key in the examples, so an installation of the published archives cannot update through a channel. Key custody belongs to each distribution owner (trust root). A production consumer pins and installs the exact qualified artifact directly.
- Production evidence: the manual
Live providerworkflow has passed with a real upstream model provider through the reference stack (after v0.7.1). There is still no validation against a real company identity provider or company gateway in production; the production validation protocol says how it is run and what a report may carry. - Supported production-validation platforms:
linux-x64,darwin-arm64, andwin32-x64with Node.js 22.19.0 or later (qualified on Node 22.19.0), the release targets the Release candidate builds and the targets in compatibility. Native Windows has no sandbox adapter: a distribution that requires the sandbox fails closed there withSANDBOX_UNAVAILABLE(sandbox backends).
main moved past v0.7.1 before v0.8.0. These changes are not in v0.7.1; they are in v0.8.0 and listed under it in the changelog:
- #178:
piship install --sha256 <hex>and--expect-key sha256:<fingerprint>check the published archive digest and the pinned update keys before anything is installed, andpiship inspectshows the pinned keys (distribution bootstrap). - #180: the trust root records the decisions that the project operates no official channel for the examples and that key custody belongs to the distribution owner; the remaining signed-channel gaps move to #181.
- #182: a failed
Live providerrun reports the gateway's HTTP status and PiShip's error code, and the workflow takes an optional model for a single run. - Pi 1.0.0: v0.8.0 pins
@earendil-works/pi-coding-agentexactly at 1.0.0.compatibility/pi.jsonand the copy in@piship/corelist 1.0.0 and 0.87.1 with the same surface statuses (personalsupported;managed,governance, andlifecyclecandidate); 0.87.1 stays so that releases built on it are still recognized, and the launcher runs only 1.0.0. v0.7.1 stays on Pi 0.87.1. The v0.8.0 Release qualification is the first one recorded for a commit with Pi 1.0.0: the earlier ones ran on 0.87.1. The upgrade notes are in compatibility. - #176:
AssistantMessage.thinkingLevel, new in Pi 1.0 (optional; the thinking level the agent loop requested), is classifiedmetadatain the redaction map. The governance review of the built-in extensions of Pi 0.99 and 1.0 (builtin:mcp,builtin:codemode,builtin:tool-search,builtin:llama) found that a PiShip session loads none of them: only Pi's CLI adds them, PiShip builds sessions through the SDK withnoExtensions: true, and a compatibility test asserts that nobuiltin:*extension loads. A tool an extension runs throughctx.executeToolstill emitstool_call, which the policy hook decides (security). - The governed
bashfollows Pi 1.0's result shape: it returns Pi'sstructuredContent(outputup to 1 MiB, and the first and last 512 KiB when longer;truncated;full_output_pathwhen truncated and saved;exit_code;wall_time_seconds), which codemode scripts receive, and a non-zero exit returns anisError: trueresult instead of throwing. The full output file still lives in PiShip's session-owned output store. - Every launch sets Pi's defaults (security): no pi.dev version check and no update notice, no Pi telemetry or install report, Pi's agent directory (its crash log and the
fdandrgit downloads) in the distribution's state instead of~/.pi/agent, a quiet startup, and the terminal's own scrollback instead of Pi 1.0's fullscreen. A managed launch also runs Pi offline.
| Status | Meaning |
|---|---|
| supported | The surface is marked supported in compatibility/pi.json: installed E2E has passed on every advertised target (Ubuntu x64, macOS arm64, Windows x64 with Node 22.19.0) as defined in compatibility. |
| candidate | The surface is marked candidate in compatibility/pi.json: public-API, unit, and local-fixture checks pass, while live-service evidence or complete current-head target evidence is still missing. |
| preview | Implemented and tested, but not a surface of its own in compatibility/pi.json, or only proven with deterministic local fixtures. Expect changes. |
| unavailable | Nothing exists to run, or nothing was available to run it on. A backend with no adapter on a platform is unavailable there (native Windows: a required sandbox fails closed with SANDBOX_UNAVAILABLE), and a live qualification that had no service, account, or cluster to run against is unavailable. It is a statement about the evidence, never a pass. |
The evidence column names the CI tier that produces the evidence, the example it exercises, and the platforms it runs on. The most recent Release qualification is v0.13.0's (v0.13.0); the per-job counts below were recorded for the v0.7 candidate.
| Area | Mode | Status | Evidence |
|---|---|---|---|
Distribution core: portable payload, install, uninstall, isolated state, inspect, doctor, --smoke, session resume |
Personal | supported (Pi surface personal) |
Fast gate: build, unit, and Pi compatibility on Ubuntu, macOS, and Windows. Portable E2E: personal-lifecycle and cli on all three targets with examples/personal; personal-clean-machine-mypi also takes MyPi from install to uninstall, with a model request, session resume, update, and rollback. |
| Distribution core | Managed | candidate (Pi surface managed) |
Fast gate as above. Portable E2E: managed with examples/demo-company against local fixtures, on all three targets; it also checks that one launch writes the metadata-only local metrics (logs/metrics.json). |
Managed access: OIDC + PKCE login, http-broker credentials, platform secret store, OpenAI-compatible gateway, model governance, layered configuration |
Managed | candidate (Pi surface managed) |
Fast gate: the live platform secret-store test on all three targets (macOS Keychain, Windows Credential Manager, Linux Secret Service under GNOME Keyring). Portable E2E: managed, managed-clean-machine (one continuous flow: install, launch, login, credential acquire, model discovery, an authenticated model request, session resume, doctor, sandboxed commands, update, rollback, logout, uninstall and purge), user switching (file and system store), the secret-store lifecycle (file and system store), headless, enterprise networking through the real launcher (network), and the security suite (security-controls, security-sweep, security-lifecycle, security-findings-session, security-sandbox, lifecycle-credentials), all on all three targets (on Windows, lifecycle-credentials and security-sweep skip some steps; see known limits) against deterministic loopback fixtures (OIDC provider, broker, gateway). The secrets of managed-clean-machine and of the system variants are in the live platform store, while managed, headless, and the file variants use the file store. The clean-machine flow's model request is authenticated by the fixture gateway, which is not a model. Reference E2E, Ubuntu only: the AcmeCode reference distribution signs in on a real Keycloak, exchanges the identity at the reference broker, keeps the credential in the Linux Secret Service, and sends model requests through a real LiteLLM gateway to a deterministic mock upstream, as one flow from install to uninstall (including commands in the required sandbox, update, rollback, and logout) and across a user switch. No production identity provider or gateway, and no model provider behind the gateway. |
Access modes local-secret, none, and a local OpenAI-compatible model |
Personal | preview | Portable E2E on all three targets: personal-access-modes, personal-local-model with examples/personal/local-model, and the personal clean-machine flows (personal-clean-machine-mypi, personal-clean-machine-local), which take MyPi (key delegated to Pi) and MyPi Local (key in its own secret store) from install to uninstall, send a model request with that key to a stand-in model server on loopback, and update and roll back through a signed loopback channel. No request to a real model provider is claimed. |
| Governance: policy, resource/provider/project trust, capabilities and Plan/Build, governed MCP, OS sandbox, audit | Managed and personal | candidate (Pi surface governance) |
Fast gate: the live sandbox probe and boundary tests run in the unit suite with a required sandbox on Ubuntu (bubblewrap) and macOS (Seatbelt); a missing sandbox fails the job instead of skipping the tests. Portable E2E: governance on all three targets; on Windows only with the sandbox optional, because Windows has no sandbox adapter and a required sandbox fails closed. managed-clean-machine also runs the commands the fixture gateway asks for through the required native sandbox on Linux and macOS and checks that each escape is refused; on Windows it runs none. Reference E2E: the same commands in the required sandbox on Ubuntu. Per backend in sandbox backends. |
Sandbox backends: custom adapters, e2b-compatible (E2B, CubeSandbox), kubernetes-agent-sandbox (sandbox backends) |
Managed and personal | preview | Per backend in sandbox backends below. |
Lifecycle: piship release, verify-release, signed channels, update, rollback, migration check |
Managed | candidate (Pi surface lifecycle) |
Portable E2E: lifecycle-install, lifecycle-integrity, lifecycle-update, and lifecycle-rollback with the demo on all three targets (Windows with the sandbox optional). Release candidate: two builds per target, reproducibility, verify-release on a fresh runner, tamper rejection, attestation, and install with the shipped script; recorded on v0.13.0 7f9e167 (run), and earlier on v0.12.0 8d40a68 (run), on v0.11.0 d4f740f (run), on v0.9.1 a97ba43 (run), on v0.9.0 ff3c382 (run), on v0.8.1 d069104 (run), on v0.8.0 8550282 (run), on v0.7.1 bd4bc09 (run), on 21de31a, on the freeze SHA ab3e7f2 (run), on the v0.7 candidate ee8b4a9 (run), and on v0.7.0 4994eee (run). |
| Lifecycle | Personal | candidate (Pi surface lifecycle) |
Portable E2E: personal-lifecycle covers signed update and rollback of the personal example. Release candidate: the same two builds, reproducibility, verification, attestation, and install as the demo, plus the installed release's offline --smoke and doctor; recorded on v0.13.0 7f9e167 (run), and earlier on v0.12.0 8d40a68 (run), on v0.11.0 d4f740f (run), on v0.9.1 a97ba43 (run), on v0.9.0 ff3c382 (run), on v0.8.1 d069104 (run), on v0.8.0 8550282 (run), on v0.7.1 bd4bc09 (run), on 21de31a, on the freeze SHA ab3e7f2 (run), on the v0.7 candidate ee8b4a9 (run), and on v0.7.0 4994eee (run). |
| Release supply-chain evidence: reproducibility, SBOM, notices, vulnerability and registry-signature checks, provenance, attestation | Managed and personal | candidate (Pi surface lifecycle) |
Release candidate on all three targets for acmecode, mypi, and devcode: two builds compared by piship reproducibility, verify-release and tamper rejection on a fresh runner, attestation verified with gh attestation verify, and the release's recorded evidence checked by scripts/check-release-evidence.mjs (qualified, tests and scan passed, every SBOM package in the notices, one audit record per vendored Pi package, the signature verdict). Before v0.11 the registry signature check verified nothing (security review); run 37538011406 on the fixed code is the first to record a verified signature, passed on all nine distribution and target combinations, and runs 37678031776 (v0.12.0) and 37887824632 (v0.13.0) again passed on all nine. Matrix: v0.11 qualification matrix. |
Shared file store (PISHIP_STORE, off by default) |
Managed and personal | preview | Fast gate: the store, collection, and boundary tests on three targets. Portable E2E: shared-store (a real release installed, updated, rolled back, and diagnosed with a store, and installed with an unusable one) and the shared file store test of developer-profile (the developer payload placed from an empty store). No release path depends on it. |
The endpoints a company must provide for managed access, and how PiShip calls them, are in the enterprise integration contract.
Not claimed anywhere: sign-in at a production identity provider, inference through a production gateway, a model request to a real model provider outside the reference stack (the manual Live provider workflow has sent one through the reference LiteLLM and AcmeCode, see after v0.7.1; that is evidence for the reference stack only), a Windows OS sandbox, a verified shared or synchronized workspace on a Windows host (known limits), a live E2B, CubeSandbox, or Kubernetes sandbox, an InferenceProvider adapter for a gateway that is not OpenAI-compatible (out of scope for v0.7), the managed path of the first production consumer (open, see distribution qualification), macOS notarization or code signing, Windows Authenticode signing, targets other than the three above, or an npm publication.
Each sandbox backend has its own maturity; a distribution's containment is only as strong as the backend it selects. What each backend enforces and reports is in sandbox backends. The statuses use the terms above, which are defined by compatibility/pi.json: a native backend is candidate because the governance surface it belongs to is, and no row is promoted beyond what that record says.
Every run named below used Node 22.19.0 and Pi 0.87.1, the pin at the time, except the v0.8.0 and v0.8.1 Release qualifications, which ran on Pi 1.0.0, the v0.9.0 and v0.9.1 Release qualifications, which ran on Pi 1.0.2, the v0.11.0 and v0.12.0 Release qualifications, which ran on Pi 1.0.3, and the v0.13.0 Release qualification, which ran on Pi 1.1.0. The per-test results were recorded for the v0.7 candidate; the Release qualifications of v0.7.0, v0.7.1, v0.8.0, v0.8.1, v0.9.0, v0.9.1, v0.11.0, v0.12.0, and v0.13.0 passed the same jobs on their own commits.
| Backend | Status | Environment and versions | Evidence and results |
|---|---|---|---|
native on Linux (bubblewrap) |
candidate (part of the Pi surface governance) |
ubuntu-latest: Ubuntu 24.04 image, bubblewrap 0.9.0. The workflows set kernel.apparmor_restrict_unprivileged_userns=0, because Ubuntu restricts, by default, the unprivileged user namespaces bubblewrap needs. |
Fast gate, with the sandbox required: the live probe and the boundary and escape tests (boundary.test.ts: 18 of 19 tests run, the 19th is the macOS launchd test), the workspace and backend-contract tests, and the sandbox conformance kit against the native backend all passed. Portable E2E: governance and managed-clean-machine with a required sandbox (four commands run: one writes inside the workspace, and reading the user's SSH key, writing outside the workspace, and connecting to a loopback listener are each refused), and the installed E2E files on both Ubuntu shards. Reference E2E: AcmeCode's commands run in the required sandbox and each escape is refused (distribution-flow). Bubblewrap cannot guard a protected git file that does not exist yet, so git control is reported not-verified in every regular repository; doctor names the files and the sandbox still runs (protected git paths). |
native on macOS (Seatbelt) |
candidate (part of the Pi surface governance) |
macos-latest: macOS 26 arm64 image, Seatbelt through /usr/bin/sandbox-exec. |
Fast gate, with the sandbox required: all 19 boundary and escape tests passed, including the launchd test, which first confirms that an unsandboxed launchd job runs and then sees six attempts (launchctl, a copied launchctl, open, a copied open, osascript, and osascript from Node) refused with no escape marker created; the workspace and backend-contract tests and the conformance kit against the native backend passed as on Linux. Portable E2E: governance and managed-clean-machine with a required sandbox (the same four commands), and the installed E2E files on all three macOS shards. Not run on Reference E2E, which is Ubuntu only. |
native on Windows |
unavailable | windows-latest: the windows-2025-vs2026 image. |
There is no Windows sandbox adapter. A distribution that requires the sandbox fails closed with SANDBOX_UNAVAILABLE (Portable E2E governance asserts it on Windows). With the sandbox optional, the Windows E2E runs no command in a sandbox: managed-clean-machine says so in its output and skips the step, and doctor reports containment not-required and isolation none. The native sandbox tests skip on Windows. Governed children there run in a kill-on-close Job Object that ends descendants with their leader; it isolates nothing. |
custom |
preview | The reference container sandbox and its single-file adapter on ubuntu-latest: Ubuntu 24.04 image, Docker 28.0.4. |
Unit tests of the adapter lifecycle and capability checks with fake adapters, and the sandbox conformance kit against reference backends. Reference E2E, Ubuntu only: sandbox passed 16 tests: the service and adapter pass every kit behavior against real containers with none skipped, and a governed session with a stored sandbox credential verifies the shared workspace in both directions. An adapter that declares a network probe has its network denial verified (unit tests with fakes); otherwise it is attested. The reference adapter declares no network probe in v0.7, so its network denial is attested, never verified. PiShip ships no company adapter. |
e2b-compatible (E2B, CubeSandbox) |
preview (live qualification unavailable) | Fixtures only; no E2B service and no CubeSandbox. See external backends. | remote.test.ts (52 tests, Fast gate on all three targets) runs the backend against a mock E2B control plane and envd that enforces the sandbox user (user, or root as CubeSandbox needs), checks that the API key appears only as X-API-Key on control requests, and checks every request for leaked credentials. The conformance kit against a fake E2B service fails two behaviors where the kit is stricter than PiShip (kit self-tests). The backend declares no network probe, so network denial is attested by the service, never verified. |
kubernetes-agent-sandbox |
preview (live qualification unavailable) | Fixtures only; no cluster. See external backends. | It does not claim network denial, so a required deny sandbox fails closed. remote.test.ts runs it against a mock API server and router (claim lifecycle, renewal across clock jumps, expired and removed claims). Portable E2E sandbox-credential and security-sandbox on all three targets launch a governed session whose bash runs in that mock with a stored sandbox credential, through a change of user, a rejected credential, and an outage in which the command never runs on the host instead. The conformance kit is not run against it: there is no fake of its runtime API that runs commands. |
The backends are recorded here and not in compatibility/pi.json: their maturity does not change which Pi surface a release records.
Live qualification of E2B, CubeSandbox, and Kubernetes Agent Sandbox needs a service the project does not operate, and never gates a release. It was checked, read-only, on the maintainer's machine that prepared the v0.7 evidence, on 2026-09-30 (UTC):
command -v kubectl kind minikube k3d orb dockerfoundkubectl(client v1.33.9),orb, anddocker;kind,minikube, andk3dare not installed.kubectl config get-contextslists no context, no current context is set, andKUBECONFIGis unset. There is no cluster to reach, sokubectl get crdwas not run: there was nothing to run it against. No cluster was started and no context was changed; OrbStack's Kubernetes was neither started nor queried.- No E2B account or API key and no CubeSandbox deployment was provided for this qualification.
| Backend | Live qualification | What it needs |
|---|---|---|
| E2B-compatible (E2B) | unavailable | An E2B account and API key, or a self-hosted service that implements the E2B API |
| CubeSandbox | unavailable | A CubeSandbox deployment and its API URL (commands run as user: root) |
| Kubernetes Agent Sandbox | unavailable | A cluster with the Agent Sandbox custom resources (SandboxClaim, SandboxWarmPool) and its sandbox router |
All three stay preview on the fixture-level evidence in the table above, and none of it is live evidence. E2B and CubeSandbox network denial is backend-attested: neither backend declares a network probe, so the service's word stands and PiShip reports it as attested. Kubernetes Agent Sandbox claims no network denial at all.
What each kind of distribution has been shown to do. The test counts are from the v0.7 candidate; the same suites passed in the v0.7.1, v0.8.0, v0.8.1, v0.9.0, v0.9.1, v0.11.0, v0.12.0, and v0.13.0 Release qualifications.
| Distribution | Role | Evidence | Status |
|---|---|---|---|
AcmeCode reference distribution (examples/enterprise-reference) |
A neutral managed distribution that depends on no company's infrastructure | Reference E2E, Ubuntu: distribution-flow (14 tests) takes one user from install to uninstall against a live Keycloak 26.7.4, the reference credential broker, and LiteLLM v1.103.0 (PostgreSQL 17.11 and a deterministic mock upstream behind it): install, sign-in, credential, models, a model request and session resume, doctor, commands in the required sandbox, update, rollback, logout, and uninstall and purge. user-switching signs a second user in over the first without a logout: the second gets none of the first's credential, entitlement, or model selection. The demo distribution (examples/demo-company) runs the same flow against local fixtures on all three targets. |
Recorded for v0.13.0 7f9e167 |
DevCode (examples/developer) |
A personal distribution with six Pi packages, a certified permission provider seeded from its manifest, and a hardened managed variant | Release candidate: devcode is wired to be built, verified, and installed with acmecode and mypi. The developer-profile E2E and the example's unit checks are in the nightly Portable E2E and the unit tier. Release qualification runs 37887824632 (v0.13.0), 37678031776 (v0.12.0), and 37538011406 (v0.11.0) built, verified, and installed devcode on all three targets, and the developer profile E2E is part of their Portable E2E; the managed variant is validated, never launched, and no developer update or rollback is automated. |
preview |
MyPi and MyPi Local (examples/personal) |
Personal regression: no enterprise identity, a local or direct model | Portable E2E on all three targets: personal-clean-machine-mypi, personal-clean-machine-local, personal-lifecycle, personal-access-modes, and personal-local-model. |
Recorded for v0.13.0 7f9e167 |
| The first production consumer | The managed path of a real company distribution | Not available in this repository. It follows the production validation protocol: collected downstream with the owner's approval, reported only as de-identified step results, and summarized here without identifiers. | open |
Limits of v0.13.0 as shipped, with earlier releases named where a bullet says so, each checked against the code or document it cites. None of them is claimed as handled. Only the issues listed under the baseline, #64 and #139, are open; a closed issue cited here records where a limit was decided, not open work.
- Shell output is stopped at 64 MiB, but in v0.7.0 Pi still writes the complete output to its own
pi-bash-*.logfile in the OS temp directory: PiShip does not remove it after the session, and a full temp filesystem while Pi writes it is not contained. After v0.7.0 the agent'sbashtool keeps its full output in a session-owned directory removed at close, and a full temp filesystem there is contained. A user's!command still goes through Pi's file: PiShip removes the files Pi recorded for the session at close and keeps the command's output within the free temp space, but a temp filesystem that fills anyway while Pi writes it is not contained, and a crash leaves the file. Closing that needs a change in Pi upstream (#64; security). --smoke-modelclassifies a failed request by the gateway's status, an aborted request asREQUEST_CANCELLED, and a managed endpoint's request that got no answer (refused or reset connection, DNS failure, deadline) asGATEWAY_UNREACHABLE. A stream that failed after it started, and a Pi-native provider's request that got no answer, are stillGATEWAY_PROTOCOL_ERROR: Pi's message keeps no structured transport error, and PiShip owns thefetchonly for a managed endpoint (kept as a known limit when #85 closed; inference).- On Windows, a governed child that writes the launcher's startup-failure marker to stderr has that output dropped and its exit reported as a startup failure (a low-severity review finding on #104, not tracked by an open issue).
- On Windows, the Job Object helper is compiled from C# for every governed child, which adds startup time to each one (a low-severity review finding on #104, not tracked by an open issue).
- On Windows, the request that carries a child's file, arguments, working directory, and approved environment travels base64-encoded in one environment variable of the launcher, so it is bound by Windows' 32,767-character limit for a variable (a low-severity review finding on #104, not tracked by an open issue).
- The native sandbox probe connects to 1.1.1.1:443 and to a host loopback listener in
denymode as negative probes: each must fail, and the probe never requires an address to be reachable. The positive control is in the boundary tests, where a sandbox with the network allowed does reach the loopback listener (network denial). - E2B and CubeSandbox network denial is backend-attested, never verified; Kubernetes Agent Sandbox claims none, and a required
denysandbox on it fails closed. - The reference container sandbox declares no network probe in v0.7, so its network denial is attested.
- Bubblewrap cannot guard a protected git file that does not exist yet, so git control is
not-verifiedunder it in every regular repository (sandbox); Seatbelt can guard a missing file. - The
Live providerworkflow is manual, uses a paid provider key held in the protectedlive-providerenvironment, and is never part of Release qualification. Its passing runs (after v0.7.1) show one model request from AcmeCode through the reference Keycloak, broker, and LiteLLM to a real upstream provider. They are not evidence for a company identity provider or gateway, and no such validation exists yet. - PiShip refuses state, install, and bin homes that are equal or nested in one another, so an install home that contains the bin home is rejected with
CONFIG_INVALID. - Windows has no evidence for the host-side check of a
sharedorsynchronizedworkspace. Of the 103 workspace tests (workspace.test.tsandgovernance-workspace.test.ts), 63 are POSIX-only and skip on Windows: the two-way sentinel, the git control file checks, the sentinel location, the propagation and validity windows, and the governed session's workspace check. 7 more need a native sandbox, which Windows does not have. The 33 that run there cover declaration handling and helper logic. The only run against a real shared workspace is the reference container sandbox, on Ubuntu. - Two security E2E files cover less on Windows than on Linux and macOS.
lifecycle-credentialslocks the file store by removing POSIX permissions, which Windows ignores. So on Windows it does not test logout with a locked store, the discarded credential and identity records that logout leaves, or the rollback that clears them: logout runs with the store unlocked.security-sweepruns the demo with the sandbox optional on Windows. It skips the fourbashtool steps: reading a stored secret and the credential metadata withcat, listing the state directory, and a long output that Pi saves to a temp file. It also does not check that the run used its temp directory. Both files still pass on Windows and sweep for leaked secrets there. - A system clock set forward cannot be told from a suspend and counts as elapsed time: the sandbox workspace check and a Kubernetes claim come due or expire early (sandbox).
- Releases up to v0.8.1 ship
brace-expansion5.0.9, which Pi 0.87.1 and 1.0.0 pin in theirnpm-shrinkwrap.json; it has two high advisories (GHSA-qhr7-859c-m2p7, GHSA-6j4f-fj2g-mc7p: local stack-exhaustion DoS from crafted nested brace patterns) and one moderate (GHSA-q2hr-2g5m-vwhr). Their example manifests allow the two high IDs as a reviewed exception until 2026-12-31. In v0.9.0 and v0.9.1, Pi 1.0.2 pins 5.0.12, which fixes them, so the example manifests carry noallowentries and the release vulnerability gate passes with no findings (#129, upgrade to Pi 1.0.2). - The branded command has no non-interactive prompt, print, or RPC mode: without a terminal the interactive command fails at once, and headless runs (CI, automation, a workload identity) use
--smoke,--smoke-model, and the subcommands (#135). - Fixed in v0.7.1: a stray file in the installed payload is named and
piship repairrestores the release (#136); a corrupt versioned state file no longer blocks update and rollback (#143); the lifecycle lock and launch gate record process identity and host (#144); adapter and custom sandbox calls have deadlines (#145); Kubernetes sandbox commands may run past 300 seconds and an unknown outcome is never retried (#146); proxy and CA failures name the proxy or the TLS chain (#148); login explains a busy port, a provider client error, and SSH (#149);validatecatches configuration certain to fail at launch (#142). Still open: an identity or credential failure inside the TUI shows PiShip's action, but Pi still adds its own/bughint, which no public Pi API can turn off (#139). - The v0.7.x follow-ups tracked under #125 (#157 to #162) are fixed in v0.7.1, and #125 is closed.
- The project operates no signed update channel. Installation trust state, sequential root refresh, root / channel role separation, threshold multi-signatures, and emergency channel-key revocation are implemented in v0.8.0 and covered by its Release qualification, and again by that of v0.8.1; the remaining gaps are partial root signing across machines and external signers (trust root gaps).
- In v0.8.0, v0.8.1, v0.9.0, and v0.9.1, some Pi 1.x behavior has no public Pi switch, and PiShip does not patch Pi: the terminal title is still "π" (Pi's
APP_TITLE); the exit hint still sayspi --session-dir ... --session ...; Pi still adds its/bughint (#139); and the built-in/sharecommand uploads the session file as a GitHub gist through the user's ownghCLI, a child process outside PiShip's in-process network policy, so a session can leave the machine that way in managed mode too (security). - Session export has no Pi seam for
/share's gist fallback or/export, sosession.exportpublicandlocalareunsupportedin v0.9.0 and v0.9.1, andsupportisunsupportedin personal mode, where Pi's/bugupload is open; the lock anddoctoralways report them (security). - A managed distribution runs Pi offline (
PI_OFFLINE=1), so Pi downloads nofdorrg. From v0.9.1, apiship/v1alpha6distribution can bundle them withruntime.searchTools: { mode: bundled }: they are pinned per release target in the lock, shipped in the payload, and found by Pi beforePATH, without the network (bundled search tools). Without it, and in v0.8.0, v0.8.1, and v0.9.0, they must be onPATHfor@completion and Pi's find and grep tools. A personal distribution without bundled tools lets Pi download its ownfdandrg; in v0.9.0 and earlier Pi put them, and looked for them first, in~/.pi/agent/bindespite PiShip's agent directory, because Pi fixes that directory when it is imported. From v0.9.1 the branded command sets the agent directory before Pi loads, so they go to<state>/agent/bin(security). - On macOS, the heartbeat test of
packages/sandbox/src/boundary.test.tsis a known flake on macOS, and no root cause is established. The unit tier of the v0.11.0, v0.12.0, and v0.13.0 Release qualifications passed it on its first attempt. The seatbelt reference conformance tests on macOS are timing sensitive too: they failed twice on loaded pull-request runs during the v0.13.0 cycle and passed on the next run. - Not verified for v0.13.0: a real pi-code isolated or background agent run (the temp-directory modes and worktree layout were read from pi-code 1.4.2's source, not run), and the package-configuration lock under real Windows contention (a scanner holding a file).
compatibility/pi.json is the machine-readable record, and @piship/core carries a copy that the compatibility suite keeps equal. For the pinned Pi 1.1.0 it lists four surfaces (1.0.3, 1.0.2, 1.0.0, and 0.87.1, kept so that releases built on them are recognized, have the same four with the same statuses):
| Surface | Status | What it covers |
|---|---|---|
personal |
supported | The portable personal distribution core |
managed |
candidate | Managed access and configuration |
governance |
candidate | Policy and trust, capabilities, governed MCP, the OS sandbox, and audit (piship/v1alpha3 and later) |
lifecycle |
candidate | Release, signed channels, update, and rollback |
release.json records the weakest of the distribution's deployment surface, the governance surface when the distribution declares governance (every piship/v1alpha3 or later manifest does), and the lifecycle surface, so every release built today records candidate. The statuses of 1.0.0 were set equal to those of 0.87.1 at that upgrade, those of 1.0.2 equal to those of 1.0.0 at the upgrade after v0.8.1, those of 1.0.3 equal to those of 1.0.2 at the upgrade after v0.9.1 (v0.11.0 and v0.12.0 ship on it), and those of 1.1.0 equal to those of 1.0.3 at the upgrade after v0.12.0 (v0.13.0 ships on it); the Release qualifications of v0.8.0 and v0.8.1 are the ones recorded on Pi 1.0.0, those of v0.9.0 and v0.9.1 are the ones recorded on 1.0.2, those of v0.11.0 and v0.12.0 are the ones recorded on 1.0.3, that of v0.13.0 is the one recorded on 1.1.0, and the earlier evidence on this page was produced on 0.87.1. See compatibility for the Pi public API PiShip uses and the upgrade policy.
AGENTS.md defines three tiers. A result is evidence only for the tier and commit it ran on.
| Tier | Workflows | When it runs | What it proves |
|---|---|---|---|
| Fast merge gate | CI (build, unit tests, and Pi compatibility on Ubuntu, macOS, and Windows; the live platform secret store on Ubuntu (GNOME Keyring), macOS, and Windows; format, lint, types, and boundaries on Ubuntu), CodeQL |
Every pull request and every main push |
A change is safe to merge |
| Full Portable E2E | Portable E2E (npm run test:e2e on three targets, each split into shards on runners of their own that together run every E2E file; Ubuntu also runs the repeated-build qualification), Reference E2E (npm run test:reference and the broker contract tests against the enterprise reference stack on Ubuntu, with the Linux Secret Service) |
Nightly, workflow_dispatch, and inside Release qualification; not a pull request gate |
The cross-platform installed integration surface, and the managed distribution against live identity, broker, and gateway services |
| Release qualification | Release qualification: CI, CodeQL, Portable E2E, and Reference E2E in parallel, then Release candidate (demo company, personal example, and developer example) |
workflow_dispatch only, on the exact candidate commit |
A specific commit and its artifacts are ready to ship |
Outside these tiers, Pi latest canary runs the compatibility suite nightly against the newest published Pi. It is early warning for the next Pi upgrade, not evidence for the pinned version. Scheduled failures of the canary, of Portable E2E, and of Reference E2E open or update a tracking issue.
A result is evidence only for the commit and tier it ran on. A run that has not happened is listed as not recorded; it is never inferred from another commit.
ab3e7f2 on main is the v0.6 freeze SHA: the last commit before any v0.7 pull request merges. v0.7 work branches from it.
| Tier | Commit | Result |
|---|---|---|
| Fast merge gate | ab3e7f2 (freeze) |
CI and CodeQL passed |
| Portable E2E | ab3e7f2 (freeze) |
Passed on Ubuntu, macOS, and Windows inside the Release qualification run below |
| Release qualification | ab3e7f2 (freeze) |
Run, dispatched manually on the exact commit: CI, CodeQL, Portable E2E, and Release candidate (demo company and personal example: two builds per target, reproducibility, verification, attestation, and install) passed on all three targets |
| Fast merge gate | 4830b07, the commit before the freeze |
CI: the Windows job failed in packages/audit/src/log.test.ts, an audit log rotation test whose assertion depended on how two concurrent writers interleave; the macOS and Ubuntu jobs and CodeQL passed |
| Release qualification | 21de31a, three commits before the freeze |
Run: CI, CodeQL, Portable E2E, and Release candidate (demo company, personal example, and developer example) passed on all three targets. It is not evidence for ab3e7f2: the commits after it change an E2E fixture and the E2E hook timeout (#36), ignore rules (#37), and SECURITY.md (#38) |
Consequence: the personal surface stays supported in compatibility/pi.json, and the Release qualification on 21de31a covered the piship/v1alpha4 personal example on all three targets. The freeze SHA ab3e7f2 now has its own green Release qualification, so the v0.6 baseline is implemented, frozen, and qualified at its exact commit. Still, a v0.7 result is evidence only for the v0.7 commit it ran on and does not stand in for the v0.6 baseline.
Tag v0.13.0 is commit 7f9e167 (the squash of #255, which is also the version change), the production-validation baseline.
| Tier | Commit | Result |
|---|---|---|
| Release qualification | 7f9e167 (v0.13.0) |
Run 37887824632, first attempt on that exact commit: 54 jobs passed and 2 were skipped (the issue-report jobs that run only on schedule). CI (check on Ubuntu, macOS, and Windows), CodeQL, Portable E2E on all three targets, Reference E2E, and Release candidate (two builds per target for acmecode, mypi, and devcode, reproducibility 9 of 9 payload-equal, verify-release, tamper rejection, offline install checks, attestations verified, registry signatures passed 9 of 9, vulnerabilities passed 9 of 9). The devcode archives of the two builds differ in bytes only because vulnerabilities.json records the scan time. Live Chrome startup is excluded from Release qualification. The GitHub pre-release carries the run's nine attested archives, with their SHA-256 files (digests) |
The commit includes the changes since v0.12.0 listed in the changelog.
Tag v0.12.0 is commit 8d40a68 (the squash of #246), the previous production-validation baseline.
| Tier | Commit | Result |
|---|---|---|
| Release qualification | 8d40a68 (v0.12.0) |
Run 37678031776, first attempt on that exact commit: 54 jobs passed and 2 were skipped (the issue-report jobs that run only on schedule). CI (check on Ubuntu, macOS, and Windows), CodeQL, Portable E2E on all three targets, Reference E2E, and Release candidate (two builds per target for acmecode, mypi, and devcode, reproducibility 9 of 9 payload-equal, verify-release, tamper rejection, offline install checks, attestations verified, registry signatures passed 9 of 9, vulnerabilities passed 9 of 9). The devcode archives of the two builds differ in bytes only because vulnerabilities.json records the scan time. The GitHub pre-release carries the run's nine attested archives, with their SHA-256 files (digests) |
| Release qualification | 0404e484 (the version change, #245) |
Run 37669522371: one Windows end-to-end job failed (a test downloaded fd and rg from GitHub and timed out) and the run was cancelled. #246 fixed the cause, and run 37678031776 above is on the commit that contains the fix. It is not evidence for 8d40a68 |
The commit includes the changes since v0.11.0 listed in the changelog.
Tag v0.11.0 is commit d4f740f (the squash of #237), the previous production-validation baseline.
| Tier | Commit | Result |
|---|---|---|
| Release qualification | d4f740f (v0.11.0) |
Run 37538011406, dispatched manually on the exact commit: all 56 jobs passed on their first attempt, on Pi 1.0.3 and Node 22.19.0. CI (check on Ubuntu, macOS, and Windows), CodeQL, Portable E2E on all three targets, Reference E2E, and Release candidate (two builds per target for acmecode, mypi, and devcode, reproducibility 9 of 9 equal, verify-release, tamper rejection, offline install with the shipped script on fresh runners, attestations, registry signatures passed 9 of 9, vulnerabilities passed). The GitHub pre-release carries the run's nine attested archives, with their SHA-256 files (digests) |
| Windows benchmark (unbundled layout) | 486545e |
Run 37519509590, manual, finished after the release was built: the concurrency sweep on the unbundled payload (7,477 files) kept the defaults (performance). It is a measurement, not a qualification |
The commit includes the v0.10.0 changes and the other changes since v0.9.1 listed in the changelog.
Tag v0.9.1 is commit a97ba43 (the squash of #215), the previous production-validation baseline.
| Tier | Commit | Result |
|---|---|---|
| Release qualification | a97ba43 (v0.9.1) |
Run 37297400038, dispatched manually on the exact commit: CI (check on Ubuntu, macOS, and Windows), CodeQL, Portable E2E, Reference E2E, and Release candidate (two byte-identical builds per target for the demo company acmecode and the personal example mypi, attestation, verify-release, tamper rejection, and install with the shipped script on fresh runners) passed, on Pi 1.0.2 and Node 22.19.0, every job on its first attempt. The GitHub pre-release carries the run's six attested archives, with their SHA-256 files (digests) |
The commit includes the changes since v0.9.0 listed in the baseline section: the dependency updates of #206, the setup guide change of #211, the MCP plain HTTP and identity headers of #212, plain HTTP to internal endpoints of #213, the bundled search tools of #214, and #215, which sets the version to 0.9.1.
Tag v0.9.0 is commit ff3c382 (the squash of #209), the previous production-validation baseline.
| Tier | Commit | Result |
|---|---|---|
| Release qualification | ff3c382 (v0.9.0) |
Run 37247881318, dispatched manually on the exact commit: CI (check on Ubuntu, macOS, and Windows), CodeQL, Portable E2E, Reference E2E, and Release candidate (two byte-identical builds per target for the demo company acmecode and the personal example mypi, attestation, verify-release, tamper rejection, and install with the shipped script on fresh runners) passed, on Pi 1.0.2 and Node 22.19.0. On the first attempt the Windows check job failed in one unit test, kills the whole process tree on timeout in packages/sandbox/src/process.test.ts: its one-second deadline killed the child before the child wrote its first output. The failed job was rerun on the same commit (attempt 2), and every job passed. The GitHub pre-release carries the run's six attested archives, with their SHA-256 files |
The commit includes the changes since v0.8.1 listed in the baseline section: the Pi 1.0.2 upgrade of #205, the governance and v1alpha6 contracts of #207, the guide updates of #208, and #209, which copies the Pi package and its lockfile with the reference distribution in Reference E2E. After v0.9.0, that test's deadline on main is five seconds.
Tag v0.8.1 is commit d069104 (the squash of #203), the previous production-validation baseline.
| Tier | Commit | Result |
|---|---|---|
| Release qualification | d069104 (v0.8.1) |
Run 37127974973, dispatched manually on the exact commit: CI (check on Ubuntu, macOS, and Windows), CodeQL, Portable E2E, Reference E2E, and Release candidate (two byte-identical builds per target for the demo company acmecode and the personal example mypi, attestation, verify-release, tamper rejection, and install with the shipped script on fresh runners) passed, on Pi 1.0.0 and Node 22.19.0. The GitHub pre-release carries the run's six attested archives, with their SHA-256 files |
The commit includes the changes since v0.8.0 listed in the baseline section: #198, #200, #201, and the review fixes of #202, with the setup guide fix of #195.
Tag v0.8.0 is commit 8550282 (the squash of #193), the previous production-validation baseline.
| Tier | Commit | Result |
|---|---|---|
| Release qualification | 8550282 (v0.8.0) |
Run 37108519783, dispatched manually on the exact commit: CI (check on Ubuntu, macOS, and Windows), CodeQL, Portable E2E, Reference E2E, and Release candidate (two byte-identical builds per target for the demo company acmecode and the personal example mypi, attestation, verify-release, tamper rejection, and install with the shipped script on fresh runners) passed, on Pi 1.0.0 and Node 22.19.0. The GitHub pre-release carries the run's six attested archives, with their SHA-256 files |
The commit includes #191 and #192, which make the E2E flows expect the root refresh's request for root/2.json and parse the v0.8 keygen output, and #193, which lets a release with an update source and no bootstrap trust build as update-disabled.
Manual real-provider evidence for the reference stack. Both runs were dispatched by the maintainer from main at 9e458f0 (after #182), in the protected live-provider environment with its stored provider secrets. Each sent one --smoke-model request from the AcmeCode reference distribution, signed in on the reference Keycloak with a credential from the reference broker, through the reference LiteLLM to a real upstream model provider, and checked for a non-empty reply that ended with stop.
| Tier | Commit | Result |
|---|---|---|
| Live provider | 9e458f0 |
Run 36877709332, with the stored secrets as they are: passed |
| Live provider | 9e458f0 |
Run 36877168540, with a model given for that run only (the model input from #182): passed. Supporting evidence |
This is evidence for the reference stack against a real provider, not for a company's identity provider or gateway: no validation against a real company identity provider or company gateway in production is recorded. The first production consumer collects that downstream.
Tag v0.7.1 is commit bd4bc09 (the squash of #174), the previous production-validation baseline.
| Tier | Commit | Result |
|---|---|---|
| Release qualification | bd4bc09 (v0.7.1) |
Run 36857734987, dispatched manually on the exact commit: CI, CodeQL, Portable E2E, Reference E2E, and Release candidate (two byte-identical builds per target, verify-release, tamper rejection, attestation, and install on fresh runners) passed. The GitHub pre-release carries the run's six attested archives unchanged, and a fresh install from the published asset was verified |
The release blockers found after ee8b4a9 (#122, #123, #124) were fixed in pull request #163, and the selected hardening items of #157, #158, and #159 in pull request #164, which also sets the PiShip version to 0.7.0. Its Release qualification found three test and example gaps, fixed in pull request #165. The squash commit of #165, 4994eee, is v0.7.0: Release qualification (CI, CodeQL, Portable E2E, Reference E2E, and Release candidate) passed on that exact commit, it is recorded in #121, the v0.7.0 tag is set on it, and its GitHub pre-release carries that run's archives. The ee8b4a9 evidence below is kept for its own commit.
Pi stays at 0.87.1 for v0.7.0. The latest stable Pi when the candidate was frozen, 0.99.2 (2026-09-30), still pins brace-expansion 5.0.9 in its npm-shrinkwrap.json, so it would not clear the advisory below, and its 0.99.0 adds built-in MCP, codemode, and tool search extensions that run tools outside the paths PiShip governs, which needs a compatibility review of its own. Upstream tracking: earendil-works/pi#10273.
The last v0.7 code change is pull request #118, head 44d11e2. Its squash commit on main, 3110556, has the same tree as 44d11e2 (e1b374e). CI, CodeQL, and Portable E2E ran on 44d11e2 or on the merge ref built from it, before the squash, and cover that tree. Reference E2E ran on 3e935a5; see its row. None of them ran on 3110556 itself. Pull request #119 then changed documentation only; its squash commit ee8b4a9 is the v0.7 candidate, and its Release qualification ran on that exact commit. The rows before it are the pull request evidence, kept for their own commits. A review of ee8b4a9 after that run found release blockers (#122), so ee8b4a9 was never tagged; Release qualification ran again on 4994eee, which became v0.7.0. This section is kept as history.
| Tier | Commit | Result |
|---|---|---|
| Fast merge gate | a185470, the pull request's merge ref (44d11e2 merged into main at 6fc3345; tree e1b374e, the tree of 44d11e2) |
CI: check passed on Ubuntu, macOS, and Windows. Unit tests: Ubuntu 2803 passed and 8 skipped, macOS 2805 and 6, Windows 2596 and 198 (platform-gated tests skip). Pi compatibility: 31 tests on each. The live platform secret store passed on each. With the sandbox required on Ubuntu and macOS, the live probe and the boundary tests ran, per sandbox backends. CodeQL passed on the same ref. |
| Portable E2E | 44d11e2, the branch head |
Run, dispatched on the branch head: passed on all nine shards (Ubuntu 2, macOS 3, Windows 4). Together the shards ran all 27 E2E files once on each target, and every file passed on every target: Ubuntu 71 tests passed and 1 skipped, macOS 71 and 1, Windows 70 and 2 (tests gated to another platform skip; the one skipped in governance on Ubuntu and macOS is the Windows-only refusal). managed-clean-machine ran its whole flow on each target in the live platform store; its sandboxed commands ran under bubblewrap on Ubuntu and under Seatbelt on macOS, and on Windows it ran none (unavailable). |
| Reference E2E | 3e935a5 |
Run on Ubuntu 24.04 with Docker 28.0.4, bubblewrap 0.9.0, and the Linux Secret Service: passed, the stack job and all four test groups (78 tests passed, 1 skipped: the Live provider test skips itself without its provider variables). The groups ran the AcmeCode flow, user switching, sign-in security cases against Keycloak, gateway evidence, usage continuity, budgets, rate limits, and the reference sandbox. 44d11e2 differs from 3e935a5 only in two test files that Reference E2E does not run (packages/pi/src/launch/session-file.test.ts and tests/e2e/personal-lifecycle.test.ts), so the run is cited for 44d11e2 on that ground and is otherwise evidence for 3e935a5. |
| Live qualification of E2B, CubeSandbox, and Kubernetes Agent Sandbox | none | unavailable: no service, account, or cluster was available (external backends). |
| Live provider | none | Not recorded for this candidate; the first runs are recorded after v0.7.1. |
| First production consumer's managed path | none | open: collected downstream, see distribution qualification. |
| Release qualification | ee8b4a9 (candidate) |
Run, dispatched manually on the exact commit: CI (check on Ubuntu, macOS, and Windows), CodeQL, Portable E2E (all nine shards: Ubuntu 2, macOS 3, Windows 4), Reference E2E (the stack job and all four test groups), and Release candidate passed. The Release candidate built the demo company (acmecode) and the personal example (mypi) twice per target, and each distribution passed reproducibility, attestation, verification on a fresh runner with tamper rejection, and install on all three targets; the installed mypi also passed the offline --smoke and doctor. The Windows acmecode candidate is the patched variant, with the sandbox optional and its lock generated in CI (artifact contract). It does not tag, sign a channel, or publish. |
| Tier | Commit | Result |
|---|---|---|
| Fast merge gate | v0.5 03c33cf on main |
CI, Pi compatibility, Secret store, and CodeQL passed |
| Portable E2E | v0.5 03c33cf |
No run recorded |
| Portable E2E | Last head of the v0.5 pull request | Run: Ubuntu and Windows passed, macOS failed |
| Portable E2E | Earlier v0.5 pull request head (personal examples relocked) | Run: passed on all three targets |
| Release candidate | v0.5 03c33cf |
No run recorded |
| Release candidate | Last head of the v0.5 pull request | Run: passed on all three targets |
| Governance sandbox on macOS | v0.3 pull request | CI run with the Seatbelt live probe and launchd boundary test; Portable E2E passed on all three targets |
| Personal surface first qualified | v0.1 pull request | Pi compatibility run with build and installed E2E on all three targets, for the piship/v1alpha1 personal example of that time |
Product milestones and schema versions are separate. A milestone is a unit of project work; a schema version changes only when the manifest or lock format changes.
| Milestone | Theme | Manifest schema | Lock schema |
|---|---|---|---|
| v0.1 | Portable personal distribution core | piship/v1alpha1 |
piship-lock/v1alpha1 |
| v0.2 | Managed access and configuration | piship/v1alpha2 |
piship-lock/v1alpha2 |
| v0.3 | Governance and security baseline | piship/v1alpha3 |
piship-lock/v1alpha3 |
| v0.4 | Production release lifecycle | piship/v1alpha4 |
piship-lock/v1alpha4 |
| v0.5 | Gap closure across governance, access, supply chain, and the personal profile | piship/v1alpha4 (unchanged) |
piship-lock/v1alpha4 (unchanged) |
v0.6 (implemented, frozen and qualified at ab3e7f2) |
Project consolidation | piship/v1alpha4 (unchanged) |
piship-lock/v1alpha4 (unchanged) |
v0.7 (v0.7.0 at 4994eee, the squash of #165; v0.7.1 at bd4bc09, the squash of #174) |
Enterprise integration and qualification | piship/v1alpha4 (unchanged) |
piship-lock/v1alpha4 (unchanged) |
v0.8 (v0.8.0 at 8550282, the squash of #193; v0.8.1 at d069104, the squash of #203) |
Pre-production trust and validation hardening | piship/v1alpha5 |
piship-lock/v1alpha5 |
v0.9 (v0.9.0 at ff3c382, the squash of #209; v0.9.1 at a97ba43, the squash of #215) |
Pi 1.x-native governance | piship/v1alpha6 |
piship-lock/v1alpha6 |
| v0.10 (never published; shipped inside v0.11.0) | Portability and Windows hot-path performance | piship/v1alpha6 (unchanged) |
piship-lock/v1alpha6 (unchanged) |
v0.11 (v0.11.0 at d4f740f, the squash of #237; v0.10.0 never published) |
Runtime footprint, Windows performance, stable v1 contracts, production readiness | piship/v1 (stable; v1alpha6 accepted for the migration window) |
piship-lock/v1 (stable; v1alpha6 read) |
v0.12 (v0.12.0 at 8d40a68, the squash of #246; the version change is #245) |
Install to daily use: fewer crashes, dead ends, and repeated prompts | piship/v1 (unchanged) |
piship-lock/v1 (unchanged) |
v0.13 (v0.13.0 at 7f9e167, the squash of #255, which is also the version change) |
Subagents through the governed launcher, TypeScript Pi package transpilation, Pi 1.1.0 | piship/v1 (unchanged; optional pretranspile field) |
piship-lock/v1 (unchanged; records pretranspile) |
All seven manifest schemas are accepted. piship/v1 is stable and freezes the semantics of piship/v1alpha6; the six alpha schemas are experimental, kept for the migration window. Only piship/v1alpha5, piship/v1alpha6, and piship/v1 can build a release, and piship migrate takes an older manifest step by step to v1 (migration). Every example uses piship/v1. The schema details live in manifest; the history lives in the changelog; what comes next is in the roadmap.