Skip to content

chore(openshell): trust v0.0.101 release identities - #8616

Merged
cv merged 9 commits into
mainfrom
codex/8598-openshell-v101-release-trust
Aug 9, 2026
Merged

chore(openshell): trust v0.0.101 release identities#8616
cv merged 9 commits into
mainfrom
codex/8598-openshell-v101-release-trust

Conversation

@apurvvkumaria

@apurvvkumaria apurvvkumaria commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

Summary

Establish base-trusted identities for the published OpenShell v0.0.101 release without changing NemoClaw's active v0.0.99 selection. The checker now binds checksum manifests, the Homebrew formula, and standalone sandbox fallback binaries to reviewed release identities so a later selector PR cannot authorize its own artifacts.

Related Issue

Fixes #8598

Changes

  • Add exact v0.0.101 CLI, gateway, and sandbox checksum-manifest hashes to the existing trusted allowlist.
  • Bind every allowlisted Homebrew formula to its exact release version, canonical GitHub asset URL, and SHA-256 digest.
  • Bind the installer's standalone sandbox fallback map to base-reviewed version/digest pairs, including dormant v0.0.101 x86_64 and arm64 identities.
  • Model all 20 official v0.0.101 manifest entries and verify positive, legacy, malformed, missing, remapped, and self-authorization paths through the trusted checker/parser boundary.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification: The change adds dormant supply-chain trust anchors and verifier hardening; supported selectors, installer/blueprint pins, CLI behavior, configuration, defaults, and user-facing errors remain on v0.0.99.
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: Independent nine-category review of exact commit 6ace3b8d657d3d65589d9ce61fe4672400f30955 returned PASS with no blocker. It independently recomputed the v0.0.101 artifacts and confirmed the base-owned formula tuple and standalone sandbox version/digest sets close both candidate self-authorization paths.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: no-docs-needed
  • Evidence: No documentation paths changed. The reviewer inspected the exact four-file diff plus the documentation rules/navigation and confirmed this is dormant trust data with fail-closed verifier enforcement only; stable runtime, blueprint, installer, and Brev selectors remain on v0.0.99 with no user-facing behavior or configuration change.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit: Not applicable.
  • Station profile/scenario: Not applicable.
  • Result: Not applicable.
  • Supporting evidence: Not applicable.

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run validate:pr passed after refreshing origin/main when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: installer checker tests (78 passed); sandbox identity tests (12 passed); four changed-contract consumer files (51 passed, with one local-load timeout rerun unchanged at a 60-second bound); live scripts/check-installer-hash.sh passed on the current v0.0.99 selection.
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result: Not applicable to dormant trust data and its verifier boundary. npm run validate:pr, npm run checks:repository, npm run typecheck:cli, npm run test:changed, test-size/source-shape checks, shfmt, and ShellCheck passed.
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Apurv Kumaria akumaria@nvidia.com

Summary by CodeRabbit

  • Security

    • Strengthened installer verification using trusted release digests, Homebrew formula records, and sandbox-build identities.
    • Added safeguards against missing, duplicate, malformed, unauthorized, or mismatched release metadata.
    • Improved diagnostics for formula digest and installer pin mismatches.
  • Release Support

    • Added verification coverage for OpenShell 0.0.101 and other supported releases.
  • Testing

    • Expanded automated coverage for release integrity and metadata validation.

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria apurvvkumaria self-assigned this Aug 8, 2026
@coderabbitai

coderabbitai Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The installer trust checks now use allowlisted Homebrew formulas and trusted sandbox-build identities. Tests cover OpenShell 0.0.101, malformed trust data, mismatched digests, duplicate entries, alternate releases, and parser mutations.

Changes

OpenShell release trust

