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
9 changes: 6 additions & 3 deletions .gds/repository.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,17 @@ repository:

provider:
type: "github"
installation: "installation:github-opennetwork"
installation: "installation:github-nddev-technocracy-opennetwork"
repository_id: 1344237290
owner: "NDDev-OpenNetwork"
owner: "NDDev-Technocracy-OpenNetwork"
name: "opencode-setup-system"
aliases:
- owner: "NDDev-Technocracy-Sandbox"
name: "opencode-setup-system"

classification:
portfolios:
- "portfolio:nddev-technocracy-sandbox"
- "portfolio:nddev-technocracy-opennetwork"
visibility_contract: "public"
data_classification: "public"

Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Security report
url: https://github.com/NDDev-OpenNetwork/opencode-setup-system/security/advisories/new
url: https://github.com/NDDev-Technocracy-OpenNetwork/opencode-setup-system/security/advisories/new
about: Report a vulnerability privately. Never open a public issue for one.
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
name: rust
permissions:
contents: read
uses: NDDev-Technocracy-Sandbox/ci-workflows/.github/workflows/rust-ci.yml@d92026cf31a10a0eeaa532e1f323c7cfdfbfac5b # 0.1.29
uses: NDDev-Technocracy-OpenNetwork/ci-workflows/.github/workflows/rust-ci.yml@93eeb2a65e98a29e9dbff7909f67c6419abff046 # commit:93eeb2a65e98a29e9dbff7909f67c6419abff046
with:
toolchain: '1.98.1'
# The three-OS matrix is the evidence ADR-0113 asks for, and standard
Expand All @@ -47,7 +47,7 @@ jobs:
name: supply-chain
permissions:
contents: read
uses: NDDev-Technocracy-Sandbox/ci-workflows/.github/workflows/rust-supply-chain.yml@d92026cf31a10a0eeaa532e1f323c7cfdfbfac5b # 0.1.29
uses: NDDev-Technocracy-OpenNetwork/ci-workflows/.github/workflows/rust-supply-chain.yml@93eeb2a65e98a29e9dbff7909f67c6419abff046 # commit:93eeb2a65e98a29e9dbff7909f67c6419abff046
with:
enable_deny: true
enable_audit: true
Expand All @@ -74,7 +74,7 @@ jobs:
name: actionlint
permissions:
contents: read
uses: NDDev-Technocracy-Sandbox/ci-workflows/.github/workflows/actionlint.yml@d92026cf31a10a0eeaa532e1f323c7cfdfbfac5b # 0.1.29
uses: NDDev-Technocracy-OpenNetwork/ci-workflows/.github/workflows/actionlint.yml@93eeb2a65e98a29e9dbff7909f67c6419abff046 # commit:93eeb2a65e98a29e9dbff7909f67c6419abff046

pr-hygiene:
name: pr-hygiene
Expand All @@ -86,7 +86,7 @@ jobs:
# that would use them is off.
issues: write # the stale bot closes threads
pull-requests: write # the labeler applies labels
uses: NDDev-Technocracy-Sandbox/ci-workflows/.github/workflows/pr-hygiene.yml@d92026cf31a10a0eeaa532e1f323c7cfdfbfac5b # 0.1.29
uses: NDDev-Technocracy-OpenNetwork/ci-workflows/.github/workflows/pr-hygiene.yml@93eeb2a65e98a29e9dbff7909f67c6419abff046 # commit:93eeb2a65e98a29e9dbff7909f67c6419abff046


boundary:
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
actions: read # CodeQL reads the workflow definitions it analyses
contents: read
security-events: write # CodeQL publishes its findings to code scanning
uses: NDDev-Technocracy-Sandbox/ci-workflows/.github/workflows/public-codeql.yml@d92026cf31a10a0eeaa532e1f323c7cfdfbfac5b # 0.1.29
uses: NDDev-Technocracy-OpenNetwork/ci-workflows/.github/workflows/public-codeql.yml@93eeb2a65e98a29e9dbff7909f67c6419abff046 # commit:93eeb2a65e98a29e9dbff7909f67c6419abff046
with:
languages: '["rust", "actions"]'
queries: security-and-quality
Expand All @@ -37,7 +37,7 @@ jobs:
permissions:
contents: read
pull-requests: write # writes the review it produces
uses: NDDev-Technocracy-Sandbox/ci-workflows/.github/workflows/public-dependency-review.yml@d92026cf31a10a0eeaa532e1f323c7cfdfbfac5b # 0.1.29
uses: NDDev-Technocracy-OpenNetwork/ci-workflows/.github/workflows/public-dependency-review.yml@93eeb2a65e98a29e9dbff7909f67c6419abff046 # commit:93eeb2a65e98a29e9dbff7909f67c6419abff046
with:
fail_on_severity: moderate

