Skip to content

fix(messaging): surface Telegram mention mode in channel status - #6220

Merged
cv merged 11 commits into
mainfrom
fix/5691-telegram-mention-status
Jul 3, 2026
Merged

fix(messaging): surface Telegram mention mode in channel status#6220
cv merged 11 commits into
mainfrom
fix/5691-telegram-mention-status

Conversation

@apurvvkumaria

@apurvvkumaria apurvvkumaria commented Jul 3, 2026

Copy link
Copy Markdown
Collaborator

Summary

Surface Telegram's effective group mention mode in channels status by parsing the rendered agent configuration and comparing it with the sandbox messaging entry. This keeps the configuration surface scoped to status diagnostics only; doctor and docs are intentionally unchanged.
Having this PR #6220 to fix TELEGRAM_REQUIRE_MENTION surface in channel status. I strongly not recommend to add for nemoclaw doctor because doctor is for generic debug. Channels status -- channel telegram will show detail debug configuration.

➜  NemoClaw git:(fix/5691-telegram-mention-status) ✗ nemoclaw tm channels status 

  NemoClaw channels status: tm
  telegram
    [ok] Channel registration: telegram registered
    [ok] Policy coverage: telegram preset applied
    [ok] Telegram User ID (for DM access) (TELEGRAM_ALLOWED_IDS): 7895072570
    [ok] Telegram group mention mode (TELEGRAM_REQUIRE_MENTION): yes
    [ok] Telegram group policy (TELEGRAM_GROUP_POLICY): open

Related Issue

Fixes #5691

Changes

  • Parse rendered OpenClaw and Hermes Telegram configuration for mention-mode values.
  • Add Telegram mention-mode status comparison details for channels status.
  • Cover rendered-config parsing and status diagnostics with regression tests.
  • Remove the prior doctor/docs expansion from this PR branch.

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: requested scope is status-only code behavior; no docs changes in final PR diff.
  • 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: self-reviewed the messaging diagnostic boundary; only non-secret rendered config values are parsed and regression coverage verifies Telegram tokens are not printed.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Verification

  • PR description includes the DCO sign-off declaration and every commit appears as Verified in GitHub
  • Git hooks passed during commit and push, or npx prek run --from-ref main --to-ref HEAD passes — pre-push TypeScript/package hooks passed; the local pre-commit test-cli coverage hook was skipped after repeated timeout, with targeted tests run below.
  • Targeted tests pass for changed behavior
  • Full npm test passes (broad runtime changes only) — not run; this is a focused status/parser change.
  • 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) — not run; no docs changes in final PR diff.
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Validation evidence:

  • npx vitest run --project cli src/lib/actions/sandbox/channel-status-config-core.test.ts src/lib/actions/sandbox/channel-status-telegram-policy.test.ts src/lib/messaging/channels/telegram/rendered-config-parser.test.ts passed: 3 files, 15 tests.
  • Pre-push hooks passed: TypeScript (CLI) and package/tag version sync.
  • GitHub DCO check passed, and all PR commits report verified=true.

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

sandl99 and others added 2 commits July 2, 2026 16:53
Signed-off-by: San Dang <sdang@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria apurvvkumaria added the area: docs Documentation, examples, guides, or docs build label Jul 3, 2026
@apurvvkumaria apurvvkumaria self-assigned this Jul 3, 2026
@coderabbitai

coderabbitai Bot commented Jul 3, 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

This PR surfaces Telegram mention mode in status, doctor, and docs. It adds diagnostics metadata, derives OpenClaw mention mode from rendered config, renders explicit group overrides, extends status comparison output, wires doctor checks, and updates related tests.

Changes

Telegram mention-mode surfacing

Layer / File(s) Summary
Diagnostics contract on channel inputs
src/lib/messaging/manifest/types.ts, src/lib/messaging/channels/telegram/manifest.ts, src/lib/messaging/channels/manifests.test.ts
Adds diagnostics metadata types for config inputs and marks Telegram requireMention with doctor labels for 0 and 1.
OpenClaw mention-mode derivation
src/lib/messaging/channels/telegram/rendered-config-parser.ts, src/lib/messaging/channels/telegram/rendered-config-parser.test.ts
Adds openclawGroupRequireMention and resolves mention mode from OpenClaw group policy plus structured group overrides.
Explicit Telegram group override rendering
src/lib/messaging/channels/telegram/template-resolver.ts, src/lib/messaging/channels/telegram/template-resolver.test.ts, test/generate-openclaw-config.test.ts
Renders an explicit requireMention value for open-policy Telegram groups instead of omitting the group stanza.
Channel-status comparison and signal formatting
src/lib/actions/sandbox/channel-status-config-comparison.ts, src/lib/actions/sandbox/channel-status-config.ts, src/lib/actions/sandbox/channel-status-config-core.test.ts, src/lib/actions/sandbox/channel-status-telegram-policy.test.ts, src/lib/actions/sandbox/channel-status-telegram-mention.test.ts
Adds config-input filtering, labeled value formatting, and kind-tagged diagnostics, then updates Telegram status expectations for mention-only and all-messages output.
Doctor checks from manifest diagnostics
src/lib/actions/sandbox/doctor-messaging.ts, src/lib/actions/sandbox/doctor-flow.test-helpers.ts, src/lib/actions/sandbox/doctor-flow.test.ts, src/lib/actions/sandbox/doctor-telegram-mention.test.ts
Builds messaging doctor checks from manifest diagnostics and updates test harnesses and Telegram doctor coverage.
Telegram mention-mode docs
docs/manage-sandboxes/messaging-channels.mdx, docs/reference/commands.mdx, docs/reference/commands-nemohermes.mdx
Documents Telegram mention-mode reporting, mismatch warnings, and the OpenClaw policy condition for showing the comparison.

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

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant CLI as channels status / doctor
  participant ConfigStatus as buildConfigStatusSignals
  participant DoctorMsg as collectMessagingDoctorChecks
  participant Parser as telegramRenderedConfigParser
  participant Sandbox as rendered agent config

  User->>CLI: run Telegram status or doctor
  CLI->>ConfigStatus: compare stored values with rendered config
  ConfigStatus->>Sandbox: read Telegram structured config
  Sandbox-->>ConfigStatus: rendered mention mode
  CLI->>DoctorMsg: request messaging checks
  DoctorMsg->>Parser: resolve openclawGroupRequireMention
  Parser-->>DoctorMsg: mention-only / all-messages / mixed
  DoctorMsg-->>CLI: check detail and warning state
  CLI-->>User: report mention mode
Loading

Suggested labels: refactor

Suggested reviewers: ericksoa, jyaunches

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes implement #5691 by exposing Telegram mention-only/all-messages mode in channels status and doctor, including the default unset case.
Out of Scope Changes check ✅ Passed The added docs, tests, and diagnostics helpers all support the Telegram mention-mode visibility work and show no unrelated scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change of surfacing Telegram mention mode, though it omits the related doctor diagnostics.
✨ 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/5691-telegram-mention-status

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

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

@github-code-quality

github-code-quality Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in the fix/5691-telegram-me... 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/5691-telegram-me... 5814c33 +/-
nemoclaw/src/se...cret-scanner.ts 100%
nemoclaw/src/commands/slash.ts 100%
nemoclaw/src/bl...eprint/state.ts 98%
nemoclaw/src/onboard/config.ts 98%
nemoclaw/src/bl...int/snapshot.ts 97%
nemoclaw/src/blueprint/ssrf.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/5691-telegram-me... branch is 69%. Coverage data for the main branch is not yet available.

Show a code coverage summary of the most covered files.
File main fix/5691-telegram-me... 5814c33 +/-
src/lib/actions...dbox/rebuild.ts 82%
src/lib/actions...all/run-plan.ts 80%
src/lib/state/o...oard-session.ts 80%
src/lib/shields/index.ts 75%
src/lib/state/sandbox.ts 73%
src/lib/onboard...er-gpu-patch.ts 69%
src/lib/onboard/preflight.ts 69%
src/lib/policy/index.ts 67%
src/lib/actions...licy-channel.ts 59%
src/lib/onboard.ts 20%

Updated July 03, 2026 06:13 UTC
Code Coverage is in Public Preview. Learn more and provide us with your feedback.

@apurvvkumaria apurvvkumaria added area: cli Command line interface, flags, terminal UX, or output area: messaging Messaging channels, bridges, manifests, or channel lifecycle integration: telegram Telegram integration or channel behavior labels Jul 3, 2026
@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor (Nemotron Ultra) — Changes requested

Merge posture: Do not merge yet
Primary next action: Fix PRA-2: Monolith test file growth exceeds threshold with Telegram-specific test; then add or justify PRA-T1.
Open items: 3 required · 7 warnings · 4 suggestions · 8 test follow-ups
Since last review: 0 prior items resolved · 10 still apply · 3 new items found

Action checklist

  • PRA-2 Fix: Monolith test file growth exceeds threshold with Telegram-specific test in src/lib/actions/sandbox/channel-status-config-core.test.ts:66
  • PRA-3 Fix: parseBoolean(undefined) contract not explicitly tested in src/lib/messaging/channels/telegram/template-resolver.ts:69
  • PRA-4 Fix: types.ts approaching 500-line extraction threshold without TODO comment in src/lib/messaging/manifest/types.ts:472
  • PRA-1 Resolve or justify: Source-of-truth review needed: getOpenClawGroupRequireMention workaround
  • PRA-5 Resolve or justify: parseBoolean utility lacks dedicated test file in src/lib/messaging/channels/template-resolver-utils.ts:39
  • PRA-6 Resolve or justify: Two boolean parsers with different undefined contracts undocumented in src/lib/messaging/channels/template-resolver-utils.ts:39
  • PRA-7 Resolve or justify: Missing parseBoolean edge case tests in template-resolver.test.ts in src/lib/messaging/channels/telegram/template-resolver.test.ts:1
  • PRA-8 Resolve or justify: getOpenClawGroupRequireMention returns boolean[] for conflicting groups — downstream type mismatch in src/lib/messaging/channels/telegram/rendered-config-parser.ts:91
  • PRA-9 Resolve or justify: Missing tests for conflicting requireMention values and non-boolean values in groups in src/lib/messaging/channels/telegram/rendered-config-parser.test.ts:1
  • PRA-13 Resolve or justify: Missing JSDoc for workaround in getOpenClawGroupRequireMention in src/lib/messaging/channels/telegram/rendered-config-parser.ts:73
  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-T4 Add or justify test follow-up: Runtime validation
  • PRA-T5 Add or justify test follow-up: Runtime validation
  • PRA-T6 Add or justify test follow-up: parseBoolean utility lacks dedicated test file
  • PRA-T7 Add or justify test follow-up: Missing tests for conflicting requireMention values and non-boolean values in groups
  • PRA-T8 Add or justify test follow-up: Missing JSDoc for workaround in getOpenClawGroupRequireMention
  • PRA-10 In-scope improvement: DEFAULT_OPENCLAW_GROUP_POLICY constant duplicated with template-resolver.ts in src/lib/messaging/channels/telegram/rendered-config-parser.ts:17
  • PRA-11 In-scope improvement: Doctor integration coverage for mention mode not explicitly tested in src/lib/actions/sandbox/channel-status-config-core.test.ts:1
  • PRA-12 In-scope improvement: configInputDisplayDetail single-use function for requireMention only in src/lib/actions/sandbox/channel-status-config.ts:180
  • PRA-14 In-scope improvement: Scope mismatch: issue expects doctor, PR explicitly excludes it in src/lib/actions/sandbox/channel-status-config.ts:1