Layer / File(s) Summary
Trusted Homebrew formula verification
scripts/check-installer-hash.sh, test/installer-hash-check.test.ts
The checker selects exactly one allowlisted formula, validates its URL and upstream digest, then compares the installer pin separately. Tests cover formula mismatches, self-authorization, malformed entries, duplicates, and invalid URLs.
Trusted sandbox-build identity validation
scripts/checks/extract-installer-pins.mts, test/installer-sandbox-build-trust.test.ts
The parser validates required and selected-release sandbox identities against the trusted allowlist. Tests reject arbitrary, incomplete, duplicated, malformed, and release-mismatched identities.
Release fixture and end-to-end validation
test/installer-hash-check.test.ts
Fixtures now index trusted manifests, asset digests, formula entries, and sandbox identities by release. End-to-end tests verify OpenShell 0.0.101 and reject untrusted alternate-release prerequisites.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Installer as Installer
  participant Checker as check-installer-hash.sh
  participant Formula as Homebrew formula
  participant Parser as extract-installer-pins.mts
  Installer->>Checker: Submit release and installer pins
  Checker->>Formula: Download allowlisted formula
  Formula-->>Checker: Return formula content
  Checker->>Checker: Verify upstream digest and formula pin
  Checker->>Parser: Validate extracted sandbox-build pins
  Parser-->>Checker: Return trusted identity result
  Checker-->>Installer: Accept or reject release identities
Loading

Possibly related issues

Possibly related PRs

Suggested labels: release-target, v0.0.106

Suggested reviewers: cv, senthilr-nv

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR adds v0.0.101 trust identities but does not show supervisor and VM driver identities required by issue #8598. Add and test trusted identities for all required v0.0.101 artifacts, including supervisor and VM driver, or document their approved scope exclusion.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the OpenShell release and the trust-identity change.
Out of Scope Changes check ✅ Passed The code and tests remain focused on trusted OpenShell release identities and do not introduce unrelated runtime or selector changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/8598-openshell-v101-release-trust

Comment @coderabbitai help to get the list of available commands.

@github-code-quality

github-code-quality Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit 1aa6c2b in the codex/8598-openshell... branch remains at 96%, unchanged from commit 1a8e6bd in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit 1aa6c2b in the codex/8598-openshell... branch remains at 81%, unchanged from commit 1a8e6bd in the main branch.

Show a code coverage summary of the most impacted files.
File main 1a8e6bd codex/8598-openshell... 1aa6c2b +/-
src/lib/messagi...flow-planner.ts 91% 91% 0%
src/lib/core/immutable.ts 97% 97% 0%
src/lib/messagi...etup-applier.ts 68% 68% 0%
src/lib/messaging/utils.ts 76% 76% 0%
src/lib/sandbox...rce-identity.ts 84% 84% 0%
src/lib/onboard...flight-ports.ts 33% 67% +34%

Updated August 09, 2026 22:29 UTC

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
test/installer-hash-check.test.ts (1)

639-691: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Assert that anchored mutations actually change the source.

CHECKER_MUTATIONS and PARSER_MUTATIONS use String.prototype.replace with long literal anchors, for example "readonly -a OPENSHELL_RELEASE_FORMULA_ALLOWLIST=(\n" at line 651 and "const TRUSTED_SANDBOX_BUILD_PINS: readonly TrustedSandboxBuildPin[] = [\n" at line 682. If a later refactor changes those anchors, replace returns the source unchanged and the mutation becomes a silent no-op.

A silent no-op does not make the negative tests error. It makes them pass for the wrong reason. For example, trusted-sandbox-alternate-version at line 1146 expects failure. If trustAlternateSandboxBuilds no-ops, the run still fails, but because the sandbox identities were never trusted, not because the release lacks an allowlist entry.

test/installer-sandbox-build-trust.test.ts already guards this at lines 49-53. Apply the same guard here.

♻️ Proposed guard for anchored replacements
+const replaceAnchored = (source: string, anchor: string, replacement: string): string => {
+  const mutated = source.replace(anchor, replacement);
+  if (mutated === source) {
+    throw new Error(`fixture mutation anchor no longer matches: ${anchor}`);
+  }
+  return mutated;
+};