Expand All @@ -52,24 +52,24 @@ jobs:
contents: read
id-token: write # mints the OIDC token Scorecard's publication is signed with
security-events: write # Scorecard publishes its findings to code scanning
uses: NDDev-Technocracy-Sandbox/ci-workflows/.github/workflows/public-scorecard.yml@d92026cf31a10a0eeaa532e1f323c7cfdfbfac5b # 0.1.29
uses: NDDev-Technocracy-OpenNetwork/ci-workflows/.github/workflows/public-scorecard.yml@93eeb2a65e98a29e9dbff7909f67c6419abff046 # commit:93eeb2a65e98a29e9dbff7909f67c6419abff046

osv:
name: osv
permissions:
contents: read
uses: NDDev-Technocracy-Sandbox/ci-workflows/.github/workflows/osv-scan.yml@d92026cf31a10a0eeaa532e1f323c7cfdfbfac5b # 0.1.29
uses: NDDev-Technocracy-OpenNetwork/ci-workflows/.github/workflows/osv-scan.yml@93eeb2a65e98a29e9dbff7909f67c6419abff046 # commit:93eeb2a65e98a29e9dbff7909f67c6419abff046

zizmor:
name: zizmor
permissions:
actions: read # the SARIF upload reads this run to attach its results
contents: read
security-events: write # zizmor publishes its findings to code scanning
uses: NDDev-Technocracy-Sandbox/ci-workflows/.github/workflows/zizmor-sarif.yml@d92026cf31a10a0eeaa532e1f323c7cfdfbfac5b # 0.1.29
uses: NDDev-Technocracy-OpenNetwork/ci-workflows/.github/workflows/zizmor-sarif.yml@93eeb2a65e98a29e9dbff7909f67c6419abff046 # commit:93eeb2a65e98a29e9dbff7909f67c6419abff046

secret-scan:
name: secret-scan
permissions:
contents: read
uses: NDDev-Technocracy-Sandbox/ci-workflows/.github/workflows/secret-scan.yml@d92026cf31a10a0eeaa532e1f323c7cfdfbfac5b # 0.1.29
uses: NDDev-Technocracy-OpenNetwork/ci-workflows/.github/workflows/secret-scan.yml@93eeb2a65e98a29e9dbff7909f67c6419abff046 # commit:93eeb2a65e98a29e9dbff7909f67c6419abff046
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,25 @@ cut and that this clone does not carry.

## [Unreleased]

## [0.0.94] - 2026-10-13

Forward configuration plans now support explicit preparation before any
final configuration write. Preparation retains exact desired bytes and a durable
admission; applying that admission survives plan expiry or loss of the source
bundle. Fresh admission still checks expiry. Cancellation remains available until
publication starts, and replay preserves later operations and unrelated files.

The first preparation upgrades an idle forward store transactionally while
preserving its receipts. Older writers refuse the upgraded schema, including
after cancellation removes the active guard. Interrupted preparation, guard
publication and cancellation resume through the same exact request.

Public provider-info and status field sets stay unchanged. ai-stp manages
configuration over user-installed harness executables. Native multi-root
coordination and active-agent handoff remain separate acceptance steps. Current
publisher identities require the compatible ai-stp reader release before these
artifacts are published; historical tags and provenance remain unchanged.

## [0.0.93] - 2026-10-12

Exact software update and removal plans now accept cancellation before
Expand Down
8 changes: 4 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ members = [
]

[workspace.package]
version = "0.0.93"
version = "0.0.94"
edition = "2024"
rust-version = "1.89"
license = "AGPL-3.0-or-later"
repository = "https://github.com/NDDev-OpenNetwork/opencode-setup-system"
repository = "https://github.com/NDDev-Technocracy-OpenNetwork/opencode-setup-system"
authors = ["Danil Silantyev / NDDev"]