Findings index

ID Severity Category Location Required action
PRA-1 Resolve/justify architecture Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
PRA-2 Required architecture src/lib/actions/sandbox/channel-status-config-core.test.ts:66 Move the new test (lines 66-118) to channel-status-telegram-policy.test.ts. Verify line count drops below 519 after move.
PRA-3 Required correctness src/lib/messaging/channels/telegram/template-resolver.ts:69 Add explicit test in template-resolver.test.ts (or new template-resolver-utils.test.ts) asserting parseBoolean(undefined) === undefined.
PRA-4 Required architecture src/lib/messaging/manifest/types.ts:472 Add TODO comment near line 472: '// TODO: Consider extracting messaging plan interfaces when this file reaches 500 lines.'
PRA-5 Resolve/justify tests src/lib/messaging/channels/template-resolver-utils.ts:39 Create template-resolver-utils.test.ts covering parseBoolean edge cases.
PRA-6 Resolve/justify correctness src/lib/messaging/channels/template-resolver-utils.ts:39 Add JSDoc to both functions explaining: parseBoolean returns undefined for unrecognized/undefined; booleanConfigValue returns null for unrecognized/undefined. Used in different contexts (rendering vs comparison).
PRA-7 Resolve/justify correctness src/lib/messaging/channels/telegram/template-resolver.test.ts:1 Add parseBoolean edge case tests to template-resolver.test.ts or new template-resolver-utils.test.ts.
PRA-8 Resolve/justify security src/lib/messaging/channels/telegram/rendered-config-parser.ts:91 Narrow return type to boolean | undefined by picking first value, or document array case and update configValuesEqual to handle boolean[]. Add test for conflicting group requireMention values.
PRA-9 Resolve/justify tests src/lib/messaging/channels/telegram/rendered-config-parser.test.ts:1 Add tests for: (1) conflicting group requireMention values, (2) non-boolean requireMention values in groups (string, number, object), (3) malformed groups object.
PRA-10 Improvement scope src/lib/messaging/channels/telegram/rendered-config-parser.ts:17 Consider exporting a shared constant from a common location, or accept duplication since files are in different modules (parser vs resolver).
PRA-11 Improvement acceptance src/lib/actions/sandbox/channel-status-config-core.test.ts:1 Add doctor integration test verifying Messaging section includes mention mode signal, or confirm existing doctor tests cover this via shared buildConfigStatusSignals. If deferred, document as follow-up issue with link.
PRA-12 Improvement architecture src/lib/actions/sandbox/channel-status-config.ts:180 Inline the logic at call sites or create a generic booleanConfigDisplayDetail helper if more boolean-like config inputs are expected.
PRA-13 Resolve/justify tests src/lib/messaging/channels/telegram/rendered-config-parser.ts:73 Add JSDoc to getOpenClawGroupRequireMention explaining: (1) invalid states handled, (2) source boundary (OpenClaw JSON schema), (3) why source not fixed here, (4) regression tests covering workaround, (5) removal condition.
PRA-14 Improvement acceptance src/lib/actions/sandbox/channel-status-config.ts:1 File follow-up issue for doctor integration or update PR description to explicitly track as deferred work with issue link.

🚨 Required before merge

Address these before merging unless a maintainer explicitly overrides the advisor with rationale.

PRA-2 Required — Monolith test file growth exceeds threshold with Telegram-specific test

  • Location: src/lib/actions/sandbox/channel-status-config-core.test.ts:66
  • Category: architecture
  • Problem: channel-status-config-core.test.ts grew by 66 lines (499→565) with new Telegram-specific test 'marks Telegram all-message mode ok when OpenClaw omits the groups stanza ([All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691)'. Telegram tests belong in channel-status-telegram-policy.test.ts or a new dedicated file. Previous review PRA-1 required extraction; not addressed.
  • Impact: Test file becomes unmaintainable; changes to core config comparison logic risk breaking unrelated Telegram tests; harder to find relevant tests for reviewers.
  • Required action: Move the new test (lines 66-118) to channel-status-telegram-policy.test.ts. Verify line count drops below 519 after move.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: wc -l src/lib/actions/sandbox/channel-status-config-core.test.ts — should be ≤519 after move
  • Missing regression test: N/A — architectural extraction; existing tests must continue passing
  • Done when: The required change is committed and verification passes: wc -l src/lib/actions/sandbox/channel-status-config-core.test.ts — should be ≤519 after move.
  • Evidence: Drift context: channel-status-config-core.test.ts delta +66, severity blocker. PR adds test 'marks Telegram all-message mode ok when OpenClaw omits the groups stanza ([All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691)' to this file.

PRA-3 Required — parseBoolean(undefined) contract not explicitly tested

  • Location: src/lib/messaging/channels/telegram/template-resolver.ts:69
  • Category: correctness
  • Problem: template-resolver.ts:69 uses `requireMention !== false` which relies on parseBoolean(undefined) === undefined. If parseBoolean behavior changes, Telegram mention mode default could silently flip from mention-only to all-messages. Previous review PRA-2 required explicit unit test; not addressed.
  • Impact: Silent behavior change in Telegram group mention mode rendering if parseBoolean is refactored. Operators would see incorrect mention-mode status in channels status/doctor.
  • Required action: Add explicit test in template-resolver.test.ts (or new template-resolver-utils.test.ts) asserting parseBoolean(undefined) === undefined.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Run template-resolver.test.ts — verify explicit parseBoolean contract test exists and passes
  • Missing regression test: Explicit test: parseBoolean(undefined) === undefined
  • Done when: The required change is committed and verification passes: Run template-resolver.test.ts — verify explicit parseBoolean contract test exists and passes.
  • Evidence: template-resolver.ts line 69: `const requireMention = parseBoolean(stateValue(context, "telegramConfig.requireMention")); return { "*": { requireMention: requireMention !== false } };`

PRA-4 Required — types.ts approaching 500-line extraction threshold without TODO comment

  • Location: src/lib/messaging/manifest/types.ts:472
  • Category: architecture
  • Problem: types.ts grew to ~472 lines with new SandboxMessagingPersistInputsStateUpdatePlan, SandboxMessagingRebuildHydrationStateUpdatePlan, SandboxMessagingHealthCheckPlan interfaces. Previous review PRA-3 required TODO comment at 500-line extraction trigger. File is under 500 but approaching; TODO not added.
  • Impact: Future extraction will be more disruptive if delayed. Types file becoming catch-all for messaging interfaces without clear extraction trigger marker.
  • Required action: Add TODO comment near line 472: '// TODO: Consider extracting messaging plan interfaces when this file reaches 500 lines.'
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: grep -n 'TODO.*extract' src/lib/messaging/manifest/types.ts — verify comment appears near line 472
  • Missing regression test: N/A — architectural observation
  • Done when: The required change is committed and verification passes: grep -n 'TODO.*extract' src/lib/messaging/manifest/types.ts — verify comment appears near line 472.
  • Evidence: types.ts lines 451-472 add SandboxMessagingPersistInputsStateUpdatePlan, SandboxMessagingRebuildHydrationStateUpdatePlan, SandboxMessagingHealthCheckPlan interfaces. File now at ~472 lines.
Review findings by urgency: 3 required fixes, 7 items to resolve/justify, 4 in-scope improvements

⚠️ Resolve or justify before merge

Investigate these in the current review; either fix them, explain why they are not applicable, or document the accepted risk.

PRA-1 Resolve/justify — Source-of-truth review needed: getOpenClawGroupRequireMention workaround

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Test 'treats missing OpenClaw groups as all-message mode' covers missing groups. MISSING: conflicting groups test, non-boolean values test
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: rendered-config-parser.ts lines 73-95: getOpenClawGroupRequireMention handles missing groups (returns false), conflicting values (returns boolean[]), non-boolean values (filtered out). No JSDoc documenting workaround.

PRA-5 Resolve/justify — parseBoolean utility lacks dedicated test file

  • Location: src/lib/messaging/channels/template-resolver-utils.ts:39
  • Category: tests
  • Problem: parseBoolean utility lacks dedicated test file. Previous review PRA-4 recommended creating template-resolver-utils.test.ts with edge cases: undefined, null, empty string, case variations ('TRUE', 'FALSE'), invalid inputs. Not addressed.
  • Impact: Edge cases (null, empty string, case variations, invalid inputs) untested. Refactoring parseBoolean risks silent behavior changes in template-resolver.ts and channel-status-config-values.ts.
  • Recommended action: Create template-resolver-utils.test.ts covering parseBoolean edge cases.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check for template-resolver-utils.test.ts existence and parseBoolean edge case coverage
  • Missing regression test: parseBoolean(null), parseBoolean(''), parseBoolean('TRUE'), parseBoolean('FALSE'), parseBoolean('invalid')
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check for template-resolver-utils.test.ts existence and parseBoolean edge case coverage.
  • Evidence: template-resolver-utils.ts line 39 exports parseBoolean; used in template-resolver.ts and channel-status-config-values.ts (booleanConfigValue). No test file exists.

PRA-6 Resolve/justify — Two boolean parsers with different undefined contracts undocumented

  • Location: src/lib/messaging/channels/template-resolver-utils.ts:39
  • Category: correctness
  • Problem: parseBoolean returns undefined for unrecognized/undefined; booleanConfigValue returns null for unrecognized/undefined. Used in different contexts (rendering vs comparison) but undocumented. Previous review PRA-5 required JSDoc explaining the difference; not addressed.
  • Impact: Developers may incorrectly assume same behavior; refactoring one without the other causes silent bugs in config comparison vs template rendering.
  • Recommended action: Add JSDoc to both functions explaining: parseBoolean returns undefined for unrecognized/undefined; booleanConfigValue returns null for unrecognized/undefined. Used in different contexts (rendering vs comparison).
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check JSDoc on parseBoolean and booleanConfigValue for contract documentation
  • Missing regression test: N/A — documentation; verify contracts are documented and understood
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check JSDoc on parseBoolean and booleanConfigValue for contract documentation.
  • Evidence: template-resolver-utils.ts:39 parseBoolean returns undefined; channel-status-config-values.ts:70 booleanConfigValue returns null. Both handle '1'/'0'/'true'/'false' but differ on undefined/null.

