diff --git a/.github/workflows/publish-crates.yml b/.github/workflows/publish-crates.yml
index d6dd816..3589648 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 opencode-setup-system
env:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 35f9ba1..7a5f350 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 d0cccad..8ffc326 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -66,7 +66,7 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "harness-runtime"
-version = "0.0.66"
+version = "0.0.67"
dependencies = [
"provider-v3",
"serde",
@@ -128,7 +128,7 @@ dependencies = [
[[package]]
name = "opencode-setup-system"
-version = "0.0.66"
+version = "0.0.67"
dependencies = [
"harness-runtime",
"provider-v3",
@@ -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 8979c53..18c9f0f 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 0e2932f..c7c20f4 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/opencode-setup-system:0.0.66 \
+ ghcr.io/nddev-opennetwork/opencode-setup-system:0.0.67 \
status --target /config/
--json
```
diff --git a/crates/opencode-setup-system/src/software.rs b/crates/opencode-setup-system/src/software.rs
index f26b1b3..39e5264 100644
--- a/crates/opencode-setup-system/src/software.rs
+++ b/crates/opencode-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/opencode-linux-arm64/-/opencode-linux-arm64-1.18.27.tgz",
- bytes: 59_945_385,
- sha256: "sha256:83bf3812ecad71b3a463c5c0a7ceb0dba9db96964f3e7f8ba6bf30ca138287e8",
+ url: "https://registry.npmjs.org/opencode-linux-arm64/-/opencode-linux-arm64-1.18.29.tgz",
+ bytes: 59_952_206,
+ sha256: "sha256:bbc655accf8263d44e5c668ef865520239e58bef515057bf8ecc27d006a6f28a",
shape: Shape::GzipTar,
member: "package/bin/opencode",
},
Artifact {
platform: "linux/x86_64",
- url: "https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.18.27.tgz",
- bytes: 60_168_253,
- sha256: "sha256:0aba86ba404f52e57bd154ec3565cd3e86d344743bf32e3004bf7fdbd3363ac4",
+ url: "https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.18.29.tgz",
+ bytes: 60_170_392,
+ sha256: "sha256:a2df564ba242759e3ee27cbd356da786243a3d3fd911cf5aa2c417521aef3042",
shape: Shape::GzipTar,
member: "package/bin/opencode",
},
Artifact {
platform: "macos/arm64",
- url: "https://registry.npmjs.org/opencode-darwin-arm64/-/opencode-darwin-arm64-1.18.27.tgz",
- bytes: 45_940_410,
- sha256: "sha256:dba942c12128491b7c00f5d4b395bb8d36061f293b59db501ca9b0911a701680",
+ url: "https://registry.npmjs.org/opencode-darwin-arm64/-/opencode-darwin-arm64-1.18.29.tgz",
+ bytes: 45_944_097,
+ sha256: "sha256:1fc08fee8b4984c1306c826b8c0e2c367fd9eeb4d4c3707469194e3fea047e72",
shape: Shape::GzipTar,
member: "package/bin/opencode",
},
Artifact {
platform: "macos/x86_64",
- url: "https://registry.npmjs.org/opencode-darwin-x64/-/opencode-darwin-x64-1.18.27.tgz",
- bytes: 48_115_145,
- sha256: "sha256:8e379467c2f911d5a6bb14a453b8f760e093daf8c5c6b9ee1da8f3515477e8f2",
+ url: "https://registry.npmjs.org/opencode-darwin-x64/-/opencode-darwin-x64-1.18.29.tgz",
+ bytes: 48_120_807,
+ sha256: "sha256:d9e2270b9040d7ce140df629773c68f15222c7a6c882f16921d36aa4c9200ae2",
shape: Shape::GzipTar,
member: "package/bin/opencode",
},
Artifact {
platform: "windows/arm64",
- url: "https://registry.npmjs.org/opencode-windows-arm64/-/opencode-windows-arm64-1.18.27.tgz",
- bytes: 58_397_893,
- sha256: "sha256:3da5a83466c814922fc1472ef4eef1c37cae990a1cfe1530959c83d3f5b13cda",
+ url: "https://registry.npmjs.org/opencode-windows-arm64/-/opencode-windows-arm64-1.18.29.tgz",
+ bytes: 58_399_395,
+ sha256: "sha256:ad2f4a063a6d82578edc0b37078eff76fcb2a58f6439a33c34a50e1c795512b8",
shape: Shape::GzipTar,
member: "package/bin/opencode.exe",
},
Artifact {
platform: "windows/x86_64",
- url: "https://registry.npmjs.org/opencode-windows-x64/-/opencode-windows-x64-1.18.27.tgz",
- bytes: 60_079_608,
- sha256: "sha256:d940ca3115e9a87107bb666c30c3efea88bcad1c2d34212c8deb4401a3054792",
+ url: "https://registry.npmjs.org/opencode-windows-x64/-/opencode-windows-x64-1.18.29.tgz",
+ bytes: 60_086_309,
+ sha256: "sha256:19eca6cdead9c67cce26fdc2db165980318edb7318c8c964dfc2ebffe03bb472",
shape: Shape::GzipTar,
member: "package/bin/opencode.exe",
},
];
-/// The artifacts 1.18.26 was published as, kept so
+/// The artifacts 1.18.27 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/opencode-linux-arm64/-/opencode-linux-arm64-1.18.26.tgz",
- bytes: 59_947_971,
- sha256: "sha256:5e0cc6c6c48d6629c8f5d3d5c9f9670e8dac7ba14d295801bb3f6a783a8f841b",
+ url: "https://registry.npmjs.org/opencode-linux-arm64/-/opencode-linux-arm64-1.18.27.tgz",
+ bytes: 59_945_385,
+ sha256: "sha256:83bf3812ecad71b3a463c5c0a7ceb0dba9db96964f3e7f8ba6bf30ca138287e8",
shape: Shape::GzipTar,
member: "package/bin/opencode",
},
Artifact {
platform: "linux/x86_64",
- url: "https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.18.26.tgz",
- bytes: 60_169_535,
- sha256: "sha256:990d8b07111517a78ba779709ff8f438e0dcf2a7fb66d36df7507c8e93358f02",
+ url: "https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.18.27.tgz",
+ bytes: 60_168_253,
+ sha256: "sha256:0aba86ba404f52e57bd154ec3565cd3e86d344743bf32e3004bf7fdbd3363ac4",
shape: Shape::GzipTar,
member: "package/bin/opencode",
},
Artifact {
platform: "macos/arm64",
- url: "https://registry.npmjs.org/opencode-darwin-arm64/-/opencode-darwin-arm64-1.18.26.tgz",
- bytes: 45_942_652,
- sha256: "sha256:d9c09ba039dd62f983fc66c65777910f20eead2c4e30cbff888f26d640607e15",
+ url: "https://registry.npmjs.org/opencode-darwin-arm64/-/opencode-darwin-arm64-1.18.27.tgz",
+ bytes: 45_940_410,
+ sha256: "sha256:dba942c12128491b7c00f5d4b395bb8d36061f293b59db501ca9b0911a701680",
shape: Shape::GzipTar,
member: "package/bin/opencode",
},
Artifact {
platform: "macos/x86_64",
- url: "https://registry.npmjs.org/opencode-darwin-x64/-/opencode-darwin-x64-1.18.26.tgz",
- bytes: 48_118_308,
- sha256: "sha256:dff2571b3ad3f04dff7f0555bf4e679615c1f70afb35258f139d22a491da57e3",
+ url: "https://registry.npmjs.org/opencode-darwin-x64/-/opencode-darwin-x64-1.18.27.tgz",
+ bytes: 48_115_145,
+ sha256: "sha256:8e379467c2f911d5a6bb14a453b8f760e093daf8c5c6b9ee1da8f3515477e8f2",
shape: Shape::GzipTar,
member: "package/bin/opencode",
},
Artifact {
platform: "windows/arm64",
- url: "https://registry.npmjs.org/opencode-windows-arm64/-/opencode-windows-arm64-1.18.26.tgz",
- bytes: 58_398_040,
- sha256: "sha256:419799338b25d5e62a393136c61166ddf0e78229b784daf0a9fabfb0df66eb9f",
+ url: "https://registry.npmjs.org/opencode-windows-arm64/-/opencode-windows-arm64-1.18.27.tgz",
+ bytes: 58_397_893,
+ sha256: "sha256:3da5a83466c814922fc1472ef4eef1c37cae990a1cfe1530959c83d3f5b13cda",
shape: Shape::GzipTar,
member: "package/bin/opencode.exe",
},
Artifact {
platform: "windows/x86_64",
- url: "https://registry.npmjs.org/opencode-windows-x64/-/opencode-windows-x64-1.18.26.tgz",
- bytes: 60_082_922,
- sha256: "sha256:fca4106836f9ca9d9485d010a247d0d928eecfff972b9019ff522b6ba9885934",
+ url: "https://registry.npmjs.org/opencode-windows-x64/-/opencode-windows-x64-1.18.27.tgz",
+ bytes: 60_079_608,
+ sha256: "sha256:d940ca3115e9a87107bb666c30c3efea88bcad1c2d34212c8deb4401a3054792",
shape: Shape::GzipTar,
member: "package/bin/opencode.exe",
},
@@ -124,12 +124,12 @@ pub(crate) const PREVIOUS_ARTIFACTS: &[Artifact] = &[
/// Opencode's program, and where its bytes come from.
pub(crate) const SOFTWARE: Software = Software {
- version: "1.18.27",
+ version: "1.18.29",
command: "opencode",
delivery: Delivery::Artifacts(ARTIFACTS),
unsupported: &[],
previous: Some(Previous {
- version: "1.18.26",
+ version: "1.18.27",
artifacts: PREVIOUS_ARTIFACTS,
}),
};
diff --git a/install.ps1 b/install.ps1
index fd6589a..cf07f8a 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\opencode-setup-system"
)
$ErrorActionPreference = "Stop"
diff --git a/install.sh b/install.sh
index 0618902..e7b458b 100644
--- a/install.sh
+++ b/install.sh
@@ -14,7 +14,7 @@ set -eu
REPO="NDDev-OpenNetwork/opencode-setup-system"
BINARY="opencode-setup-system"
-VERSION="${1:-0.0.66}"
+VERSION="${1:-0.0.67}"
PREFIX="${OPENCODE_INSTALL_DIR:-$HOME/.local/bin}"
case "$(uname -s)" in
diff --git a/references/opencode-baseline.json b/references/opencode-baseline.json
index 3c34f4e..10eaf3d 100644
--- a/references/opencode-baseline.json
+++ b/references/opencode-baseline.json
@@ -8,9 +8,9 @@
"minimum_version_ref": "build/version.json:opencode_min"
},
"release": {
- "github_release": "https://github.com/anomalyco/opencode/releases/tag/v1.18.27",
- "github_release_api": "https://api.github.com/repos/anomalyco/opencode/releases/tags/v1.18.27",
- "tag": "v1.18.27",
+ "github_release": "https://github.com/anomalyco/opencode/releases/tag/v1.18.29",
+ "github_release_api": "https://api.github.com/repos/anomalyco/opencode/releases/tags/v1.18.29",
+ "tag": "v1.18.29",
"cli_signature": null,
"cli_signature_note": "Official CLI zip/tar assets expose GitHub release asset SHA-256 digests but no PGP/cosign signature was published for the CLI assets."
},
@@ -109,7 +109,7 @@
"OPENCODE_DISABLE_PROJECT_CONFIG",
"OPENCODE_DISABLE_SHARE"
],
- "verified_at": "2026-09-03T14:13:03+00:00",
+ "verified_at": "2026-09-07T03:16:49+00:00",
"native_surfaces": {
"verified_at": "2026-08-31",
"config_home": "~/.config/opencode",
@@ -294,89 +294,89 @@
"shape": "gzip-tar",
"platforms": {
"linux/arm64": {
- "url": "https://registry.npmjs.org/opencode-linux-arm64/-/opencode-linux-arm64-1.18.27.tgz",
- "bytes": 59945385,
- "sha256": "sha256:83bf3812ecad71b3a463c5c0a7ceb0dba9db96964f3e7f8ba6bf30ca138287e8",
+ "url": "https://registry.npmjs.org/opencode-linux-arm64/-/opencode-linux-arm64-1.18.29.tgz",
+ "bytes": 59952206,
+ "sha256": "sha256:bbc655accf8263d44e5c668ef865520239e58bef515057bf8ecc27d006a6f28a",
"member": "package/bin/opencode"
},
"linux/x86_64": {
- "url": "https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.18.27.tgz",
- "bytes": 60168253,
- "sha256": "sha256:0aba86ba404f52e57bd154ec3565cd3e86d344743bf32e3004bf7fdbd3363ac4",
+ "url": "https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.18.29.tgz",
+ "bytes": 60170392,
+ "sha256": "sha256:a2df564ba242759e3ee27cbd356da786243a3d3fd911cf5aa2c417521aef3042",
"member": "package/bin/opencode"
},
"macos/arm64": {
- "url": "https://registry.npmjs.org/opencode-darwin-arm64/-/opencode-darwin-arm64-1.18.27.tgz",
- "bytes": 45940410,
- "sha256": "sha256:dba942c12128491b7c00f5d4b395bb8d36061f293b59db501ca9b0911a701680",
+ "url": "https://registry.npmjs.org/opencode-darwin-arm64/-/opencode-darwin-arm64-1.18.29.tgz",
+ "bytes": 45944097,
+ "sha256": "sha256:1fc08fee8b4984c1306c826b8c0e2c367fd9eeb4d4c3707469194e3fea047e72",
"member": "package/bin/opencode"
},
"macos/x86_64": {
- "url": "https://registry.npmjs.org/opencode-darwin-x64/-/opencode-darwin-x64-1.18.27.tgz",
- "bytes": 48115145,
- "sha256": "sha256:8e379467c2f911d5a6bb14a453b8f760e093daf8c5c6b9ee1da8f3515477e8f2",
+ "url": "https://registry.npmjs.org/opencode-darwin-x64/-/opencode-darwin-x64-1.18.29.tgz",
+ "bytes": 48120807,
+ "sha256": "sha256:d9e2270b9040d7ce140df629773c68f15222c7a6c882f16921d36aa4c9200ae2",
"member": "package/bin/opencode"
},
"windows/arm64": {
- "url": "https://registry.npmjs.org/opencode-windows-arm64/-/opencode-windows-arm64-1.18.27.tgz",
- "bytes": 58397893,
- "sha256": "sha256:3da5a83466c814922fc1472ef4eef1c37cae990a1cfe1530959c83d3f5b13cda",
+ "url": "https://registry.npmjs.org/opencode-windows-arm64/-/opencode-windows-arm64-1.18.29.tgz",
+ "bytes": 58399395,
+ "sha256": "sha256:ad2f4a063a6d82578edc0b37078eff76fcb2a58f6439a33c34a50e1c795512b8",
"member": "package/bin/opencode.exe"
},
"windows/x86_64": {
- "url": "https://registry.npmjs.org/opencode-windows-x64/-/opencode-windows-x64-1.18.27.tgz",
- "bytes": 60079608,
- "sha256": "sha256:d940ca3115e9a87107bb666c30c3efea88bcad1c2d34212c8deb4401a3054792",
+ "url": "https://registry.npmjs.org/opencode-windows-x64/-/opencode-windows-x64-1.18.29.tgz",
+ "bytes": 60086309,
+ "sha256": "sha256:19eca6cdead9c67cce26fdc2db165980318edb7318c8c964dfc2ebffe03bb472",
"member": "package/bin/opencode.exe"
}
},
- "version": "1.18.27",
- "verified_at": "2026-09-03T14:13:03+00:00"
+ "version": "1.18.29",
+ "verified_at": "2026-09-07T03:16:49+00:00"
},
- "setup_catalogue_digest": "sha256:6674be4f91b673d6ec1b3633713132ccf86da90e7ea280976d66e538212ccd57",
+ "setup_catalogue_digest": "sha256:637cc0372e587d7360dd8542554f59d8aa464af96475587cbecdaba7c36093ac",
"previous_software_artifacts": {
"command": "opencode",
"shape": "gzip-tar",
"platforms": {
"linux/arm64": {
- "url": "https://registry.npmjs.org/opencode-linux-arm64/-/opencode-linux-arm64-1.18.26.tgz",
- "bytes": 59947971,
- "sha256": "sha256:5e0cc6c6c48d6629c8f5d3d5c9f9670e8dac7ba14d295801bb3f6a783a8f841b",
+ "url": "https://registry.npmjs.org/opencode-linux-arm64/-/opencode-linux-arm64-1.18.27.tgz",
+ "bytes": 59945385,
+ "sha256": "sha256:83bf3812ecad71b3a463c5c0a7ceb0dba9db96964f3e7f8ba6bf30ca138287e8",
"member": "package/bin/opencode"
},
"linux/x86_64": {
- "url": "https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.18.26.tgz",
- "bytes": 60169535,
- "sha256": "sha256:990d8b07111517a78ba779709ff8f438e0dcf2a7fb66d36df7507c8e93358f02",
+ "url": "https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.18.27.tgz",
+ "bytes": 60168253,
+ "sha256": "sha256:0aba86ba404f52e57bd154ec3565cd3e86d344743bf32e3004bf7fdbd3363ac4",
"member": "package/bin/opencode"
},
"macos/arm64": {
- "url": "https://registry.npmjs.org/opencode-darwin-arm64/-/opencode-darwin-arm64-1.18.26.tgz",
- "bytes": 45942652,
- "sha256": "sha256:d9c09ba039dd62f983fc66c65777910f20eead2c4e30cbff888f26d640607e15",
+ "url": "https://registry.npmjs.org/opencode-darwin-arm64/-/opencode-darwin-arm64-1.18.27.tgz",
+ "bytes": 45940410,
+ "sha256": "sha256:dba942c12128491b7c00f5d4b395bb8d36061f293b59db501ca9b0911a701680",
"member": "package/bin/opencode"
},
"macos/x86_64": {
- "url": "https://registry.npmjs.org/opencode-darwin-x64/-/opencode-darwin-x64-1.18.26.tgz",
- "bytes": 48118308,
- "sha256": "sha256:dff2571b3ad3f04dff7f0555bf4e679615c1f70afb35258f139d22a491da57e3",
+ "url": "https://registry.npmjs.org/opencode-darwin-x64/-/opencode-darwin-x64-1.18.27.tgz",
+ "bytes": 48115145,
+ "sha256": "sha256:8e379467c2f911d5a6bb14a453b8f760e093daf8c5c6b9ee1da8f3515477e8f2",
"member": "package/bin/opencode"
},
"windows/arm64": {
- "url": "https://registry.npmjs.org/opencode-windows-arm64/-/opencode-windows-arm64-1.18.26.tgz",
- "bytes": 58398040,
- "sha256": "sha256:419799338b25d5e62a393136c61166ddf0e78229b784daf0a9fabfb0df66eb9f",
+ "url": "https://registry.npmjs.org/opencode-windows-arm64/-/opencode-windows-arm64-1.18.27.tgz",
+ "bytes": 58397893,
+ "sha256": "sha256:3da5a83466c814922fc1472ef4eef1c37cae990a1cfe1530959c83d3f5b13cda",
"member": "package/bin/opencode.exe"
},
"windows/x86_64": {
- "url": "https://registry.npmjs.org/opencode-windows-x64/-/opencode-windows-x64-1.18.26.tgz",
- "bytes": 60082922,
- "sha256": "sha256:fca4106836f9ca9d9485d010a247d0d928eecfff972b9019ff522b6ba9885934",
+ "url": "https://registry.npmjs.org/opencode-windows-x64/-/opencode-windows-x64-1.18.27.tgz",
+ "bytes": 60079608,
+ "sha256": "sha256:d940ca3115e9a87107bb666c30c3efea88bcad1c2d34212c8deb4401a3054792",
"member": "package/bin/opencode.exe"
}
},
- "version": "1.18.26",
- "verified_at": "2026-09-02T00:40:45+00:00"
+ "version": "1.18.27",
+ "verified_at": "2026-09-03T14:13:03+00:00"
},
"source_verified_runtime_flags_note": "All five read out of the 1.18.25 binary on 2026-08-31 -- the whole `OPENCODE_*` set is in its string table, and these are the five this provider has a reason to name. **Nothing in this repository read this block until now.** It is the same shape as the `windows` row that sat under `unsupported` for weeks while this provider installed Windows: a true-when-written list with no reader, which is the condition a stale fact needs. `native_declaration_names_the_switch_it_sets` now ties `updates_off_env` to this list, so the declaration and the measurement cannot drift apart in silence.",
"surface_presence": {
diff --git a/setups/nddev-builder/home/agents/nddev-builder.md b/setups/nddev-builder/home/agents/nddev-builder.md
index 75540dc..887fb77 100644
--- a/setups/nddev-builder/home/agents/nddev-builder.md
+++ b/setups/nddev-builder/home/agents/nddev-builder.md
@@ -1,18 +1,29 @@
---
name: nddev-builder
-description: Work on opencode-setup-system -- change a declaration, add or revise a setup, or check a target's lifecycle end to end for opencode.
+description: Build or review a complete opencode tool collection -- select and author native components, compose an exact setup, document capabilities, and prove installation and recovery through opencode-setup-system.
---
-You are working inside `opencode-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
+`opencode-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
diff --git a/setups/nddev-builder/home/commands/nddev-setup.md b/setups/nddev-builder/home/commands/nddev-setup.md
index dacc7ec..8b9cab8 100644
--- a/setups/nddev-builder/home/commands/nddev-setup.md
+++ b/setups/nddev-builder/home/commands/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 `opencode-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/commands/nddev-validate.md b/setups/nddev-builder/home/commands/nddev-validate.md
index d147f1d..8d213c2 100644
--- a/setups/nddev-builder/home/commands/nddev-validate.md
+++ b/setups/nddev-builder/home/commands/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/home/skills/nddev-builder/SKILL.md b/setups/nddev-builder/home/skills/nddev-builder/SKILL.md
index 43ff39c..19be475 100644
--- a/setups/nddev-builder/home/skills/nddev-builder/SKILL.md
+++ b/setups/nddev-builder/home/skills/nddev-builder/SKILL.md
@@ -1,30 +1,36 @@
---
name: nddev-builder
-description: Build, review or validate a opencode setup for opencode-setup-system -- its owned surfaces, the components it carries, the lifecycle it performs, and the checks it must pass. Use when changing opencode-setup-system or the native artifacts a setup writes.
+description: Create, improve or review a complete opencode setup -- a native collection of tools for the user's tasks. Use for selecting and authoring components, composing setups, explaining their capabilities, adapting them to this harness, and validating installation and recovery through opencode-setup-system.
---
# NDDev Builder
-The entry point for work on `opencode-setup-system`. Keep changes
-target-explicit, reversible, and backed by this tree's checks.
+Build a complete native tool collection for the user's tasks. Start with
+`references/ai-stp-lifecycle.md` for outcome, component selection, composition,
+evaluation, installation and delivery. Keep changes target-explicit and
+reversible. The provider's implementation is changed only when that is the task.
## Workflow
-1. **Name the surface being changed**, and check this harness actually owns it:
+1. **Name the user outcome and required capabilities.** Inventory and reuse
+ existing components, then compose one setup for this harness through
+ `references/ai-stp-lifecycle.md`.
+2. **Name the surface being changed**, and check this harness actually owns it:
`references/surfaces.md`, which is generated from the baseline rather than
written beside it.
-2. **Prefer what the program answers over a copy of it.** Ask the binary:
+3. **Prefer what the program answers over a copy of it.** Ask the binary:
`list`, `status --target `, `provider-info`. In a checkout, read
`crates/opencode-setup-system/src/main.rs` and the baseline a test binds it to.
-3. **Declare against the vendor, never against a routing table.** A path with no
+4. **Declare against the vendor, never against a routing table.** A path with no
page behind it is a false statement in `provider-info`, and the consumer
plans postconditions and target identity from that statement.
-4. **A declaration can refute a route and cannot confirm one.** Reading finds a
+5. **A declaration can refute a route and cannot confirm one.** Reading finds a
directory; only running the product says what it is read *as*. Where a run is
impossible, confirm at the line in the product's own code -- a path literal
alone is not evidence that the path is used.
-5. **Run the checks in `references/validation.md`**, and report what each one
- said rather than that it passed.
+6. **Exercise the setup's acceptance scenarios and recovery.** For provider
+ implementation changes also run `references/validation.md`. Report observed
+ results, exact versions and unmeasured cases.
## Routing
diff --git a/setups/nddev-builder/home/skills/nddev-builder/references/ai-stp-lifecycle.md b/setups/nddev-builder/home/skills/nddev-builder/references/ai-stp-lifecycle.md
index e658e0e..b5e235a 100644
--- a/setups/nddev-builder/home/skills/nddev-builder/references/ai-stp-lifecycle.md
+++ b/setups/nddev-builder/home/skills/nddev-builder/references/ai-stp-lifecycle.md
@@ -1,34 +1,104 @@
-# 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.
diff --git a/setups/nddev-builder/home/skills/nddev-builder/references/second-target.md b/setups/nddev-builder/home/skills/nddev-builder/references/second-target.md
index cdc4706..11961f6 100644
--- a/setups/nddev-builder/home/skills/nddev-builder/references/second-target.md
+++ b/setups/nddev-builder/home/skills/nddev-builder/references/second-target.md
@@ -26,12 +26,13 @@ The one root in this estate that belongs to a convention rather than to a produc
Relative to this scope's own root the path is `skills`, not `.agents/skills`: the root is what the scope names, and writing it into the path again would put the skills at `~/.agents/.agents/skills`.
-**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/skills/nddev-builder/references/validation.md b/setups/nddev-builder/home/skills/nddev-builder/references/validation.md
index dab6edd..c74ddd2 100644
--- a/setups/nddev-builder/home/skills/nddev-builder/references/validation.md
+++ b/setups/nddev-builder/home/skills/nddev-builder/references/validation.md
@@ -1,7 +1,10 @@
# 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
@@ -9,7 +12,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
@@ -34,13 +38,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 `opencode-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/opencode-setup-system \
+ --executable \
--target --protocol-version 3 --json
```
@@ -66,8 +71,11 @@ 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.
diff --git a/setups/nddev-builder/setup.json b/setups/nddev-builder/setup.json
index 31be51c..d3de451 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://opencode.ai/docs/agents",
"https://opencode.ai/docs/commands",