Skip to content

fix(whatsapp): report the paired in-process bridge in channels status - #7015

Merged
cv merged 44 commits into
mainfrom
fix/whatsapp-status-probe-unpaired
Jul 20, 2026
Merged

fix(whatsapp): report the paired in-process bridge in channels status#7015
cv merged 44 commits into
mainfrom
fix/whatsapp-status-probe-unpaired

Conversation

@hunglp6d

@hunglp6d hunglp6d commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Summary

nemoclaw <sandbox> channels status --channel whatsapp reported a working, paired WhatsApp bot as unpaired with a dead bridge: the probe checked the pre-2026.6.10 session path and pgrep'd for a separate bridge process that no longer exists (the bridge now runs in-process inside the gateway). This teaches the probe the current OpenClaw session location and derives in-process liveness from the canonical gateway log, and moves the whole probe into a manifest-first phase:"status" hook so channel-status.ts carries zero WhatsApp-specific code (mirroring the Telegram hook from #6887).

Related Issue

Fixes #7016

Changes

  • Probe the current OpenClaw session path credentials/whatsapp/<account> in addition to the legacy whatsapp/ dir (OpenClaw 2026.6.10+ stores the paired Baileys session there), so a paired sandbox is no longer misread as unpaired.
  • Derive in-process-bridge liveness from the canonical in-sandbox gateway log /tmp/gateway.log (where NemoClaw redirects gateway stdout, per agent/gateway-script-shared.ts; the same log the Telegram hook reads), scoped to [whatsapp] lines and emitting only markers + a redacted ISO timestamp — never a raw log line that could carry a phone number.
  • Require a clean probe exit (exec.status === 0) before trusting the result, so a timed-out probe classifies as probe_failed instead of reading a verdict off partial stdout (matches the Telegram hook).
  • Refactor (not a new abstraction — adopts the existing manifest-first status-hook architecture feat(messaging): telegram channels-status health probe #6887 introduced for Telegram, its §8-deferred follow-up): move the probe + evaluator to messaging/channels/whatsapp/hooks/{status-health,status-health-eval}.ts, register a phase:"status" hook in the whatsapp manifest, and run it through the generic status-hook runner. channel-status.ts loses ~312 lines of WhatsApp-specific code; its dispatch now routes both in-sandbox-qr and log-tail deep-probe channels through the same generic runChannelHealthHook. Deletes sandbox/whatsapp-diagnostics.ts.
  • Protected by messaging/channels/whatsapp/hooks/status-health.test.ts + status-health-eval.test.ts: credentials-path evidence, gateway-log heartbeat synthesis, /tmp/gateway.log path assertion (guards the path regression), non-zero-exit → probe_failed, and a sh -n syntax check of the generated probe script.

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
  • Docs not applicable — justification: no user-facing command, flag, or output contract changed; this corrects the accuracy of an existing diagnostic.
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification:
  • Sensitive paths changed (messaging + sandbox)
  • 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:

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 — command/result or justification:
  • Applicable broad gate passed — npm test for broad runtime/test-harness changes; npm run check for repo-wide validation/coverage changes — command/result:
  • 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: Hung Le hple@nvidia.com

Summary by CodeRabbit

  • New Features

    • Added a manifest-driven WhatsApp channel health hook (whatsapp.statusHealth) that reports bridge liveness and heartbeat when available (OpenClaw-based; Hermes bypasses the probe).
  • Bug Fixes

    • Updated sandbox channel status to prefer the declared channel-health hook and fall back to config-only output when missing or paused.
    • Improved health/verdict handling, including correct “stopped bridge” classification and safer handling of malformed/unreliable probe output.
  • Tests

    • Expanded hook registration, verdict mapping, redaction, and robustness tests, plus updated sandbox integration expectations.

@copy-pr-bot

copy-pr-bot Bot commented Jul 16, 2026

Copy link
Copy Markdown

Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Jul 16, 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 an OpenClaw WhatsApp status-health hook using authoritative sandbox status JSON and shared channel-health reports. Registers the hook through the manifest and built-in registry, then routes sandbox channel status through the generic health-hook runner with fallback reporting.

Changes

WhatsApp channel health

Layer / File(s) Summary
Shared health contracts
src/lib/messaging/channels/whatsapp/hooks/status-health-eval.ts, src/lib/messaging/channels/whatsapp/hooks/status-health-eval.test.ts, src/lib/actions/sandbox/channel-status-config.ts
WhatsApp diagnostic types now reuse shared channel-health definitions.
OpenClaw WhatsApp status probe
src/lib/messaging/channels/whatsapp/hooks/status-health.ts, src/lib/messaging/channels/whatsapp/hooks/status-health.test.ts
The hook probes OpenClaw status JSON, maps pairing and liveness data into health signals, redacts sensitive fields, and covers malformed, unreachable, unsupported-agent, and no-op cases.
Hook registration and manifest wiring
src/lib/messaging/channels/whatsapp/hooks/index.ts, src/lib/messaging/channels/whatsapp/manifest.ts, src/lib/messaging/hooks/builtins.ts, src/lib/messaging/hooks/hook-runner.test.ts, src/lib/messaging/channels/manifests.test.ts
Registers whatsapp.statusHealth for OpenClaw and updates registry and manifest assertions.
Generic channel-status routing and integration tests
src/lib/actions/sandbox/channel-status.ts, src/lib/actions/sandbox/channel-status.test.ts
Removes bespoke WhatsApp deep-probe logic, gates status hooks from the manifest, and updates tests to use authoritative OpenClaw outputs and Hermes fallback behavior.

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

Sequence Diagram(s)

sequenceDiagram
  participant ChannelStatus
  participant HookRunner
  participant WhatsappStatusHealth
  participant SandboxExec
  ChannelStatus->>HookRunner: run channel health hook
  HookRunner->>WhatsappStatusHealth: invoke whatsapp.statusHealth
  WhatsappStatusHealth->>SandboxExec: execute OpenClaw status JSON command
  SandboxExec-->>WhatsappStatusHealth: return probe result
  WhatsappStatusHealth-->>HookRunner: return channelHealth report
  HookRunner-->>ChannelStatus: render channel status
Loading

Suggested labels: bug-fix, integration: openclaw

Suggested reviewers: sandl99, cv

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.83% 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 is concise and accurately reflects the WhatsApp status probe fix.
Linked Issues check ✅ Passed The changes address #7016 by using manifest status hooks and OpenClaw probing to recognize paired creds, in-process liveness, and gateway-log health.
Out of Scope Changes check ✅ Passed The added hook wiring, tests, and WhatsApp diagnostics refactor all align with the stated issue and commit objectives.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/whatsapp-status-probe-unpaired

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

@github-code-quality

github-code-quality Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit b6d0ae1 in the fix/whatsapp-status-... branch remains at 96%, unchanged from commit 70d7d28 in the main branch.

TypeScript / code-coverage/cli

The overall coverage in commit b6d0ae1 in the fix/whatsapp-status-... branch remains at 80%, unchanged from commit 70d7d28 in the main branch.

Show a code coverage summary of the most impacted files.
File main 70d7d28 fix/whatsapp-status-... b6d0ae1 +/-
src/lib/inferen...lama/process.ts 100% 50% -50%
src/lib/domain/.../connect-env.ts 97% 89% -8%
src/lib/inferen...er-lifecycle.ts 71% 65% -6%
src/lib/actions...annel-status.ts 93% 91% -2%
src/lib/actions...test-helpers.ts 65% 63% -2%
src/lib/actions...tatus-config.ts 96% 96% 0%
src/lib/messagi...onfig-parser.ts 50% 100% +50%
src/lib/messagi...-health-eval.ts 0% 88% +88%
src/lib/messagi...tatus-health.ts 0% 92% +92%
src/lib/messagi.../hooks/index.ts 0% 100% +100%

Updated July 20, 2026 18:47 UTC

@github-actions

github-actions Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Informational

Advisor assessment: Informational / high confidence
Next action: Review the warnings below.
Findings: 0 blockers · 1 warning · 0 suggestions
Status: Canonical ledger: 0 blocker(s), 1 warning(s), 0 suggestion(s).

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 1 warning · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Model comparison: normalized findings differ; normalized E2E selections differ; Nemotron reported the same number of blockers, 1 fewer warning, the same number of suggestions.

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-onboard, credential-sanitization, security-posture, channels-add-remove, channels-stop-start, onboard-repair, onboard-resume

1 optional E2E recommendation
  • messaging-providers
1 warning · 0 suggestions

Warnings

Warnings do not block.

PRA-1 Warning — Add installed-runtime coverage for the OpenClaw WhatsApp status contract

  • Location: src/lib/messaging/channels/whatsapp/hooks/status-health.ts:155
  • Category: tests
  • Problem: The new health probe treats `openclaw channels status --channel whatsapp --json` as its authoritative runtime source, but all added coverage supplies hand-built JSON to a mocked sandbox executor. No checked-in live test exercises an installed paired OpenClaw WhatsApp bridge through this command and verifies the actual account-map/default-account payload yields a non-unpaired healthy result.
  • Impact: An OpenClaw CLI payload change in field placement, default-account selection, or liveness representation would make real status probes fail closed as `probe_failed` (or misclassify a working bridge) while the mocked fixtures continue to pass.
  • Recommendation: Add a focused existing-E2E-surface regression that invokes `channels status --channel whatsapp` against a paired, working OpenClaw WhatsApp bridge and asserts the reported runtime verdict is healthy (and not unpaired).
  • Verification: Inspect the checked-in E2E inventory and WhatsApp/messaging-provider suites for a test that both establishes a paired OpenClaw WhatsApp runtime and invokes the NemoClaw status command; none is present in the reviewed test inventory.
  • Test coverage: A live installed-runtime test with a paired OpenClaw WhatsApp account whose real `openclaw ... --json` account/default-account fields are consumed by `nemoclaw <sandbox> channels status --channel whatsapp`, asserting a healthy/non-unpaired verdict.
  • Evidence: `runOpenclawStatusProbe` constructs and trusts `openclaw channels status --channel whatsapp --json --timeout <ms>` at src/lib/messaging/channels/whatsapp/hooks/status-health.ts:155. The added status-health tests create JSON fixtures via `openclawJson` and inject them through a mocked executor, rather than invoking an installed OpenClaw bridge. The static E2E inventory reports no test name matching a WhatsApp channels-status command path.

Workflow run details

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

@github-actions

Copy link
Copy Markdown
Contributor

E2E Target Results — ❌ Some tests failed

Run: 29494504124
Workflow ref: fix/whatsapp-status-probe-unpaired
Requested targets: (default — all supported)
Requested test IDs: channels-add-remove,channels-stop-start,onboard-repair,onboard-resume
Summary: 3 passed, 1 failed, 0 cancelled, 0 skipped, 0 unknown

Test Result Total wall clock time
channels-add-remove ✅ success 8m 36s
channels-stop-start ❌ failure 1h 2m 3s
onboard-repair ✅ success 4m 42s
onboard-resume ✅ success 6m 8s

Failed tests: channels-stop-start. Check the workflow run for all logs and artifacts.

@hunglp6d hunglp6d self-assigned this Jul 16, 2026
@hunglp6d
hunglp6d marked this pull request as ready for review July 16, 2026 19:29

@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: 3

🤖 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 `@src/lib/actions/sandbox/channel-status.ts`:
- Around line 24-27: Update showSandboxChannelStatus() to route status-hook
execution through the channel-health manifest rather than gating
runChannelHealthHook() on diagnostic.deepProbe or legacy diagnostic values.
Remove the WhatsappDiagnosticReport import and keep the status path typed as
ChannelHealthReport, ensuring real phase: "status" hooks are executed.

In `@src/lib/messaging/channels/whatsapp/hooks/status-health.ts`:
- Around line 249-252: The WhatsApp health probe must not mark the bridge alive
from any historical startup or listening log. Update the shell logic around
__wa_scoped and GW_ALIVE to derive liveness from the latest successful readiness
event, invalidate it when a later stop or error event appears, and ensure failed
or stale starts cannot override pgrep or produce connectionState "open".
- Around line 217-223: Update the directory-status logic around the quotedDirs
shell loop in src/lib/messaging/channels/whatsapp/hooks/status-health.ts:217-223
to report a populated credentials layout only when the authoritative nested
WhatsApp session artifact exists, not merely when credentials/whatsapp contains
entries. In
src/lib/messaging/channels/whatsapp/hooks/status-health.test.ts:118-144, replace
injected POPULATED results with behavioral coverage through the public boundary
for missing, incomplete, and valid account-session layouts.
🪄 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: 9670ec56-cac1-4e67-8766-e540708b945b

📥 Commits

Reviewing files that changed from the base of the PR and between 24c7334 and fab911c.

📒 Files selected for processing (11)
  • src/lib/actions/sandbox/channel-status-config.ts
  • src/lib/actions/sandbox/channel-status.ts
  • src/lib/messaging/channels/manifests.test.ts
  • src/lib/messaging/channels/whatsapp/hooks/index.ts
  • src/lib/messaging/channels/whatsapp/hooks/status-health-eval.test.ts
  • src/lib/messaging/channels/whatsapp/hooks/status-health-eval.ts
  • src/lib/messaging/channels/whatsapp/hooks/status-health.test.ts
  • src/lib/messaging/channels/whatsapp/hooks/status-health.ts
  • src/lib/messaging/channels/whatsapp/manifest.ts
  • src/lib/messaging/hooks/builtins.ts
  • src/lib/messaging/hooks/hook-runner.test.ts

Comment thread src/lib/actions/sandbox/channel-status.ts Outdated
Comment thread src/lib/messaging/channels/whatsapp/hooks/status-health.ts Outdated
Comment thread src/lib/messaging/channels/whatsapp/hooks/status-health.ts Outdated

@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: 4

🧹 Nitpick comments (1)
src/lib/messaging/channels/whatsapp/hooks/status-health.test.ts (1)

43-48: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Fail when the sequential mock receives an unexpected extra call.

Repeating the final result can hide additional probe executions, allowing the test at Lines 230–249 to pass despite violating its one-exec-per-hook assumption.

Proposed fix
   return vi.fn((_sandbox: string, _command: string, _timeout: number): ExecResult => {
-    const value = results[call] ?? results[results.length - 1] ?? null;
-    call += 1;
-    return value;
+    if (call >= results.length) {
+      throw new Error(`Unexpected exec call ${call + 1}`);
+    }
+    return results[call++];
   });

As per path instructions, flag conditionals that let tests pass without exercising their 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 `@src/lib/messaging/channels/whatsapp/hooks/status-health.test.ts` around lines
43 - 48, Update makeSequentialExec so calls beyond the supplied results fail
immediately instead of reusing the final result or returning null. Preserve
sequential result consumption for expected calls, ensuring tests such as the
one-exec-per-hook case detect unexpected extra executions.

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 `@src/lib/messaging/channels/whatsapp/hooks/status-health.ts`:
- Around line 203-215: Update the !wa branch in the WhatsApp health evaluation
to derive recentLogSignals from json.gatewayReachable: report the gateway as
unreachable when it is false, and report the channel as unavailable or
unconfigured when it is true. Preserve probeReachable and the null runtime
fields so the evaluator still resolves to “unknown.”
- Around line 261-276: Update summarizeOpenclawLive to whitelist healthState
against the documented enum before adding it to parts. Preserve recognized
non-healthy states, map any other non-null value to the fixed "unknown" token,
and avoid emitting arbitrary external text verbatim.
- Around line 347-351: Update epochMsToIso to validate that the numeric epoch
value is within JavaScript Date’s supported range before calling toISOString().
Return null for out-of-range values, while preserving the existing null behavior
for non-numeric, non-finite, and non-positive inputs.
- Around line 90-93: Validate the agent value before the probe selection in the
health-check flow: only "hermes" and the supported OpenClaw agent should
proceed. Deny or skip unsupported values safely instead of routing every
non-Hermes value to runOpenclawStatusProbe, while preserving the existing probe
behavior for valid agents.

---

Nitpick comments:
In `@src/lib/messaging/channels/whatsapp/hooks/status-health.test.ts`:
- Around line 43-48: Update makeSequentialExec so calls beyond the supplied
results fail immediately instead of reusing the final result or returning null.
Preserve sequential result consumption for expected calls, ensuring tests such
as the one-exec-per-hook case detect unexpected extra executions.
🪄 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: eae2d0c1-cbd0-4336-a427-f969c0b7b83c

📥 Commits

Reviewing files that changed from the base of the PR and between fab911c and 39ba950.

📒 Files selected for processing (4)
  • src/lib/actions/sandbox/channel-status.test.ts
  • src/lib/actions/sandbox/channel-status.ts
  • src/lib/messaging/channels/whatsapp/hooks/status-health.test.ts
  • src/lib/messaging/channels/whatsapp/hooks/status-health.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/actions/sandbox/channel-status.ts

Comment thread src/lib/messaging/channels/whatsapp/hooks/status-health.ts Outdated
Comment thread src/lib/messaging/channels/whatsapp/hooks/status-health.ts
Comment thread src/lib/messaging/channels/whatsapp/hooks/status-health.ts
Comment thread src/lib/messaging/channels/whatsapp/hooks/status-health.ts
@github-actions

Copy link
Copy Markdown
Contributor

E2E Target Results — ✅ All requested tests passed

Run: 29562437470
Workflow ref: fix/whatsapp-status-probe-unpaired
Requested targets: (default — all supported)
Requested test IDs: channels-add-remove,channels-stop-start,onboard-repair,onboard-resume,messaging-providers
Summary: 5 passed, 0 failed, 0 cancelled, 0 skipped, 0 unknown

Test Result Total wall clock time
channels-add-remove ✅ success 7m 50s
channels-stop-start ✅ success 14m 55s
messaging-providers ✅ success 12m 44s
onboard-repair ✅ success 4m 36s
onboard-resume ✅ success 6m 22s

@hunglp6d hunglp6d added VRDC Issues and PRs submitted by NVIDIA VRDC test team. area: messaging Messaging channels, bridges, manifests, or channel lifecycle v0.0.86 labels Jul 17, 2026
@wscurran wscurran removed the v0.0.86 label Jul 17, 2026
@cv
cv enabled auto-merge (squash) July 19, 2026 13:51
@cv

cv commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator

Maintainer sweep update: the current-base CI run passed on its first attempt, and 8 of 10 selected live E2E jobs passed. The two Hermes outcomes do not point to this PR's WhatsApp status-probe change:

  • security-posture (Hermes) failed at the OpenShell control layer while restarting the gateway with SUPERVISOR_UNAVAILABLE;
  • channels-stop-start (Hermes) was then canceled by workflow fail-fast.

The existing approval stands. I am deferring the remaining merge decision on live infrastructure evidence; no source changes are requested from the contributor.

@apurvvkumaria apurvvkumaria left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Exact-head review at e0100d4 found a production contract mismatch. The probe reads json.channels.whatsapp, but the pinned OpenClaw 2026.6.10 status command returns per-channel account arrays under channelAccounts and healthy payloads need not contain channels or gatewayReachable. A real healthy response is therefore classified as probe_failed. Consume channelAccounts.whatsapp, select the default account deterministically, and add regression coverage using the exact upstream-shaped payload.

Co-authored-by: Hung Le <hple@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Addressed the exact-head OpenClaw response-contract blocker in verified signed commit 046e987, with original author Hung Le credited as co-author. The probe now consumes channelAccounts.whatsapp, selects channelDefaultAccountId.whatsapp deterministically, fails closed on malformed or ambiguous account payloads, and retains the bounded legacy summary fallback only when channelAccounts is absent. Validation before push: 76 focused tests passed, Biome and diff checks passed, and CLI build/typecheck passed. Fresh exact-head CI is running.

Co-authored-by: Hung Le <hple@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Addressed the remaining exact-head advisor warning in verified signed commit d68b395. Official OpenClaw source confirms both the pinned 2026.6.10 producer and NemoClaw blueprint compatibility floor 2026.3.11 emit channelAccounts plus channelDefaultAccountId, so the unproven summary-only fallback was removed and now fails closed. Invalid-field tests were kept meaningful by moving them onto the authoritative account payload. Validation: 77 focused tests, CLI typecheck, Biome, and diff check passed. Hung Le remains credited as co-author.

@apurvvkumaria
apurvvkumaria dismissed their stale review July 20, 2026 03:24

Superseded by exact-head fixes 046e987 and d68b395: the probe now consumes channelAccounts/default account state and fails closed on summary-only payloads. Independent audit passed with 77 focused tests, zero unresolved threads, and green exact-head CI/advisors. Protected E2E remains a separate required gate.

@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Exact-head E2E follow-up: the single permitted failed-job rerun completed successfully.

The required E2E / PR Gate Coordination check is still red because the controller finalized the first child-run failure as non-retryable and does not reconcile a later successful failed-job rerun. No additional retry was launched; the retry allowance is exhausted. The selected E2E evidence is green, but branch protection still needs controller-state reconciliation or a legitimate new PR revision.

@cjagwani

Copy link
Copy Markdown
Collaborator

The prior exact-revision E2E verdict is terminal for head 2560dd67 on base a5ccdca8; no same-revision retry is appropriate. main has now legitimately advanced to 5b547cdf via #7216, so a current-main merge is the valid path to obtain a fresh exact-base gate.

The intervening mainline change does not overlap this PR's WhatsApp status-probe files. Maintainer edits are disabled for the branch, so please merge current main into fix/whatsapp-status-probe-unpaired without rewriting the verified history. The existing code/security approval can then be re-bound after fresh CI and selected E2E complete.

@cv
cv disabled auto-merge July 20, 2026 19:36
@cv
cv merged commit ac120c8 into main Jul 20, 2026
52 of 54 checks passed
@cv
cv deleted the fix/whatsapp-status-probe-unpaired branch July 20, 2026 19:36
@jyaunches jyaunches mentioned this pull request Jul 20, 2026
22 tasks
jyaunches added a commit that referenced this pull request Jul 20, 2026
<!-- markdownlint-disable MD041 -->
## Summary

Add the canonical `## v0.0.90` entry to `docs/changelog/2026-07-20.mdx`
before the release tag is planned.
The update also corrects the documented custom-image migration window so
the compatibility fallback that first ships in v0.0.90 remains available
until v0.0.91.

## Changes

- Add the v0.0.90 summary and detailed release bullets for managed-image
routing, provider-reset recovery, WhatsApp health reporting, and DGX
Station guidance.
- Keep the newest release first in the shared dated changelog and use
root-absolute links to the canonical OpenClaw routes.
- Correct `docs/reference/commands.mdx` to state that the legacy image
route selector remains supported through v0.0.90 and is removed in
v0.0.91.
- Release source summary:
- [#7264](#7264) ->
`docs/resources/prompt-assets/dgx-station.md`,
`docs/changelog/2026-07-20.mdx`: Record the versioned Station installer
path, Nemotron 3 Ultra 550B default, and explicit DeepSeek override.
- [#7261](#7261) ->
`docs/get-started/dgx-station-preparation.mdx`,
`docs/manage-sandboxes/recover-rebuild-sandboxes.mdx`,
`docs/changelog/2026-07-20.mdx`: Include the OpenIB, legacy recovery,
and Additional Setup documentation follow-ups.
- [#7232](#7232) ->
`docs/changelog/2026-07-20.mdx`: Document provider-reset recovery for
wrapped OpenShell attachment diagnostics.
- [#7189](#7189) ->
`docs/reference/commands.mdx`, `docs/changelog/2026-07-20.mdx`: Document
the managed-image route-selector rename and correct its one-release
migration window.
- [#7015](#7015) ->
`docs/changelog/2026-07-20.mdx`: Document corrected OpenClaw WhatsApp
health reporting.
- No additional user-facing page update is needed for
[#7193](#7193),
[#7110](#7110),
[#6783](#6783), or
[#7263](#7263) because they
change contributor governance, internal CI or release automation, or
editorial style without changing supported user behavior.
- [#7242](#7242) and
[#7225](#7225) are already
ancestors of and documented in v0.0.89, so this entry does not duplicate
them despite their stale v0.0.90 labels.

## 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 the dated changelog heading,
SPDX form, version order, 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:

## DGX Station Hardware Evidence

- [ ] Tested on DGX Station
- Tested commit: Not applicable; this PR does not change
`scripts/prepare-dgx-station-host.sh` or runtime behavior.
- Station profile/scenario: Not applicable.
- Result: Not applicable.
- Supporting evidence: Not applicable.

## 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 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 run; this is a focused
documentation-only change.
- [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) — passed
with 0 errors and two unrelated baseline warnings for unauthenticated
redirect checks and the existing light-mode contrast ratio.
- [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)

---
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>


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

## Summary by CodeRabbit

- **Documentation**
- Added release notes for v0.0.90 covering inference routing, credential
reset behavior, WhatsApp status detection, and DGX Station coding-agent
guidance.
- Updated custom Dockerfile guidance to document continued support for
the legacy provider argument through v0.0.90.
- Clarified that legacy declarations must be renamed to
`NEMOCLAW_INFERENCE_PROVIDER_ID` before v0.0.91.
  - Added and refreshed related documentation links.

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

Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: messaging Messaging channels, bridges, manifests, or channel lifecycle VRDC Issues and PRs submitted by NVIDIA VRDC test team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[All Platforms][WhatsApp] channels status --channel whatsapp reports a working paired bridge as unpaired

8 participants