Then route the anchored mutations through it, for example:

-const trustAlternateSandboxBuilds = (source: string): string => {
-  const digests = SYNTHETIC_SANDBOX_BUILD_DIGESTS;
-  return source.replace(
-    "const TRUSTED_SANDBOX_BUILD_PINS: readonly TrustedSandboxBuildPin[] = [\n",
-    `const TRUSTED_SANDBOX_BUILD_PINS: readonly TrustedSandboxBuildPin[] = [
-  { required: false, sha256: "${digests[0]}", version: "9.9.9" },
-  { required: false, sha256: "${digests[1]}", version: "9.9.9" },
-`,
-  );
-};
+const trustAlternateSandboxBuilds = (source: string): string => {
+  const digests = SYNTHETIC_SANDBOX_BUILD_DIGESTS;
+  return replaceAnchored(
+    source,
+    "const TRUSTED_SANDBOX_BUILD_PINS: readonly TrustedSandboxBuildPin[] = [\n",
+    `const TRUSTED_SANDBOX_BUILD_PINS: readonly TrustedSandboxBuildPin[] = [
+  { required: false, sha256: "${digests[0]}", version: "9.9.9" },
+  { required: false, sha256: "${digests[1]}", version: "9.9.9" },
+`,
+  );
+};

Apply the same treatment to the allowlisted-alternate-version, duplicate-trusted-formula, malformed-trusted-formula, mismatched-trusted-formula-url, and trusted-formula-mismatch entries.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/installer-hash-check.test.ts` around lines 639 - 691, Add a shared
checked-replacement helper in the installer hash-check tests that asserts each
anchor is found and the resulting source changes, then use it for the anchored
replacements in CHECKER_MUTATIONS and trustAlternateSandboxBuilds, including the
allowlisted, duplicate, malformed, URL-mismatch, and digest-mismatch formula
mutations. Preserve each mutation’s existing replacement behavior while
preventing silent no-ops.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@test/installer-hash-check.test.ts`:
- Around line 639-691: Add a shared checked-replacement helper in the installer
hash-check tests that asserts each anchor is found and the resulting source
changes, then use it for the anchored replacements in CHECKER_MUTATIONS and
trustAlternateSandboxBuilds, including the allowlisted, duplicate, malformed,
URL-mismatch, and digest-mismatch formula mutations. Preserve each mutation’s
existing replacement behavior while preventing silent no-ops.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 856b1b40-dbb4-438c-9b26-ee3384dc64dc

📥 Commits

Reviewing files that changed from the base of the PR and between a76e297 and 6ace3b8.

📒 Files selected for processing (4)
  • scripts/check-installer-hash.sh
  • scripts/checks/extract-installer-pins.mts
  • test/installer-hash-check.test.ts
  • test/installer-sandbox-build-trust.test.ts

@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

Advisor assessment: No blocking advisor findings reported
Next action: No advisor follow-up needed.
Findings: 0 blockers · 0 warnings · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · medium confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Failed after a partial review · low confidence · 0 blockers · 0 warnings · 0 suggestions

Second-opinion terminology and E2E selections are advisory. Live E2E does not run automatically for pull requests.

3 semantic terminology decisions

Terminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.

  • established — base-trusted at scripts/check-installer-hash.sh:53: Retain base-trusted for code and identities that execute from the base SHA.
  • established — standalone sandbox binary at scripts/checks/extract-installer-pins.mts:672: Retain standalone sandbox binary for this extracted fallback executable.
  • justified — identity at scripts/check-installer-hash.sh:52: Retain identity tuple when a version, URL, and digest jointly identify an artifact.

E2E guidance

Advisory only. A maintainer can dispatch the default E2E suite against this exact revision.

