perf(hermes): remove build-only image caches - #7492
Conversation
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughHermes Dockerfiles now isolate and remove build-only npm, Electron, node-gyp, and sandbox caches, verify their absence from published images, and add provisioning, dependency-layer, integrity-lookup, and runtime smoke-test coverage. ChangesHermes cache hardening
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in commit 8abdc43 in the TypeScript / code-coverage/cliThe overall coverage in commit 8abdc43 in the Show a code coverage summary of the most impacted files.
Updated |
PR Review Advisor — InformationalAdvisor assessment: Informational / high confidence Model lanes
Nemotron output stays in workflow artifacts and does not change the assessment above. E2E guidanceAdvisory only. E2E / PR Gate selects and runs jobs independently. Recommended E2E: 2 optional E2E recommendations
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>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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.
Inline comments:
In `@test/hermes-share-mount-deps.test.ts`:
- Around line 218-240: Update the test “keeps only root runtime dependencies
after building workspace UIs (`#7144`)” to create marker files under
ui-tui/node_modules and web/node_modules before running the install layer. After
execution, assert both workspace node_modules directories are absent while the
root node_modules directory remains, using the resulting filesystem layout as
the primary verification; retain only call assertions needed for command
behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 8739337a-9993-4b58-a505-8aef49e035e5
📒 Files selected for processing (4)
agents/hermes/Dockerfileagents/hermes/Dockerfile.basetest/hermes-dashboard-provisioning.test.tstest/hermes-share-mount-deps.test.ts
🚧 Files skipped from review as they are similar to previous changes (3)
- agents/hermes/Dockerfile
- agents/hermes/Dockerfile.base
- test/hermes-dashboard-provisioning.test.ts
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
|
Exact-head refresh: Local verification on the exact head:
The merge commit is signed, DCO-compliant, and GitHub Verified. Fresh exact-head CI is running; no further code changes are planned unless CI or review finds an actionable issue. |
|
Fix-forward: dispatched the documented manual |
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
|
Exact-head credentialed E2E evidence for
Using the merged #7493 timing semantics (
The child scorecard job itself is intentionally skipped for PR-correlated dispatches because they provide Matched local images remain This proves exact-head behavior and the image-size reduction. It does not yet prove a hosted-runner memory reduction: the alternate-checkout trust boundary disables runner-pressure sampling. The remaining acceptance step is a matched direct-main cohort after merge/publish/pin, using #7493 for queue/execution data and runner-pressure telemetry for memory. The PR is otherwise green and awaits independent human review. |
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
|
Fresh exact-revision validation is green after synchronizing with current
The controlled exact-revision A/B showed:
The cache-preservation guards passed in both Hermes lanes. The synchronized self-hosted run also resolved the root sandbox base by pull in 29s/31s instead of the stale-branch false rebuild path (16m16s/18m27s). Memory caveat: alternate-checkout controller runs currently disable hosted runner telemetry, so these runs establish time/export improvement and correctness, not a measured peak-memory reduction. The automatic controller failure was authorization-only ( |
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
test/sandbox-provisioning.test.ts (1)
1390-1403: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winKeep the dashboard cache paths distinct.
/root/.npm,/root/.cache/electron, and/root/.cache/node-gypall map to the samerootCachedirectory. Cleanup of one path can therefore remove the shared evidence and let the test pass even if another cache path is not cleaned up. UserootCache/npm,rootCache/electron, androotCache/node-gyp, then assert each redirected directory is absent.As per path instructions, tests should prefer observable outcomes through the public boundary rather than relying on a shared implementation detail.
🤖 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/sandbox-provisioning.test.ts` around lines 1390 - 1403, Update the cache path replacements in the test setup around dockerRunCommandBetween so npm, electron, and node-gyp map to distinct rootCache subdirectories: npm, electron, and node-gyp. Add assertions through the test’s public observable boundary that each redirected directory is absent after cleanup, rather than relying on shared rootCache state.Source: Path instructions
🧹 Nitpick comments (1)
test/hermes-final-image-layout.test.ts (1)
218-222: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winAvoid formatting-sensitive source-text assertions for cache behavior.
These checks can reject equivalent Dockerfile formatting while still not proving that
/sandbox/.cacheis absent from the assembled image. Prefer an image/layout assertion, or normalize the extracted command and assert command semantics rather than trailing whitespace, ordering, and literal\formatting.As per path instructions, tests should prioritize behavioral confidence over implementation lock-in.
🤖 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/hermes-final-image-layout.test.ts` around lines 218 - 222, Replace the formatting-sensitive cache assertions in the hermes final-image layout test with a behavioral image/layout assertion that verifies /sandbox/.cache is absent from the assembled image. Avoid asserting exact Dockerfile command text, trailing whitespace, command ordering, or literal line-continuation formatting; keep only semantic validation of the cache cleanup behavior.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.
Outside diff comments:
In `@test/sandbox-provisioning.test.ts`:
- Around line 1390-1403: Update the cache path replacements in the test setup
around dockerRunCommandBetween so npm, electron, and node-gyp map to distinct
rootCache subdirectories: npm, electron, and node-gyp. Add assertions through
the test’s public observable boundary that each redirected directory is absent
after cleanup, rather than relying on shared rootCache state.
---
Nitpick comments:
In `@test/hermes-final-image-layout.test.ts`:
- Around line 218-222: Replace the formatting-sensitive cache assertions in the
hermes final-image layout test with a behavioral image/layout assertion that
verifies /sandbox/.cache is absent from the assembled image. Avoid asserting
exact Dockerfile command text, trailing whitespace, command ordering, or literal
line-continuation formatting; keep only semantic validation of the cache cleanup
behavior.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: fd445cd9-9d24-4d7d-91a5-a003bc83b971
📒 Files selected for processing (5)
agents/hermes/Dockerfileagents/hermes/Dockerfile.basetest/hermes-final-image-layout.test.tstest/hermes-share-mount-deps.test.tstest/sandbox-provisioning.test.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- agents/hermes/Dockerfile
- agents/hermes/Dockerfile.base
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
|
CodeRabbit follow-up for the current-head review:
|
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
Exact-head audit for
The documented manual controller 30168456161 dispatched child 30168471044, but |
<!-- markdownlint-disable MD041 --> ## Summary Add the canonical `docs/changelog/2026-07-25.mdx` release entry with the exact `## v0.0.96` heading. The entry reconciles all 90 first-parent commits since v0.0.95 with all 92 merged PRs in the live `v0.0.96` label ledger and groups the user-visible changes by operator journey. ## Changes - Add the parser-safe dated MDX changelog entry for v0.0.96 with root-absolute links to the focused user guides. - Source summary: - [#7194](#7194) -> `docs/changelog/2026-07-25.mdx`: Document persistent baseline network policy exclusions and their inspection, rebuild, and snapshot behavior. - [#7188](#7188), [#7427](#7427), and [#7546](#7546) -> `docs/changelog/2026-07-25.mdx`: Document DNS-backed HTTPS inference routing, keyless loopback endpoints, and provider-marker isolation. - [#7238](#7238) -> `docs/changelog/2026-07-25.mdx`: Document blueprint sandbox and provider identifier validation before state writes or OpenShell calls, with bounded terminal-safe rejection previews. - [#7319](#7319), [#7274](#7274), [#7528](#7528), [#7353](#7353), and [#7560](#7560) -> `docs/changelog/2026-07-25.mdx`: Document the managed default gateway service, onboarding readiness, and container-runtime identity safeguards. - [#7349](#7349), [#7498](#7498), [#7406](#7406), [#7196](#7196), [#7559](#7559), [#7421](#7421), [#7510](#7510), [#7295](#7295), and [#7565](#7565) -> `docs/changelog/2026-07-25.mdx`: Document gateway-scoped status, lifecycle diagnostics, managed MCP recovery, delete-edge safeguards, and fail-closed CLI prompt and command output. - [#7591](#7591) -> `docs/changelog/2026-07-25.mdx`: Document opt-in authenticated MCP tool-name discovery, its bounded and names-only contract, probe interaction, and rebuild requirement. - [#7305](#7305), [#7480](#7480), [#7471](#7471), [#7365](#7365), and [#7541](#7541) -> `docs/changelog/2026-07-25.mdx`: Document installer version checks, version-tag reporting, license guidance, WSL Ollama selection, and DGX Station vLLM detection. - [#7482](#7482), [#7466](#7466), [#7208](#7208), [#7434](#7434), and [#7586](#7586) -> `docs/changelog/2026-07-25.mdx`: Document Ollama resource details, reasoning precedence, Hermes onboarding behavior, and preserved managed Hermes BuildKit failures. - [#6830](#6830), [#7492](#7492), [#7563](#7563), and [#7582](#7582) -> `docs/changelog/2026-07-25.mdx`: Document the authoritative OpenClaw production lock, fixed managed-image dependencies, immutable Hermes base adoption, and Hermes image-size reduction. - [#7505](#7505), [#7530](#7530), [#7547](#7547), [#7508](#7508), [#7548](#7548), [#7549](#7549), [#7537](#7537), [#7534](#7534), [#7515](#7515), [#7511](#7511), [#7551](#7551), [#7562](#7562), [#7575](#7575), [#7496](#7496), [#7594](#7594), [#7595](#7595), and [#7599](#7599) -> `docs/changelog/2026-07-25.mdx`: Summarize release validation, transient and bounded dispatch reconciliation, exact pre-tag qualification, identity revalidation, npm-audit retry, sharding, image reuse, timeout, telemetry, and workflow-hardening changes. - Reconciled without separate changelog prose: - [#7539](#7539), [#7526](#7526), [#7507](#7507), [#7506](#7506), [#7519](#7519), [#7516](#7516), [#7396](#7396), [#7254](#7254), [#7583](#7583), [#7596](#7596), and [#7598](#7598): Test-harness or fixture-only changes. - [#7403](#7403), [#7161](#7161), [#6877](#6877), [#7531](#7531), [#7525](#7525), [#7522](#7522), [#7536](#7536), [#7552](#7552), [#7566](#7566), [#7553](#7553), [#7561](#7561), [#7577](#7577), [#7569](#7569), [#7585](#7585), [#7584](#7584), [#7592](#7592), [#7580](#7580), [#7571](#7571), [#7517](#7517), [#7589](#7589), [#7402](#7402), [#7558](#7558), [#7544](#7544), and [#7601](#7601): Dependency, internal recovery, validation, contributor-workflow, E2E optimization, telemetry, or CI trust changes with no separate user-facing release claim. - [#7556](#7556), [#7573](#7573), [#7576](#7576), and [#7578](#7578): Experimental repository-maintainer conflict automation with no canonical user documentation surface. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [x] 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: `test/changelog-docs.test.ts` validates dated changelog structure, version headings, and published links. - [ ] Tests not applicable — justification: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] 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: - [ ] 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: `docs-updated` - Evidence: Reviewed `docs/changelog/2026-07-25.mdx` at exact head `0f5dedb47` against 90 first-parent release commits and 92 merged PRs labeled `v0.0.96`. Verified parser-safe MDX SPDX, the exact version heading, literal CLI names, writing style, skip terms, all 20 root-absolute published links, and the accepted #7591 opt-in authenticated discovery bounds. #7544, #7599, and #7601 remain internal or CI-only release-ledger entries. Changelog tests passed 6/6, the docs build passed with 0 errors and two pre-existing Fern warnings, and `npm run check:diff` plus the final diff check passed. - Agent: Codex Desktop documentation-writer subagent <!-- docs-review-head-sha: 0f5dedb --> <!-- docs-review-agents-blob-sha: be20a09 --> ## 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 check:diff` passed when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — `npx vitest run test/changelog-docs.test.ts`: 6/6 passed. - [ ] 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 this prose-only changelog entry. - [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) — the build passed with 0 errors and 2 existing Fern warnings; the published-route check passed. - [x] 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) — native changelog files use the required parser-safe MDX SPDX comment and no frontmatter. --- Signed-off-by: Carlos Villela <cvillela@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Persistent network policy exclusions with consistent restore/exclusion reporting across rebuilds/snapshots. * Opt-in MCP tool discovery via `mcp status --tools` with bounded, redacted authenticated traffic. * Improved HTTPS inference switching for custom endpoints and refreshed onboarding/model menu details. * Refined OpenShell gateway defaults for port `8080`, including more reliable readiness checks. * **Bug Fixes** * Prevent incorrect provider/model restoration after compatible-provider update failures. * Preserve managed MCP state after exec loss and tighten gateway/doctor status scoping. * **Tests** * Stronger, fail-closed release validation with hardened evidence/artifact handoff and bounded timeouts/retries. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com> Co-authored-by: Prekshi Vyas <prekshiv@nvidia.com>
Summary
The Hermes base image retained npm downloads, Electron archives, node-gyp headers, and production dependencies for every UI workspace after its build artifacts were complete. This change removes those build-only contents in their creating layers while preserving the Hermes runtime, browser tooling, dashboard, TUI, WhatsApp, and Discord behavior.
The final Hermes image also committed Hermes doctor's disposable
/sandbox/.cacheinto the layer that generated configuration, even though a later layer deleted the visible path. The follow-up removes that cache in its creating layer and keeps a final absence guard.Against a matched baseline build at
2f6298ee165f4821f635be962fedff5e165701ee, the measurement-head PR image fell from 1,057,410,491 bytes to 433,015,966 bytes: 624,394,525 bytes smaller (59.05%). Rootnode_modulesfell from 649,783,827 bytes to 79,784,358 bytes (87.72%).Related Issue
Part of #7144. This PR does not close the issue because repeated hosted-runner timing and peak-memory acceptance evidence remains.
Changes
/root/.npm,/root/.cache/electron, and/root/.cache/node-gypin the dependency-install layer that creates them./sandbox/.cachein the same layer that creates it, and reject a surviving path or symlink during final-image sealing.node_modulesunavailable.Type of Change
Quality Gates
f3ad9ca9e3d1778c0fb7eaa6add0607a868269ccagainst base2f6298ee165f4821f635be962fedff5e165701ee, and for the follow-up diff at0c96c1ae4d489ec20b5c008ce38763791014b654. The main-sync commits68885c7855fc90d0fa53bfab4f0bee8eced73784and8abdc43656ab20444450698b46f327dc3de69588do not change the reviewed PR-owned diff, andd6b46853f0b44820bd1f43ac2368d84de3ff2027only strengthens cache-cleanup test coverage. Hosted x86, arm64, and selected E2E validation pass for the reviewed implementation head; the test-only follow-up passes its focused integration suite.Documentation Writer Review
no-docs-neededmain; the PR-owned diff is unchanged.DGX Station Hardware Evidence
Verification
Signed-off-by:line and every commit appears asVerifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run check:diffpassed when hooks were skipped or unavailabletest/sandbox-provisioning.test.ts: 61/61 integration tests passed.npm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes — command/result: Not applicable; the change is covered by focused runtime/image tests, a full exact-head image build, andnpx prek run --from-ref origin/main --to-ref HEAD.npm run docsbuilds without warnings (doc changes only)Additional image evidence:
docker build -f agents/hermes/Dockerfile.base -t nemoclaw-hermes-7144:exact-head .passed at measurement headf3ad9ca9e3d1778c0fb7eaa6add0607a868269cc. The first attempt ended in an npm registryECONNRESET; one controlled retry reused the cached layers and completed.agent-browser0.26.0 CLI, dashboard assets, the self-contained TUI, separate WhatsApp dependencies, and cache absence.68885c7855fc90d0fa53bfab4f0bee8eced73784; the later change only strengthens a test fixture. Peak-memory sampling remains outstanding because alternate-checkout controller runs disable hosted runner telemetry.f3ad9ca9eproduced a 480,356,238-byte final image and follow-up0c96c1ae4produced 457,589,433 bytes: 22,766,805 bytes / 4.74% smaller overall. The PR-added portion above the base fell 48.09%, and the doctor layer fell from 155 MB to 78.6 MB./sandbox/.cacheabsent, and passed a Hermes v0.18.0 runtime smoke. This is local image-size evidence, not yet hosted-runner peak-memory proof.Signed-off-by: Apurv Kumaria akumaria@nvidia.com
Summary by CodeRabbit