[workspace.dependencies]
Expand Down Expand Up @@ -41,9 +41,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.93" }
provider-v3 = { path = "crates/provider-v3", version = "0.0.93" }
harness-runtime = { path = "crates/harness-runtime", version = "0.0.93" }
setup-core = { path = "crates/setup-core", version = "0.0.94" }
provider-v3 = { path = "crates/provider-v3", version = "0.0.94" }
harness-runtime = { path = "crates/harness-runtime", version = "0.0.94" }

[workspace.lints.rust]
unsafe_code = "forbid"
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ does not acquire release publisher authentication by passing conformance.

```bash
docker run --rm -v "$HOME/.config:/config" \
ghcr.io/nddev-opennetwork/opencode-setup-system:0.0.93 \
ghcr.io/nddev-technocracy-opennetwork/opencode-setup-system:0.0.94 \
status --target /config/<dir> --json
```

Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ latest release is supported.
## Reporting a vulnerability

Report privately through
[GitHub Security Advisories](https://github.com/NDDev-OpenNetwork/opencode-setup-system/security/advisories/new).
[GitHub Security Advisories](https://github.com/NDDev-Technocracy-OpenNetwork/opencode-setup-system/security/advisories/new).

Do not publish exploit details, credentials, tokens, private configuration or
backup contents in an issue or pull request. A backup slot may contain whatever
Expand Down
9 changes: 9 additions & 0 deletions crates/harness-runtime/src/wire.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ pub fn dispatch(harness: &Harness, invocation: Invocation) -> Result<serde_json:
plan_digest,
provider_release_digest,
cancel,
prepare,
bundle,
prefix,
software_artifacts,
Expand All @@ -79,6 +80,8 @@ pub fn dispatch(harness: &Harness, invocation: Invocation) -> Result<serde_json:
}
let perform = if cancel {
forward::cancel
} else if prepare {
forward::prepare
} else {
forward::apply
};
Expand All @@ -91,6 +94,12 @@ pub fn dispatch(harness: &Harness, invocation: Invocation) -> Result<serde_json:
bundle.as_ref(),
);
}
if prepare {
return Err(Error::refuse(
WireReason::UnsupportedOperation,
"preparation requires explicit forward configuration",
));
}
if Operation::SOFTWARE.contains(&operation_of(&artifact)?) {
if bundle.is_some() {
return Err(Error::refuse(
Expand Down
35 changes: 35 additions & 0 deletions crates/harness-runtime/src/wire/forward.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,12 +178,39 @@ pub(super) fn apply(
plan_digest: &str,
release: &str,
bundle: Option<&ArgvBundle>,
) -> Result<serde_json::Value> {
execute(harness, path, plan, plan_digest, release, bundle, false)
}

pub(super) fn prepare(
harness: &Harness,
path: &Path,
plan: &serde_json::Value,
plan_digest: &str,
release: &str,
bundle: Option<&ArgvBundle>,
) -> Result<serde_json::Value> {
execute(harness, path, plan, plan_digest, release, bundle, true)
}

fn execute(
harness: &Harness,
path: &Path,
plan: &serde_json::Value,
plan_digest: &str,
release: &str,
bundle: Option<&ArgvBundle>,
prepare_only: bool,
) -> Result<serde_json::Value> {
let (target, admission) = bound(harness, path, plan, plan_digest, release, bundle)?;
let scope = scope_of(plan);
let mut writer = Writer::acquire(&target, harness.control_directory)?;
match writer.progress(&admission)? {
Progress::Completed(outcome) => return Ok(outcome),
Progress::Prepared(_) if prepare_only => {
return writer.prepared(&admission).map_err(Error::from);
}
Progress::Applying(_) | Progress::Finishing if prepare_only => return Err(refused()),
Progress::Cancelled(_) => {
return Err(Error::refuse(
WireReason::Stale,
Expand Down Expand Up @@ -214,8 +241,16 @@ pub(super) fn apply(
scope,
)?;
let context = serde_json::to_value(&assembly.context).map_err(|_| refused())?;
if prepare_only {
return writer
.prepare(&admission, &context, &assembly.changes)
.map_err(Error::from);
}
writer.admit(&admission, &context, &assembly.changes)?;
}
if matches!(writer.progress(&admission)?, Progress::Prepared(_)) {
writer.start(&admission)?;
}
if let Progress::Applying(context) = writer.progress(&admission)? {
let context: Context = serde_json::from_value(context).map_err(|_| refused())?;
if writer.read(harness.state_file)?.0 != context.state_before
Expand Down
Loading
Loading