PRA-7 Resolve/justify — Missing parseBoolean edge case tests in template-resolver.test.ts

  • Location: src/lib/messaging/channels/telegram/template-resolver.test.ts:1
  • Category: correctness
  • Problem: Previous review PRA-6 required parseBoolean edge case tests in template-resolver.test.ts or new template-resolver-utils.test.ts. Not addressed.
  • Impact: Edge cases untested; refactoring risks silent behavior changes.
  • Recommended action: Add parseBoolean edge case tests to template-resolver.test.ts or new template-resolver-utils.test.ts.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check template-resolver.test.ts or template-resolver-utils.test.ts for parseBoolean edge case coverage
  • Missing regression test: parseBoolean(null), parseBoolean(''), parseBoolean('TRUE'), parseBoolean('FALSE'), parseBoolean('invalid')
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check template-resolver.test.ts or template-resolver-utils.test.ts for parseBoolean edge case coverage.
  • Evidence: template-resolver.test.ts only tests group policy resolution, not parseBoolean directly.

PRA-8 Resolve/justify — getOpenClawGroupRequireMention returns boolean[] for conflicting groups — downstream type mismatch

  • Location: src/lib/messaging/channels/telegram/rendered-config-parser.ts:91
  • Category: security
  • Problem: getOpenClawGroupRequireMention returns boolean[] when groups have conflicting requireMention values. Downstream configValuesEqual uses booleanConfigValue which returns null for arrays, causing fallback to string comparison and silent mismatch signals. Previous review PRA-9 required fix; not addressed.
  • Impact: Operators see incorrect 'mismatch' diagnostic signals when OpenClaw config has groups with different requireMention values. Type confusion undermines trust in status output.
  • Recommended action: Narrow return type to boolean | undefined by picking first value, or document array case and update configValuesEqual to handle boolean[]. Add test for conflicting group requireMention values.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check getOpenClawGroupRequireMention return type and configValuesEqual handling of boolean[]
  • Missing regression test: Test: conflicting group requireMention values (one true, one false) → verify correct diagnostic signal (not silent mismatch)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check getOpenClawGroupRequireMention return type and configValuesEqual handling of boolean[].
  • Evidence: rendered-config-parser.ts line 91: `return [...new Set(values)].sort().length === 1 ? values[0] : [...new Set(values)].sort();` returns boolean[] for conflicts. channel-status-config-values.ts:70 booleanConfigValue returns null for arrays.

PRA-9 Resolve/justify — Missing tests for conflicting requireMention values and non-boolean values in groups

  • Location: src/lib/messaging/channels/telegram/rendered-config-parser.test.ts:1
  • Category: tests
  • Problem: New rendered-config-parser.test.ts covers 4 happy-path cases but missing edge cases: conflicting requireMention values across groups, non-boolean requireMention values in groups. Previous review PRA-10 required these tests; not addressed.
  • Impact: Conflicting groups and malformed configs not tested; silent mismatches possible in production.
  • Recommended action: Add tests for: (1) conflicting group requireMention values, (2) non-boolean requireMention values in groups (string, number, object), (3) malformed groups object.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check rendered-config-parser.test.ts for conflicting/non-boolean test cases
  • Missing regression test: Test: groups: {'g1': {requireMention: true}, 'g2': {requireMention: false}} → returns boolean[]; Test: groups: {'g1': {requireMention: 'yes'}} → filtered out, returns false
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check rendered-config-parser.test.ts for conflicting/non-boolean test cases.
  • Evidence: rendered-config-parser.test.ts has 4 tests covering happy paths only.

PRA-13 Resolve/justify — Missing JSDoc for workaround in getOpenClawGroupRequireMention

  • Location: src/lib/messaging/channels/telegram/rendered-config-parser.ts:73
  • Category: tests
  • Problem: getOpenClawGroupRequireMention handles invalid OpenClaw config states (missing groups, conflicting requireMention, non-boolean values) but lacks JSDoc explaining the workaround, its source boundary, and removal condition.
  • Impact: Future maintainers may not understand why the function returns boolean[] for conflicts or false for missing groups; workaround may persist indefinitely.
  • Recommended action: Add JSDoc to getOpenClawGroupRequireMention explaining: (1) invalid states handled, (2) source boundary (OpenClaw JSON schema), (3) why source not fixed here, (4) regression tests covering workaround, (5) removal condition.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check JSDoc on getOpenClawGroupRequireMention for workaround documentation
  • Missing regression test: N/A — documentation; but missing regression tests for conflicting/non-boolean values (see PRA-10)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check JSDoc on getOpenClawGroupRequireMention for workaround documentation.
  • Evidence: rendered-config-parser.ts lines 73-95: getOpenClawGroupRequireMention has no JSDoc explaining workaround.

💡 In-scope improvements

These are lower-risk, not throwaway. Prefer fixing them in this PR when they are local to changed code; defer only with rationale or a linked follow-up.

PRA-10 Improvement — DEFAULT_OPENCLAW_GROUP_POLICY constant duplicated with template-resolver.ts

  • Location: src/lib/messaging/channels/telegram/rendered-config-parser.ts:17
  • Category: scope
  • Problem: DEFAULT_OPENCLAW_GROUP_POLICY = 'open' defined in both template-resolver.ts:13 and rendered-config-parser.ts:17. Previous review PRA-7 suggested shared constant or accepting duplication; not addressed.
  • Impact: Minor duplication; if default changes, must update in two places. Low priority since files are in different modules (parser vs resolver).
  • Suggested action: Consider exporting a shared constant from a common location, or accept duplication since files are in different modules (parser vs resolver).
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: grep -r 'DEFAULT_OPENCLAW_GROUP_POLICY' src/lib/messaging/channels/telegram/
  • Missing regression test: N/A — constant duplication
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: template-resolver.ts line 13 and rendered-config-parser.ts line 17 both define const DEFAULT_OPENCLAW_GROUP_POLICY = 'open';

