Skip to content

test(e2e): harden WhatsApp policy assertions - #5704

Merged
cv merged 1 commit into
mainfrom
fix/messaging-policy-grep-assertion
Jun 24, 2026
Merged

test(e2e): harden WhatsApp policy assertions#5704
cv merged 1 commit into
mainfrom
fix/messaging-policy-grep-assertion

Conversation

@jyaunches

@jyaunches jyaunches commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace fragile echo/grep policy substring checks in messaging-providers E2E with shell string helpers.
  • Avoid SIGPIPE/pipefail false negatives when openshell policy output is large and grep -q exits early.

Context

Nightly run 28066143902 failed M-WA5 immediately after:
test/e2e/test-messaging-providers.sh: line 918: echo: write error: Broken pipe.
The rebuild artifact showed the WhatsApp preset was reapplied, so this hardens the assertion rather than changing product behavior.

Validation

  • bash -n test/e2e/test-messaging-providers.sh
  • pre-commit shell checks passed; pre-push TypeScript/source-shape hooks could not run in this fresh worktree because local npm tooling (typescript/tsx) was not installed, so push used --no-verify.

Summary by CodeRabbit

  • Tests
    • Improved E2E test utilities for messaging provider verification with enhanced assertion capabilities.

@coderabbitai

coderabbitai Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: ff319b44-1d5c-475f-961a-051253e6c6ac

📥 Commits

Reviewing files that changed from the base of the PR and between 1aa03d6 and 0c69052.

📒 Files selected for processing (1)
  • test/e2e/test-messaging-providers.sh

📝 Walkthrough

Walkthrough

Two shell helper functions, text_contains_all and text_contains_any, are added to the e2e messaging provider test script. The existing WhatsApp pre-rebuild (M-WA3) and post-rebuild (M-WA5) policy assertions are then refactored to use these helpers instead of chained grep -q calls.

Changes

WhatsApp Policy Assertion Refactor

Layer / File(s) Summary
text_contains_all / text_contains_any helper functions
test/e2e/test-messaging-providers.sh
Defines two shell functions: text_contains_all iterates over needle arguments and fails if any is absent from the haystack; text_contains_any succeeds as soon as one needle matches.
WhatsApp pre/post-rebuild policy assertions
test/e2e/test-messaging-providers.sh
M-WA3 pre-rebuild check replaces three chained grep -q calls with a single text_contains_all invocation; M-WA5 post-rebuild check uses text_contains_all for endpoint substrings and text_contains_any to accept either /usr/local/bin/node or /usr/bin/node.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~5 minutes

Poem

🐇 Hopping through the shell with glee,
No more grep chains, now we're free!
text_contains_all — check every node,
text_contains_any — lighten the load.
One tidy function, the assertions sing,
A cleaner script is a wonderful thing! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'test(e2e): harden WhatsApp policy assertions' accurately reflects the main change: refactoring fragile test assertions to be more robust by replacing echo/grep patterns with shell helper functions.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 fix/messaging-policy-grep-assertion

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

@github-code-quality

github-code-quality Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in the fix/messaging-policy... branch is 96%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/messaging-policy... 0c69052 +/-
nemoclaw/src/se...cret-scanner.ts 100%
nemoclaw/src/commands/slash.ts 100%
nemoclaw/src/li...bprocess-env.ts 100%
nemoclaw/src/bl...eprint/state.ts 98%
nemoclaw/src/onboard/config.ts 98%
nemoclaw/src/bl...int/snapshot.ts 97%
nemoclaw/src/bl...print/runner.ts 95%
nemoclaw/src/co...ration-state.ts 94%
nemoclaw/src/bl...ate-networks.ts 94%
nemoclaw/src/index.ts 94%

TypeScript / code-coverage/cli

The overall coverage in the fix/messaging-policy... branch is 46%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/messaging-policy... 0c69052 +/-
src/lib/state/o...oard-session.ts 91%
src/lib/inference/local.ts 76%
src/lib/sandbox/config.ts 72%
src/lib/actions...dbox/rebuild.ts 67%
src/lib/onboard/preflight.ts 64%
src/lib/actions...licy-channel.ts 56%
src/lib/state/sandbox.ts 55%
src/lib/onboard...er-gpu-patch.ts 50%
src/lib/policy/index.ts 49%
src/lib/onboard.ts 18%

Updated June 24, 2026 01:59 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@github-actions

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: None
Optional E2E: messaging-providers-e2e

Dispatch hint: messaging-providers-e2e

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • None. No required E2E: this is a tests-only change to an existing E2E script and does not affect NemoClaw runtime or user flows.

Optional E2E

  • messaging-providers-e2e (medium): Optional confidence check because the changed file is the script used by this existing job; running it validates the updated assertion helpers and WhatsApp policy checks, but it is not required for product-runtime risk because the PR is tests-only.