Recommended E2E: managed-image-multiarch-startup

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@coderabbitai coderabbitai Bot mentioned this pull request Aug 8, 2026
23 tasks
apurvvkumaria added a commit that referenced this pull request Aug 9, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Restore the required root-owned, immutable `0444` mode for the reviewed
managed-startup runtime bundle in every managed agent image. The repair
uses each final image's existing permission replay so legacy builders
remain supported and promotion continues to fail closed.

This repair blocks clean trusted main and therefore blocks publication
of the draft-only trust-root bootstrap. It does not directly qualify
#8616 or #8617.

## Changes

- Require the managed-startup runtime bundle to be a regular, non-link
file in the OpenClaw, Hermes, and Deep Agents Code final images.
- Replay `root:root` ownership and mode `0444`, then require the final
numeric stat to be `0:0:444`.
- Preserve the reviewed bundle bytes, original builder-stage copy
provenance, legacy-builder compatibility, six-variant validation, and
aggregate promotion barrier.

## Type of Change

- [x] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [ ] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Quality Gates

- [ ] Tests added or updated for changed behavior
- [x] Existing tests cover changed behavior — justification: The
supported managed-image workflow validator checks regular-file,
non-link, and `0:0:444` invariants for all six agent/architecture
candidates before aggregate promotion. Focused image-layout and workflow
contracts passed for this commit.
- [ ] Tests not applicable — justification:
- [ ] Docs updated for user-facing behavior changes
- [x] Docs not applicable — justification: This restores an existing
internal image artifact invariant and changes no command, configuration,
default, documented workflow, or supported surface.
- [x] Sensitive paths changed (security, policy, credentials, preflight,
onboarding, inference, runner, sandbox, or messaging)
- [x] Sensitive-path review completed or maintainer-approved waiver
recorded — reviewer/approval link/justification: Fresh independent
correctness/security review of commit
`591550ad54cc43b7b18982712b16d40902f41a29` passed all nine security
categories with no findings.
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Documentation Writer Review

- [x] Documentation writer subagent reviewed the completed changes
- Result: `no-docs-needed`
- Evidence: Commit 591550a restores the existing root-owned, read-only
managed-image runtime artifact contract in three Dockerfiles. It changes
no command, configuration, default, documented workflow, or supported
surface.
- Agent: Codex Desktop
<!-- docs-review-head-sha: 591550a -->
<!-- docs-review-agents-blob-sha: c4923a3 -->

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit:
- Station profile/scenario:
- Result:
- Supporting evidence:

## Verification