PRA-11 Improvement — Doctor integration coverage for mention mode not explicitly tested

  • Location: src/lib/actions/sandbox/channel-status-config-core.test.ts:1
  • Category: acceptance
  • Problem: Issue [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691 expected doctor output to include mention mode. PR explicitly excludes doctor: 'doctor and docs are intentionally unchanged'. Previous review PRA-8 recommended doctor integration test or follow-up issue; not addressed.
  • Impact: Operators cannot verify mention mode via doctor command as originally requested. Scope decision documented but not tracked.
  • Suggested action: Add doctor integration test verifying Messaging section includes mention mode signal, or confirm existing doctor tests cover this via shared buildConfigStatusSignals. If deferred, document as follow-up issue with link.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check doctor tests for mention mode signal coverage; check if follow-up issue filed
  • Missing regression test: Doctor integration test: nemoclaw <sandbox> doctor shows Telegram mention mode in Messaging section
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: PR description: 'doctor and docs are intentionally unchanged'. Issue [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691 expected doctor output change.

PRA-12 Improvement — configInputDisplayDetail single-use function for requireMention only

  • Location: src/lib/actions/sandbox/channel-status-config.ts:180
  • Category: architecture
  • Problem: New configInputDisplayDetail function only handles requireMention input (TELEGRAM_REQUIRE_MENTION). Could inline or make generic formatter for boolean-like config inputs.
  • Impact: Extra abstraction for single use case; adds maintenance surface without reuse.
  • Suggested action: Inline the logic at call sites or create a generic booleanConfigDisplayDetail helper if more boolean-like config inputs are expected.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check call sites of configInputDisplayDetail — only used for requireMention
  • Missing regression test: N/A — simplification
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: channel-status-config.ts lines 180-190: configInputDisplayDetail only checks input.id === 'requireMention' && input.envKey === 'TELEGRAM_REQUIRE_MENTION'

PRA-14 Improvement — Scope mismatch: issue expects doctor, PR explicitly excludes it

Simplification opportunities: 1 possible cut, net -8 lines possible

These are safe simplification checks only. Do not remove validation, security controls, data-loss prevention, or required tests.

  • PRA-12 shrink (src/lib/actions/sandbox/channel-status-config.ts:180): configInputDisplayDetail function (lines 180-190) and its import
    • Replacement: Inline ternary at two call sites: booleanConfigValue(value) !== null ? (booleanConfigValue(value) ? 'yes' : 'no') : configInputDetail(value)
    • Net: -8 lines
    • Safety boundary: Must preserve 'yes'/'no' display for requireMention; must not change behavior for other inputs
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Runtime validation — parseBoolean(undefined) === undefined in template-resolver-utils.test.ts. Runtime/sandbox/infrastructure paths need behavioral runtime validation: src/lib/actions/sandbox/channel-status-config.ts. New parser and status comparison logic require targeted integration tests beyond unit mocks.
  • PRA-T2 Runtime validation — parseBoolean edge cases: null, empty string, 'TRUE', 'FALSE', 'invalid'. Runtime/sandbox/infrastructure paths need behavioral runtime validation: src/lib/actions/sandbox/channel-status-config.ts. New parser and status comparison logic require targeted integration tests beyond unit mocks.
  • PRA-T3 Runtime validation — booleanConfigValue edge cases: array, object, '1', '0', 'true', 'false'. Runtime/sandbox/infrastructure paths need behavioral runtime validation: src/lib/actions/sandbox/channel-status-config.ts. New parser and status comparison logic require targeted integration tests beyond unit mocks.
  • PRA-T4 Runtime validation — Conflicting requireMention values across groups → returns boolean[]. Runtime/sandbox/infrastructure paths need behavioral runtime validation: src/lib/actions/sandbox/channel-status-config.ts. New parser and status comparison logic require targeted integration tests beyond unit mocks.
  • PRA-T5 Runtime validation — Non-boolean requireMention in group (string, number, object) → filtered out. Runtime/sandbox/infrastructure paths need behavioral runtime validation: src/lib/actions/sandbox/channel-status-config.ts. New parser and status comparison logic require targeted integration tests beyond unit mocks.
  • PRA-T6 parseBoolean utility lacks dedicated test file — Create template-resolver-utils.test.ts covering parseBoolean edge cases.
  • PRA-T7 Missing tests for conflicting requireMention values and non-boolean values in groups — Add tests for: (1) conflicting group requireMention values, (2) non-boolean requireMention values in groups (string, number, object), (3) malformed groups object.
  • PRA-T8 Missing JSDoc for workaround in getOpenClawGroupRequireMention — Add JSDoc to getOpenClawGroupRequireMention explaining: (1) invalid states handled, (2) source boundary (OpenClaw JSON schema), (3) why source not fixed here, (4) regression tests covering workaround, (5) removal condition.
Since last review details

Current findings, using the urgency labels above:

PRA-1 Resolve/justify — Source-of-truth review needed: getOpenClawGroupRequireMention workaround

  • Location: not file-specific
  • Category: architecture
  • Problem: The advisor marked localized patch analysis as needs_followup.
  • Impact: A localized workaround can preserve or hide an invalid state when the source boundary is unclear.
  • Recommended action: Identify the invalid state, source boundary, source-fix constraint, regression test, and removal condition before merging the localized behavior.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Missing regression test: Test 'treats missing OpenClaw groups as all-message mode' covers missing groups. MISSING: conflicting groups test, non-boolean values test
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Inspect the localized patch and source-of-truth review fields for a concrete invalid state, source boundary, source-fix constraint, regression test, and removal condition.
  • Evidence: rendered-config-parser.ts lines 73-95: getOpenClawGroupRequireMention handles missing groups (returns false), conflicting values (returns boolean[]), non-boolean values (filtered out). No JSDoc documenting workaround.

PRA-2 Required — Monolith test file growth exceeds threshold with Telegram-specific test

  • Location: src/lib/actions/sandbox/channel-status-config-core.test.ts:66
  • Category: architecture
  • Problem: channel-status-config-core.test.ts grew by 66 lines (499→565) with new Telegram-specific test 'marks Telegram all-message mode ok when OpenClaw omits the groups stanza ([All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691)'. Telegram tests belong in channel-status-telegram-policy.test.ts or a new dedicated file. Previous review PRA-1 required extraction; not addressed.
  • Impact: Test file becomes unmaintainable; changes to core config comparison logic risk breaking unrelated Telegram tests; harder to find relevant tests for reviewers.
  • Required action: Move the new test (lines 66-118) to channel-status-telegram-policy.test.ts. Verify line count drops below 519 after move.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: wc -l src/lib/actions/sandbox/channel-status-config-core.test.ts — should be ≤519 after move
  • Missing regression test: N/A — architectural extraction; existing tests must continue passing
  • Done when: The required change is committed and verification passes: wc -l src/lib/actions/sandbox/channel-status-config-core.test.ts — should be ≤519 after move.
  • Evidence: Drift context: channel-status-config-core.test.ts delta +66, severity blocker. PR adds test 'marks Telegram all-message mode ok when OpenClaw omits the groups stanza ([All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691)' to this file.

PRA-3 Required — parseBoolean(undefined) contract not explicitly tested

  • Location: src/lib/messaging/channels/telegram/template-resolver.ts:69
  • Category: correctness
  • Problem: template-resolver.ts:69 uses `requireMention !== false` which relies on parseBoolean(undefined) === undefined. If parseBoolean behavior changes, Telegram mention mode default could silently flip from mention-only to all-messages. Previous review PRA-2 required explicit unit test; not addressed.
  • Impact: Silent behavior change in Telegram group mention mode rendering if parseBoolean is refactored. Operators would see incorrect mention-mode status in channels status/doctor.
  • Required action: Add explicit test in template-resolver.test.ts (or new template-resolver-utils.test.ts) asserting parseBoolean(undefined) === undefined.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Run template-resolver.test.ts — verify explicit parseBoolean contract test exists and passes
  • Missing regression test: Explicit test: parseBoolean(undefined) === undefined
  • Done when: The required change is committed and verification passes: Run template-resolver.test.ts — verify explicit parseBoolean contract test exists and passes.
  • Evidence: template-resolver.ts line 69: `const requireMention = parseBoolean(stateValue(context, "telegramConfig.requireMention")); return { "*": { requireMention: requireMention !== false } };`

PRA-4 Required — types.ts approaching 500-line extraction threshold without TODO comment

  • Location: src/lib/messaging/manifest/types.ts:472
  • Category: architecture
  • Problem: types.ts grew to ~472 lines with new SandboxMessagingPersistInputsStateUpdatePlan, SandboxMessagingRebuildHydrationStateUpdatePlan, SandboxMessagingHealthCheckPlan interfaces. Previous review PRA-3 required TODO comment at 500-line extraction trigger. File is under 500 but approaching; TODO not added.
  • Impact: Future extraction will be more disruptive if delayed. Types file becoming catch-all for messaging interfaces without clear extraction trigger marker.
  • Required action: Add TODO comment near line 472: '// TODO: Consider extracting messaging plan interfaces when this file reaches 500 lines.'
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: grep -n 'TODO.*extract' src/lib/messaging/manifest/types.ts — verify comment appears near line 472
  • Missing regression test: N/A — architectural observation
  • Done when: The required change is committed and verification passes: grep -n 'TODO.*extract' src/lib/messaging/manifest/types.ts — verify comment appears near line 472.
  • Evidence: types.ts lines 451-472 add SandboxMessagingPersistInputsStateUpdatePlan, SandboxMessagingRebuildHydrationStateUpdatePlan, SandboxMessagingHealthCheckPlan interfaces. File now at ~472 lines.

PRA-5 Resolve/justify — parseBoolean utility lacks dedicated test file

  • Location: src/lib/messaging/channels/template-resolver-utils.ts:39
  • Category: tests
  • Problem: parseBoolean utility lacks dedicated test file. Previous review PRA-4 recommended creating template-resolver-utils.test.ts with edge cases: undefined, null, empty string, case variations ('TRUE', 'FALSE'), invalid inputs. Not addressed.
  • Impact: Edge cases (null, empty string, case variations, invalid inputs) untested. Refactoring parseBoolean risks silent behavior changes in template-resolver.ts and channel-status-config-values.ts.
  • Recommended action: Create template-resolver-utils.test.ts covering parseBoolean edge cases.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check for template-resolver-utils.test.ts existence and parseBoolean edge case coverage
  • Missing regression test: parseBoolean(null), parseBoolean(''), parseBoolean('TRUE'), parseBoolean('FALSE'), parseBoolean('invalid')
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check for template-resolver-utils.test.ts existence and parseBoolean edge case coverage.
  • Evidence: template-resolver-utils.ts line 39 exports parseBoolean; used in template-resolver.ts and channel-status-config-values.ts (booleanConfigValue). No test file exists.

PRA-6 Resolve/justify — Two boolean parsers with different undefined contracts undocumented

  • Location: src/lib/messaging/channels/template-resolver-utils.ts:39
  • Category: correctness
  • Problem: parseBoolean returns undefined for unrecognized/undefined; booleanConfigValue returns null for unrecognized/undefined. Used in different contexts (rendering vs comparison) but undocumented. Previous review PRA-5 required JSDoc explaining the difference; not addressed.
  • Impact: Developers may incorrectly assume same behavior; refactoring one without the other causes silent bugs in config comparison vs template rendering.
  • Recommended action: Add JSDoc to both functions explaining: parseBoolean returns undefined for unrecognized/undefined; booleanConfigValue returns null for unrecognized/undefined. Used in different contexts (rendering vs comparison).
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check JSDoc on parseBoolean and booleanConfigValue for contract documentation
  • Missing regression test: N/A — documentation; verify contracts are documented and understood
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check JSDoc on parseBoolean and booleanConfigValue for contract documentation.
  • Evidence: template-resolver-utils.ts:39 parseBoolean returns undefined; channel-status-config-values.ts:70 booleanConfigValue returns null. Both handle '1'/'0'/'true'/'false' but differ on undefined/null.

PRA-7 Resolve/justify — Missing parseBoolean edge case tests in template-resolver.test.ts

  • Location: src/lib/messaging/channels/telegram/template-resolver.test.ts:1
  • Category: correctness
  • Problem: Previous review PRA-6 required parseBoolean edge case tests in template-resolver.test.ts or new template-resolver-utils.test.ts. Not addressed.
  • Impact: Edge cases untested; refactoring risks silent behavior changes.
  • Recommended action: Add parseBoolean edge case tests to template-resolver.test.ts or new template-resolver-utils.test.ts.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check template-resolver.test.ts or template-resolver-utils.test.ts for parseBoolean edge case coverage
  • Missing regression test: parseBoolean(null), parseBoolean(''), parseBoolean('TRUE'), parseBoolean('FALSE'), parseBoolean('invalid')
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check template-resolver.test.ts or template-resolver-utils.test.ts for parseBoolean edge case coverage.
  • Evidence: template-resolver.test.ts only tests group policy resolution, not parseBoolean directly.

PRA-8 Resolve/justify — getOpenClawGroupRequireMention returns boolean[] for conflicting groups — downstream type mismatch

  • Location: src/lib/messaging/channels/telegram/rendered-config-parser.ts:91
  • Category: security
  • Problem: getOpenClawGroupRequireMention returns boolean[] when groups have conflicting requireMention values. Downstream configValuesEqual uses booleanConfigValue which returns null for arrays, causing fallback to string comparison and silent mismatch signals. Previous review PRA-9 required fix; not addressed.
  • Impact: Operators see incorrect 'mismatch' diagnostic signals when OpenClaw config has groups with different requireMention values. Type confusion undermines trust in status output.
  • Recommended action: Narrow return type to boolean | undefined by picking first value, or document array case and update configValuesEqual to handle boolean[]. Add test for conflicting group requireMention values.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check getOpenClawGroupRequireMention return type and configValuesEqual handling of boolean[]
  • Missing regression test: Test: conflicting group requireMention values (one true, one false) → verify correct diagnostic signal (not silent mismatch)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check getOpenClawGroupRequireMention return type and configValuesEqual handling of boolean[].
  • Evidence: rendered-config-parser.ts line 91: `return [...new Set(values)].sort().length === 1 ? values[0] : [...new Set(values)].sort();` returns boolean[] for conflicts. channel-status-config-values.ts:70 booleanConfigValue returns null for arrays.

PRA-9 Resolve/justify — Missing tests for conflicting requireMention values and non-boolean values in groups

  • Location: src/lib/messaging/channels/telegram/rendered-config-parser.test.ts:1
  • Category: tests
  • Problem: New rendered-config-parser.test.ts covers 4 happy-path cases but missing edge cases: conflicting requireMention values across groups, non-boolean requireMention values in groups. Previous review PRA-10 required these tests; not addressed.
  • Impact: Conflicting groups and malformed configs not tested; silent mismatches possible in production.
  • Recommended action: Add tests for: (1) conflicting group requireMention values, (2) non-boolean requireMention values in groups (string, number, object), (3) malformed groups object.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check rendered-config-parser.test.ts for conflicting/non-boolean test cases
  • Missing regression test: Test: groups: {'g1': {requireMention: true}, 'g2': {requireMention: false}} → returns boolean[]; Test: groups: {'g1': {requireMention: 'yes'}} → filtered out, returns false
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check rendered-config-parser.test.ts for conflicting/non-boolean test cases.
  • Evidence: rendered-config-parser.test.ts has 4 tests covering happy paths only.

PRA-10 Improvement — DEFAULT_OPENCLAW_GROUP_POLICY constant duplicated with template-resolver.ts

  • Location: src/lib/messaging/channels/telegram/rendered-config-parser.ts:17
  • Category: scope
  • Problem: DEFAULT_OPENCLAW_GROUP_POLICY = 'open' defined in both template-resolver.ts:13 and rendered-config-parser.ts:17. Previous review PRA-7 suggested shared constant or accepting duplication; not addressed.
  • Impact: Minor duplication; if default changes, must update in two places. Low priority since files are in different modules (parser vs resolver).
  • Suggested action: Consider exporting a shared constant from a common location, or accept duplication since files are in different modules (parser vs resolver).
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: grep -r 'DEFAULT_OPENCLAW_GROUP_POLICY' src/lib/messaging/channels/telegram/
  • Missing regression test: N/A — constant duplication
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: template-resolver.ts line 13 and rendered-config-parser.ts line 17 both define const DEFAULT_OPENCLAW_GROUP_POLICY = 'open';

PRA-11 Improvement — Doctor integration coverage for mention mode not explicitly tested

  • Location: src/lib/actions/sandbox/channel-status-config-core.test.ts:1
  • Category: acceptance
  • Problem: Issue [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691 expected doctor output to include mention mode. PR explicitly excludes doctor: 'doctor and docs are intentionally unchanged'. Previous review PRA-8 recommended doctor integration test or follow-up issue; not addressed.
  • Impact: Operators cannot verify mention mode via doctor command as originally requested. Scope decision documented but not tracked.
  • Suggested action: Add doctor integration test verifying Messaging section includes mention mode signal, or confirm existing doctor tests cover this via shared buildConfigStatusSignals. If deferred, document as follow-up issue with link.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check doctor tests for mention mode signal coverage; check if follow-up issue filed
  • Missing regression test: Doctor integration test: nemoclaw <sandbox> doctor shows Telegram mention mode in Messaging section
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: PR description: 'doctor and docs are intentionally unchanged'. Issue [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691 expected doctor output change.

PRA-12 Improvement — configInputDisplayDetail single-use function for requireMention only

  • Location: src/lib/actions/sandbox/channel-status-config.ts:180
  • Category: architecture
  • Problem: New configInputDisplayDetail function only handles requireMention input (TELEGRAM_REQUIRE_MENTION). Could inline or make generic formatter for boolean-like config inputs.
  • Impact: Extra abstraction for single use case; adds maintenance surface without reuse.
  • Suggested action: Inline the logic at call sites or create a generic booleanConfigDisplayDetail helper if more boolean-like config inputs are expected.
  • Expected follow-up: Prefer a current-PR fix when local to changed code; defer only with rationale or linked follow-up.
  • Verification: Check call sites of configInputDisplayDetail — only used for requireMention
  • Missing regression test: N/A — simplification
  • Done when: The local improvement is applied, or the PR notes why it should be deferred.
  • Evidence: channel-status-config.ts lines 180-190: configInputDisplayDetail only checks input.id === 'requireMention' && input.envKey === 'TELEGRAM_REQUIRE_MENTION'

PRA-13 Resolve/justify — Missing JSDoc for workaround in getOpenClawGroupRequireMention

  • Location: src/lib/messaging/channels/telegram/rendered-config-parser.ts:73
  • Category: tests
  • Problem: getOpenClawGroupRequireMention handles invalid OpenClaw config states (missing groups, conflicting requireMention, non-boolean values) but lacks JSDoc explaining the workaround, its source boundary, and removal condition.
  • Impact: Future maintainers may not understand why the function returns boolean[] for conflicts or false for missing groups; workaround may persist indefinitely.
  • Recommended action: Add JSDoc to getOpenClawGroupRequireMention explaining: (1) invalid states handled, (2) source boundary (OpenClaw JSON schema), (3) why source not fixed here, (4) regression tests covering workaround, (5) removal condition.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Check JSDoc on getOpenClawGroupRequireMention for workaround documentation
  • Missing regression test: N/A — documentation; but missing regression tests for conflicting/non-boolean values (see PRA-10)
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Check JSDoc on getOpenClawGroupRequireMention for workaround documentation.
  • Evidence: rendered-config-parser.ts lines 73-95: getOpenClawGroupRequireMention has no JSDoc explaining workaround.

PRA-14 Improvement — Scope mismatch: issue expects doctor, PR explicitly excludes it

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.

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Changes requested

Merge posture: Do not merge yet
Primary next action: Fix PRA-1: Doctor still does not surface Telegram mention mode; then add or justify PRA-T1.
Open items: 1 required · 0 warnings · 0 suggestions · 8 test follow-ups
Since last review: 0 prior items resolved · 1 still applies · 0 new items found

Action checklist

  • PRA-1 Fix: Doctor still does not surface Telegram mention mode in src/lib/actions/sandbox/doctor-messaging.ts:269
  • PRA-T1 Add or justify test follow-up: Runtime validation
  • PRA-T2 Add or justify test follow-up: Runtime validation
  • PRA-T3 Add or justify test follow-up: Runtime validation
  • PRA-T4 Add or justify test follow-up: Runtime validation
  • PRA-T5 Add or justify test follow-up: Acceptance clause
  • PRA-T6 Add or justify test follow-up: Acceptance clause
  • PRA-T7 Add or justify test follow-up: Acceptance clause
  • PRA-T8 Add or justify test follow-up: Acceptance clause

Findings index

ID Severity Category Location Required action
PRA-1 Required acceptance src/lib/actions/sandbox/doctor-messaging.ts:269 Add doctor-side Telegram mention-mode reporting for configured Telegram channels, preferably by reusing the same rendered-config comparison boundary or a shared helper used by `channels status`, and ensure it is still emitted when the existing `Channels` check is `warn`. If maintainers intentionally want this PR to be status-only, remove or narrow the `Fixes #5691` closure claim so the doctor acceptance remains tracked separately.

🚨 Required before merge

Address these before merging unless a maintainer explicitly overrides the advisor with rationale.

PRA-1 Required — Doctor still does not surface Telegram mention mode

  • Location: src/lib/actions/sandbox/doctor-messaging.ts:269
  • Category: acceptance
  • Problem: The PR still closes [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691, whose expected behavior explicitly includes `nemoclaw tg-default-sb doctor`, and the reopened QA comment reports the missing `TELEGRAM_REQUIRE_MENTION` field in both channels status and doctor. This diff adds the rendered-config comparison for `channels status`, but `collectMessagingDoctorChecks()` still returns only the configured-channel check and runtime-channel check; it does not call `buildConfigStatusSignals()` or otherwise emit the new Telegram mention-mode diagnostic in the Messaging section.
  • Impact: Merging as-is would leave one of the issue's two user-visible diagnostic surfaces unfixed. Operators and QA still cannot verify mention-only versus all-messages behavior from `nemoclaw <sandbox> doctor`, including the overlap-warning path called out in the reopened issue comment.
  • Required action: Add doctor-side Telegram mention-mode reporting for configured Telegram channels, preferably by reusing the same rendered-config comparison boundary or a shared helper used by `channels status`, and ensure it is still emitted when the existing `Channels` check is `warn`. If maintainers intentionally want this PR to be status-only, remove or narrow the `Fixes [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691` closure claim so the doctor acceptance remains tracked separately.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Read `src/lib/actions/sandbox/doctor-messaging.ts` around `collectMessagingDoctorChecks()` and `configuredChannelsCheck()`; the current code constructs only the configured channels and runtime registry checks and the PR diff contains no doctor file changes.
  • Missing regression test: Add a targeted doctor unit test where a Telegram sandbox has `TELEGRAM_GROUP_POLICY=open` and `TELEGRAM_REQUIRE_MENTION=1` or the default, the configured `Channels` check is `warn` because of a Telegram overlap/conflict, and the rendered doctor Messaging output still includes `Telegram group mention mode (TELEGRAM_REQUIRE_MENTION)` with the expected mention-only/all-messages value.
  • Done when: The required change is committed and verification passes: Read `src/lib/actions/sandbox/doctor-messaging.ts` around `collectMessagingDoctorChecks()` and `configuredChannelsCheck()`; the current code constructs only the configured channels and runtime registry checks and the PR diff contains no doctor file changes.
  • Evidence: Issue [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691 Expected Behavior includes: `In nemoclaw tg-default-sb doctor: a hint in the Messaging section indicating whether Telegram is configured as mention-only or all-messages.` Comment 4868764476 says: `No TELEGRAM_REQUIRE_MENTION field present in channels status or doctor output.` The changed files are limited to channel-status and Telegram rendered-config parser code/tests.
Test follow-ups to resolve or justify

If these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.

  • PRA-T1 Runtime validation — Add a doctor unit regression where Telegram is enabled with `TELEGRAM_GROUP_POLICY=open` and default or `1` mention mode, the `Channels` check is `warn` due to overlap/conflict, and doctor Messaging output still includes `Telegram group mention mode (TELEGRAM_REQUIRE_MENTION): yes` or equivalent.. Unit coverage is strong for the changed parser and channel-status formatting, but the changed behavior depends on real sandbox rebuild output and `execSandbox` reads of rendered config files. The linked issue also still lacks doctor regression coverage.
  • PRA-T2 Runtime validation — Add or identify runtime validation that rebuilding an OpenClaw Telegram sandbox with `TELEGRAM_GROUP_POLICY=open` and `TELEGRAM_REQUIRE_MENTION=0` omits or encodes `channels.telegram.groups` consistently with all-message mode, and `channels status --channel telegram` reports `Telegram group mention mode (TELEGRAM_REQUIRE_MENTION): no`.. Unit coverage is strong for the changed parser and channel-status formatting, but the changed behavior depends on real sandbox rebuild output and `execSandbox` reads of rendered config files. The linked issue also still lacks doctor regression coverage.
  • PRA-T3 Runtime validation — Add or identify runtime validation that rebuilding an OpenClaw Telegram sandbox with `TELEGRAM_REQUIRE_MENTION` unset/default renders `channels.telegram.groups["*"].requireMention=true`, and `channels status --channel telegram` reports `Telegram group mention mode (TELEGRAM_REQUIRE_MENTION): yes (default)` or the accepted default wording.. Unit coverage is strong for the changed parser and channel-status formatting, but the changed behavior depends on real sandbox rebuild output and `execSandbox` reads of rendered config files. The linked issue also still lacks doctor regression coverage.
  • PRA-T4 Runtime validation — Add a negative parser/status regression for mixed rendered OpenClaw groups, for example one group with `requireMention: true` and another with `false`, and assert the comparison warns instead of accepting a single expected scalar mention-mode value.. Unit coverage is strong for the changed parser and channel-status formatting, but the changed behavior depends on real sandbox rebuild output and `execSandbox` reads of rendered config files. The linked issue also still lacks doctor regression coverage.
  • PRA-T5 Acceptance clause — Issue title: `[All Platforms][CLI&UX][GitHub Issue [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb` — add test evidence or identify existing coverage. The diff surfaces Telegram mention mode in `channels status` through `src/lib/actions/sandbox/channel-status-config.ts` and `src/lib/messaging/channels/telegram/rendered-config-parser.ts`, with tests asserting `Telegram group mention mode (TELEGRAM_REQUIRE_MENTION)`. No doctor code or tests changed.
  • PRA-T6 Acceptance clause — Expected Behavior: `When Telegram is configured with mention-only group reply behavior (either via TELEGRAM_REQUIRE_MENTION=1 or an equivalent onboard wizard choice), NemoClaw's user-facing status/diagnostic commands should expose this configuration clearly:` — add test evidence or identify existing coverage. Status diagnostics now expose the setting as yes/no/default. Doctor remains unchanged and therefore does not expose the setting.
  • PRA-T7 Acceptance clause — Expected Behavior bullet: `In nemoclaw tg-default-sb doctor: a hint in the Messaging section indicating whether Telegram is configured as mention-only or all-messages.` — add test evidence or identify existing coverage. `src/lib/actions/sandbox/doctor-messaging.ts` is unchanged; `collectMessagingDoctorChecks()` still appends only the configured-channel check and runtime-channel check.
  • PRA-T8 Acceptance clause — Actual Behavior bullet: `doctor reports Channels: telegram enabled; no recent conflict signatures and Runtime channel registry: telegram acknowledged by OpenClaw runtime — no mention-mode detail.` — add test evidence or identify existing coverage. No doctor implementation or doctor regression test was added; the existing doctor check construction still has no mention-mode signal.
Since last review details

Current findings, using the urgency labels above:

PRA-1 Required — Doctor still does not surface Telegram mention mode

  • Location: src/lib/actions/sandbox/doctor-messaging.ts:269
  • Category: acceptance
  • Problem: The PR still closes [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691, whose expected behavior explicitly includes `nemoclaw tg-default-sb doctor`, and the reopened QA comment reports the missing `TELEGRAM_REQUIRE_MENTION` field in both channels status and doctor. This diff adds the rendered-config comparison for `channels status`, but `collectMessagingDoctorChecks()` still returns only the configured-channel check and runtime-channel check; it does not call `buildConfigStatusSignals()` or otherwise emit the new Telegram mention-mode diagnostic in the Messaging section.
  • Impact: Merging as-is would leave one of the issue's two user-visible diagnostic surfaces unfixed. Operators and QA still cannot verify mention-only versus all-messages behavior from `nemoclaw <sandbox> doctor`, including the overlap-warning path called out in the reopened issue comment.
  • Required action: Add doctor-side Telegram mention-mode reporting for configured Telegram channels, preferably by reusing the same rendered-config comparison boundary or a shared helper used by `channels status`, and ensure it is still emitted when the existing `Channels` check is `warn`. If maintainers intentionally want this PR to be status-only, remove or narrow the `Fixes [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691` closure claim so the doctor acceptance remains tracked separately.
  • Expected follow-up: Fix before merge or get explicit maintainer override.
  • Verification: Read `src/lib/actions/sandbox/doctor-messaging.ts` around `collectMessagingDoctorChecks()` and `configuredChannelsCheck()`; the current code constructs only the configured channels and runtime registry checks and the PR diff contains no doctor file changes.
  • Missing regression test: Add a targeted doctor unit test where a Telegram sandbox has `TELEGRAM_GROUP_POLICY=open` and `TELEGRAM_REQUIRE_MENTION=1` or the default, the configured `Channels` check is `warn` because of a Telegram overlap/conflict, and the rendered doctor Messaging output still includes `Telegram group mention mode (TELEGRAM_REQUIRE_MENTION)` with the expected mention-only/all-messages value.
  • Done when: The required change is committed and verification passes: Read `src/lib/actions/sandbox/doctor-messaging.ts` around `collectMessagingDoctorChecks()` and `configuredChannelsCheck()`; the current code constructs only the configured channels and runtime registry checks and the PR diff contains no doctor file changes.
  • Evidence: Issue [All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb #5691 Expected Behavior includes: `In nemoclaw tg-default-sb doctor: a hint in the Messaging section indicating whether Telegram is configured as mention-only or all-messages.` Comment 4868764476 says: `No TELEGRAM_REQUIRE_MENTION field present in channels status or doctor output.` The changed files are limited to channel-status and Telegram rendered-config parser code/tests.

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.

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: messaging-providers
Optional E2E: channels-add-remove, diagnostics

Dispatch hint: messaging-providers

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • messaging-providers (medium): Exercises real Docker/OpenShell sandbox messaging-provider setup with Telegram, verifies rendered openclaw.json channel/account configuration, provider credential isolation, Telegram policy behavior, and optional real Telegram send coverage. This is the closest existing E2E coverage for changes to Telegram rendered config interpretation.

Optional E2E

  • channels-add-remove (medium): Useful adjacent confidence because it adds Telegram to an OpenClaw sandbox with TELEGRAM_REQUIRE_MENTION=0, rebuilds, checks registry/policy/rendered openclaw.json state, and then removes the channel. It does not directly assert the new status display/parser behavior, so it is optional rather than required.
  • diagnostics (medium): Useful adjacent confidence for nemoclaw status and sandbox openclaw.json readability through real OpenShell, but the existing diagnostics lane is not Telegram-channel-specific.

New E2E recommendations

  • telegram-channel-status-config (medium): Existing E2E coverage exercises Telegram rendering and provider behavior, but does not appear to assert nemoclaw <sandbox> status --channel telegram reports TELEGRAM_REQUIRE_MENTION as ok when OpenClaw omits the groups stanza for all-message mode or when wildcard groups.requireMention is present.
    • Suggested test: Add a focused live E2E assertion after Telegram channel add/rebuild that runs nemoclaw <sandbox> status --channel telegram and verifies Telegram group mention mode (TELEGRAM_REQUIRE_MENTION) shows an ok detail for both all-message mode and mention-required mode.

Dispatch hint

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

@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

E2E Target Recommendation

Required E2E targets: channels-add-remove
Optional E2E targets: messaging-providers

Dispatch required E2E targets:

  • gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=channels-add-remove

Workflow run

Full E2E target advisor summary

E2E Target Advisor

Base: origin/main
Head: HEAD
Confidence: medium

Required E2E targets

  • channels-add-remove: The PR changes Telegram rendered config parsing and channel status comparison for TELEGRAM_REQUIRE_MENTION/group policy. The channels-add-remove job is the smallest wired live E2E job that exercises adding Telegram, persisting requireMention, rebuilding, applying the Telegram policy preset, and verifying rendered OpenClaw channel state.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=channels-add-remove

Optional E2E targets

  • messaging-providers: Optional broader coverage for Telegram provider runtime configuration, including OpenClaw rendered telegram account fields and groupPolicy behavior across the messaging-provider live boundary.
    • Dispatch: gh workflow run e2e.yaml --ref <pr-head-ref> --field jobs=messaging-providers

Relevant changed files

  • src/lib/actions/sandbox/channel-status-config.ts
  • src/lib/messaging/channels/telegram/rendered-config-parser.ts

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (3)
src/lib/actions/sandbox/doctor-messaging.ts (1)

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

Avoid matching on the label string "Rendered config source" to rename check labels.

Comparing signal.label against a magic string produced by another module (likely configSourceReadSignals) is a fragile cross-file coupling — a wording change there silently breaks this renaming logic with no compiler warning.

Consider having configSourceReadSignals/DiagnosticSignal carry an explicit discriminant (e.g. a kind: "source" | "input" field) that this code can switch on instead of matching display text.

🤖 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/actions/sandbox/doctor-messaging.ts` around lines 304 - 314, The
Messaging label remapping in doctor-messaging.ts is coupled to the display text
“Rendered config source”, which is fragile and can break silently if another
module changes wording. Update the signal model used by
configSourceReadSignals/DiagnosticSignal to include an explicit discriminant
such as kind, then change the mapping logic in the Messaging signal
transformation to switch on that field instead of comparing signal.label
strings.
src/lib/actions/sandbox/channel-status-config.ts (1)

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

Simplify configInputValueDetail's ad-hoc parenthesis construction.

The function builds renderedValue with a deliberately unclosed ( and closes it later in a separate conditional return, which is hard to follow and easy to break during future edits (e.g. adding a third suffix variant).

♻️ Suggested clearer implementation
 function configInputValueDetail(
   input: ChannelConfigInputSpec,
   value: MessagingSerializableValue | undefined,
   options: { readonly isDefault?: boolean } = {},
 ): string {
   const booleanValue = value === undefined ? null : booleanConfigValue(value);
   const labelKey =
     booleanValue === null ? configInputDetail(value) : booleanValue === true ? "1" : "0";
   const label = input.diagnostics?.valueLabels?.[labelKey];
-  const renderedValue = label ? `${label} (${labelKey}` : configInputDetail(value);
-  if (label) return `${renderedValue}${options.isDefault ? ", default" : ""})`;
-  return `${renderedValue}${options.isDefault ? " (default)" : ""}`;
+  if (label) {
+    return options.isDefault ? `${label} (${labelKey}, default)` : `${label} (${labelKey})`;
+  }
+  const renderedValue = configInputDetail(value);
+  return options.isDefault ? `${renderedValue} (default)` : renderedValue;
 }
🤖 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/actions/sandbox/channel-status-config.ts` around lines 194 - 207,
`configInputValueDetail` currently constructs label output with split, ad-hoc
parentheses handling that is hard to maintain. Refactor the logic in
`configInputValueDetail` so the rendered string is assembled in one clear path,
with any `default` suffix appended consistently without relying on an unclosed
parenthesis in `renderedValue`. Keep the existing behavior for
`input.diagnostics?.valueLabels`, `booleanConfigValue`, and `configInputDetail`,
but make the formatting logic explicit and easy to extend.
src/lib/messaging/channels/telegram/rendered-config-parser.ts (1)

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

Simplify duplicate Set/sort computation.

new Set(values) and .sort() are each computed twice on Lines 113. Also note the sort relies on default string-coercion ordering ("false" < "true"), which is correct here but non-obvious for future readers/values.

♻️ Proposed simplification
   if (values.length === 0) return true;
-  return [...new Set(values)].sort().length === 1 ? values[0] : [...new Set(values)].sort();
+  const uniqueValues = [...new Set(values)].sort((a, b) => Number(a) - Number(b));
+  return uniqueValues.length === 1 ? uniqueValues[0] : uniqueValues;
🤖 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/telegram/rendered-config-parser.ts` around lines
101 - 114, The duplicate Set/sort work in the requireMention parsing logic
should be simplified to avoid computing the same unique/sorted result twice.
Update the boolean aggregation in rendered-config-parser’s parsing function to
store the deduplicated result in a local variable once, then use that variable
for the length check and return path. Keep the behavior the same in
getStructuredPath/values handling, but make the ordering intent clearer for
future readers.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/lib/actions/sandbox/channel-status-config.ts`:
- Around line 194-207: `configInputValueDetail` currently constructs label
output with split, ad-hoc parentheses handling that is hard to maintain.
Refactor the logic in `configInputValueDetail` so the rendered string is
assembled in one clear path, with any `default` suffix appended consistently
without relying on an unclosed parenthesis in `renderedValue`. Keep the existing
behavior for `input.diagnostics?.valueLabels`, `booleanConfigValue`, and
`configInputDetail`, but make the formatting logic explicit and easy to extend.

In `@src/lib/actions/sandbox/doctor-messaging.ts`:
- Around line 304-314: The Messaging label remapping in doctor-messaging.ts is
coupled to the display text “Rendered config source”, which is fragile and can
break silently if another module changes wording. Update the signal model used
by configSourceReadSignals/DiagnosticSignal to include an explicit discriminant
such as kind, then change the mapping logic in the Messaging signal
transformation to switch on that field instead of comparing signal.label
strings.

In `@src/lib/messaging/channels/telegram/rendered-config-parser.ts`:
- Around line 101-114: The duplicate Set/sort work in the requireMention parsing
logic should be simplified to avoid computing the same unique/sorted result
twice. Update the boolean aggregation in rendered-config-parser’s parsing
function to store the deduplicated result in a local variable once, then use
that variable for the length check and return path. Keep the behavior the same
in getStructuredPath/values handling, but make the ordering intent clearer for
future readers.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: a44119cb-cab7-4013-80c5-023a08775865

📥 Commits

Reviewing files that changed from the base of the PR and between 2276b2e and 88f255f.

📒 Files selected for processing (16)
  • docs/manage-sandboxes/messaging-channels.mdx
  • docs/reference/commands-nemohermes.mdx
  • docs/reference/commands.mdx
  • src/lib/actions/sandbox/channel-status-config-core.test.ts
  • src/lib/actions/sandbox/channel-status-config.ts
  • src/lib/actions/sandbox/channel-status-telegram-policy.test.ts
  • src/lib/actions/sandbox/doctor-flow.test.ts
  • src/lib/actions/sandbox/doctor-messaging.ts
  • src/lib/messaging/channels/manifests.test.ts
  • src/lib/messaging/channels/telegram/manifest.ts
  • src/lib/messaging/channels/telegram/rendered-config-parser.test.ts
  • src/lib/messaging/channels/telegram/rendered-config-parser.ts
  • src/lib/messaging/channels/telegram/template-resolver.test.ts
  • src/lib/messaging/channels/telegram/template-resolver.ts
  • src/lib/messaging/manifest/types.ts
  • test/generate-openclaw-config.test.ts

Signed-off-by: Apurv Kumaria <akumaria@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.

Caution

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

⚠️ Outside diff range comments (1)
src/lib/actions/sandbox/doctor-flow.test.ts (1)

1-258: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Keep the missing doctor mention cases in this suite doctor-telegram-mention.test.ts only covers the explicit 1/0 renderings; add the default-unset and drift-warning doctor JSON cases here as well so this suite still exercises the full Telegram mention matrix.

🤖 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/actions/sandbox/doctor-flow.test.ts` around lines 1 - 258, Add the
missing doctor mention coverage to runSandboxDoctor flow in doctor-flow.test.ts
so this suite still exercises the full Telegram mention matrix. Extend the
existing JSON-focused cases to include the default-unset path and the
drift-warning path, alongside the explicit 1/0 renderings already covered in
doctor-telegram-mention.test.ts. Use the existing createDoctorHarness and
runSandboxDoctor entrypoint to assert the JSON report behavior for those mention
states.

Source: Path instructions

🧹 Nitpick comments (1)
src/lib/actions/sandbox/doctor-flow.test-helpers.ts (1)

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

Naming collision: local resolve shadows the node:path import.

const resolve = requireDist(...) shadows the top-level resolve import from node:path for the rest of createDoctorHarness. Not a live bug today, but risks confusion or an accidental misuse if path.resolve is ever needed inside this function later.

♻️ Suggested rename
-  const resolve = requireDist("../../adapters/openshell/resolve.js");
+  const openshellResolve = requireDist("../../adapters/openshell/resolve.js");

(and update the corresponding resolveOpenshell spy target below)

🤖 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/actions/sandbox/doctor-flow.test-helpers.ts` at line 88, The local
`resolve` constant in `createDoctorHarness` shadows the `node:path` `resolve`
import, so rename the `requireDist("../../adapters/openshell/resolve.js")`
binding to a distinct name and update the matching `resolveOpenshell` spy target
accordingly. Keep the top-level path helper untouched and adjust any references
in `doctor-flow.test-helpers.ts` that currently use the shadowed identifier so
the function remains clear and future-safe.
🤖 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 `@src/lib/actions/sandbox/doctor-flow.test.ts`:
- Around line 1-258: Add the missing doctor mention coverage to runSandboxDoctor
flow in doctor-flow.test.ts so this suite still exercises the full Telegram
mention matrix. Extend the existing JSON-focused cases to include the
default-unset path and the drift-warning path, alongside the explicit 1/0
renderings already covered in doctor-telegram-mention.test.ts. Use the existing
createDoctorHarness and runSandboxDoctor entrypoint to assert the JSON report
behavior for those mention states.

---

Nitpick comments:
In `@src/lib/actions/sandbox/doctor-flow.test-helpers.ts`:
- Line 88: The local `resolve` constant in `createDoctorHarness` shadows the
`node:path` `resolve` import, so rename the
`requireDist("../../adapters/openshell/resolve.js")` binding to a distinct name
and update the matching `resolveOpenshell` spy target accordingly. Keep the
top-level path helper untouched and adjust any references in
`doctor-flow.test-helpers.ts` that currently use the shadowed identifier so the
function remains clear and future-safe.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: cf03115f-43f6-425b-8baa-e9786f4437a2

📥 Commits

Reviewing files that changed from the base of the PR and between 88f255f and 6d10fdf.

📒 Files selected for processing (6)
  • src/lib/actions/sandbox/channel-status-config-core.test.ts
  • src/lib/actions/sandbox/channel-status-telegram-mention.test.ts
  • src/lib/actions/sandbox/doctor-flow.test-helpers.ts
  • src/lib/actions/sandbox/doctor-flow.test.ts
  • src/lib/actions/sandbox/doctor-telegram-mention.test.ts
  • src/lib/messaging/channels/telegram/template-resolver.test.ts
💤 Files with no reviewable changes (1)
  • src/lib/actions/sandbox/channel-status-config-core.test.ts
✅ Files skipped from review due to trivial changes (1)
  • src/lib/actions/sandbox/doctor-telegram-mention.test.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/messaging/channels/telegram/template-resolver.test.ts

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Comment thread src/lib/actions/sandbox/doctor-messaging.ts Outdated
Signed-off-by: San Dang <sdang@nvidia.com>
@sandl99 sandl99 self-assigned this Jul 3, 2026
@sandl99 sandl99 changed the title fix(messaging): surface Telegram mention mode in status and doctor fix(messaging): surface Telegram mention mode in channel status Jul 3, 2026
@sandl99 sandl99 added the v0.0.74 label Jul 3, 2026
Signed-off-by: San Dang <sdang@nvidia.com>
@sandl99
sandl99 requested a review from cv July 3, 2026 06:08
@github-actions

github-actions Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

Vitest E2E Target Results — ✅ All selected jobs passed

Run: 28642059794
Workflow ref: fix/5691-telegram-mention-status
Requested targets: channels-add-remove,messaging-providers
Requested jobs: (default — all default-enabled free-standing jobs; explicit-only jobs hermes-gpu-startup, openshell-gateway-auth-contract, jetson-nvmap-gpu, and sandbox-rlimits-connect are skipped unless selected)
Summary: 2 passed, 0 failed, 0 cancelled, 0 skipped

Job Result
channels-add-remove ✅ success
messaging-providers ✅ success

@cv
cv merged commit 22c0b72 into main Jul 3, 2026
122 checks passed
@cv
cv deleted the fix/5691-telegram-mention-status branch July 3, 2026 07:44
@ericksoa ericksoa mentioned this pull request Jul 4, 2026
21 tasks
ericksoa added a commit that referenced this pull request Jul 4, 2026
<!-- markdownlint-disable MD041 -->
## Summary
This PR prepares the user-facing documentation for v0.0.74 before the
release plan is frozen.
It expands the release notes across the 56-commit train and closes
durable documentation gaps found during the pre-tag commit scan.

## Changes
- Expand the `v0.0.74` release notes to cover OpenShell 0.0.72, managed
MCP, progressive tool disclosure, LangChain Deep Agents Code,
onboarding, local inference, messaging, recovery, and contributor
workflows.
- Correct the `destroy` contract for retained per-name volumes,
gateway-unreachable `--force` cleanup, managed MCP ownership, and
same-name recovery.
- Document separate remediation for an unreachable container DNS
resolver versus one that answers with `NXDOMAIN` or `REFUSED`.
- Document the Windows on Arm N1X automatic Ollama safeguard and its
remaining large-model limitations.
- State that messaging conflicts abort rebuild before backup or
deletion, leaving the original sandbox intact.
- Link the agent-runnable value benchmark from the contributor task
index.
- Synchronize generated agent command variants.
- Validate with `npm run docs:sync-agent-variants` and `npm run docs`;
Fern completed with 0 errors and 2 existing warnings.
- Source summary:
- [#6020](#6020) and
[#5876](#5876) ->
`docs/about/release-notes.mdx`: Consolidate the OpenShell 0.0.72 policy
boundary and managed MCP lifecycle.
- [#6251](#6251) and
[#5989](#5989) ->
`docs/about/release-notes.mdx`: Summarize progressive tool disclosure
and sandbox-first inference controls.
- [#6232](#6232),
[#6082](#6082),
[#6219](#6219),
[#6214](#6214),
[#6215](#6215),
[#6230](#6230), and
[#6260](#6260) ->
`docs/about/release-notes.mdx`: Summarize the experimental LangChain
Deep Agents Code status, secret, version, rebuild, snapshot, and MCP
boundaries.
- [#6166](#6166),
[#6254](#6254),
[#6265](#6265),
[#6164](#6164), and
[#6017](#6017) ->
`docs/about/release-notes.mdx`: Summarize BuildKit prebuild, validated
image reuse, bounded readiness, and preflight improvements.
- [#6150](#6150) ->
`docs/about/release-notes.mdx` and `docs/reference/troubleshooting.mdx`:
Separate unreachable-resolver remediation from reachable-but-rejected
DNS responses.
- [#6234](#6234) ->
`docs/about/release-notes.mdx`,
`docs/inference/use-local-inference.mdx`, and
`docs/get-started/windows-preparation.mdx`: Document N1X automatic 9B
selection and the remaining explicit-large-model boundary.
- [#6129](#6129),
[#5987](#5987),
[#5955](#5955), and
[#6220](#6220) ->
`docs/about/release-notes.mdx`,
`docs/manage-sandboxes/messaging-channels.mdx`,
`docs/reference/commands.mdx`, and
`docs/reference/commands-nemohermes.mdx`: Document messaging policy
persistence, status, and the pre-destructive conflict check.
- [#5963](#5963),
[#6050](#6050),
[#6094](#6094),
[#6238](#6238),
[#5988](#5988),
[#6235](#6235),
[#6181](#6181), and
[#5986](#5986) ->
`docs/about/release-notes.mdx`, `docs/reference/commands.mdx`, and
`docs/reference/commands-nemohermes.mdx`: Summarize day-two recovery and
clarify retained-volume and local-only destroy semantics.
- [#6200](#6200),
[#6248](#6248),
[#6168](#6168),
[#6270](#6270), and
[#5649](#5649) ->
`docs/about/release-notes.mdx` and `CONTRIBUTING.md`: Summarize
contributor setup and verification improvements and expose the advisory
value benchmark.

## Type of Change

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

## Quality Gates
<!-- Check exactly one tests line and one docs line. Check other lines
when applicable. Add every requested justification or approval
reference. -->
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: documentation-only release
preparation; generated-variant synchronization and the Fern docs build
validate the changed pages and routes.
- [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:

## Verification
<!-- Check each applicable item only when supported by the requested
evidence. Run targeted tests once per relevant change set and rerun
after later edits or hook autofixes that can affect the tested behavior.
Do not rerun hook-covered checks. -->
- [x] PR description includes the DCO sign-off declaration 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 — command/result or justification: tests
are not applicable to this documentation-only change; `npm run docs`
validates the source and generated routes.
- [ ] 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)
- [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)

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
* Expanded setup guidance for Windows on Arm devices with safer default
local model selection.
* Clarified local inference and sandbox messaging behavior, including
conflict checks before rebuilds and safer recovery steps.
* Updated destroy/rebuild/reference docs with more detailed warnings,
failure handling, and volume-retention guidance.
* Improved troubleshooting instructions for Docker DNS issues with
clearer paths for unreachable vs. blocked resolvers.

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

---------

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
…IA#6220)

<!-- markdownlint-disable MD041 -->
## Summary
<!-- 1-3 sentences: what this PR does and why. -->

Surface Telegram's effective group mention mode in `channels status` by
parsing the rendered agent configuration and comparing it with the
sandbox messaging entry. This keeps the configuration surface scoped to
status diagnostics only; `doctor` and docs are intentionally unchanged.
Having this PR NVIDIA#6220 to fix
TELEGRAM_REQUIRE_MENTION surface in channel status. I strongly not
recommend to add for nemoclaw doctor because doctor is for generic
debug. Channels status -- channel telegram will show detail debug
configuration.

```
➜  NemoClaw git:(fix/5691-telegram-mention-status) ✗ nemoclaw tm channels status 

  NemoClaw channels status: tm
  telegram
    [ok] Channel registration: telegram registered
    [ok] Policy coverage: telegram preset applied
    [ok] Telegram User ID (for DM access) (TELEGRAM_ALLOWED_IDS): 7895072570
    [ok] Telegram group mention mode (TELEGRAM_REQUIRE_MENTION): yes
    [ok] Telegram group policy (TELEGRAM_GROUP_POLICY): open
```

## Related Issue
<!-- Fixes #NNN or Closes #NNN. Remove this section if none. -->

Fixes NVIDIA#5691

## Changes
<!-- Bullet list of key changes. -->

- Parse rendered OpenClaw and Hermes Telegram configuration for
mention-mode values.
- Add Telegram mention-mode status comparison details for `channels
status`.
- Cover rendered-config parsing and status diagnostics with regression
tests.
- Remove the prior doctor/docs expansion from this PR branch.

## 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
<!-- Check all that apply. For any "covered by existing tests", "not
applicable", or waiver entry, add a brief justification on the same line
or in the Changes section. -->
- [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: requested scope is
status-only code behavior; no docs changes in final PR diff.
- [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: self-reviewed the
messaging diagnostic boundary; only non-secret rendered config values
are parsed and regression coverage verifies Telegram tokens are not
printed.
- [ ] Non-success, skipped, or missing CI check accepted by maintainer —
check name, approval link, and follow-up issue:

## Verification
<!-- Check each item you ran and confirmed. Leave unchecked items you
skipped. Doc-only changes do not require npm test unless you ran it. -->
- [x] PR description includes the DCO sign-off declaration and every
commit appears as `Verified` in GitHub
- [ ] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes — pre-push TypeScript/package
hooks passed; the local pre-commit `test-cli` coverage hook was skipped
after repeated timeout, with targeted tests run below.
- [x] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only) — not run;
this is a focused status/parser 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) — not
run; no docs changes in final PR diff.
- [ ] 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)

Validation evidence:

- `npx vitest run --project cli
src/lib/actions/sandbox/channel-status-config-core.test.ts
src/lib/actions/sandbox/channel-status-telegram-policy.test.ts
src/lib/messaging/channels/telegram/rendered-config-parser.test.ts`
passed: 3 files, 15 tests.
- Pre-push hooks passed: TypeScript (CLI) and package/tag version sync.
- GitHub DCO check passed, and all PR commits report `verified=true`.

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: San Dang <sdang@nvidia.com>

---------

Signed-off-by: San Dang <sdang@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Co-authored-by: San Dang <sdang@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
<!-- markdownlint-disable MD041 -->
## Summary
This PR prepares the user-facing documentation for v0.0.74 before the
release plan is frozen.
It expands the release notes across the 56-commit train and closes
durable documentation gaps found during the pre-tag commit scan.

## Changes
- Expand the `v0.0.74` release notes to cover OpenShell 0.0.72, managed
MCP, progressive tool disclosure, LangChain Deep Agents Code,
onboarding, local inference, messaging, recovery, and contributor
workflows.
- Correct the `destroy` contract for retained per-name volumes,
gateway-unreachable `--force` cleanup, managed MCP ownership, and
same-name recovery.
- Document separate remediation for an unreachable container DNS
resolver versus one that answers with `NXDOMAIN` or `REFUSED`.
- Document the Windows on Arm N1X automatic Ollama safeguard and its
remaining large-model limitations.
- State that messaging conflicts abort rebuild before backup or
deletion, leaving the original sandbox intact.
- Link the agent-runnable value benchmark from the contributor task
index.
- Synchronize generated agent command variants.
- Validate with `npm run docs:sync-agent-variants` and `npm run docs`;
Fern completed with 0 errors and 2 existing warnings.
- Source summary:
- [NVIDIA#6020](NVIDIA#6020) and
[NVIDIA#5876](NVIDIA#5876) ->
`docs/about/release-notes.mdx`: Consolidate the OpenShell 0.0.72 policy
boundary and managed MCP lifecycle.
- [NVIDIA#6251](NVIDIA#6251) and
[NVIDIA#5989](NVIDIA#5989) ->
`docs/about/release-notes.mdx`: Summarize progressive tool disclosure
and sandbox-first inference controls.
- [NVIDIA#6232](NVIDIA#6232),
[NVIDIA#6082](NVIDIA#6082),
[NVIDIA#6219](NVIDIA#6219),
[NVIDIA#6214](NVIDIA#6214),
[NVIDIA#6215](NVIDIA#6215),
[NVIDIA#6230](NVIDIA#6230), and
[NVIDIA#6260](NVIDIA#6260) ->
`docs/about/release-notes.mdx`: Summarize the experimental LangChain
Deep Agents Code status, secret, version, rebuild, snapshot, and MCP
boundaries.
- [NVIDIA#6166](NVIDIA#6166),
[NVIDIA#6254](NVIDIA#6254),
[NVIDIA#6265](NVIDIA#6265),
[NVIDIA#6164](NVIDIA#6164), and
[NVIDIA#6017](NVIDIA#6017) ->
`docs/about/release-notes.mdx`: Summarize BuildKit prebuild, validated
image reuse, bounded readiness, and preflight improvements.
- [NVIDIA#6150](NVIDIA#6150) ->
`docs/about/release-notes.mdx` and `docs/reference/troubleshooting.mdx`:
Separate unreachable-resolver remediation from reachable-but-rejected
DNS responses.
- [NVIDIA#6234](NVIDIA#6234) ->
`docs/about/release-notes.mdx`,
`docs/inference/use-local-inference.mdx`, and
`docs/get-started/windows-preparation.mdx`: Document N1X automatic 9B
selection and the remaining explicit-large-model boundary.
- [NVIDIA#6129](NVIDIA#6129),
[NVIDIA#5987](NVIDIA#5987),
[NVIDIA#5955](NVIDIA#5955), and
[NVIDIA#6220](NVIDIA#6220) ->
`docs/about/release-notes.mdx`,
`docs/manage-sandboxes/messaging-channels.mdx`,
`docs/reference/commands.mdx`, and
`docs/reference/commands-nemohermes.mdx`: Document messaging policy
persistence, status, and the pre-destructive conflict check.
- [NVIDIA#5963](NVIDIA#5963),
[NVIDIA#6050](NVIDIA#6050),
[NVIDIA#6094](NVIDIA#6094),
[NVIDIA#6238](NVIDIA#6238),
[NVIDIA#5988](NVIDIA#5988),
[NVIDIA#6235](NVIDIA#6235),
[NVIDIA#6181](NVIDIA#6181), and
[NVIDIA#5986](NVIDIA#5986) ->
`docs/about/release-notes.mdx`, `docs/reference/commands.mdx`, and
`docs/reference/commands-nemohermes.mdx`: Summarize day-two recovery and
clarify retained-volume and local-only destroy semantics.
- [NVIDIA#6200](NVIDIA#6200),
[NVIDIA#6248](NVIDIA#6248),
[NVIDIA#6168](NVIDIA#6168),
[NVIDIA#6270](NVIDIA#6270), and
[NVIDIA#5649](NVIDIA#5649) ->
`docs/about/release-notes.mdx` and `CONTRIBUTING.md`: Summarize
contributor setup and verification improvements and expose the advisory
value benchmark.

## Type of Change

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

## Quality Gates
<!-- Check exactly one tests line and one docs line. Check other lines
when applicable. Add every requested justification or approval
reference. -->
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: documentation-only release
preparation; generated-variant synchronization and the Fern docs build
validate the changed pages and routes.
- [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:

## Verification
<!-- Check each applicable item only when supported by the requested
evidence. Run targeted tests once per relevant change set and rerun
after later edits or hook autofixes that can affect the tested behavior.
Do not rerun hook-covered checks. -->
- [x] PR description includes the DCO sign-off declaration 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 — command/result or justification: tests
are not applicable to this documentation-only change; `npm run docs`
validates the source and generated routes.
- [ ] 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)
- [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)

---
<!-- DCO sign-off is required in this PR description, and every commit
must appear as Verified in GitHub. Run: git config user.name && git
config user.email -->
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>


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

## Summary by CodeRabbit

* **Documentation**
* Expanded setup guidance for Windows on Arm devices with safer default
local model selection.
* Clarified local inference and sandbox messaging behavior, including
conflict checks before rebuilds and safer recovery steps.
* Updated destroy/rebuild/reference docs with more detailed warnings,
failure handling, and volume-retention guidance.
* Improved troubleshooting instructions for Docker DNS issues with
clearer paths for unreachable vs. blocked resolvers.

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

---------

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

Labels

area: cli Command line interface, flags, terminal UX, or output area: docs Documentation, examples, guides, or docs build area: messaging Messaging channels, bridges, manifests, or channel lifecycle integration: telegram Telegram integration or channel behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[All Platforms][CLI&UX][GitHub Issue #5691] Telegram mention-only configuration not surfaced in NemoClaw status/doctor output for tg-default-sb

3 participants