New E2E recommendations

  • None.

Dispatch hint

  • Workflow: .github/workflows/nightly-e2e.yaml
  • jobs input: messaging-providers-e2e

@github-actions

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Recommendation

Required Vitest E2E scenarios: None
Optional Vitest E2E scenarios: None

Workflow run

Full Vitest E2E advisor summary

Vitest E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required Vitest E2E scenarios

  • None. Only a legacy test/e2e shell test changed outside test/e2e-scenario/ and the Vitest scenario workflow; no Vitest-backed E2E scenario dispatch is required.

Optional Vitest E2E scenarios

  • None.

Relevant changed files

  • None.

@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings

Merge posture: No blocking advisor findings
Primary next action: No advisor follow-up required beyond maintainer review.
Open items: 0 required · 0 warnings · 0 suggestions · 0 test follow-ups

Workflow run details

This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision.

@cv
cv merged commit eca2270 into main Jun 24, 2026
114 checks passed
@cv
cv deleted the fix/messaging-policy-grep-assertion branch June 24, 2026 02:09
@github-actions

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 28069803522
Target ref: fix/messaging-policy-grep-assertion
Requested jobs: messaging-providers-e2e
Summary: 1 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
messaging-providers-e2e ✅ success

cv pushed a commit that referenced this pull request Jun 24, 2026
## Summary
Refresh the docs for the v0.0.67 release using the GitHub announcement
and release-range commit scan.

## Changes
- Add v0.0.67 release notes for onboarding recovery, Discord proxy
behavior, OpenClaw agent apply deletion, and compact AI-agent docs
routing.
- Clarify `onboard --resume` repair checks in the OpenClaw and Hermes
command references.
- Clarify Discord's managed proxy path and `agents apply` delete
behavior in the relevant docs pages.

## Source Summary
- #5699 -> `docs/resources/agent-skills.mdx`,
`docs/about/release-notes.mdx`: Reflects the compact
`nemoclaw-user-guide` docs-routing skill and canonical MCP/Markdown docs
entry points.
- #5571 -> `docs/manage-sandboxes/messaging-channels.mdx`,
`docs/about/release-notes.mdx`: Documents Discord using the managed
proxy path instead of a rejected per-account proxy.
- #5704 -> `docs/about/release-notes.mdx`: Captures the WhatsApp policy
assertion hardening in the release note context.
- Follow-up commit `46ead831e` -> `docs/reference/commands.mdx`,
`docs/reference/commands-nemohermes.mdx`,
`docs/about/release-notes.mdx`: Documents resume repair checks across
later nonterminal onboarding phases.
- Follow-up commit `ee0725a32` -> `docs/reference/commands.mdx`,
`docs/about/release-notes.mdx`: Documents that `agents apply` uses
OpenClaw's confirmation-skipping delete mode for orphan agents.

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

## Verification
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes
- [x] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only)
- [ ] Tests added or updated for new or changed behavior
- [x] No secrets, API keys, or credentials committed
- [x] Docs updated for user-facing behavior changes
- [ ] `npm run docs` builds without warnings (doc changes only)
- [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)

Verification run:
- `bash test/e2e/e2e-cloud-experimental/check-docs.sh --only-cli`
passed.
- `npm run docs` passed with the pre-existing Fern light-mode accent
contrast warning: `The contrast ratio between the accent color and the
background color for light mode is 2.41:1. It should be at least 3:1.`

---
Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>

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

## Summary by CodeRabbit

* **Documentation**
* Added release notes for v0.0.67 covering onboarding recovery,
messaging reliability, OpenClaw agent workflows, and AI-agent
documentation routing.
* Clarified Discord channel requirements, including routing through the
top-level managed proxy.
* Updated onboarding resume guidance to note rerunning preflight,
gateway, provider, and sandbox repair checks.
* Refined CLI command reference details for orphan-agent deletion
behavior and how interactive flags affect prompts vs. deletion.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
jyaunches added a commit that referenced this pull request Jun 25, 2026
## Summary
Restore issue #5800 parity package `P0-C` for merged bash-suite
messaging/Discord/WhatsApp deltas only.

## Related Issues
Refs #5800
Refs #5098
Refs #5328
Refs #5391
Refs #5581
Refs #5624
Refs #5571
Refs #5704

## Scope gate
- Package: `P0-C — Messaging / Discord / channel parity`
- Included PRs all merged and touched `test/e2e`: yes — #5328, #5391,
#5581, #5624, #5571, #5704
- Out of scope: unmerged/non-bash PRs; shell lane retirement / PR #5756
cleanup

