Skip to content

test(hermes): cover MCP integrity through restart - #7743

Closed
cjagwani wants to merge 10 commits into
mainfrom
codex/7499-hermes-mcp-integrity-restart
Closed

test(hermes): cover MCP integrity through restart#7743
cjagwani wants to merge 10 commits into
mainfrom
codex/7499-hermes-mcp-integrity-restart

Conversation

@cjagwani

@cjagwani cjagwani commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds a focused live regression for the existing managed HTTPS Hermes MCP path from an ordinary sandbox identity through normal shields relock, a real gateway restart, and a failed-reload rollback. The existing Hermes MCP target now follows the reported supported sequence and verifies gateway health plus post-restart and post-rollback integrity without changing production behavior.

Related Issue

Closes #7499

Changes

  • Extend the live Hermes MCP scenario so a real managed add is followed immediately by explicit shields restoration and a supervisor-mediated gateway restart.
  • Verify post-restart gateway health, locked ownership and modes, matching strict and compatibility anchors, and current intended/applied state through the transaction helper's direct inspection.
  • Inject a first-reload failure around the packaged non-root transaction, then require its production rollback path to restore the prior config and both anchors byte-for-byte, perform a real rollback reload, and return gateway health plus intended/applied state to current.
  • Scan the raw in-sandbox Hermes files after restart to confirm the fake bridge secret is absent.
  • Retain the existing focused rollback coverage for failed gateway reloads.

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: Test-only coverage confirms an existing documented contract; no command, output, behavior, or supported surface changes.
  • 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

  • Documentation writer subagent reviewed the completed changes
  • Result: no-docs-needed
  • Evidence: No documentation files changed; existing MCP bridge setup and command reference documentation already cover explicit shields transitions, managed config metadata, hash anchors, gateway restart health, and restart sealing.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

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

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 check:diff passed when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — env PATH=/usr/local/bin:$PATH npx vitest run --project integration test/hermes-mcp-config-transaction.test.ts (27 passed)
  • Applicable broad gate passed — directly selected E2E support and live-target gating contracts (28 passed), CLI typecheck, semantic phase and file-size budgets, and exact Vitest project membership 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: Charan Jagwani cjagwani@nvidia.com

Summary by CodeRabbit

  • Bug Fixes

    • Improved reliability of managed MCP bridge configuration across Hermes gateway restarts while protections remain enabled.
    • Added validation that bridge registration, integrity checks, and configuration state recover correctly after restart and relock operations.
    • Confirmed Hermes secrets remain protected and are not exposed during the restart lifecycle.
  • Tests

    • Expanded integration and end-to-end coverage for MCP add, restart, seal/unseal, integrity, and recovery scenarios.

@cjagwani cjagwani added integration: hermes Hermes integration behavior area: security Security controls, permissions, secrets, or hardening labels Jul 28, 2026
@cjagwani cjagwani self-assigned this Jul 28, 2026
@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds Hermes live E2E coverage for managed MCP additions across shield restoration, gateway restart, locked integrity validation, bridge registration, configuration inspection, and failed-reload rollback.

Changes

Hermes MCP lifecycle integrity

Layer / File(s) Summary
Locked gateway restart lifecycle
test/e2e/live/mcp-bridge-hermes-lifecycle.ts, test/e2e/live/mcp-bridge-phases.ts, test/e2e/live/mcp-bridge.test.ts
Adds the restart and integrity helper, registers a new Hermes phase, verifies bridge/config state, and preserves secret-absence assertions.
Managed reload rollback verification
test/e2e/live/mcp-bridge-hermes-lifecycle.ts
Injects a reload failure and verifies rollback restores configuration, hash anchors, lifecycle identity, and gateway health.

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

Sequence Diagram(s)

sequenceDiagram
  participant HermesTest
  participant Sandbox
  participant HermesGateway
  participant NemoClaw
  participant TransactionHelper
  HermesTest->>Sandbox: Restore shields
  HermesTest->>HermesGateway: Restart gateway
  HermesGateway-->>HermesTest: Return restart and health status
  HermesTest->>Sandbox: Verify permissions and hash anchors
  HermesTest->>NemoClaw: List managed MCP bridges
  HermesTest->>TransactionHelper: Inspect expected configuration payload
  TransactionHelper-->>HermesTest: Report matched state
  HermesTest->>TransactionHelper: Inject managed reload failure
  TransactionHelper-->>HermesTest: Roll back configuration and hashes
Loading

Suggested labels: area: e2e