- [x] PR description includes a `Signed-off-by:` line and every commit
appears as `Verified` in GitHub
- [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or
`npm run validate:pr` passed after refreshing `origin/main` when hooks
were skipped or unavailable
- [x] Targeted behavior tests pass for the current change set, or tests
are marked not applicable above — `47` focused image/layout/workflow
tests passed; the targeted Deep Agents Code compatibility contract
passed.
- [ ] Applicable broad gate passed — Not applicable to this
three-Dockerfile permission repair; `npm run checks:repository`,
Dockerfile lint, reviewed-bundle verification, and the source-shape
audit passed.
- [x] Quality Gates section completed with required justifications or
waivers
- [x] No secrets, API keys, or credentials committed
- [ ] `npm run docs` builds without warnings (doc changes only)
- [ ] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

Final resolution still requires the first automatic exact-main
managed-image run after external merge to pass all six validation jobs
and artifact receipts. No manual E2E run was dispatched.

---
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Bug Fixes**
* Strengthened container image validation to ensure the managed startup
runtime is present as a regular, non-symlink file.
* Confirmed the runtime file is root-owned and has read-only permissions
before startup checks complete.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@coderabbitai

coderabbitai Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
test/installer-sandbox-build-trust.test.ts (1)

129-147: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

A partial mutation can make this test pass for the wrong reason.

mutateSandboxBuildFunction asserts only that the combined result differs from the original. The two chained .replace calls hold hardcoded production digests. If the installer rotates the second digest, the first replace still matches, the combined assert still passes, and the assertion at Line 146 checks only the first digest. The test then reports success while it no longer exercises full self-authorization.

Assert both replacements, and assert both unexpected identities.

As per path instructions: "Flag copied production algorithms, broad mocks that bypass the behavior under test, and conditionals that make a test pass without exercising its claim."

♻️ Proposed change to assert each replacement
   it("prevents a selected release from self-authorizing replacement binaries", () => {
     const result = runParser((source) =>
-      mutateSandboxBuildFunction(source, (functionSource) =>
-        functionSource
-          .replace(
-            "a4b0c38ed90a6dd4b4f312ad3727824a25ec478d88d4e65d22a82377b18e6214",
-            ARBITRARY_SANDBOX_BUILD_DIGESTS[0],
-          )
-          .replace(
-            "f60ce5b76e4dbd645f690c8519852d261c8cf6a70b5fc56db329a23d68bc7b2e",
-            ARBITRARY_SANDBOX_BUILD_DIGESTS[1],
-          ),
-      ),
+      mutateSandboxBuildFunction(source, (functionSource) => {
+        const first = functionSource.replace(
+          "a4b0c38ed90a6dd4b4f312ad3727824a25ec478d88d4e65d22a82377b18e6214",
+          ARBITRARY_SANDBOX_BUILD_DIGESTS[0],
+        );
+        assert.notEqual(first, functionSource, "x86_64 digest must be replaced");
+        const second = first.replace(
+          "f60ce5b76e4dbd645f690c8519852d261c8cf6a70b5fc56db329a23d68bc7b2e",
+          ARBITRARY_SANDBOX_BUILD_DIGESTS[1],
+        );
+        assert.notEqual(second, first, "arm64 digest must be replaced");
+        return second;
+      }),
     );
 
     expect(result.status).toBe(1);
     expect(result.stderr).toContain("must use only base-trusted binary identities");
     expect(result.stderr).toContain(`unexpected=[0.0.99:${"a".repeat(64)}`);
+    expect(result.stderr).toContain("b".repeat(64));
   });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/installer-sandbox-build-trust.test.ts` around lines 129 - 147, Update
the test mutation in “prevents a selected release from self-authorizing
replacement binaries” so it verifies that each chained replacement actually
changed the source, rather than relying on mutateSandboxBuildFunction’s
combined-difference assertion. Also assert that stderr reports both mutated
unexpected identities, ensuring the test exercises full self-authorization.

Source: Path instructions

test/installer-hash-check.test.ts (2)

679-679: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Anchor the digest replacement to the v0.0.72 tuple.

source.replace(FORMULA_DIGEST, "0".repeat(64)) replaces only the first occurrence of the digest string in the checker. The test at Line 1221 asserts a v0.0.72 mismatch, so the mutation must target that tuple. If a second allowlist tuple ever reuses this digest, or if the v0.0.72 tuple stops being first, the mutation silently hits the wrong entry and the assertion at Line 980 still passes. Use the same anchored form as malformed-trusted-formula.

♻️ Proposed anchored replacement
-  "trusted-formula-mismatch": (source) => source.replace(FORMULA_DIGEST, "0".repeat(64)),
+  "trusted-formula-mismatch": (source) =>
+    source.replace(
+      `v0.0.72/openshell.rb|${FORMULA_DIGEST}`,
+      `v0.0.72/openshell.rb|${"0".repeat(64)}`,
+    ),
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/installer-hash-check.test.ts` at line 679, Update the
“trusted-formula-mismatch” mutation to replace the digest only within the
v0.0.72 tuple, using the same anchored replacement pattern as
“malformed-trusted-formula” rather than replacing the first standalone
FORMULA_DIGEST occurrence. Preserve the existing zero-digest value and mismatch
assertion behavior.

236-251: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Duplicated sandbox-build fixture helpers in two test files. Both files define their own copies of mutateSandboxBuildFunction, addSandboxBuildPins, and the v0.0.101 digest constants. The helpers encode the pinned_sandbox_build_version shell grammar. Two copies can drift when that grammar changes, and one suite can then stop exercising its claim while still passing.

  • test/installer-hash-check.test.ts#L236-L251: move addSandboxBuildPins, mutateSandboxBuildFunction, and V00101_SANDBOX_BUILD_DIGESTS into a shared test helper module, and import them here.
  • test/installer-sandbox-build-trust.test.ts#L39-L72: delete the local mutateSandboxBuildFunction and addSandboxBuildPins definitions and the duplicated digest constants at Lines 26-29, then import them from the shared helper module.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/installer-hash-check.test.ts` around lines 236 - 251, Move
mutateSandboxBuildFunction, addSandboxBuildPins, and
V00101_SANDBOX_BUILD_DIGESTS from test/installer-hash-check.test.ts lines
236-251 into a shared test helper module, then import them there. In
test/installer-sandbox-build-trust.test.ts lines 39-72, remove the local helper
implementations and duplicated digest constants and import the shared symbols
instead; both sites must use the same helper implementation.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@test/installer-hash-check.test.ts`:
- Line 679: Update the “trusted-formula-mismatch” mutation to replace the digest
only within the v0.0.72 tuple, using the same anchored replacement pattern as
“malformed-trusted-formula” rather than replacing the first standalone
FORMULA_DIGEST occurrence. Preserve the existing zero-digest value and mismatch
assertion behavior.
- Around line 236-251: Move mutateSandboxBuildFunction, addSandboxBuildPins, and
V00101_SANDBOX_BUILD_DIGESTS from test/installer-hash-check.test.ts lines
236-251 into a shared test helper module, then import them there. In
test/installer-sandbox-build-trust.test.ts lines 39-72, remove the local helper
implementations and duplicated digest constants and import the shared symbols
instead; both sites must use the same helper implementation.

In `@test/installer-sandbox-build-trust.test.ts`:
- Around line 129-147: Update the test mutation in “prevents a selected release
from self-authorizing replacement binaries” so it verifies that each chained
replacement actually changed the source, rather than relying on
mutateSandboxBuildFunction’s combined-difference assertion. Also assert that
stderr reports both mutated unexpected identities, ensuring the test exercises
full self-authorization.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: b06065e9-a9c6-4285-9c6c-3d72c5d2d29e

📥 Commits

Reviewing files that changed from the base of the PR and between 7d1c24e and d056eb4.

📒 Files selected for processing (4)
  • scripts/check-installer-hash.sh
  • scripts/checks/extract-installer-pins.mts
  • test/installer-hash-check.test.ts
  • test/installer-sandbox-build-trust.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/checks/extract-installer-pins.mts

@cv cv left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Accepted issues #8598 and #8590 authorize the release-trust work. The delta from the previously approved b8b9b94 contains two verified main commits and verified merge commit bb3c7ce; none changes the four PR files, whose blob identities remain unchanged. The combined change preserves active v0.0.99 selectors, keeps v0.0.101 identities dormant, binds formulas and standalone sandbox binaries to base-owned identities, and fails closed. The nine-category security review found no blocker. No documentation update is required because supported runtime behavior, selectors, configuration, defaults, and errors remain unchanged. No competing PR, unresolved review thread, current automated finding, compatibility issue, or regression blocker was found.

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@cv
cv merged commit b346cd8 into main Aug 9, 2026
52 of 53 checks passed
@cv
cv deleted the codex/8598-openshell-v101-release-trust branch August 9, 2026 22:53
@github-actions github-actions Bot added the v0.0.106 Release target label Aug 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

v0.0.106 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Record OpenShell v0.0.101 baselines and release trust

2 participants