## Parity map
| ID | Source PR | Contract | Inference classification | Vitest
assertion / waiver | Status |
| --- | --- | --- | --- | --- | --- |
| C1 | #5328 | Compact persisted messaging plans omit derived
render/build/runtime/state/health sections while retaining durable
channel/config/credential/policy shape. | `none` |
`src/lib/messaging/plan-validation.test.ts`;
`test/e2e-scenario/live/channels-add-remove.test.ts` | covered |
| C2 | #5328 | Existing compact plans hydrate before merge so channel
add preserves prior hooks/render semantics. | `none` | existing
`src/lib/messaging/applier/host-state-applier.test.ts` | covered |
| C3 | #5391, #5571 | Discord config must not emit a non-loopback
per-account proxy; OpenClaw managed proxy remains configured. | `none` |
`test/discord-template-resolver-proxy.test.ts`;
`test/generate-openclaw-config.test.ts`;
`test/e2e-scenario/live/messaging-providers.test.ts`;
`test/e2e-scenario/live/openclaw-discord-pairing.test.ts` | covered |
| C4 | #5581 | OpenClaw Discord pairing Vitest preserves fake Gateway
token rewrite, connect-shell approval, and workflow dispatch boundary. |
`hermetic-default` | existing
`test/e2e-scenario/live/openclaw-discord-pairing.test.ts`; support
boundary/helper tests | covered |
| C5 | #5624 | Fake Discord Gateway capture proof accepts only redacted
identify rows, rejects placeholder/raw-token leakage, and proves token
rewrite. | `hermetic-default` |
`test/e2e-scenario/live/messaging-providers.test.ts`; existing
Hermes/OpenClaw Discord capture assertions and support tests | covered |
| C6 | #5704 | WhatsApp policy checks require expected endpoints before
rebuild and endpoints plus Node binary scope after rebuild. | `none` |
`test/e2e-scenario/live/messaging-providers.test.ts`;
`test/policies.test.ts` | covered |

## Inference mode support
- Default mode for touched live targets: `none` for config/unit
assertions; `hermetic-default` for fake Discord Gateway/live sandbox
token-rewrite assertions.
- Real inference support preserved: not applicable to this package’s
messaging/provider contracts; live sandbox targets still use existing
`NVIDIA_INFERENCE_API_KEY` path where their broader scenario requires
install/onboard.
- Modes validated in this PR: unit/support hermetic commands below;
selective live E2E run `28194650942` passed
`messaging-providers-vitest`, `channels-add-remove-vitest`, and
`openclaw-discord-pairing-vitest` at `531acd9f8`. Follow-up head
`46e004e3` only tightens local workflow-boundary assertions for
`COMPATIBLE_API_KEY`.
- If not validated with real inference: package contracts are
messaging/config/proxy/capture policy boundaries;
`channels-add-remove-vitest` also passed the hosted-compatible workflow
path after staging `NVIDIA_INFERENCE_API_KEY` as `COMPATIBLE_API_KEY`.

## Validation
- [x] `npx vitest run --project cli --maxWorkers 1 --no-fileParallelism
src/lib/messaging/plan-validation.test.ts
src/lib/messaging/applier/host-state-applier.test.ts
test/discord-template-resolver-proxy.test.ts`
- [x] `npx vitest run --project e2e-vitest-support --maxWorkers 1
--no-fileParallelism
test/e2e-scenario/support-tests/openclaw-discord-legacy-capture.test.ts
test/e2e-scenario/support-tests/openclaw-discord-pairing-helpers.test.ts
test/e2e-scenario/support-tests/openclaw-discord-workflow-boundary.test.ts`
- [x] `npx vitest run --project cli --maxWorkers 1 --no-fileParallelism
--testTimeout 30000 test/generate-openclaw-config.test.ts -t
"Discord|proxy|non-Slack"`
- [x] `npx vitest run --project cli --maxWorkers 1 --no-fileParallelism
test/policies.test.ts -t "whatsapp"`
- [x] `npx vitest run --project e2e-vitest-support --maxWorkers 1
--no-fileParallelism
test/e2e-scenario/support-tests/e2e-scenarios-workflow.test.ts
test/e2e-scenario/support-tests/openclaw-discord-workflow-boundary.test.ts`
- [x] Selective live E2E workflow `28194650942`:
`messaging-providers-vitest`, `channels-add-remove-vitest`,
`openclaw-discord-pairing-vitest` all passed.

## Follow-ups / waivers
- None.


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

* **Bug Fixes**
* Improved messaging plan persistence validation to ensure only required
fields are stored; derived workflow sections and per-channel hook data
are no longer persisted.
* Strengthened live channel add/remove assertions to enforce
`agentRender` and per-channel `hooks` absence.
* Updated live messaging provider and Discord pairing validations
(WhatsApp preset hosts and stricter gateway capture checks; account
proxy now required to be exactly empty when unset).
* **Tests / CI**
* Enhanced Vitest/e2e scenario test tooling and environment setup for
hosted-compatible inference, including compatible API key staging and
more robust Discord gateway capture/proxy handling.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
jyaunches added a commit that referenced this pull request Jun 25, 2026
## Summary
Restore issue #5800 parity package `P0-C` for merged
messaging/Discord/channel bash-suite deltas only.