Suggested reviewers: cv, aasthajh, afourniernv

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes address #7499 by exercising the real managed MCP flow, restoring shields, restarting the gateway, and verifying rollback and integrity state.
Out of Scope Changes check ✅ Passed The PR stays within the managed Hermes MCP test path and adds no apparent unrelated production or feature work.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately reflects the main change: Hermes MCP integrity coverage through a restart.
✨ 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/7499-hermes-mcp-integrity-restart

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

@github-code-quality

github-code-quality Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit 6c43fc0 in the codex/7499-hermes-mc... branch remains at 96%, unchanged from commit 7f4b490 in the main branch.


Updated July 28, 2026 18:48 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.

Actionable comments posted: 1

🧹 Nitpick comments (2)
test/hermes-mcp-transaction-restart.test.ts (2)

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

reloads assertion is a redundant mock-call check.

module.reload_gateway is mocked to append to reloads, and the test then asserts both outcome.reloaded: true (the module's real, public return value) and reloads: ["reload"] (a record of the mock invocation). The latter adds no independent confidence over the former — it only proves the stub was called, not any additional observable behavior.

As per path instructions, tests should "Prefer observable outcomes through the public boundary over source-text, private-shape, or mock-call assertions," and this counts as exactly that pattern.

🤖 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-mcp-transaction-restart.test.ts` around lines 51 - 82, Remove the
redundant reloads tracking and its reloads: ["reload"] assertion from the
transaction restart test. Keep the public outcome.reloaded: true assertion and
the remaining observable integrity assertions, ensuring the test validates
behavior through module.execute rather than mock-call details.

Source: Path instructions


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

Digest "current" recomputation reuses the same private functions being validated — risk of a tautological check.

current_digest (and intended/applied via _parse_config_hash) are computed here by calling the same private helpers (guard._read_text, guard._parse_config_hash, guard._canonical_mcp_servers_digest) that inspect_mcp_integrity_snapshot/assert_mcp_integrity_snapshot_current presumably use internally. If any of these private digest functions has a bug (e.g. non-deterministic or content-insensitive output), both sides of the intended == applied == current comparison would agree on the wrong value, and the test would still pass.

assert_mcp_integrity_snapshot_current(snapshot) above already exercises the real invariant through the module's public validation path — consider relying primarily on that call (and/or comparing against an independently computed reference, e.g. a plain hashlib.sha256 over the raw file bytes) rather than re-deriving "current" via the same private canonicalization routine.

As per path instructions, tests should "Flag copied production algorithms... and conditionals that make a test pass without exercising its claim."

🤖 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-mcp-transaction-restart.test.ts` around lines 119 - 134, Remove
the tautological digest recomputation in the test after
assert_mcp_integrity_snapshot_current(snapshot), especially the use of
guard._parse_config_hash and guard._canonical_mcp_servers_digest for validation.
Rely on the public assertion for the production invariant, and if explicit
digest reporting is required, compute the reference independently from raw file
bytes using a standard hashlib digest rather than copied private helpers.

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.

Inline comments:
In `@test/hermes-mcp-transaction-restart.test.ts`:
- Around line 25-29: Update runPython to pass the same explicit timeout used by
runGuard and strictHashIsValid in its spawnSync options, ensuring hung Python
scripts terminate rather than blocking the test run.

---

Nitpick comments:
In `@test/hermes-mcp-transaction-restart.test.ts`:
- Around line 51-82: Remove the redundant reloads tracking and its reloads:
["reload"] assertion from the transaction restart test. Keep the public
outcome.reloaded: true assertion and the remaining observable integrity
assertions, ensuring the test validates behavior through module.execute rather
than mock-call details.
- Around line 119-134: Remove the tautological digest recomputation in the test
after assert_mcp_integrity_snapshot_current(snapshot), especially the use of
guard._parse_config_hash and guard._canonical_mcp_servers_digest for validation.
Rely on the public assertion for the production invariant, and if explicit
digest reporting is required, compute the reference independently from raw file
bytes using a standard hashlib digest rather than copied private helpers.
🪄 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: 38c24b95-2ddf-46df-bc94-8f9b88a1263f

📥 Commits

Reviewing files that changed from the base of the PR and between c3ab052 and 79ff907.

📒 Files selected for processing (1)
  • test/hermes-mcp-transaction-restart.test.ts

Comment thread test/hermes-mcp-transaction-restart.test.ts Outdated
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
@github-actions

github-actions Bot commented Jul 28, 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 · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings match; normalized E2E selections differ; severity counts match.

Nemotron output stays in workflow artifacts and does not change the assessment above.

E2E guidance

Advisory only. E2E / PR Gate selects and runs jobs independently.

Recommended E2E: cloud-inference, cloud-onboard, security-posture, mcp-bridge, mcp-bridge-dev

Workflow run details

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

@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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
test/hermes-mcp-transaction-restart.test.ts (1)

34-166: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Enable this regression test in the targeted suite.

Because this test is skipped, its restart, recovery, and digest assertions provide no CI regression protection for issue #7499. Replace it.skip with it once the fixture prerequisites are available.

As per path instructions, tests must provide behavioral confidence.

🤖 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-mcp-transaction-restart.test.ts` around lines 34 - 166, Enable
the regression test by changing the skipped test declaration in “Hermes managed
MCP integrity through restart” from it.skipIf to it.skipIf only for unsupported
platforms or identities, ensuring the test runs when fixture prerequisites are
available. Preserve the existing Windows/root skip conditions and all restart,
recovery, and digest assertions.

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/hermes-mcp-transaction-restart.test.ts`:
- Around line 34-166: Enable the regression test by changing the skipped test
declaration in “Hermes managed MCP integrity through restart” from it.skipIf to
it.skipIf only for unsupported platforms or identities, ensuring the test runs
when fixture prerequisites are available. Preserve the existing Windows/root
skip conditions and all restart, recovery, and digest assertions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 97c156b0-722d-49e9-9348-bffb5e8599fa

📥 Commits

Reviewing files that changed from the base of the PR and between 79ff907 and f26fa01.

📒 Files selected for processing (2)
  • test/helpers/hermes-restart-config-seal-fixture.ts
  • test/hermes-mcp-transaction-restart.test.ts

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>

@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.

Actionable comments posted: 1

🧹 Nitpick comments (1)
test/e2e/live/mcp-bridge-hermes-lifecycle.ts (1)

113-170: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Assert the inspector's state via parsed JSON rather than a spaced literal.

toContain('"state": "matched"') couples the assertion to hermes-mcp-config-transaction.py's exact serializer spacing; a json.dumps separator change would fail the test without any behavior change. Parsing effectiveConfig.stdout and asserting the state field keeps the same claim without the formatting lock-in. The mcp list --json block above already does this correctly.

🤖 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/e2e/live/mcp-bridge-hermes-lifecycle.ts` around lines 113 - 170, Update
the effectiveConfig assertion to parse effectiveConfig.stdout as JSON and assert
the parsed state field equals "matched", replacing the exact spaced-string
check. Keep the existing command execution, exit assertion, and secret-redaction
checks unchanged.
🤖 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/e2e/live/mcp-bridge-hermes-lifecycle.ts`:
- Around line 58-85: Remove the ineffective HOST_SECRET and ROTATED_HOST_SECRET
assertions from the redacted restart result in the gateway lifecycle flow.
Validate secret absence at an unredacted boundary, or run a separate canary
probe that does not include these values in redactionValues, while preserving
the existing restart success and health assertions.

---

Nitpick comments:
In `@test/e2e/live/mcp-bridge-hermes-lifecycle.ts`:
- Around line 113-170: Update the effectiveConfig assertion to parse
effectiveConfig.stdout as JSON and assert the parsed state field equals
"matched", replacing the exact spaced-string check. Keep the existing command
execution, exit assertion, and secret-redaction checks unchanged.
🪄 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: 59831b14-33fa-48f8-a237-677620f93fe0

📥 Commits

Reviewing files that changed from the base of the PR and between f26fa01 and ecc0576.

📒 Files selected for processing (4)
  • test/e2e/live/mcp-bridge-hermes-lifecycle.ts
  • test/e2e/live/mcp-bridge-phases.ts
  • test/e2e/live/mcp-bridge.test.ts
  • test/hermes-mcp-transaction-restart.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/hermes-mcp-transaction-restart.test.ts

Comment thread test/e2e/live/mcp-bridge-hermes-lifecycle.ts Outdated
@cjagwani

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

cjagwani added 2 commits July 28, 2026 11:11
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
@cjagwani

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@cjagwani

cjagwani commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator Author

Maintainer waiver requested for an unrelated required-check flake on head 6c43fc03d.

  • cli-test-shards (5) failed only because test/e2e/support/e2e-report-to-pr-workflow-boundary.test.ts:859 exceeded its hard 5,000 ms timeout.
  • The PR diff remains limited to the three Hermes MCP live-E2E files and does not touch that test, its fixture, or its workflow boundary.
  • The same unchanged test timed out on multiple PR attempts; an exact local run failed once at about 5.16 s and passed immediately afterward at about 4.12 s, consistent with a threshold flake.
  • An externally triggered second attempt of the current-head run failed at the identical line and timeout.
  • The other seven CLI shards and all other current-head CI jobs passed. Targeted transaction, E2E-support/gating, typecheck, phase, size, and project-membership checks also passed locally.
  • No further rerun is planned because the failure has repeated without any patch-related signal.

Please confirm whether this non-success check may be waived and the selected mcp-bridge Hermes live E2E may proceed, or direct an alternative validation path.

@cjagwani

Copy link
Copy Markdown
Collaborator Author

Superseded by #7761, which preserves this exact patch on current main with a fresh GitHub-verified branch because repository rules prohibit force-pushing this published branch.

@cjagwani cjagwani closed this Jul 28, 2026
cv added a commit that referenced this pull request Jul 28, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Fix locked Hermes gateway restart after a managed MCP update. The
root-owned restart controller now recognizes the guard-generated v1 MCP
state record in the strict config hash while continuing to reject
malformed, duplicate, unknown, or ambiguous records.

The PR also adds a focused live regression covering managed add, shields
restoration, real gateway restart, integrity verification, and
failed-reload rollback. It replaces #7743 on current `main`; repository
rules forbid force-pushing the published replacement branch. One narrow
test-only timeout adjustment salvages a workflow-boundary check that
twice exhausted Vitest's default 5-second envelope despite its child
process already being bounded to 30 seconds.

## Related Issue

Closes #7499

## Changes

- Parse zero or one exact `nemoclaw-hermes-mcp-state-v1` metadata record
in the locked Hermes strict hash, preserving legacy two-record hashes.
- Reject malformed, duplicate, or unknown metadata and duplicate config
hash paths with `GATEWAY_CONFIG_HASH_MISMATCH`.
- Exercise the existing Hermes MCP live target through managed add,
shields restoration, supervisor-mediated restart, exact locked file/hash
verification, and public transaction inspection.
- Inject a first-reload failure and require the real rollback path to
restore config and both anchors byte-for-byte, prove a healthy rollback
reload, and confirm current state through the packaged public `inspect`
flow.
- Scan raw Hermes files and the startup log after restart to confirm the
fake bridge secret is absent.
- Give the existing workflow-boundary test a 40-second Vitest envelope
around its already-bounded 30-second child process.

## 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

- [x] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [ ] Tests not applicable — justification:
- [ ] Docs updated for user-facing behavior changes
- [x] Docs not applicable — justification: This restores the existing
documented locked Hermes restart contract; the v1 hash record is an
internal guard-generated implementation detail.
- [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: Manual nine-category
security review on `79767cd8c` passed all categories. The root
ownership/mode checks remain unchanged; parsing is bounded ASCII with an
exact known-record regex, and negative tests cover malformed, duplicate,
unknown, and ambiguous input.
- [ ] 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: The parser restores the existing locked Hermes restart
contract while preserving fail-closed validation. The E2E follow-up only
strengthens verification through public packaged behavior.
- Agent: Codex Desktop `/root/replacement_docs_review`
<!-- docs-review-head-sha: 79767cd -->
<!-- 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 — managed gateway control 4/4; Hermes
MCP transaction 27/27; serial MCP live-selection E2E-support 41/41;
workflow-boundary E2E-support 33/33; live Hermes target
collection/import; semantic E2E phases 115 tests across 73 files; CLI
typecheck; exact Vitest project-membership and test-size gates.
- [ ] Applicable broad gate passed — `npm test` for broad
runtime/test-harness changes; `npm run check` for repo-wide
validation/coverage changes — command/result:
- [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)

---
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>


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

* **Tests**
* Expanded end-to-end coverage for managed MCP bridge setup, including
Hermes shield restoration across a locked gateway restart.
* Added rollback validation that confirms a failed managed reload
restores Hermes configuration and integrity anchors.
* Tightened Hermes-related secret expectations and updated Hermes phase
sequencing.
* Added unit coverage for strict locked-hash parsing, covering
legacy/current Hermes state variants and rejecting malformed/ambiguous
inputs.
  * Increased timeout for workflow-to-PR reporting integration E2E.
* **Bug Fixes**
* Strengthened locked Hermes config-hash validation with strict
state-line parsing and clearer mismatch handling.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Carlos Villela <cvillela@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: security Security controls, permissions, secrets, or hardening integration: hermes Hermes integration behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Managed Hermes MCP add can leave config hash stale and gateway unavailable

1 participant