diff --git a/.github/workflows/publish-crates.yml b/.github/workflows/publish-crates.yml
index 19ae72d..d7455ad 100644
--- a/.github/workflows/publish-crates.yml
+++ b/.github/workflows/publish-crates.yml
@@ -48,7 +48,7 @@ jobs:
- name: Mint a short-lived crates.io token
id: crates
- uses: rust-lang/crates-io-auth-action@82864bf380abd3e242c564a5ba58dd29d6265b00
+ uses: rust-lang/crates-io-auth-action@c6f97d42243bad5fab37ca0427f495c86d5b1a18 # v1.0.5
- name: Publish codex-setup-system
env:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7011487..008831d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,17 @@ cut and that this clone does not carry.
## [Unreleased]
+## [0.0.67] - 2026-09-07
+
+nddev-builder creates complete native tool collections: select and author
+components, compose exact setups across declared roots, document capabilities,
+and verify installation, native invocation and recovery. Provider maintenance
+checks are separate from ordinary setup authoring. The toolkit includes the
+consumer's exact digest-approval steps and preserves the active environment.
+Product artifacts are refreshed from verified vendor bytes, with previous
+pins retained for rollback. Release authentication uses the tagged upstream
+action release.
+
## [0.0.66] - 2026-09-07
Reset is an optional protocol operation: it empties declared native
diff --git a/Cargo.lock b/Cargo.lock
index 952606f..5d4bdc5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -25,7 +25,7 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "codex-setup-system"
-version = "0.0.66"
+version = "0.0.67"
dependencies = [
"harness-runtime",
"provider-v3",
@@ -76,7 +76,7 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "harness-runtime"
-version = "0.0.66"
+version = "0.0.67"
dependencies = [
"provider-v3",
"serde",
@@ -147,7 +147,7 @@ dependencies = [
[[package]]
name = "provider-v3"
-version = "0.0.66"
+version = "0.0.67"
dependencies = [
"serde",
"serde_json",
@@ -209,7 +209,7 @@ dependencies = [
[[package]]
name = "setup-core"
-version = "0.0.66"
+version = "0.0.67"
dependencies = [
"miniz_oxide",
"serde",
diff --git a/Cargo.toml b/Cargo.toml
index e8ce7f9..2b079c6 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -8,7 +8,7 @@ members = [
]
[workspace.package]
-version = "0.0.66"
+version = "0.0.67"
edition = "2024"
rust-version = "1.89"
license = "AGPL-3.0-or-later"
@@ -23,9 +23,9 @@ sha2 = "0.11"
# `setup-core::archive`); an inflate loop is not, because its bugs are
# memory-safety bugs and it is not improved by being hand-written here.
miniz_oxide = "0.9"
-setup-core = { path = "crates/setup-core", version = "0.0.66" }
-provider-v3 = { path = "crates/provider-v3", version = "0.0.66" }
-harness-runtime = { path = "crates/harness-runtime", version = "0.0.66" }
+setup-core = { path = "crates/setup-core", version = "0.0.67" }
+provider-v3 = { path = "crates/provider-v3", version = "0.0.67" }
+harness-runtime = { path = "crates/harness-runtime", version = "0.0.67" }
[workspace.lints.rust]
unsafe_code = "forbid"
diff --git a/README.md b/README.md
index 139dd48..da30748 100644
--- a/README.md
+++ b/README.md
@@ -179,7 +179,7 @@ release is a convenience, not the authorised copy.
```bash
docker run --rm -v "$HOME/.config:/config" \
- ghcr.io/nddev-opennetwork/codex-setup-system:0.0.66 \
+ ghcr.io/nddev-opennetwork/codex-setup-system:0.0.67 \
status --target /config/
--json
```
diff --git a/crates/codex-setup-system/src/software.rs b/crates/codex-setup-system/src/software.rs
index 6cc38b2..51384ed 100644
--- a/crates/codex-setup-system/src/software.rs
+++ b/crates/codex-setup-system/src/software.rs
@@ -20,103 +20,103 @@ use harness_runtime::{Artifact, Delivery, Previous, Shape, Software};
pub(crate) const ARTIFACTS: &[Artifact] = &[
Artifact {
platform: "linux/arm64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-linux-arm64.tgz",
- bytes: 121_675_259,
- sha256: "sha256:df2f8f764bf86aeae51d71cc37686dcbd2c24e4bce9a9d1e8f249141fd99fac3",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-linux-arm64.tgz",
+ bytes: 121_707_000,
+ sha256: "sha256:439c0dd0d6923f607b4e5cd1e3079c12f0b86f6e5007f07e377d6ad25e2d7bb9",
shape: Shape::GzipTar,
member: "package/vendor/aarch64-unknown-linux-musl/bin/codex",
},
Artifact {
platform: "linux/x86_64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-linux-x64.tgz",
- bytes: 129_259_793,
- sha256: "sha256:1fd52113294979c9936a110cab7cb9d5e9d1e28086f112fd6748a05826a9e5a0",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-linux-x64.tgz",
+ bytes: 129_272_137,
+ sha256: "sha256:54818cb9fce3360cc6e44cfc5a96952cd5c1243efb43cbe488e11dda84663e08",
shape: Shape::GzipTar,
member: "package/vendor/x86_64-unknown-linux-musl/bin/codex",
},
Artifact {
platform: "macos/arm64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-darwin-arm64.tgz",
- bytes: 115_669_249,
- sha256: "sha256:151ecdd90b96af823a2828146bff056c8a5f42d2ab4da63a198fe8a4ad84990b",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-darwin-arm64.tgz",
+ bytes: 115_672_312,
+ sha256: "sha256:535d301b49131abfda3264f959fb0defa40bbc306976d98ddbc15c424636c55c",
shape: Shape::GzipTar,
member: "package/vendor/aarch64-apple-darwin/bin/codex",
},
Artifact {
platform: "macos/x86_64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-darwin-x64.tgz",
- bytes: 123_497_670,
- sha256: "sha256:ec139bb87cdd25d8038069cef7ff2bdd2d119c7fcf0ac6e26dcc1020573cd112",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-darwin-x64.tgz",
+ bytes: 123_544_033,
+ sha256: "sha256:5e468958503c60e940b1b1af3fe2064c16fd141f1607111caf99f2c0a0e80725",
shape: Shape::GzipTar,
member: "package/vendor/x86_64-apple-darwin/bin/codex",
},
Artifact {
platform: "windows/arm64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-win32-arm64.tgz",
- bytes: 132_143_077,
- sha256: "sha256:71ba906090143a310354ae5c864d5c677e05842b373cadcf84ef2872f8ddcfa1",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-win32-arm64.tgz",
+ bytes: 132_173_674,
+ sha256: "sha256:6d0bf07e04810f0ed4ad2984f6c9f0547bb9e0e1bb1f8fe9ecce0de3376bbfef",
shape: Shape::GzipTar,
member: "package/vendor/aarch64-pc-windows-msvc/bin/codex.exe",
},
Artifact {
platform: "windows/x86_64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-win32-x64.tgz",
- bytes: 141_510_231,
- sha256: "sha256:e674587ea13f7051aeae697b1425ec028a236f54fa1dd1a15661ef7c063f2874",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-win32-x64.tgz",
+ bytes: 141_495_386,
+ sha256: "sha256:05f473573f38b3f4dc9484e6807a511a1bb0e128dfa50816dafc5f79e553cdca",
shape: Shape::GzipTar,
member: "package/vendor/x86_64-pc-windows-msvc/bin/codex.exe",
},
];
-/// The artifacts 0.153.1 was published as, kept so
+/// The artifacts 0.153.2 was published as, kept so
/// `software_update` has a version to move from and `rollback` a tree to
/// return to. Measured from bytes when it was the current pin.
pub(crate) const PREVIOUS_ARTIFACTS: &[Artifact] = &[
Artifact {
platform: "linux/arm64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-linux-arm64.tgz",
- bytes: 121_697_093,
- sha256: "sha256:3e050251b40b334e74a27c52128b86f8468fa8242d5c8205b04f4b31f85690f7",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-linux-arm64.tgz",
+ bytes: 121_675_259,
+ sha256: "sha256:df2f8f764bf86aeae51d71cc37686dcbd2c24e4bce9a9d1e8f249141fd99fac3",
shape: Shape::GzipTar,
member: "package/vendor/aarch64-unknown-linux-musl/bin/codex",
},
Artifact {
platform: "linux/x86_64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-linux-x64.tgz",
- bytes: 129_241_027,
- sha256: "sha256:33b4ae16df4530361a651bc1540ae8de325ccc789622a812c94585bdf205f7f4",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-linux-x64.tgz",
+ bytes: 129_259_793,
+ sha256: "sha256:1fd52113294979c9936a110cab7cb9d5e9d1e28086f112fd6748a05826a9e5a0",
shape: Shape::GzipTar,
member: "package/vendor/x86_64-unknown-linux-musl/bin/codex",
},
Artifact {
platform: "macos/arm64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-darwin-arm64.tgz",
- bytes: 115_673_114,
- sha256: "sha256:33babfe9db041ff18100775bf34df673c1baf9a5d7b1d09fdcafefc58501aa87",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-darwin-arm64.tgz",
+ bytes: 115_669_249,
+ sha256: "sha256:151ecdd90b96af823a2828146bff056c8a5f42d2ab4da63a198fe8a4ad84990b",
shape: Shape::GzipTar,
member: "package/vendor/aarch64-apple-darwin/bin/codex",
},
Artifact {
platform: "macos/x86_64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-darwin-x64.tgz",
- bytes: 123_566_510,
- sha256: "sha256:bafcac30746296be53a183ff907b9ae59cef9f8e65fa511abcb7661bd247bf80",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-darwin-x64.tgz",
+ bytes: 123_497_670,
+ sha256: "sha256:ec139bb87cdd25d8038069cef7ff2bdd2d119c7fcf0ac6e26dcc1020573cd112",
shape: Shape::GzipTar,
member: "package/vendor/x86_64-apple-darwin/bin/codex",
},
Artifact {
platform: "windows/arm64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-win32-arm64.tgz",
- bytes: 132_174_290,
- sha256: "sha256:5ee2fab96e2ba898ea7e4c0c8f4222f4dfd08d0ea9b4c9b849323ebb1e90ef14",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-win32-arm64.tgz",
+ bytes: 132_143_077,
+ sha256: "sha256:71ba906090143a310354ae5c864d5c677e05842b373cadcf84ef2872f8ddcfa1",
shape: Shape::GzipTar,
member: "package/vendor/aarch64-pc-windows-msvc/bin/codex.exe",
},
Artifact {
platform: "windows/x86_64",
- url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-win32-x64.tgz",
- bytes: 141_469_181,
- sha256: "sha256:fa9e2ac23e905fdcba1fb4f396c57da65fac04c1a3ee4eebbbb85b5ad6b2dc10",
+ url: "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-win32-x64.tgz",
+ bytes: 141_510_231,
+ sha256: "sha256:e674587ea13f7051aeae697b1425ec028a236f54fa1dd1a15661ef7c063f2874",
shape: Shape::GzipTar,
member: "package/vendor/x86_64-pc-windows-msvc/bin/codex.exe",
},
@@ -124,12 +124,12 @@ pub(crate) const PREVIOUS_ARTIFACTS: &[Artifact] = &[
/// Codex's program, and where its bytes come from.
pub(crate) const SOFTWARE: Software = Software {
- version: "0.153.2",
+ version: "0.153.4",
command: "codex",
delivery: Delivery::Artifacts(ARTIFACTS),
unsupported: &[],
previous: Some(Previous {
- version: "0.153.1",
+ version: "0.153.2",
artifacts: PREVIOUS_ARTIFACTS,
}),
};
diff --git a/install.ps1 b/install.ps1
index 091ede4..eed8399 100644
--- a/install.ps1
+++ b/install.ps1
@@ -7,7 +7,7 @@
# powershell -ExecutionPolicy Bypass -File install.ps1 -Version 0.1.0
[CmdletBinding()]
param(
- [string]$Version = "0.0.66",
+ [string]$Version = "0.0.67",
[string]$InstallDir = "$env:LOCALAPPDATA\Programs\codex-setup-system"
)
$ErrorActionPreference = "Stop"
diff --git a/install.sh b/install.sh
index 7e1f9d9..155a056 100644
--- a/install.sh
+++ b/install.sh
@@ -14,7 +14,7 @@ set -eu
REPO="NDDev-OpenNetwork/codex-setup-system"
BINARY="codex-setup-system"
-VERSION="${1:-0.0.66}"
+VERSION="${1:-0.0.67}"
PREFIX="${CODEX_INSTALL_DIR:-$HOME/.local/bin}"
case "$(uname -s)" in
diff --git a/references/codex-baseline.json b/references/codex-baseline.json
index 41364d4..a006192 100644
--- a/references/codex-baseline.json
+++ b/references/codex-baseline.json
@@ -21,12 +21,12 @@
"desktop_documented_product": "ChatGPT",
"desktop_pinned_cli_packaging": "Codex.app/Codex.dmg",
"installer_asset": "install.sh",
- "installer_release": "rust-v0.153.2",
- "installed_version": "0.153.2",
+ "installer_release": "rust-v0.153.4",
+ "installed_version": "0.153.4",
"standalone_layout": "packages/standalone"
},
"verified_version_ref": "build/version.json:codex_cli_tested",
- "verified_at": "2026-09-04T13:31:03+00:00",
+ "verified_at": "2026-09-07T03:12:33+00:00",
"native_surfaces": {
"verified_at": "2026-08-31",
"config_home": "~/.codex",
@@ -212,89 +212,89 @@
"shape": "gzip-tar",
"platforms": {
"linux/arm64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-linux-arm64.tgz",
- "bytes": 121675259,
- "sha256": "sha256:df2f8f764bf86aeae51d71cc37686dcbd2c24e4bce9a9d1e8f249141fd99fac3",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-linux-arm64.tgz",
+ "bytes": 121707000,
+ "sha256": "sha256:439c0dd0d6923f607b4e5cd1e3079c12f0b86f6e5007f07e377d6ad25e2d7bb9",
"member": "package/vendor/aarch64-unknown-linux-musl/bin/codex"
},
"linux/x86_64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-linux-x64.tgz",
- "bytes": 129259793,
- "sha256": "sha256:1fd52113294979c9936a110cab7cb9d5e9d1e28086f112fd6748a05826a9e5a0",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-linux-x64.tgz",
+ "bytes": 129272137,
+ "sha256": "sha256:54818cb9fce3360cc6e44cfc5a96952cd5c1243efb43cbe488e11dda84663e08",
"member": "package/vendor/x86_64-unknown-linux-musl/bin/codex"
},
"macos/arm64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-darwin-arm64.tgz",
- "bytes": 115669249,
- "sha256": "sha256:151ecdd90b96af823a2828146bff056c8a5f42d2ab4da63a198fe8a4ad84990b",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-darwin-arm64.tgz",
+ "bytes": 115672312,
+ "sha256": "sha256:535d301b49131abfda3264f959fb0defa40bbc306976d98ddbc15c424636c55c",
"member": "package/vendor/aarch64-apple-darwin/bin/codex"
},
"macos/x86_64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-darwin-x64.tgz",
- "bytes": 123497670,
- "sha256": "sha256:ec139bb87cdd25d8038069cef7ff2bdd2d119c7fcf0ac6e26dcc1020573cd112",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-darwin-x64.tgz",
+ "bytes": 123544033,
+ "sha256": "sha256:5e468958503c60e940b1b1af3fe2064c16fd141f1607111caf99f2c0a0e80725",
"member": "package/vendor/x86_64-apple-darwin/bin/codex"
},
"windows/arm64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-win32-arm64.tgz",
- "bytes": 132143077,
- "sha256": "sha256:71ba906090143a310354ae5c864d5c677e05842b373cadcf84ef2872f8ddcfa1",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-win32-arm64.tgz",
+ "bytes": 132173674,
+ "sha256": "sha256:6d0bf07e04810f0ed4ad2984f6c9f0547bb9e0e1bb1f8fe9ecce0de3376bbfef",
"member": "package/vendor/aarch64-pc-windows-msvc/bin/codex.exe"
},
"windows/x86_64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-win32-x64.tgz",
- "bytes": 141510231,
- "sha256": "sha256:e674587ea13f7051aeae697b1425ec028a236f54fa1dd1a15661ef7c063f2874",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.4-win32-x64.tgz",
+ "bytes": 141495386,
+ "sha256": "sha256:05f473573f38b3f4dc9484e6807a511a1bb0e128dfa50816dafc5f79e553cdca",
"member": "package/vendor/x86_64-pc-windows-msvc/bin/codex.exe"
}
},
- "version": "0.153.2",
- "verified_at": "2026-09-04T13:31:03+00:00"
+ "version": "0.153.4",
+ "verified_at": "2026-09-07T03:12:33+00:00"
},
- "setup_catalogue_digest": "sha256:0852dd75a463902a650b910fed85ce0bfe33c4fae26039f150224fb227a96bdb",
+ "setup_catalogue_digest": "sha256:58465e95466a2f0f5572d5807512e32445e9e40f16eb1ded9f815213cca1d6d7",
"previous_software_artifacts": {
"command": "codex",
"shape": "gzip-tar",
"platforms": {
"linux/arm64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-linux-arm64.tgz",
- "bytes": 121697093,
- "sha256": "sha256:3e050251b40b334e74a27c52128b86f8468fa8242d5c8205b04f4b31f85690f7",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-linux-arm64.tgz",
+ "bytes": 121675259,
+ "sha256": "sha256:df2f8f764bf86aeae51d71cc37686dcbd2c24e4bce9a9d1e8f249141fd99fac3",
"member": "package/vendor/aarch64-unknown-linux-musl/bin/codex"
},
"linux/x86_64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-linux-x64.tgz",
- "bytes": 129241027,
- "sha256": "sha256:33b4ae16df4530361a651bc1540ae8de325ccc789622a812c94585bdf205f7f4",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-linux-x64.tgz",
+ "bytes": 129259793,
+ "sha256": "sha256:1fd52113294979c9936a110cab7cb9d5e9d1e28086f112fd6748a05826a9e5a0",
"member": "package/vendor/x86_64-unknown-linux-musl/bin/codex"
},
"macos/arm64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-darwin-arm64.tgz",
- "bytes": 115673114,
- "sha256": "sha256:33babfe9db041ff18100775bf34df673c1baf9a5d7b1d09fdcafefc58501aa87",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-darwin-arm64.tgz",
+ "bytes": 115669249,
+ "sha256": "sha256:151ecdd90b96af823a2828146bff056c8a5f42d2ab4da63a198fe8a4ad84990b",
"member": "package/vendor/aarch64-apple-darwin/bin/codex"
},
"macos/x86_64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-darwin-x64.tgz",
- "bytes": 123566510,
- "sha256": "sha256:bafcac30746296be53a183ff907b9ae59cef9f8e65fa511abcb7661bd247bf80",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-darwin-x64.tgz",
+ "bytes": 123497670,
+ "sha256": "sha256:ec139bb87cdd25d8038069cef7ff2bdd2d119c7fcf0ac6e26dcc1020573cd112",
"member": "package/vendor/x86_64-apple-darwin/bin/codex"
},
"windows/arm64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-win32-arm64.tgz",
- "bytes": 132174290,
- "sha256": "sha256:5ee2fab96e2ba898ea7e4c0c8f4222f4dfd08d0ea9b4c9b849323ebb1e90ef14",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-win32-arm64.tgz",
+ "bytes": 132143077,
+ "sha256": "sha256:71ba906090143a310354ae5c864d5c677e05842b373cadcf84ef2872f8ddcfa1",
"member": "package/vendor/aarch64-pc-windows-msvc/bin/codex.exe"
},
"windows/x86_64": {
- "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.1-win32-x64.tgz",
- "bytes": 141469181,
- "sha256": "sha256:fa9e2ac23e905fdcba1fb4f396c57da65fac04c1a3ee4eebbbb85b5ad6b2dc10",
+ "url": "https://registry.npmjs.org/@openai/codex/-/codex-0.153.2-win32-x64.tgz",
+ "bytes": 141510231,
+ "sha256": "sha256:e674587ea13f7051aeae697b1425ec028a236f54fa1dd1a15661ef7c063f2874",
"member": "package/vendor/x86_64-pc-windows-msvc/bin/codex.exe"
}
},
- "version": "0.153.1",
- "verified_at": "2026-09-03T22:15:16+00:00"
+ "version": "0.153.2",
+ "verified_at": "2026-09-04T13:31:03+00:00"
},
"capability_features": {
"measured_at": "2026-08-30",
diff --git a/setups/nddev-builder/home/agents/nddev-builder.toml b/setups/nddev-builder/home/agents/nddev-builder.toml
index 4bbbaed..4c0a72d 100644
--- a/setups/nddev-builder/home/agents/nddev-builder.toml
+++ b/setups/nddev-builder/home/agents/nddev-builder.toml
@@ -3,18 +3,29 @@
# already names. All three keys below are required -- measured against
# the 0.151.0 binary, which refuses each by name when it is absent.
name = "nddev-builder"
-description = "Work on codex-setup-system -- change a declaration, add or revise a setup, or check a target lifecycle end to end."
+description = "Build or review a complete native tool collection for codex: select components, compose a setup, document capabilities, and verify installation and recovery."
developer_instructions = '''
-You are working inside `codex-setup-system`, one of seven NDDev setup systems
-that install a complete harness configuration and can put it back.
+Build or review a complete setup for the harness served by
+`codex-setup-system`: a native collection of tools for the user's tasks.
+Work on the explicitly delegated authoring tree, components and setup graph.
+Do not assume the user is developing the provider itself. Prefer existing
+components, fill demonstrated gaps, explain capabilities, and validate native
+discovery, installation and recovery in disposable targets.
+
+Return the setup location, component/capability inventory, exact versions and
+digests, invocation examples, checks run and remaining evidence gaps. Stay
+within delegated paths and authority. Do not mutate a live configuration or
+publish merely because an authoring task mentioned those later lifecycle steps.
Hold to these, in this order:
1. **Measure before declaring.** Run the product, read its own bytes, and only
then read its pages. Where the two disagree the product wins, and both get
written down.
-2. **Every declared path cites the source that decided it**, in
- `references/-baseline.json`. A row nobody can source comes out.
+2. **Every declared path cites its source.** In a provider implementation
+ checkout, use `references/-baseline.json`. An installed toolkit
+ uses its routed or inline references and `provider-info`; it does not assume
+ that the provider source checkout is available. An unsourced row comes out.
3. **Every declared kind is a promise of a rollback.** Declaring one the product
cannot route is a promise nothing can keep.
4. **Never weaken a check to buy green.** Observe every new guard failing on the
@@ -219,45 +230,118 @@ Each build pins two versions -- the current one and the one before it -- so an
update has somewhere to come from and a rollback somewhere to return to. A bump
moves the current pin into the second slot rather than adding a second choice.
-# The ai-stp CLI lifecycle
-
-Native install, select and restore of this provider are the lifecycle section
-of this toolkit. This page is the consumer path: author a component, compose a
-setup, install it, read it back, release an immutable version, and request
-publication.
-
-Resolve every flag from `ai-stp help --agent --json`. Do not invent options.
-Start with `ai-stp doctor --json`.
-
-## Exercise from a blank authoring directory
-
-1. **Scaffold** a real skill with `ai-stp component scaffold plan` then
- `ai-stp component scaffold apply`. Replace every draft marker before
- compose or release.
-2. **Passport.** `ai-stp component passport validate` and
- `ai-stp component skill validate` on the package directory (the directory
- with `SKILL.md` at its root), not the whole tree.
-3. **Harness semantics.** This harness's surfaces table says where the kind
- lands. Do not invent a path the declaration does not carry. Adaptations are
- those native files, not a second copy of the passport.
-4. **Compose a setup.** `ai-stp select propose` then `ai-stp select confirm`,
- or `ai-stp setup compose plan`. Confirm only the proposal just returned.
-5. **Install and read back.** `ai-stp install plan`, then `ai-stp install apply`
- with that plan's digest, then `ai-stp target status` with the same provider.
- Trust `pending_authorization`, not the apply exit code.
-6. **Immutable release.** `ai-stp component version release`.
-7. **Requested publication.** `ai-stp component publish` or
- `ai-stp setup publish plan`. Publicity is a separate user decision.
-
-## What this page does not name
-
-- Private authoring gates, repository coordinates, or unpublished tools.
-- Flags other than `ai-stp doctor --json` and `ai-stp help --agent --json`.
+# Build a complete setup with ai-stp
+
+A setup is a complete configuration of one chosen harness: a working collection
+of tools for a user outcome. It is more than one plugin or a set of unrelated
+files. Use this workflow to create a new setup, improve an existing collection,
+or recast it for another harness. Provider development is a separate task.
+
+Start with `ai-stp doctor --json` and resolve command arguments from
+`ai-stp help --agent --json` in the installed consumer. Do not invent options or
+assume a newer development command is available in a released CLI.
+
+## 1. Define the outcome and inspect existing tools
+
+Record the intended tasks, chosen harness, operating systems, installation
+scopes and the user's existing authority. Name concrete acceptance scenarios,
+such as building a tested application, reviewing a change, or maintaining an
+MCP integration. Inspect the explicitly named authoring directories with
+`ai-stp component inventory`; use `ai-stp component discover` for native
+configuration. Discovery does not adopt files or establish ownership.
+
+Build a capability inventory: the outcome each component enables, its source,
+exact version, native entry point, scope, dependencies, external accounts,
+activation needs and evidence. Reuse a suitable existing component before
+creating another. Explain overlap and omitted capabilities. Choose only the
+tools the intended tasks need; a large file count is not completeness.
+
+## 2. Author native components
+
+Use `ai-stp setup scaffold plan` / `ai-stp setup scaffold apply` for a complete
+authoring tree, or `ai-stp component scaffold plan` / `ai-stp component scaffold apply` for a missing member. Replace every draft marker with useful content.
+Keep authored sources and generated harness projections distinct.
+
+Read this harness's surfaces and per-kind references before choosing paths or
+keys. Put durable context in instructions, repeatable procedures in skills,
+external tool connections in MCP, lifecycle callbacks in hooks, and narrowly
+scoped delegation in native agents where supported. A plugin packages the
+capabilities its own harness supports; it is not itself the whole setup.
+Shared executables use the consumer's `cli` component lifecycle and are not
+slash commands. Do not create a new component kind for a descriptive category.
+
+Use `ai-stp component passport validate` for metadata and
+`ai-stp component skill validate` for a skill package. Validate the native file
+format and demonstrate discovery in the actual product separately. Passing a
+parser does not prove the harness discovers, trusts or executes the component.
+Keep credential values out of the artifact; document only required variable
+names or the product's account connection procedure.
+
+## 3. Compose one exact graph
+
+Freeze authored components with `ai-stp component version release`. Compose
+exact sources through `ai-stp setup compose plan` / `ai-stp setup compose apply`,
+or select registered components through `ai-stp select propose` /
+`ai-stp select confirm`. Apply the exact returned plan, after revalidating its
+preconditions. Inspect dependency closure, path and key conflicts, scope
+compatibility, executable prerequisites and conversion losses with the
+consumer's graph and report commands. Resolve conflicts before installation.
+
+A setup stays bound to one harness. To derive another, use `ai-stp setup recast plan` / `ai-stp setup recast apply`; inspect the destination's native files,
+semantic losses and provenance. Do not relabel the original or copy one
+harness's config into another. A shared instruction or skill format does not
+make permissions, hooks, agents or plugin manifests interchangeable.
+
+## 4. Prove the collection works
+
+Use `ai-stp eval plan` / `ai-stp eval run` for the setup's own adaptations, and
+`ai-stp eval component plan` / `ai-stp eval component run` when evaluating all
+adaptations of a component. Local static evaluation is not a security scan or
+an authenticated product run; retain those evidence distinctions.
+
+Build and review the exact bundle. For a single scope use `ai-stp install plan`,
+`ai-stp install approve` with the returned digest, then `ai-stp install apply`.
+For a setup spanning roots use `ai-stp install transaction plan`,
+`ai-stp install transaction approve`, and its matching apply/recovery commands.
+These approval commands record the exact effect already authorized by the
+task; they do not require another user question for that same effect.
+Exercise this first
+in disposable homes, targets and prefixes. Read `ai-stp target status`, diff
+and backups; an exit code alone is not a verified effect. Preserve any pending
+authorization, refusal or unknown outcome as such and follow its recovery
+path. Demonstrate restore and verify that pre-existing files survive.
+
+Run each acceptance scenario through the real harness, including one implicit
+and one explicit invocation where supported. Check missing dependencies and
+conflicting components as well as the happy path. Record the exact harness,
+provider and consumer versions, OS/architecture, artifact digests and results.
+An unavailable credential or platform is unmeasured, never a passing cell.
+
+## 5. Deliver a usable setup
+
+Write a concise setup guide with its purpose, supported tasks, component and
+capability inventory, native activation/invocation examples, required accounts,
+scope, compatibility, evidence limits, update path and backup/restore path.
+Separate built-in harness features from features supplied by this setup.
+Use current vendor documentation and the measured product version; cite the
+source for a feature claim instead of promising parity across harnesses.
+
+Use `ai-stp setup export` for a reviewable tree. For a requested publication,
+use `ai-stp component publish` or `ai-stp setup publish plan` followed by
+`ai-stp setup publish confirm` on the reviewed exact set. Preserve immutable
+versions. Task authority is separate from verification; changing an existing
+object's visibility or access rights needs the user's decision. Report what
+was created, where it is, how to invoke it, what passed and what remains
+unmeasured. Deliver authoring artifacts without modifying the running agent's
+own active configuration.
# Before Handing Off
-Run the checks this tree's CI runs, in order, and report what each one said
-rather than that it passed.
+For setup authoring, run the component validators, composition/evaluation and
+disposable product scenarios described in the ai-stp lifecycle guidance. A
+setup containing Python tools does not require a Rust provider checkout.
+
+When changing provider implementation, run that checkout's CI checks:
```bash
cargo fmt --all --check
@@ -265,7 +349,8 @@ cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
```
-If a command here is not present, say so rather than working around it.
+Report each result and any unavailable check. The cargo commands apply only
+to the provider implementation workspace.
## A lifecycle smoke test against a disposable target
@@ -290,13 +375,14 @@ before anyone types it.
## Conformance against the consumer
+Use this additional check when changing or qualifying the provider itself.
The wire surface is checked by the consumer's own runner, not by anything here.
Ask `codex-setup-system provider-info` for `harness_id`; that is the value
`--harness` takes, and it is not always the directory name.
```bash
ai-stp provider conformance --harness \
- --executable target/release/codex-setup-system \
+ --executable \
--target --protocol-version 3 --json
```
@@ -322,11 +408,14 @@ code until a checker goes quiet is not. The difference is whether the change
stands on its own merits: if the code was worse for a reason that has nothing to
do with the checker, fix it; if it was not, dismiss the finding and say why.
-## What this toolkit does not do
+## Task scope and disposable verification
-- It does not push, tag, or release.
-- It does not write a live configuration home.
-- It does not install software or start a product.
+Authoring includes creating files and running the required checks in disposable
+homes, targets and prefixes. Installing verified prerequisites and launching a
+product there are valid validation steps. Keep credentials and live state out
+of those copies. Publishing or applying to a user's live target happens only
+when the task includes that effect, through the exact reviewed lifecycle.
+Never change the running agent's active configuration in place.
# Writing this harness's configuration
@@ -454,12 +543,13 @@ Considered under this scope and not owned:
- **`AGENTS.md`** — Instructions at user level are ~/.codex/AGENTS.md, which the global scope already owns. A second copy under the convention root would be a second statement of one fact, and nothing documents Codex reading it there.
-**A setup cannot carry one of these.** A setup is installed into one
-target and its payload is relative to that target, so a component
-for this scope is installed by the consumer against that root -- not
-by a setup aimed at the configuration home. If you are looking for
-where to put one by hand, it is the path above joined to the root
-above, and nowhere under the home.
+**A complete setup may include these scoped components.** Each
+provider request still reaches one root. The consumer coordinates
+the roots with `ai-stp install transaction plan`, exact digest
+approval, apply and recovery. A shipped configuration-home preset
+cannot reach this root by nesting a path inside its home payload.
+Declare the component's actual scope and bind the matching root
+explicitly in the transaction.
**The root is shared, and that changes what removal means.** Several
products read it. Under this scope `remove`, the backup and a
@@ -493,12 +583,13 @@ Considered under this scope and not owned:
- **`AGENTS.override.md`** — This is an intentional project-local override. A setup owning it could silently suppress the shared AGENTS.md it installs.
-**A setup cannot carry one of these.** A setup is installed into one
-target and its payload is relative to that target, so a component
-for this scope is installed by the consumer against that root -- not
-by a setup aimed at the configuration home. If you are looking for
-where to put one by hand, it is the path above joined to the root
-above, and nowhere under the home.
+**A complete setup may include these scoped components.** Each
+provider request still reaches one root. The consumer coordinates
+the roots with `ai-stp install transaction plan`, exact digest
+approval, apply and recovery. A shipped configuration-home preset
+cannot reach this root by nesting a path inside its home payload.
+Declare the component's actual scope and bind the matching root
+explicitly in the transaction.
**The root is shared, and that changes what removal means.** Several
products read it. Under this scope `remove`, the backup and a
diff --git a/setups/nddev-builder/home/prompts/nddev-setup.md b/setups/nddev-builder/home/prompts/nddev-setup.md
index dacc7ec..227d21f 100644
--- a/setups/nddev-builder/home/prompts/nddev-setup.md
+++ b/setups/nddev-builder/home/prompts/nddev-setup.md
@@ -1,13 +1,14 @@
# Setup
-Add or revise a setup in this system.
+Create or improve a complete native tool collection for the user's tasks.
+Start from the builder's ai-stp lifecycle guidance: define acceptance scenarios,
+inventory existing components, select exact versions, fill missing capabilities,
+compose the graph, validate it, and deliver invocation and recovery instructions.
-Every harness offers the same three postures, and the names are the estate's
-rather than each product's so that learning them once is enough:
-
-- `baseline` — a working floor
-- `minimal` — the product's own defaults
-- `full-auto` — nothing asked, nothing sandboxed
+Ask `codex-setup-system list` for the shipped presets. Their names describe
+payload composition, not different authority levels. Read the selected payload
+and its documented policy; do not assume `minimal` means product defaults or
+that only a preset named `full-auto` supports autonomous work.
Rules a setup must satisfy, each held by a guard:
@@ -22,7 +23,8 @@ Rules a setup must satisfy, each held by a guard:
- **No two files may differ only in case.** They are one file on macOS and
Windows and two on Linux.
-Say which of these the change touches, then run this tree's checks:
+Exercise the setup's intended tasks and backup/restore in disposable targets.
+If changing provider implementation, also run this tree's checks:
```bash
cargo fmt --all --check
diff --git a/setups/nddev-builder/home/prompts/nddev-validate.md b/setups/nddev-builder/home/prompts/nddev-validate.md
index bc915f0..13d4ff1 100644
--- a/setups/nddev-builder/home/prompts/nddev-validate.md
+++ b/setups/nddev-builder/home/prompts/nddev-validate.md
@@ -1,7 +1,10 @@
# Validate
-Run everything that must pass before handing off, in order, and report what each
-one said rather than that it passed.
+For a setup, follow the builder's ai-stp lifecycle validation: native component
+checks, exact composition, evaluation, disposable install/readback/restore and
+the intended product tasks. Document capabilities and evidence gaps.
+
+For provider implementation changes, also run this checkout's checks:
```bash
cargo fmt --all --check
diff --git a/setups/nddev-builder/setup.json b/setups/nddev-builder/setup.json
index bb8c3e9..1288ae9 100644
--- a/setups/nddev-builder/setup.json
+++ b/setups/nddev-builder/setup.json
@@ -1,7 +1,7 @@
{
"schema_version": 1,
"id": "nddev-builder",
- "description": "The harness-native full-auto posture plus the NDDev builder toolkit: autonomous implementation, exact product formats, lifecycle, verification and release handoff.",
+ "description": "Build complete native tool collections: select and author components, compose exact setups, document capabilities, and verify installation and recovery with ai-stp.",
"sources": [
"https://github.com/openai/codex/blob/rust-v0.151.0/codex-rs/agent-roles/src/discovery.rs",
"https://learn.chatgpt.com/docs/agent-configuration/agents-md",