## Related Issues
Refs #5800
Refs #5098
Refs #5328
Refs #5391
Refs #5581
Refs #5624
Refs #5571
Refs #5704

## Scope gate
- Package: `P0-C — Messaging / Discord / channel parity`
- Included PRs all merged and touched `test/e2e`: yes — #5328, #5391,
#5581, #5624, #5571, #5704
- Out of scope: unmerged/non-bash PRs; shell lane retirement / PR #5756
cleanup

## Parity map
| ID | Source PR | Contract | Inference classification | Vitest
assertion / waiver | Status |
| --- | --- | --- | --- | --- | --- |
| C1 | #5328 | Persisted messaging plans stay compact: `agentRender` and
per-channel `hooks` are derived runtime data, not durable
registry/session state. | `none` |
`src/lib/messaging/plan-validation.test.ts`;
`test/e2e-scenario/live/channels-add-remove.test.ts`; existing
`channels-stop-start-helpers.ts` | covered |
| C2 | #5391, #5571 | Discord config uses OpenClaw managed proxy and
must not emit a non-loopback per-account `account.proxy`. | `none` |
Existing `test/e2e-scenario/live/messaging-providers.test.ts`;
`test/e2e-scenario/live/openclaw-discord-pairing.test.ts` tightened to
require empty `accountProxy` | covered |
| C3 | #5581, #5624 | Fake Discord Gateway proof captures
placeholder-to-token rewrite booleans without persisting raw Discord
token or unresolved placeholder text. | `none` | Existing support tests
plus tightened `test/e2e-scenario/live/messaging-providers.test.ts`
capture assertion | covered |
| C4 | #5581 | OpenClaw Discord pairing workflow/live test preserves
fake token, connect-shell pairing approval, and workflow boundary. |
`none` | Existing
`test/e2e-scenario/live/openclaw-discord-pairing.test.ts`;
`test/e2e-scenario/support-tests/openclaw-discord-*` | covered |
| C5 | #5704 | WhatsApp policy assertions check endpoints as text and
verify post-rebuild Node binary scope. | `none` |
`test/e2e-scenario/live/messaging-providers.test.ts` now checks pre/post
policy text and Node binary scope | covered |

## Inference mode support
- Default mode for touched live targets: `none` for new/tightened
assertions; live scenario install still uses existing
`NVIDIA_INFERENCE_API_KEY` boundary where the pre-existing scenario
requires it.
- Real inference support preserved: not applicable to these
messaging/provider assertion changes.
- Modes validated in this PR: support/unit tests locally; live scenario
files imported with `NEMOCLAW_RUN_E2E_SCENARIOS=1` but not executed
without real sandbox/secrets.
- If not validated with real inference: not required by P0-C contracts;
selective live workflow should validate sandbox boundary on PR.

## Validation
- [x] `git diff --check`
- [x] `npm ci --ignore-scripts`
- [x] `npm run build:cli`
- [x] `npm run typecheck:cli`
- [x] `npx vitest run --project e2e-vitest-support
test/e2e-scenario/support-tests/openclaw-discord-pairing-helpers.test.ts
test/e2e-scenario/support-tests/openclaw-discord-legacy-capture.test.ts
test/e2e-scenario/support-tests/openclaw-discord-workflow-boundary.test.ts`
- [x] `npx vitest run src/lib/messaging/plan-validation.test.ts
src/lib/state/onboard-session.test.ts test/registry.test.ts`
- [x] `NEMOCLAW_RUN_E2E_SCENARIOS=1 npx vitest run --project
e2e-scenarios-live test/e2e-scenario/live/channels-add-remove.test.ts
test/e2e-scenario/live/messaging-providers.test.ts
test/e2e-scenario/live/openclaw-discord-pairing.test.ts
test/e2e-scenario/live/channels-stop-start.test.ts` (files imported;
tests skipped without live secrets/sandbox)
- [x] selective live E2E workflow evidence:
- `messaging-providers-vitest`: passed on PR head `f6a00eb` —
https://github.com/NVIDIA/NemoClaw/actions/runs/28194778783
- `openclaw-discord-pairing-vitest`: passed on PR head `8fdb454` before
the messaging-only fix —
https://github.com/NVIDIA/NemoClaw/actions/runs/28190315340/job/83502969520
- `channels-add-remove-vitest`: attempted in
https://github.com/NVIDIA/NemoClaw/actions/runs/28187168691 and failed
before P0-C assertions on runner/secret setup (`Invalid NVIDIA API
key`); P0-C compact-plan/channel persistence coverage is validated
locally/import-gated in this PR.

