Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,3 +169,5 @@ If the user's instructions conflict with any rule in this document, ask for expl
- 2026-09-13: npm created latest on first publication despite a bootstrap tag -> Verify registry behavior, clean only a newly uploaded exact bootstrap artifact, and retain a regression for partial retries.

- 2026-09-13: Node rejects package import targets containing node_modules -> Preserve existing package import targets and validate staged tarballs through installed CLI startup before publication.

- 2026-09-13: npm accepted publication before registry metadata propagated -> Preserve the uploaded artifact identity and resume verification without republishing or rebuilding.
185 changes: 185 additions & 0 deletions docs/release/cli-publication-evidence.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
{
"verifiedAt": "2026-09-13T15:44:11.177Z",
"sourceCommit": "f2a661684af35fe6e9a3209c6f9720144e1fd423",
"artifact": {
"name": "@diffexai/diffex",
"version": "0.2.1",
"filename": "diffexai-diffex-0.2.1.tgz",
"size": 3530237,
"sha256": "64c161d63ef416f6bf116a6b35953225dc49c236ccba0ef4b88c2ac8ff4452b0",
"integrity": "sha512-ZBrTmPGnJy/C7u8DhZA/owIDELJGzPf2ujbRtZCPyvSfQEAtXGZk2C0PQ1/ctbyFKMXXpkXPlO7Asm5E/s//5g=="
},
"published": {
"name": "@diffexai/diffex",
"version": "0.2.1",
"tarball": "https://registry.npmjs.org/@diffexai/diffex/-/diffex-0.2.1.tgz",
"integrity": "sha512-ZBrTmPGnJy/C7u8DhZA/owIDELJGzPf2ujbRtZCPyvSfQEAtXGZk2C0PQ1/ctbyFKMXXpkXPlO7Asm5E/s//5g=="
},
"distTags": {
"bootstrap": "0.2.1",
"latest": "0.2.1"
},
"retired": [
{
"name": "@diffexai/diffex-agent-core",
"version": "0.2.0",
"absent": true,
"packageStatus": 404,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": []
},
{
"name": "@diffexai/diffex-ai",
"version": "0.2.0",
"absent": true,
"packageStatus": 404,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": []
},
{
"name": "@diffexai/diffex-client",
"version": "0.2.0",
"absent": true,
"packageStatus": 404,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": []
},
{
"name": "@diffexai/diffex",
"version": "0.2.0",
"absent": true,
"packageStatus": 200,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": [
"0.2.1"
]
},
{
"name": "@diffexai/diffex-coding-agent-server",
"version": "0.2.0",
"absent": true,
"packageStatus": 404,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": []
},
{
"name": "@diffexai/diffex-harness-state",
"version": "0.2.0",
"absent": true,
"packageStatus": 404,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": []
},
{
"name": "@diffexai/diffex-protocol",
"version": "0.2.0",
"absent": true,
"packageStatus": 404,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": []
},
{
"name": "@diffexai/diffex-server",
"version": "0.2.0",
"absent": true,
"packageStatus": 404,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": []
},
{
"name": "@diffexai/diffex-session-backend-sqlite-node",
"version": "0.2.0",
"absent": true,
"packageStatus": 404,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": []
},
{
"name": "@diffexai/diffex-telemetry",
"version": "0.2.0",
"absent": true,
"packageStatus": 404,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": []
},
{
"name": "@diffexai/diffex-tui",
"version": "0.2.0",
"absent": true,
"packageStatus": 404,
"versionStatus": 404,
"tarballStatus": 404,
"remainingVersions": []
}
],
"trust": {
"id": "a26ffd56-ad7f-4e22-bffa-9086e41a38fb",
"type": "github",
"file": "build-binaries.yml",
"repository": "diffexai/diffex",
"environment": "npm-publish",
"permissions": [
"createPackage",
"createStagedPackage"
]
},
"traditionalTokenPublishing": {
"command": "npm access set mfa=publish @diffexai/diffex --registry=https://registry.npmjs.org",
"exitCode": 0,
"acceptedAt": "2026-09-13T15:44:07.515Z",
"publish_requires_tfa": true,
"automation_token_overrides_tfa": false,
"verification": "Authenticated npm access command accepted; flags follow the pinned npm 11.16.0 setMfa implementation"
},
"ownerApprovedSkippingBlockedGitHubValidation": true,
"publicRegistryInstall": {
"startedAt": "2026-09-13T15:43:37.001Z",
"package": "@diffexai/diffex@0.2.1",
"registry": "https://registry.npmjs.org",
"authenticated": false,
"platform": "darwin",
"arch": "arm64",
"managers": [
{
"manager": "npm",
"version": "0.2.1",
"entrypoints": [
"@diffexai/diffex",
"@diffexai/diffex/rpc-entry",
"@diffexai/diffex/client"
],
"installedFileHashes": "passed",
"runtimeNativeWasmAndHtmlExport": "passed",
"help": "passed"
},
{
"manager": "bun",
"version": "0.2.1",
"entrypoints": [
"@diffexai/diffex",
"@diffexai/diffex/rpc-entry",
"@diffexai/diffex/client"
],
"installedFileHashes": "passed",
"runtimeNativeWasmAndHtmlExport": "passed",
"help": "passed"
}
],
"status": "passed",
"cleanup": true,
"finishedAt": "2026-09-13T15:43:48.479Z"
},
"issues": [
"npm rejected removal of latest tag"
]
}
43 changes: 29 additions & 14 deletions docs/release/publication-trust.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ At 14:20:48 UTC it confirmed both version records, the latest fixture pointer, a
It made no production write and did not publish npm packages.
This run predates the additional credential scope checks and does not claim to validate them live.