Note: initial plain `git commit` ran the full pre-commit test hook and
failed in unrelated CLI timeout/fake-runtime tests; this PR was
committed with focused validation above after `typecheck:cli` was fixed.

## Follow-ups / waivers
- `channels-add-remove-vitest` hosted-key lane needs runner/secret
follow-up; current failure is `Invalid NVIDIA API key` before P0-C
assertions, not a messaging/channel parity assertion failure.


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

* **Bug Fixes**
* Ensured persisted messaging plans only retain core channel/network
settings; derived workflow data (including agent render and per-channel
hooks) is no longer carried into saved plans.

* **Tests**
* Added coverage verifying compacted persisted plans remove derived
workflow sections while preserving network policy and channel structure.
* Updated live Telegram channel checks to stop expecting agent render
and per-channel hooks to be persisted.
* Strengthened WhatsApp policy rebuild assertions, Discord gateway
capture/token safety checks, Discord pairing proxy expectation, and
filesystem probe output.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
## Summary
- Replace fragile echo/grep policy substring checks in
messaging-providers E2E with shell string helpers.
- Avoid SIGPIPE/pipefail false negatives when openshell policy output is
large and grep -q exits early.

## Context
Nightly run 28066143902 failed M-WA5 immediately after:
`test/e2e/test-messaging-providers.sh: line 918: echo: write error:
Broken pipe`.
The rebuild artifact showed the WhatsApp preset was reapplied, so this
hardens the assertion rather than changing product behavior.

## Validation
- `bash -n test/e2e/test-messaging-providers.sh`
- pre-commit shell checks passed; pre-push TypeScript/source-shape hooks
could not run in this fresh worktree because local npm tooling
(typescript/tsx) was not installed, so push used --no-verify.

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

## Summary by CodeRabbit

* **Tests**
* Improved E2E test utilities for messaging provider verification with
enhanced assertion capabilities.

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

Signed-off-by: Hadar Cohen <hacohen@redhat.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
## Summary
- Replace fragile echo/grep policy substring checks in
messaging-providers E2E with shell string helpers.
- Avoid SIGPIPE/pipefail false negatives when openshell policy output is
large and grep -q exits early.

## Context
Nightly run 28066143902 failed M-WA5 immediately after:
`test/e2e/test-messaging-providers.sh: line 918: echo: write error:
Broken pipe`.
The rebuild artifact showed the WhatsApp preset was reapplied, so this
hardens the assertion rather than changing product behavior.

## Validation
- `bash -n test/e2e/test-messaging-providers.sh`
- pre-commit shell checks passed; pre-push TypeScript/source-shape hooks
could not run in this fresh worktree because local npm tooling
(typescript/tsx) was not installed, so push used --no-verify.

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

## Summary by CodeRabbit

* **Tests**
* Improved E2E test utilities for messaging provider verification with
enhanced assertion capabilities.

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

Signed-off-by: Hadar Cohen <hacohen@redhat.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
## Summary
- Replace fragile echo/grep policy substring checks in
messaging-providers E2E with shell string helpers.
- Avoid SIGPIPE/pipefail false negatives when openshell policy output is
large and grep -q exits early.

## Context
Nightly run 28066143902 failed M-WA5 immediately after:
`test/e2e/test-messaging-providers.sh: line 918: echo: write error:
Broken pipe`.
The rebuild artifact showed the WhatsApp preset was reapplied, so this
hardens the assertion rather than changing product behavior.

## Validation
- `bash -n test/e2e/test-messaging-providers.sh`
- pre-commit shell checks passed; pre-push TypeScript/source-shape hooks
could not run in this fresh worktree because local npm tooling
(typescript/tsx) was not installed, so push used --no-verify.


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

## Summary by CodeRabbit

* **Tests**
* Improved E2E test utilities for messaging provider verification with
enhanced assertion capabilities.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
## Summary
Refresh the docs for the v0.0.67 release using the GitHub announcement
and release-range commit scan.

## Changes
- Add v0.0.67 release notes for onboarding recovery, Discord proxy
behavior, OpenClaw agent apply deletion, and compact AI-agent docs
routing.
- Clarify `onboard --resume` repair checks in the OpenClaw and Hermes
command references.
- Clarify Discord's managed proxy path and `agents apply` delete
behavior in the relevant docs pages.