## Outstanding acceptance
## Bootstrap decisions and replacement

The owner confirmed the current `/cl` refresh and approved public bootstrap publication of `0.2.0` once validation passes.
The initial environment attempt was blocked by automatic approval review; the owner subsequently approved the exact settings and fallback, and configuration succeeded.
Expand All @@ -91,31 +91,46 @@ This failed the no-latest acceptance gate and no production announcement was mad
The CLI trusted publisher was created and read back with the exact repository, file, environment, and current npm permission pair.
The owner then requested a CLI-only distribution and approved `0.2.1` with retirement of `0.2.0`.
The replacement tarball includes seven required workspace packages plus the existing evolution and harness-trace runtime modules.
Replacement publication, old-package removal, final dist-tags, and traditional-token restrictions remain pending until their live results are retained.
The final publication and retirement results below supersede the initial eleven-package bootstrap.
No R2 production pointer or generally available release may be created by bootstrap.
These pending items prevent publication-trust acceptance from being marked complete.
Credential scope verification remains dependent on the workflow reaching `main`.

## CLI-only replacement validation

Final publication candidate `f2a661684af35fe6e9a3209c6f9720144e1fd423` packages only `@diffexai/diffex@0.2.1`.
The [local candidate evidence](cli-only-candidate-evidence.json) retains its exact tarball size, SHA-256, SHA-512, supported entrypoints, npm/Bun acceptance, terminal outcomes, and cleanup.
The source quality gate, full isolated `./test.sh` suite, package inventory regressions, and disclosure-policy rejection tests passed.
The final local tarball passed both package managers with the separate Diffex registry scope blocked.
These local bytes are not published.
These bytes were retained before publication and selected for the owner-approved replacement.

[Native run 34765040811](https://github.com/diffexai/diffex/actions/runs/34765040811) passed Darwin arm64 and both Linux targets on implementation commit `8c8d8f529`; Darwin x64 was cancelled when the final README revision was pushed.
[Final candidate run 34765173973](https://github.com/diffexai/diffex/actions/runs/34765173973) failed before executing any build command.
GitHub's job annotation reports failed account payments or an Actions spending limit and directs the owner to Billing and plans.
Rerun that retained run after the account issue is resolved so source identity remains pinned to the final candidate.
Download its private artifact, inspect its manifest and checksums, and require every native target to pass before replacement publication.
The owner subsequently explicitly approved publication without the blocked GitHub CLI validation.
The exact final local tarball recorded in `cli-only-candidate-evidence.json` was published with the incomplete native matrix retained as an owner-accepted limitation.
Future normal releases retain their native acceptance gate.
Do not substitute the earlier partial matrix or represent local validation as four-platform acceptance.

The owner approved publishing the validated replacement under `bootstrap` and retiring the original CLI `0.2.0` plus the ten separate npm packages.
The existing CLI `0.2.0` depends on those packages, so removal waits for validated replacement bytes.
Reinspect registry versions before deletion, remove dependents before dependencies, preserve `@diffexai/diffex@0.2.1`, and verify all retired versions are absent.
The existing first-registration bootstrap guard intentionally rejects established versions; this explicitly approved replacement requires the retained exact tarball command with `--access public --tag bootstrap --registry=https://registry.npmjs.org --provenance=false --ignore-scripts`.
Verify bytes and final tags, then require package publishing 2FA with tokens disallowed and inspect trust again.
No new general release tag or R2 announcement is part of this replacement.

At 15:21 UTC the production probe still returned no release on `/api/latest-version` (404), healthy Render readiness (200), and anonymous auth rejection (401).
No current R2 or Worker credential was replaced or revoked.
## Published CLI and retirement results

On 2026-09-13T15:44:11.177Z, anonymous registry verification confirmed only `@diffexai/diffex@0.2.1` remains from the approved original inventory.
The ten separate npm packages and CLI `0.2.0` were unpublished in dependency order, and every retired version endpoint returns 404 or 410.
The replacement was downloaded anonymously and matches source `f2a661684af35fe6e9a3209c6f9720144e1fd423`, SHA-256 `64c161d63ef416f6bf116a6b35953225dc49c236ccba0ef4b88c2ac8ff4452b0`, and the retained SHA-512 integrity.
Final registry inspection found `bootstrap: 0.2.1` and `latest: 0.2.1`.
The npm registry rejected removal of its automatic latest tag; the no-latest acceptance condition remains unresolved.
npm accepted `npm access set mfa=publish @diffexai/diffex`, requiring publishing 2FA and disallowing traditional token overrides.
The exact retained CLI trusted publisher was inspected again after package retirement.
Fresh anonymous npm and Bun installations passed public imports, installed-file hashes, CLI version/help, native modules, WASM, and HTML export on Darwin arm64, with isolated directories removed afterward.
The [publication evidence](cli-publication-evidence.json) retains exact identity, registry retirement results, trust, tags, and installation outcomes.
The earlier [candidate evidence](cli-only-candidate-evidence.json) describes the retained prepublication validation snapshot.
No R2 production pointer or general release announcement was created.
The production probe after publication returned missing release (404), healthy readiness (200), and anonymous auth rejection (401).

## Remaining live verification

The new production/staging credential scope checks require the companion workflow on `main` and a subsequent dispatch.
Existing environment ref restrictions were preserved.
The npm no-latest acceptance condition remains open because tag deletion was rejected.
GitHub native validation of the final candidate remains an explicitly owner-accepted exception for this replacement only.
Future normal releases retain their native validation gate.
Loading