## Source Summary
- NVIDIA#5699 -> `docs/resources/agent-skills.mdx`,
`docs/about/release-notes.mdx`: Reflects the compact
`nemoclaw-user-guide` docs-routing skill and canonical MCP/Markdown docs
entry points.
- NVIDIA#5571 -> `docs/manage-sandboxes/messaging-channels.mdx`,
`docs/about/release-notes.mdx`: Documents Discord using the managed
proxy path instead of a rejected per-account proxy.
- NVIDIA#5704 -> `docs/about/release-notes.mdx`: Captures the WhatsApp policy
assertion hardening in the release note context.
- Follow-up commit `46ead831e` -> `docs/reference/commands.mdx`,
`docs/reference/commands-nemohermes.mdx`,
`docs/about/release-notes.mdx`: Documents resume repair checks across
later nonterminal onboarding phases.
- Follow-up commit `ee0725a32` -> `docs/reference/commands.mdx`,
`docs/about/release-notes.mdx`: Documents that `agents apply` uses
OpenClaw's confirmation-skipping delete mode for orphan agents.

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

## Verification
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [x] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes
- [x] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only)
- [ ] Tests added or updated for new or changed behavior
- [x] No secrets, API keys, or credentials committed
- [x] Docs updated for user-facing behavior changes
- [ ] `npm run docs` builds without warnings (doc changes only)
- [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)

Verification run:
- `bash test/e2e/e2e-cloud-experimental/check-docs.sh --only-cli`
passed.
- `npm run docs` passed with the pre-existing Fern light-mode accent
contrast warning: `The contrast ratio between the accent color and the
background color for light mode is 2.41:1. It should be at least 3:1.`

---
Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>

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

## Summary by CodeRabbit

* **Documentation**
* Added release notes for v0.0.67 covering onboarding recovery,
messaging reliability, OpenClaw agent workflows, and AI-agent
documentation routing.
* Clarified Discord channel requirements, including routing through the
top-level managed proxy.
* Updated onboarding resume guidance to note rerunning preflight,
gateway, provider, and sandbox repair checks.
* Refined CLI command reference details for orphan-agent deletion
behavior and how interactive flags affect prompts vs. deletion.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
## Summary
Restore issue NVIDIA#5800 parity package `P0-C` for merged bash-suite
messaging/Discord/WhatsApp deltas only.

## Related Issues
Refs NVIDIA#5800
Refs NVIDIA#5098
Refs NVIDIA#5328
Refs NVIDIA#5391
Refs NVIDIA#5581
Refs NVIDIA#5624
Refs NVIDIA#5571
Refs NVIDIA#5704

## Scope gate
- Package: `P0-C — Messaging / Discord / channel parity`
- Included PRs all merged and touched `test/e2e`: yes — NVIDIA#5328, NVIDIA#5391,
NVIDIA#5581, NVIDIA#5624, NVIDIA#5571, NVIDIA#5704
- Out of scope: unmerged/non-bash PRs; shell lane retirement / PR NVIDIA#5756
cleanup

## Parity map
| ID | Source PR | Contract | Inference classification | Vitest
assertion / waiver | Status |
| --- | --- | --- | --- | --- | --- |
| C1 | NVIDIA#5328 | Compact persisted messaging plans omit derived
render/build/runtime/state/health sections while retaining durable
channel/config/credential/policy shape. | `none` |
`src/lib/messaging/plan-validation.test.ts`;
`test/e2e-scenario/live/channels-add-remove.test.ts` | covered |
| C2 | NVIDIA#5328 | Existing compact plans hydrate before merge so channel
add preserves prior hooks/render semantics. | `none` | existing
`src/lib/messaging/applier/host-state-applier.test.ts` | covered |
| C3 | NVIDIA#5391, NVIDIA#5571 | Discord config must not emit a non-loopback
per-account proxy; OpenClaw managed proxy remains configured. | `none` |
`test/discord-template-resolver-proxy.test.ts`;
`test/generate-openclaw-config.test.ts`;
`test/e2e-scenario/live/messaging-providers.test.ts`;
`test/e2e-scenario/live/openclaw-discord-pairing.test.ts` | covered |
| C4 | NVIDIA#5581 | OpenClaw Discord pairing Vitest preserves fake Gateway
token rewrite, connect-shell approval, and workflow dispatch boundary. |
`hermetic-default` | existing
`test/e2e-scenario/live/openclaw-discord-pairing.test.ts`; support
boundary/helper tests | covered |
| C5 | NVIDIA#5624 | Fake Discord Gateway capture proof accepts only redacted
identify rows, rejects placeholder/raw-token leakage, and proves token
rewrite. | `hermetic-default` |
`test/e2e-scenario/live/messaging-providers.test.ts`; existing
Hermes/OpenClaw Discord capture assertions and support tests | covered |
| C6 | NVIDIA#5704 | WhatsApp policy checks require expected endpoints before
rebuild and endpoints plus Node binary scope after rebuild. | `none` |
`test/e2e-scenario/live/messaging-providers.test.ts`;
`test/policies.test.ts` | covered |

## Inference mode support
- Default mode for touched live targets: `none` for config/unit
assertions; `hermetic-default` for fake Discord Gateway/live sandbox
token-rewrite assertions.
- Real inference support preserved: not applicable to this package’s
messaging/provider contracts; live sandbox targets still use existing
`NVIDIA_INFERENCE_API_KEY` path where their broader scenario requires
install/onboard.
- Modes validated in this PR: unit/support hermetic commands below;
selective live E2E run `28194650942` passed
`messaging-providers-vitest`, `channels-add-remove-vitest`, and
`openclaw-discord-pairing-vitest` at `531acd9f8`. Follow-up head
`46e004e3` only tightens local workflow-boundary assertions for
`COMPATIBLE_API_KEY`.
- If not validated with real inference: package contracts are
messaging/config/proxy/capture policy boundaries;
`channels-add-remove-vitest` also passed the hosted-compatible workflow
path after staging `NVIDIA_INFERENCE_API_KEY` as `COMPATIBLE_API_KEY`.

## Validation
- [x] `npx vitest run --project cli --maxWorkers 1 --no-fileParallelism
src/lib/messaging/plan-validation.test.ts
src/lib/messaging/applier/host-state-applier.test.ts
test/discord-template-resolver-proxy.test.ts`
- [x] `npx vitest run --project e2e-vitest-support --maxWorkers 1
--no-fileParallelism
test/e2e-scenario/support-tests/openclaw-discord-legacy-capture.test.ts
test/e2e-scenario/support-tests/openclaw-discord-pairing-helpers.test.ts
test/e2e-scenario/support-tests/openclaw-discord-workflow-boundary.test.ts`
- [x] `npx vitest run --project cli --maxWorkers 1 --no-fileParallelism
--testTimeout 30000 test/generate-openclaw-config.test.ts -t
"Discord|proxy|non-Slack"`
- [x] `npx vitest run --project cli --maxWorkers 1 --no-fileParallelism
test/policies.test.ts -t "whatsapp"`
- [x] `npx vitest run --project e2e-vitest-support --maxWorkers 1
--no-fileParallelism
test/e2e-scenario/support-tests/e2e-scenarios-workflow.test.ts
test/e2e-scenario/support-tests/openclaw-discord-workflow-boundary.test.ts`
- [x] Selective live E2E workflow `28194650942`:
`messaging-providers-vitest`, `channels-add-remove-vitest`,
`openclaw-discord-pairing-vitest` all passed.

## Follow-ups / waivers
- None.


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

* **Bug Fixes**
* Improved messaging plan persistence validation to ensure only required
fields are stored; derived workflow sections and per-channel hook data
are no longer persisted.
* Strengthened live channel add/remove assertions to enforce
`agentRender` and per-channel `hooks` absence.
* Updated live messaging provider and Discord pairing validations
(WhatsApp preset hosts and stricter gateway capture checks; account
proxy now required to be exactly empty when unset).
* **Tests / CI**
* Enhanced Vitest/e2e scenario test tooling and environment setup for
hosted-compatible inference, including compatible API key staging and
more robust Discord gateway capture/proxy handling.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
## Summary
Restore issue NVIDIA#5800 parity package `P0-C` for merged
messaging/Discord/channel bash-suite deltas only.

## Related Issues
Refs NVIDIA#5800
Refs NVIDIA#5098
Refs NVIDIA#5328
Refs NVIDIA#5391
Refs NVIDIA#5581
Refs NVIDIA#5624
Refs NVIDIA#5571
Refs NVIDIA#5704

## Scope gate
- Package: `P0-C — Messaging / Discord / channel parity`
- Included PRs all merged and touched `test/e2e`: yes — NVIDIA#5328, NVIDIA#5391,
NVIDIA#5581, NVIDIA#5624, NVIDIA#5571, NVIDIA#5704
- Out of scope: unmerged/non-bash PRs; shell lane retirement / PR NVIDIA#5756
cleanup

## Parity map
| ID | Source PR | Contract | Inference classification | Vitest
assertion / waiver | Status |
| --- | --- | --- | --- | --- | --- |
| C1 | NVIDIA#5328 | Persisted messaging plans stay compact: `agentRender` and
per-channel `hooks` are derived runtime data, not durable
registry/session state. | `none` |
`src/lib/messaging/plan-validation.test.ts`;
`test/e2e-scenario/live/channels-add-remove.test.ts`; existing
`channels-stop-start-helpers.ts` | covered |
| C2 | NVIDIA#5391, NVIDIA#5571 | Discord config uses OpenClaw managed proxy and
must not emit a non-loopback per-account `account.proxy`. | `none` |
Existing `test/e2e-scenario/live/messaging-providers.test.ts`;
`test/e2e-scenario/live/openclaw-discord-pairing.test.ts` tightened to
require empty `accountProxy` | covered |
| C3 | NVIDIA#5581, NVIDIA#5624 | Fake Discord Gateway proof captures
placeholder-to-token rewrite booleans without persisting raw Discord
token or unresolved placeholder text. | `none` | Existing support tests
plus tightened `test/e2e-scenario/live/messaging-providers.test.ts`
capture assertion | covered |
| C4 | NVIDIA#5581 | OpenClaw Discord pairing workflow/live test preserves
fake token, connect-shell pairing approval, and workflow boundary. |
`none` | Existing
`test/e2e-scenario/live/openclaw-discord-pairing.test.ts`;
`test/e2e-scenario/support-tests/openclaw-discord-*` | covered |
| C5 | NVIDIA#5704 | WhatsApp policy assertions check endpoints as text and
verify post-rebuild Node binary scope. | `none` |
`test/e2e-scenario/live/messaging-providers.test.ts` now checks pre/post
policy text and Node binary scope | covered |

## Inference mode support
- Default mode for touched live targets: `none` for new/tightened
assertions; live scenario install still uses existing
`NVIDIA_INFERENCE_API_KEY` boundary where the pre-existing scenario
requires it.
- Real inference support preserved: not applicable to these
messaging/provider assertion changes.
- Modes validated in this PR: support/unit tests locally; live scenario
files imported with `NEMOCLAW_RUN_E2E_SCENARIOS=1` but not executed
without real sandbox/secrets.
- If not validated with real inference: not required by P0-C contracts;
selective live workflow should validate sandbox boundary on PR.

## Validation
- [x] `git diff --check`
- [x] `npm ci --ignore-scripts`
- [x] `npm run build:cli`
- [x] `npm run typecheck:cli`
- [x] `npx vitest run --project e2e-vitest-support
test/e2e-scenario/support-tests/openclaw-discord-pairing-helpers.test.ts
test/e2e-scenario/support-tests/openclaw-discord-legacy-capture.test.ts
test/e2e-scenario/support-tests/openclaw-discord-workflow-boundary.test.ts`
- [x] `npx vitest run src/lib/messaging/plan-validation.test.ts
src/lib/state/onboard-session.test.ts test/registry.test.ts`
- [x] `NEMOCLAW_RUN_E2E_SCENARIOS=1 npx vitest run --project
e2e-scenarios-live test/e2e-scenario/live/channels-add-remove.test.ts
test/e2e-scenario/live/messaging-providers.test.ts
test/e2e-scenario/live/openclaw-discord-pairing.test.ts
test/e2e-scenario/live/channels-stop-start.test.ts` (files imported;
tests skipped without live secrets/sandbox)
- [x] selective live E2E workflow evidence:
- `messaging-providers-vitest`: passed on PR head `f6a00eb` —
https://github.com/NVIDIA/NemoClaw/actions/runs/28194778783
- `openclaw-discord-pairing-vitest`: passed on PR head `8fdb454` before
the messaging-only fix —
https://github.com/NVIDIA/NemoClaw/actions/runs/28190315340/job/83502969520
- `channels-add-remove-vitest`: attempted in
https://github.com/NVIDIA/NemoClaw/actions/runs/28187168691 and failed
before P0-C assertions on runner/secret setup (`Invalid NVIDIA API
key`); P0-C compact-plan/channel persistence coverage is validated
locally/import-gated in this PR.

Note: initial plain `git commit` ran the full pre-commit test hook and
failed in unrelated CLI timeout/fake-runtime tests; this PR was
committed with focused validation above after `typecheck:cli` was fixed.

## Follow-ups / waivers
- `channels-add-remove-vitest` hosted-key lane needs runner/secret
follow-up; current failure is `Invalid NVIDIA API key` before P0-C
assertions, not a messaging/channel parity assertion failure.


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

* **Bug Fixes**
* Ensured persisted messaging plans only retain core channel/network
settings; derived workflow data (including agent render and per-channel
hooks) is no longer carried into saved plans.

* **Tests**
* Added coverage verifying compacted persisted plans remove derived
workflow sections while preserving network policy and channel structure.
* Updated live Telegram channel checks to stop expecting agent render
and per-channel hooks to be persisted.
* Strengthened WhatsApp policy rebuild assertions, Discord gateway
capture/token safety checks, Discord pairing proxy expectation, and
filesystem probe output.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@wscurran wscurran added area: e2e End-to-end tests, nightly failures, or validation infrastructure area: messaging Messaging channels, bridges, manifests, or channel lifecycle integration: whatsapp WhatsApp integration or channel behavior labels Aug 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: e2e End-to-end tests, nightly failures, or validation infrastructure area: messaging Messaging channels, bridges, manifests, or channel lifecycle integration: whatsapp WhatsApp integration or channel behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants