Skip to content

docs(platform): publish canonical platform support matrix (#4630) - #5712

Merged
cv merged 14 commits into
mainfrom
feat/4630-platform-support-matrix-v2
Jun 24, 2026
Merged

docs(platform): publish canonical platform support matrix (#4630)#5712
cv merged 14 commits into
mainfrom
feat/4630-platform-support-matrix-v2

Conversation

@cjagwani

@cjagwani cjagwani commented Jun 24, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds the canonical launch-claims matrix for NemoClaw at `docs/reference/platform-support.mdx`, driven by `ci/platform-matrix.json` through a hardened generator. Single source of truth for what NemoClaw supports today.

Related Issue

Closes #4630. Supersedes #5345 (closed; that branch carried a heavy docs-to-skills regen tangle that became untenable after main retired the docs-to-skills system in #5699).

Why a new PR

#5345 was open for two weeks while main moved significantly. The most disruptive change was #5699 ("retire docs-to-skills") which deleted the regeneration tool and the entire user-skill tree this PR's pre-restart branch was modifying. Reconciling against the new structure would have required reverting half the PR's value and re-baselining against current main. Branching fresh off main is the cleaner path.

The audit, evidence, and advisor-loop work from #5345 carries forward through this PR's content — only the diff history was reset.

What this lands

  • `ci/platform-matrix.json` — expanded to cover platforms, providers, agents, integrations, deployment paths, capabilities, and out-of-scope items. Every status follows the declared vocabulary (`Tested` / `Tested with limitations` / `Experimental` / `Deferred` / `Unsupported` / `Hermes only`). Rows carry file:line evidence citations.
  • `docs/reference/platform-support.mdx` — new canonical page rendered from the JSON through sentinel-comment regeneration. Includes a project-status block and an Owners section reflecting the engineering-owner model (no separate product-owner role today).
  • `scripts/generate-platform-docs.py` — hardened generator:
    • `_validate_matrix` rejects missing required keys, unknown statuses, and placeholder owner values (`TBD`, `TODO`, `FIXME`, `see PR review`, empty)
    • `_escape_cell` escapes pipes, newlines, HTML control characters, and MDX expression braces in every emitted cell
    • Full table generators for agents, capabilities, integrations, deployment paths, out-of-scope, and the canonical platform/provider tables; partial views for prerequisites and inference-options
  • `docs/get-started/prerequisites.mdx` + `docs/inference/inference-options.mdx` — partial tables re-rendered from the JSON so onboarding-time docs use the same vocabulary.
  • `test/generate-platform-docs.test.ts` — regression coverage for escaping, status vocabulary, placeholder owner rejection, partial-vs-full deferred filtering, owners-block shape, agent-ID resolution against installed manifests, out-of-scope LangChain exception scoping, and file:line citation existence.

Verification

  • `npx vitest run test/generate-platform-docs.test.ts` — 13/13 pass
  • `python3 scripts/generate-platform-docs.py --check` — all files in sync
  • Generator and tests verified against current `main` after rebase

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)

Advisor state

0 required findings. 2 advisory warnings on deeper matrix schema validation — not pursuing; the right form is a JSON Schema, tracking as follow-up.

Summary by CodeRabbit

  • Documentation
    • Added the “Platform Support and Launch Claims” reference page with a shared status vocabulary and expanded, JSON-driven launch matrices (agents, platforms, providers, integrations, deployment paths, capabilities), including out-of-scope items and caveats/blockers guidance.
    • Refined platform/inference documentation to better reflect validated adapter paths, API shapes, and supported distro/runtime assumptions (e.g., Linux|Docker).
  • Tests
    • Expanded generator end-to-end/regression coverage for table escaping, matrix validation, output variants, and repository consistency checks.
  • Chores
    • Updated the platform-matrix sync pre-commit trigger when the generated platform-support docs change.

Add a single source of truth for what NemoClaw supports today across
platforms, inference providers, agents, integrations, deployment paths,
capabilities, and out-of-scope items. Everything below the docs surface
is generated from ci/platform-matrix.json so the page cannot drift
silently from the metadata.

What this lands

- ci/platform-matrix.json: expanded source of truth covering platforms,
  providers, agents, integrations, deployment paths, capabilities, and
  the out-of-scope table. Every status follows the declared vocabulary
  (Tested / Tested with limitations / Experimental / Deferred /
  Unsupported / Hermes only); evidence rows carry file:line citations
  to source.
- docs/reference/platform-support.mdx: new canonical launch-claims page
  wired to the JSON through sentinel-comment regeneration. Renders every
  section above, plus a project-status block and an Owners section that
  reflects the engineering-owner model.
- scripts/generate-platform-docs.py: hardened generator. Validates the
  matrix shape (required keys, declared status vocabulary, placeholder
  owner rejection), escapes Markdown table hazards (pipes, newlines,
  HTML control characters, MDX expression braces), and renders the full
  agent/capability/integration/deployment/out-of-scope tables for the
  canonical page in addition to the existing partial views.
- docs/get-started/prerequisites.mdx and docs/inference/inference-options.mdx:
  partial tables re-rendered from the JSON so users see the same status
  vocabulary in onboarding-time docs without browsing the full matrix.
- test/generate-platform-docs.test.ts: regression coverage for the
  generator, escaping, status vocabulary, placeholder owner rejection,
  partial-vs-full deferred filtering, owners-block shape, agent-ID
  resolution against installed manifests, out-of-scope LangChain
  exception scoping, and file:line citation existence.

Supersedes #5345

This branches off current main and ships only the canonical matrix
work; the docs-to-skills regen tangle from #5345 is dropped now that
main has retired that system. The audit and evidence work from #5345
is preserved in its history.

Fixes #4630

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

coderabbitai Bot commented Jun 24, 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

Updates the platform support matrix, expands the generator and reference docs it renders, refreshes related guidance, and adds tests plus pre-commit coverage for the generated documentation.

Changes

Platform Support Matrix System

Layer / File(s) Summary
Matrix JSON source data
ci/platform-matrix.json
Adds richer project status and owner metadata, updates status labels, revises platform/provider entries, and expands local provider, agent, capability, out-of-scope, integration, and deployment-path notes.
Generator validation and rendering core
scripts/generate-platform-docs.py
Adds matrix validation, placeholder-owner detection, MDX-safe cell escaping, shared status labels, deferred-row filtering, and main-flow error handling plus matrix-key routing.
Reference docs and navigation
docs/reference/platform-support.mdx, docs/index.yml, docs/get-started/prerequisites.mdx, docs/inference/inference-options.mdx
Adds the platform support reference page, updates docs navigation, and refreshes the prerequisites and inference option tables to match the revised matrix claims.
Generator and repo consistency tests
test/generate-platform-docs.test.ts, .pre-commit-config.yaml
Adds end-to-end tests for escaping, validation, table rendering, owners output, agent manifest lookup, out-of-scope wording, citation integrity, and matrix placeholder rejection, and updates the pre-commit sync trigger for the generated docs.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐇 I hopped through JSON, then MDX to the page,
With labels and caveats all set on the stage.
The validator hummed, the tables aligned bright,
And docs sprang to life in the soft moonlight.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 30.43% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely describes the main change: publishing a canonical platform support matrix.
Linked Issues check ✅ Passed The PR adds the canonical reviewed matrix, covers the listed platforms and inference paths, and documents statuses, caveats, and ownership.
Out of Scope Changes check ✅ Passed The changes stay within the matrix publication effort, including generator, docs, tests, and navigation updates tied to the same goal.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/4630-platform-support-matrix-v2

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

@github-code-quality

github-code-quality Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in the feat/4630-platform-s... 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 feat/4630-platform-s... 8baa753 +/-
nemoclaw/src/se...cret-scanner.ts 100%
nemoclaw/src/commands/slash.ts 100%
nemoclaw/src/li...bprocess-env.ts 100%
nemoclaw/src/bl...eprint/state.ts 98%
nemoclaw/src/onboard/config.ts 98%
nemoclaw/src/bl...int/snapshot.ts 97%
nemoclaw/src/bl...print/runner.ts 95%
nemoclaw/src/co...ration-state.ts 94%
nemoclaw/src/bl...ate-networks.ts 94%
nemoclaw/src/index.ts 94%

TypeScript / code-coverage/cli

The overall coverage in the feat/4630-platform-s... branch is 46%. Coverage data for the main branch is not yet available.

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

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

@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: None
Optional E2E: docs-validation-e2e

Dispatch hint: docs-validation-e2e

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • None. No merge-blocking runtime E2E is required: the changed files are documentation, generated launch-claim data, docs navigation, pre-commit tooling, and generator unit tests. They do not affect installer/onboarding execution, sandbox lifecycle, credential handling, security boundaries, network policy enforcement, inference routing implementation, deployment code, or real assistant user flows.

Optional E2E

  • docs-validation-e2e (low): Optional confidence for the new docs page/navigation and generated support-matrix tables. The PR does not change runtime code, but this existing docs E2E validates documentation behavior beyond the static platform-matrix sync check.

New E2E recommendations

  • None.

Dispatch hint

  • Workflow: .github/workflows/nightly-e2e.yaml
  • jobs input: docs-validation-e2e

@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

Vitest E2E Scenario Recommendation

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

Workflow run

Full Vitest E2E advisor summary

Vitest E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required Vitest E2E scenarios

  • None. No Vitest scenario E2E dispatch is required: this PR changes platform-support documentation/source data, the docs generator, pre-commit wiring, and a non-scenario unit test outside test/e2e-scenario/. It does not change the Vitest scenario workflow, registry, runtime support, live scenario files, fixtures, or onboarding/runtime code exercised by typed scenarios.

Optional Vitest E2E scenarios

  • None.

Relevant changed files

  • None.

@github-actions

github-actions Bot commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — Changes requested

Merge posture: Do not merge yet
Primary next action: Resolve or justify PRA-1: Source-of-truth review needed: ci/platform-matrix.json scalar and row type contracts.
Open items: 0 required · 2 warnings · 0 suggestions · 5 test follow-ups
Since last review: 2 prior items resolved · 0 still apply · 1 new item found

Action checklist

  • PRA-1 Resolve or justify: Source-of-truth review needed: ci/platform-matrix.json scalar and row type contracts
  • PRA-2 Resolve or justify: Validate matrix type contracts before rendering in scripts/generate-platform-docs.py:214
  • 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: ci/platform-matrix.json scalar and row type contracts

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 Resolve/justify correctness scripts/generate-platform-docs.py:214 Add explicit type checks in `_validate_matrix()`: require `statuses`, `owners`, and `project_status` to be dicts; require `platforms[*].runtimes` to be a non-empty list of non-empty strings; and keep the existing required-key, status-vocabulary, owner-placeholder, odd-backtick, and escaping checks.
Review findings by urgency: 0 required fixes, 2 items to resolve/justify, 0 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: ci/platform-matrix.json scalar and row type contracts

  • 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: Missing: tests should assert controlled `ValueError` for non-dict `statuses`, non-dict `owners`, non-dict `project_status`, and string-valued `platforms[0].runtimes`.
  • 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: `_validate_matrix()` calls `.keys()`/`.get()` on scalar sections without type checks and `generate_platform_table()` joins `p['runtimes']` without validating list-of-strings shape.

PRA-2 Resolve/justify — Validate matrix type contracts before rendering

  • Location: scripts/generate-platform-docs.py:214
  • Category: correctness
  • Problem: `_validate_matrix()` now requires the generator-backed list sections to exist, but it still assumes several source shapes without checking them. `statuses` is used as a dict via `.keys()` and later `.items()`, `owners` and `project_status` are used as dicts, and `platforms[*].runtimes` is joined as an iterable without confirming it is a list of runtime strings. A malformed matrix can therefore fail with raw `AttributeError`/`KeyError`, or worse, silently render a string runtime like `"Docker"` as `D, o, c, k, e, r`.
  • Impact: The launch-claims source of truth can still produce inconsistent contributor failures or silently publish corrupted support tables from malformed JSON, weakening the controlled validation boundary this PR adds.
  • Recommended action: Add explicit type checks in `_validate_matrix()`: require `statuses`, `owners`, and `project_status` to be dicts; require `platforms[*].runtimes` to be a non-empty list of non-empty strings; and keep the existing required-key, status-vocabulary, owner-placeholder, odd-backtick, and escaping checks.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read `scripts/generate-platform-docs.py` around `_validate_matrix()` and `generate_platform_table()`; confirm malformed `statuses`, `owners`, `project_status`, and `platforms[*].runtimes` are rejected with controlled `ValueError` before any generator indexes or joins them.
  • Missing regression test: Add focused tests where `statuses` is a list, `owners` is a string, `project_status` is a string, and `platforms[0].runtimes` is `"Docker"`; each should assert `_validate_matrix()` raises a controlled `ValueError` naming the invalid section or field.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read `scripts/generate-platform-docs.py` around `_validate_matrix()` and `generate_platform_table()`; confirm malformed `statuses`, `owners`, `project_status`, and `platforms[*].runtimes` are rejected with controlled `ValueError` before any generator indexes or joins them.
  • Evidence: `allowed_statuses = set(matrix.get("statuses", {}).keys())` assumes dict shape; `owners = matrix.get("owners") or {}` then `owners.get("engineering")` assumes dict shape; `project_status = matrix.get("project_status") or {}` then key checks assume dict shape; `runtimes = ", ".join(p["runtimes"])` will silently iterate a string runtime.

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

  • None.
Simplification opportunities: 1 possible cut

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

  • PRA-2 shrink (scripts/generate-platform-docs.py:214): Hand-maintained top-level generator schema assumptions spread between `TABLES`, `GENERATOR_MATRIX_KEY`, and `_validate_matrix().sections`.
    • Replacement: Derive the required generator matrix keys from `TABLES` plus `GENERATOR_MATRIX_KEY`, then layer the explicit per-section row type/required-key checks on top.
    • Safety boundary: Do not remove the validation boundaries added by this PR: required row keys, status vocabulary checks, placeholder owner rejection, odd-backtick rejection, and MDX/table escaping.
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 — `_validate_matrix()` rejects `platforms[0].runtimes: "Docker"` with a controlled `ValueError` instead of rendering `D, o, c, k, e, r`.. The PR has strong focused unit/contract coverage for generator escaping, vocabulary, ownership, missing sections, nav registration, and citation existence. Additional runtime/source-boundary validation is still recommended for malformed type shapes and check-mode drift behavior because this generator now defines the launch-claims source-of-truth boundary.
  • PRA-T2 Runtime validation — `_validate_matrix()` rejects non-dict `statuses`, `owners`, and `project_status` with controlled `ValueError` messages naming the invalid top-level section.. The PR has strong focused unit/contract coverage for generator escaping, vocabulary, ownership, missing sections, nav registration, and citation existence. Additional runtime/source-boundary validation is still recommended for malformed type shapes and check-mode drift behavior because this generator now defines the launch-claims source-of-truth boundary.
  • PRA-T3 Runtime validation — `_validate_matrix()` rejects odd backticks in a `notes` field with the documented controlled `ValueError`.. The PR has strong focused unit/contract coverage for generator escaping, vocabulary, ownership, missing sections, nav registration, and citation existence. Additional runtime/source-boundary validation is still recommended for malformed type shapes and check-mode drift behavior because this generator now defines the launch-claims source-of-truth boundary.
  • PRA-T4 Runtime validation — `python3 scripts/generate-platform-docs.py --check` detects drift in `docs/reference/platform-support.mdx`, exits non-zero, and does not write the file.. The PR has strong focused unit/contract coverage for generator escaping, vocabulary, ownership, missing sections, nav registration, and citation existence. Additional runtime/source-boundary validation is still recommended for malformed type shapes and check-mode drift behavior because this generator now defines the launch-claims source-of-truth boundary.
  • PRA-T5 ci/platform-matrix.json scalar and row type contracts — Missing: tests should assert controlled `ValueError` for non-dict `statuses`, non-dict `owners`, non-dict `project_status`, and string-valued `platforms[0].runtimes`.. `_validate_matrix()` calls `.keys()`/`.get()` on scalar sections without type checks and `generate_platform_table()` joins `p['runtimes']` without validating list-of-strings shape.
Since last review details

Current findings, using the urgency labels above:

PRA-1 Resolve/justify — Source-of-truth review needed: ci/platform-matrix.json scalar and row type contracts

  • 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: Missing: tests should assert controlled `ValueError` for non-dict `statuses`, non-dict `owners`, non-dict `project_status`, and string-valued `platforms[0].runtimes`.
  • 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: `_validate_matrix()` calls `.keys()`/`.get()` on scalar sections without type checks and `generate_platform_table()` joins `p['runtimes']` without validating list-of-strings shape.

PRA-2 Resolve/justify — Validate matrix type contracts before rendering

  • Location: scripts/generate-platform-docs.py:214
  • Category: correctness
  • Problem: `_validate_matrix()` now requires the generator-backed list sections to exist, but it still assumes several source shapes without checking them. `statuses` is used as a dict via `.keys()` and later `.items()`, `owners` and `project_status` are used as dicts, and `platforms[*].runtimes` is joined as an iterable without confirming it is a list of runtime strings. A malformed matrix can therefore fail with raw `AttributeError`/`KeyError`, or worse, silently render a string runtime like `"Docker"` as `D, o, c, k, e, r`.
  • Impact: The launch-claims source of truth can still produce inconsistent contributor failures or silently publish corrupted support tables from malformed JSON, weakening the controlled validation boundary this PR adds.
  • Recommended action: Add explicit type checks in `_validate_matrix()`: require `statuses`, `owners`, and `project_status` to be dicts; require `platforms[*].runtimes` to be a non-empty list of non-empty strings; and keep the existing required-key, status-vocabulary, owner-placeholder, odd-backtick, and escaping checks.
  • Expected follow-up: Resolve in this PR or explain why the risk is acceptable.
  • Verification: Read `scripts/generate-platform-docs.py` around `_validate_matrix()` and `generate_platform_table()`; confirm malformed `statuses`, `owners`, `project_status`, and `platforms[*].runtimes` are rejected with controlled `ValueError` before any generator indexes or joins them.
  • Missing regression test: Add focused tests where `statuses` is a list, `owners` is a string, `project_status` is a string, and `platforms[0].runtimes` is `"Docker"`; each should assert `_validate_matrix()` raises a controlled `ValueError` naming the invalid section or field.
  • Done when: The risk is fixed or explicitly justified in the PR. Verification: Read `scripts/generate-platform-docs.py` around `_validate_matrix()` and `generate_platform_table()`; confirm malformed `statuses`, `owners`, `project_status`, and `platforms[*].runtimes` are rejected with controlled `ValueError` before any generator indexes or joins them.
  • Evidence: `allowed_statuses = set(matrix.get("statuses", {}).keys())` assumes dict shape; `owners = matrix.get("owners") or {}` then `owners.get("engineering")` assumes dict shape; `project_status = matrix.get("project_status") or {}` then key checks assume dict shape; `runtimes = ", ".join(p["runtimes"])` will silently iterate a string runtime.

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (4)
test/generate-platform-docs.test.ts (2)

255-291: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Align the test name with the files it actually scans.

The assertion says "matrix, docs, and generated skills," but docTargets only includes two docs pages and never inspects generated skills artifacts. That gives broader coverage than the test really has. Either extend the scan to the generated skills output or rename the test to match its current scope.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/generate-platform-docs.test.ts` around lines 255 - 291, The test name
overstates its coverage because the current scan in the `every --agent <id>
example...` test only reads the matrix and the two doc pages listed in
`docTargets`, not generated skills artifacts. Either update the test logic to
actually inspect the generated skills output as well, or rename the test
description/assertion to reflect the real inputs it checks so the scope matches
the implementation.

196-236: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Exercise the real --check path here.

This test never invokes the generator's CLI or main() wiring; it imports the module and calls _validate_matrix directly. A regression in argument parsing, fail-fast stderr handling, or exit-code plumbing would still pass this test. Please run the real python3 ... generate-platform-docs.py --check ... path instead of reimplementing it inline.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/generate-platform-docs.test.ts` around lines 196 - 236, The test is
bypassing the generator’s actual CLI flow by importing the module and calling
_validate_matrix directly, so it won’t catch regressions in main(), argument
parsing, stderr handling, or exit codes. Update the test to invoke the real
generate-platform-docs.py --check path through spawnSync, using the existing
SCRIPT_PATH and temporary matrix fixture, and assert on the CLI result rather
than the inline Python wrapper; keep the validation expectation tied to the
placeholder owner case in _validate_matrix.
docs/reference/platform-support.mdx (2)

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

Use the shared CLI placeholder on Line 173.

nemoclaw <name> connect is a cross-agent command example, so hard-coding the alias here breaks the build-time rewrite used elsewhere on this page. As per path instructions, "when a docs PR adds a command-line example that works across all NemoClaw agent aliases ... use $$nemoclaw instead."

🤖 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 `@docs/reference/platform-support.mdx` at line 173, The `nemoclaw <name>
connect` example in the platform support docs should use the shared CLI
placeholder instead of a hard-coded alias so the build-time rewrite can work
across agent names. Update the command example in the docs reference content to
use the shared placeholder consistently with the other cross-agent examples on
this page, and keep the surrounding text unchanged.

Source: Path instructions


182-187: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a Next Steps section at the bottom of this new page.

The page currently ends with update instructions, but the docs path instructions for new pages call for a bottom Next Steps section that links to related pages.

🤖 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 `@docs/reference/platform-support.mdx` around lines 182 - 187, Add a
bottom-of-page Next Steps section to the platform-support docs page, since this
new page currently ends with the Updating the matrix instructions and is missing
the standard related-links footer. Update the mdx content in the
platform-support page to include a clearly labeled Next Steps section with links
to the relevant follow-up docs, keeping it consistent with the existing docs
page structure and navigation style.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/inference/inference-options.mdx`:
- Around line 46-54: The “Provider Options” copy conflicts with the newly
caveated status table for the OpenAI-compatible and Anthropic-compatible rows.
Update the wording in the provider section so it matches the validated adapters
only, using the same symbols and terminology as the table entries for
OpenRouter, AWS Bedrock, OpenAI-compatible, and Anthropic-compatible endpoints.
Remove or soften any “any compatible proxy/server” language so the page makes
one consistent claim across both sections.

In `@scripts/generate-platform-docs.py`:
- Around line 181-237: _validate_matrix() currently skips validating the
project_status object, so generate_project_status_block() can still crash later
with a raw KeyError when stage, label, since, or notes are missing. Add a
required-key check for the project_status entry inside _validate_matrix(), using
the same fail-fast pattern as the other sections, so malformed data is rejected
with a controlled ValueError before rendering.
- Around line 159-178: The _escape_cell helper is escaping angle brackets inside
inline code spans, which changes literal command placeholders in generated docs.
Update _escape_cell in generate-platform-docs.py to preserve text wrapped in
backticks while still escaping structural Markdown/MDX hazards in the rest of
the cell. Keep the logic localized to _escape_cell so table cells render safely
without altering inline code content.

---

Nitpick comments:
In `@docs/reference/platform-support.mdx`:
- Line 173: The `nemoclaw <name> connect` example in the platform support docs
should use the shared CLI placeholder instead of a hard-coded alias so the
build-time rewrite can work across agent names. Update the command example in
the docs reference content to use the shared placeholder consistently with the
other cross-agent examples on this page, and keep the surrounding text
unchanged.
- Around line 182-187: Add a bottom-of-page Next Steps section to the
platform-support docs page, since this new page currently ends with the Updating
the matrix instructions and is missing the standard related-links footer. Update
the mdx content in the platform-support page to include a clearly labeled Next
Steps section with links to the relevant follow-up docs, keeping it consistent
with the existing docs page structure and navigation style.

In `@test/generate-platform-docs.test.ts`:
- Around line 255-291: The test name overstates its coverage because the current
scan in the `every --agent <id> example...` test only reads the matrix and the
two doc pages listed in `docTargets`, not generated skills artifacts. Either
update the test logic to actually inspect the generated skills output as well,
or rename the test description/assertion to reflect the real inputs it checks so
the scope matches the implementation.
- Around line 196-236: The test is bypassing the generator’s actual CLI flow by
importing the module and calling _validate_matrix directly, so it won’t catch
regressions in main(), argument parsing, stderr handling, or exit codes. Update
the test to invoke the real generate-platform-docs.py --check path through
spawnSync, using the existing SCRIPT_PATH and temporary matrix fixture, and
assert on the CLI result rather than the inline Python wrapper; keep the
validation expectation tied to the placeholder owner case in _validate_matrix.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: e961c8cc-6a03-49c4-9a16-c3ae21c4b759

📥 Commits

Reviewing files that changed from the base of the PR and between 6fb9754 and 6094218.

📒 Files selected for processing (6)
  • ci/platform-matrix.json
  • docs/get-started/prerequisites.mdx
  • docs/inference/inference-options.mdx
  • docs/reference/platform-support.mdx
  • scripts/generate-platform-docs.py
  • test/generate-platform-docs.test.ts

Comment thread docs/inference/inference-options.mdx Outdated
Comment thread scripts/generate-platform-docs.py Outdated
Comment thread scripts/generate-platform-docs.py
Four targeted fixes.

- CodeRabbit (inference-options.mdx). The status table now scopes the
  "Other OpenAI-compatible endpoint" and "Other Anthropic-compatible
  endpoint" rows to the validated adapter (OpenRouter, AWS Bedrock).
  The Provider Options section below still said the routes "work with
  any compatible proxy," so the page shipped two different launch
  claims after this PR narrowed the status table. Update the option
  rows to mirror the matrix narrative.
- CodeRabbit (generate-platform-docs.py _escape_cell). Encoding `<`,
  `>`, `{`, and `}` globally also rewrote content inside backtick
  inline-code spans, so generated rows like
  `$$nemoclaw <name> policy-add` rendered as
  `$$nemoclaw &lt;name&gt; policy-add` in docs/reference/platform-support.mdx.
  Split each cell on backticks and encode only the outside segments;
  MDX treats backtick spans as literal so encoding there is both
  unnecessary and corrupting.
- CodeRabbit (generate-platform-docs.py _validate_matrix).
  `generate_project_status_block` subscripts `stage`, `label`, `since`,
  and `notes` from `project_status`, but the validator never checked
  that object. Add the same required-key check applied to the agent
  sections so a typo at the source fails fast with a ValueError
  instead of a raw KeyError at render time.
- PR Review Advisor (pre-commit sync contract). The
  platform-matrix-sync hook only triggered on edits to
  `prerequisites.mdx`/`inference-options.mdx`/the matrix/the script,
  and only `git add`-ed the two partial-table docs. Add
  `docs/reference/platform-support.mdx` to both the trigger pattern
  and the staged file list so an edit to the canonical page also
  fires the regenerator and so the hook stages the regenerated
  output when the matrix or generator changes.

Regen output verified: code-span content inside backticks is now
preserved literally; `--check` is clean; all 13 generator tests
pass.

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
docs/inference/inference-options.mdx (1)

69-71: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use active voice for adapter-validation statements.

Line 69 and Line 71 use passive phrasing (“is validated ...”). Please rewrite these claims in active voice to match docs style requirements.
As per coding guidelines, “Use active voice, second person, present tense, and direct language in documentation.” As per path instructions, “Active voice required. Flag passive constructions.”

🤖 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 `@docs/inference/inference-options.mdx` around lines 69 - 71, The
adapter-validation sentences in the “Other OpenAI-compatible endpoint” and
“Other Anthropic-compatible endpoint” rows use passive voice; rewrite those
descriptions in active voice to match the docs style. Update the wording in the
table entries so the subject is explicit and the phrasing is direct, keeping the
references to OpenRouter, AWS Bedrock, and the respective adapter behavior while
removing “is validated” style constructions.

Sources: Coding guidelines, Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@docs/inference/inference-options.mdx`:
- Around line 69-71: The adapter-validation sentences in the “Other
OpenAI-compatible endpoint” and “Other Anthropic-compatible endpoint” rows use
passive voice; rewrite those descriptions in active voice to match the docs
style. Update the wording in the table entries so the subject is explicit and
the phrasing is direct, keeping the references to OpenRouter, AWS Bedrock, and
the respective adapter behavior while removing “is validated” style
constructions.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 19c0b181-79ab-4053-bf84-b5edc018aa9f

📥 Commits

Reviewing files that changed from the base of the PR and between 6094218 and c82b360.

📒 Files selected for processing (4)
  • .pre-commit-config.yaml
  • docs/inference/inference-options.mdx
  • docs/reference/platform-support.mdx
  • scripts/generate-platform-docs.py
✅ Files skipped from review due to trivial changes (1)
  • docs/reference/platform-support.mdx
🚧 Files skipped from review as they are similar to previous changes (1)
  • scripts/generate-platform-docs.py

cjagwani added 2 commits June 23, 2026 23:03
Advisor PRA-3 on the prior push: the new project_status validation
added to _validate_matrix made the existing "accepts a real
engineering owner alias" test fail because its minimal matrix
omits project_status. Update that fixture to include a complete
project_status block and add a sibling test that asserts the
validator rejects an incomplete project_status with the documented
error message and the missing keys named in the failure.

PRA-5 contract: add a test that pins the platform-matrix-sync hook
against every docs/ target the generator can emit. The test walks
the generator source for REPO_ROOT path joins under docs/, builds
the set of emitted output paths, and asserts the hook section in
.pre-commit-config.yaml stages each one. Catches the regression
class where a new sentinel lands in the generator but the hook is
not updated, leaving the canonical page silently out of sync.

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Three concrete fixes from the latest advisor pass.

- PRA-4 unmatched backticks. The cell escaper split on backticks and
  encoded only the outside segments, but an odd backtick count is
  ambiguous and would skip encoding for the trailing segment. Reject
  odd backtick counts in notes at validation time, and have the
  escaper encode every segment when the count is uneven so the
  rendered cell still escapes its MDX hazards even if validation is
  bypassed in some downstream caller.
- PRA-5 status vocabulary duplication. The Status vocabulary table
  in docs/reference/platform-support.mdx duplicated the matrix
  statuses dict, and the wording in the JSON had drifted from the
  doc prose. Add a status-vocabulary sentinel block and a
  generate_status_vocabulary_table renderer; align the matrix
  statuses entries with the doc's nuance so the regenerated table
  matches. Single source of truth restored.
- PRA-6 hook contract coverage. The previous contract test asserted
  the hook's git-add list covers every docs/ target the generator
  emits, but did not check the `files:` trigger pattern. Extend the
  test to also assert each target appears in the regex-escaped form
  inside the trigger pattern, so editing the canonical page alone
  still fires the regenerator.

Generator output unchanged for existing tables; status vocabulary
now renders from JSON. 15/15 tests pass; --check clean.

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Comment thread test/generate-platform-docs.test.ts Fixed
Advisor flagged on #5712 that docs/reference/platform-support.mdx was added but never registered with the Fern navigation, so the canonical page would not appear in the published docs site. Add a 'Platform Support' entry to the Reference section of both agent navigation trees in docs/index.yml. The page is agent-neutral, so both variants link to the same file at reference/platform-support.mdx; no agent-variants build step is needed.

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

Copy link
Copy Markdown
Contributor

cjagwani added 4 commits June 23, 2026 23:25
… (PRA-2)

Advisor PRA-2 on #5712: the nav registration in docs/index.yml is now correct, but no test pins it. Add a contract test that walks every Reference section in docs/index.yml and asserts each one registers reference/platform-support.mdx. Catches the regression class where a future docs refactor drops the nav entry while leaving the source file in place.

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Advisor flagged that the doc claimed a pre-commit '--check' hook would block CI on drift, but the existing platform-matrix-sync hook actually regenerates and git-adds the rendered tables (sync-on-commit, not check-and-fail). Rewrite both mentions to describe the real behaviour: the hook runs the generator and stages the regenerated docs, and '--check' is the locally-runnable verification mode for callers that want to confirm sync without writing.

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
…ce (PRA-1)

The OpenAI-compatible row cited src/lib/onboard.ts:3673 as the OpenRouter validation point, but that line is the onboarding prompt example ('OpenAI-compatible base URL e.g. https://openrouter.ai'), not validation evidence.

Cite src/lib/inference/config.test.ts:119 instead, which exercises getProviderSelectionConfig('compatible-endpoint', 'openrouter/auto') with the expected provider routing. Keep the onboarding prompt reference but mark it as the prompt example, not the validation source.

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

CodeQL flagged the trigger-escape helper as incomplete: target.replace(/\./g, '\\.') does not escape literal backslashes in the input. Repo-relative Unix paths can't contain backslashes today, but the helper is still technically wrong and the SAST alert stays open.

Add a preceding backslash escape so the helper is correct for any input. No behavioral change for the existing targets, and the unresolved github-advanced-security thread on this line clears.

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

cjagwani commented Jun 24, 2026

Copy link
Copy Markdown
Collaborator Author

Hey @cv, #5712 is the fresh follow-up. Per the advisor warnings, both are asking us to add stricter per-field type checks to the matrix validator (enforce that ci_tested is a bool and runtimes is a list of strings). I think the cleaner way to do that is a JSON Schema in a follow-up, not bolted on here. There are 0 required findings, so it's not blocking. The validator already covers the structural stuff that matters for this PR. RFR when free.

@cjagwani
cjagwani requested a review from cv June 24, 2026 07:29
cjagwani added 5 commits June 24, 2026 02:29
The codebase-growth-guardrails check counts new if statements in test files (NemoClaw asserts deterministic test bodies). The hook contract test used 'if (segments[0] !== "docs") continue;' to skip non-docs targets, which tripped the count after the merge with main re-baselined the comparison.

Rewrite the targeting as a fluent Array.filter chain. Same behavior, zero conditionals in the loop body, contract test still asserts every emitted docs/ output is staged by the pre-commit hook.

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
CI's source-shape budget bans tests that grep source files (currently maxSourceShapeCases=0). The hook contract test added for advisor PRA-5 read .pre-commit-config.yaml and the generator source to assert alignment, which trips the budget and fails static-checks.

The hook still functions: edits to the matrix or to docs/reference/platform-support.mdx trigger the regenerator and stage the rendered docs. A future move to behavior-tested validation (e.g. a generator self-check that fails on missing hook coverage) would let us restore drift protection without the source-text pattern.

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Advisor flagged that _validate_matrix iterated matrix.get(section, []) for every generator-backed section, so a future matrix.json that dropped 'agents' or 'capabilities' entirely would silently render empty tables instead of failing the validator. Replace the silent fallback with an explicit presence + list-type check before iteration. Add two regression tests covering the missing-section and wrong-type rejection paths.

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
@cjagwani cjagwani self-assigned this Jun 24, 2026
@cjagwani cjagwani added area: docs Documentation, examples, guides, or docs build v0.0.68 labels Jun 24, 2026
@cjagwani
cjagwani requested a review from jyaunches June 24, 2026 14:24
@cv
cv merged commit 72b6b74 into main Jun 24, 2026
45 checks passed
@cv
cv deleted the feat/4630-platform-support-matrix-v2 branch June 24, 2026 15:37
@miyoungc miyoungc mentioned this pull request Jun 25, 2026
21 tasks
cv pushed a commit that referenced this pull request Jun 25, 2026
<!-- markdownlint-disable MD041 -->
## Summary
Refreshes the v0.0.68 docs with release notes, Microsoft Teams messaging
guidance, and generated support-matrix coverage.
Also corrects the Hermes generated command reference so `sessions
export` examples match Hermes-only behavior while keeping the shared
command heading compatible with CLI parity checks.

## Changes
- #5585 -> `docs/manage-sandboxes/messaging-channels.mdx`,
`docs/reference/platform-support.mdx`: Documents experimental Microsoft
Teams channel setup, Bot Framework credentials, webhook forwarding,
local `MSTEAMS_PORT` conflicts, and the generated integration support
row.
- #5526 -> `docs/reference/commands.mdx`,
`docs/reference/commands-nemohermes.mdx`: Keeps Hermes `sessions export`
examples on the supported single-JSONL export path while preserving the
canonical shared CLI heading.
- #5044 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for installer onboarding failure propagation.
- #5641 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for fresh recovery after pre-sandbox installer interruption.
- #5673 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for explicit deny-all messaging manifests.
- #5743 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for unsupported-agent channel-add rejection.
- #5252 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for Hermes `gateway-token` dashboard guidance.
- #5659 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for local OpenClaw `agent` wrapper help.
- #5661 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for default extra-agent paths.
- #5669 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for Deep Agents Code branding.
- #5672 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for hosted-compatible default model ID preservation.
- #5725 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for Deep Agents Code sandbox liveness.
- #5644 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for DGX Spark managed-vLLM express install defaults.
- #5712 -> `docs/about/release-notes.mdx`,
`docs/reference/platform-support.mdx`: Adds v0.0.68 release-note
coverage for the canonical support matrix and updates the matrix source
with Teams.

## 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 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. -->
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: docs-only release refresh;
no runtime code changed.
- [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 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
- [x] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes
- [ ] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only)
- [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) — `npm
run docs` passed with 0 errors; Fern reported the existing light-mode
accent contrast warning.
- [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)

Additional verification:
- `python3 scripts/generate-platform-docs.py --check` passed.
- `npm run docs:sync-agent-variants` passed.
- `bash test/e2e/e2e-cloud-experimental/check-docs.sh --only-cli`
passed.
- `npm run docs` passed with 0 errors and one Fern theme warning:
light-mode accent contrast ratio is 2.41:1 and should be at least 3:1.
- `npm run build:cli` refreshed local untracked `dist/` artifacts after
rebase; no tracked files changed.
- `npm run typecheck:cli` passed.
- Normal commit and push hooks passed after the local CLI rebuild.

---
<!-- 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: Miyoung Choi <miyoungc@nvidia.com>

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

## Summary by CodeRabbit

* **New Features**
* Added **Microsoft Teams** as an experimental messaging channel,
including manifest-first onboarding, local port routing/conflict
handling, sandbox delivery controls, and policy preset support.

* **Documentation**
* Expanded messaging-channel setup for Teams (prerequisites,
credential/webhook setup, wizard flow, and add/remove commands).
* Updated reference docs for **agent-specific** session export examples
(OpenClaw vs Hermes).
* Refreshed platform support guidance and added the latest release-notes
entry.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@wscurran wscurran added the VDR Linked to VDR finding label Jun 26, 2026
@coderabbitai coderabbitai Bot mentioned this pull request Jun 26, 2026
21 tasks
cv added a commit that referenced this pull request Jun 27, 2026
…5455)

## Summary
`nemoclaw <name> destroy` deleted the sandbox pod but left its
per-sandbox persistent volume intact, so re-onboarding with the same
name resurrected old workspace files (`USER.md`, `SOUL.md`, ...). This
makes destroy actually wipe that persistent state, restoring the
documented "clean workspace on re-onboard" contract.

## Related Issue
Fixes #5449

## Changes
- Add `wipeSandboxState()` in `src/lib/actions/sandbox/destroy.ts`:
while the sandbox is still live (before `openshell sandbox delete`), it
removes the agent-manifest state dirs/files plus discovered multi-agent
`workspace-*` dirs via `openshell sandbox exec -- sh -c 'rm -rf ...'`.
This is the inverse of `backupSandboxState`, so it targets exactly the
set snapshot/backup treat as durable state.
- Call `wipeSandboxState()` from `destroySandbox()` after the
confirmation gate and before the delete.
- Best-effort and non-fatal: a non-live sandbox (e.g. gateway down)
warns and lets destroy proceed, mirroring the existing
`removeShieldsState` pattern from #3114.
- Add `test/destroy-wipe-sandbox-state.test.ts` reproducing the issue:
asserts the wipe targets the `workspace/` dir under the agent config
dir, includes `workspace-*` (#1260), passes `ignoreError`, and never
throws on a failed exec.

### Root cause
`openshell sandbox delete` tears down the pod but the workspace lives in
a k3s local-path PVC keyed by sandbox name (inside the shared
`openshell-cluster-nemoclaw` Docker volume), which `delete` leaves
intact. `openshell sandbox delete --help` exposes no storage-wipe flag,
and the cluster volume is only removed on opt-in gateway teardown
(#2166). Re-onboarding with the same name rebinds the PVC. Same bug
class as #3114.

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

## Verification
- [ ] `npx prek run --all-files` passes
- [ ] `npm test` passes
- [x] Tests added or updated for new or changed behavior
- [x] No secrets, API keys, or credentials committed
- [ ] Docs updated for user-facing behavior changes
- [ ] `make docs` builds without warnings (doc changes only)
- [ ] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

<!-- Verification notes: this branch builds (`npm run build:cli`) and
type-checks (`npm run typecheck:cli`) cleanly; `biome check` is clean on
both changed files; and the destroy suites
(`test/destroy-wipe-sandbox-state.test.ts`,
`test/destroy-cleanup-sandbox-services.test.ts`,
`src/lib/domain/sandbox/destroy.test.ts`) pass deterministically. The
full `npm test` and `npx prek run --all-files` were not run because the
local working tree carries heavy unrelated modifications and the full
suite is flaky in this environment; behavior was verified via the
targeted suites above. No docs change is needed — the fix makes code
match the existing contract in docs/manage-sandboxes/backup-restore.md.
-->

## Advisor state

1 required finding that contradicts the advisor's own original required
PRA-5 from this PR. PRA-5 required the wipe run AFTER
gateway-select-before-delete (the bug we fixed). A later round's PRA-2
asks the wipe defer until after delete proves destroy can complete —
physically impossible because `sandbox delete` unmounts the PVC and the
in-sandbox `rm -rf` can no longer reach it. The code keeps PRA-5's
ordering; the contradiction is named at
`src/lib/actions/sandbox/destroy.ts:386-389`. Plus 3 recurring advisory
warnings (source-of-truth recursion pattern — same plateau as #5712 and
#5819). Justifications in `wipeSandboxState()` docstring.

---
Signed-off-by: jason-ma-nv <jama@nvidia.com>

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

## Release Notes

* **Bug Fixes**
* Improved sandbox destruction to best-effort wipe persisted agent state
before deletion, including the agent manifest state plus `workspace` and
`workspace-*` multi-agent data.
* Added safer cleanup execution: failures are non-blocking, and warnings
are logged (e.g., “Could not wipe workspace state”).
* Strengthened security checks to prevent path escaping when generating
the cleanup command.

* **Tests**
* Expanded regression coverage for correct exec invocation, warning
behavior on failures, and secure `rm -rf` script generation (including
`cd` boundary and traversal/absolute-path protections).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Jason Ma <jama@nvidia.com>
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Co-authored-by: Test User <test@example.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Carlos Villela <cvillela@nvidia.com>
Co-authored-by: cjagwani <cjagwani@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
… (NVIDIA#5712)

## Summary

Adds the canonical launch-claims matrix for NemoClaw at
\`docs/reference/platform-support.mdx\`, driven by
\`ci/platform-matrix.json\` through a hardened generator. Single source
of truth for what NemoClaw supports today.

## Related Issue

Closes NVIDIA#4630. **Supersedes NVIDIA#5345** (closed; that branch carried a heavy
docs-to-skills regen tangle that became untenable after main retired the
docs-to-skills system in NVIDIA#5699).

## Why a new PR

NVIDIA#5345 was open for two weeks while main moved significantly. The most
disruptive change was NVIDIA#5699 (\"retire docs-to-skills\") which deleted
the regeneration tool and the entire user-skill tree this PR's
pre-restart branch was modifying. Reconciling against the new structure
would have required reverting half the PR's value and re-baselining
against current main. Branching fresh off main is the cleaner path.

The audit, evidence, and advisor-loop work from NVIDIA#5345 carries forward
through this PR's content — only the diff history was reset.

## What this lands

- **\`ci/platform-matrix.json\`** — expanded to cover platforms,
providers, agents, integrations, deployment paths, capabilities, and
out-of-scope items. Every status follows the declared vocabulary
(\`Tested\` / \`Tested with limitations\` / \`Experimental\` /
\`Deferred\` / \`Unsupported\` / \`Hermes only\`). Rows carry file:line
evidence citations.
- **\`docs/reference/platform-support.mdx\`** — new canonical page
rendered from the JSON through sentinel-comment regeneration. Includes a
project-status block and an Owners section reflecting the
engineering-owner model (no separate product-owner role today).
- **\`scripts/generate-platform-docs.py\`** — hardened generator:
- \`_validate_matrix\` rejects missing required keys, unknown statuses,
and placeholder owner values (\`TBD\`, \`TODO\`, \`FIXME\`, \`see PR
review\`, empty)
- \`_escape_cell\` escapes pipes, newlines, HTML control characters, and
MDX expression braces in every emitted cell
- Full table generators for agents, capabilities, integrations,
deployment paths, out-of-scope, and the canonical platform/provider
tables; partial views for prerequisites and inference-options
- **\`docs/get-started/prerequisites.mdx\` +
\`docs/inference/inference-options.mdx\`** — partial tables re-rendered
from the JSON so onboarding-time docs use the same vocabulary.
- **\`test/generate-platform-docs.test.ts\`** — regression coverage for
escaping, status vocabulary, placeholder owner rejection,
partial-vs-full deferred filtering, owners-block shape, agent-ID
resolution against installed manifests, out-of-scope LangChain exception
scoping, and file:line citation existence.

## Verification

- \`npx vitest run test/generate-platform-docs.test.ts\` — 13/13 pass
- \`python3 scripts/generate-platform-docs.py --check\` — all files in
sync
- Generator and tests verified against current \`main\` after rebase

## Type of Change

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

## Advisor state

0 required findings. 2 advisory warnings on deeper matrix schema
validation — not pursuing; the right form is a JSON Schema, tracking as
follow-up.

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

* **Documentation**
* Added the “Platform Support and Launch Claims” reference page with a
shared status vocabulary and expanded, JSON-driven launch matrices
(agents, platforms, providers, integrations, deployment paths,
capabilities), including out-of-scope items and caveats/blockers
guidance.
* Refined platform/inference documentation to better reflect validated
adapter paths, API shapes, and supported distro/runtime assumptions
(e.g., Linux|Docker).
* **Tests**
* Expanded generator end-to-end/regression coverage for table escaping,
matrix validation, output variants, and repository consistency checks.
* **Chores**
* Updated the platform-matrix sync pre-commit trigger when the generated
platform-support docs change.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
<!-- markdownlint-disable MD041 -->
## Summary
Refreshes the v0.0.68 docs with release notes, Microsoft Teams messaging
guidance, and generated support-matrix coverage.
Also corrects the Hermes generated command reference so `sessions
export` examples match Hermes-only behavior while keeping the shared
command heading compatible with CLI parity checks.

## Changes
- NVIDIA#5585 -> `docs/manage-sandboxes/messaging-channels.mdx`,
`docs/reference/platform-support.mdx`: Documents experimental Microsoft
Teams channel setup, Bot Framework credentials, webhook forwarding,
local `MSTEAMS_PORT` conflicts, and the generated integration support
row.
- NVIDIA#5526 -> `docs/reference/commands.mdx`,
`docs/reference/commands-nemohermes.mdx`: Keeps Hermes `sessions export`
examples on the supported single-JSONL export path while preserving the
canonical shared CLI heading.
- NVIDIA#5044 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for installer onboarding failure propagation.
- NVIDIA#5641 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for fresh recovery after pre-sandbox installer interruption.
- NVIDIA#5673 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for explicit deny-all messaging manifests.
- NVIDIA#5743 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for unsupported-agent channel-add rejection.
- NVIDIA#5252 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for Hermes `gateway-token` dashboard guidance.
- NVIDIA#5659 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for local OpenClaw `agent` wrapper help.
- NVIDIA#5661 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for default extra-agent paths.
- NVIDIA#5669 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for Deep Agents Code branding.
- NVIDIA#5672 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for hosted-compatible default model ID preservation.
- NVIDIA#5725 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for Deep Agents Code sandbox liveness.
- NVIDIA#5644 -> `docs/about/release-notes.mdx`: Adds v0.0.68 release-note
coverage for DGX Spark managed-vLLM express install defaults.
- NVIDIA#5712 -> `docs/about/release-notes.mdx`,
`docs/reference/platform-support.mdx`: Adds v0.0.68 release-note
coverage for the canonical support matrix and updates the matrix source
with Teams.

## 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 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. -->
- [ ] Tests added or updated for changed behavior
- [ ] Existing tests cover changed behavior — justification:
- [x] Tests not applicable — justification: docs-only release refresh;
no runtime code changed.
- [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 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
- [x] Git hooks passed during commit and push, or `npx prek run
--from-ref main --to-ref HEAD` passes
- [ ] Targeted tests pass for changed behavior
- [ ] Full `npm test` passes (broad runtime changes only)
- [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) — `npm
run docs` passed with 0 errors; Fern reported the existing light-mode
accent contrast warning.
- [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)

Additional verification:
- `python3 scripts/generate-platform-docs.py --check` passed.
- `npm run docs:sync-agent-variants` passed.
- `bash test/e2e/e2e-cloud-experimental/check-docs.sh --only-cli`
passed.
- `npm run docs` passed with 0 errors and one Fern theme warning:
light-mode accent contrast ratio is 2.41:1 and should be at least 3:1.
- `npm run build:cli` refreshed local untracked `dist/` artifacts after
rebase; no tracked files changed.
- `npm run typecheck:cli` passed.
- Normal commit and push hooks passed after the local CLI rebuild.

---
<!-- 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: Miyoung Choi <miyoungc@nvidia.com>

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

## Summary by CodeRabbit

* **New Features**
* Added **Microsoft Teams** as an experimental messaging channel,
including manifest-first onboarding, local port routing/conflict
handling, sandbox delivery controls, and policy preset support.

* **Documentation**
* Expanded messaging-channel setup for Teams (prerequisites,
credential/webhook setup, wizard flow, and add/remove commands).
* Updated reference docs for **agent-specific** session export examples
(OpenClaw vs Hermes).
* Refreshed platform support guidance and added the latest release-notes
entry.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Hadar301 pushed a commit to Hadar301/NemoClaw-OpenShift that referenced this pull request Jul 12, 2026
…5449) (NVIDIA#5455)

## Summary
`nemoclaw <name> destroy` deleted the sandbox pod but left its
per-sandbox persistent volume intact, so re-onboarding with the same
name resurrected old workspace files (`USER.md`, `SOUL.md`, ...). This
makes destroy actually wipe that persistent state, restoring the
documented "clean workspace on re-onboard" contract.

## Related Issue
Fixes NVIDIA#5449

## Changes
- Add `wipeSandboxState()` in `src/lib/actions/sandbox/destroy.ts`:
while the sandbox is still live (before `openshell sandbox delete`), it
removes the agent-manifest state dirs/files plus discovered multi-agent
`workspace-*` dirs via `openshell sandbox exec -- sh -c 'rm -rf ...'`.
This is the inverse of `backupSandboxState`, so it targets exactly the
set snapshot/backup treat as durable state.
- Call `wipeSandboxState()` from `destroySandbox()` after the
confirmation gate and before the delete.
- Best-effort and non-fatal: a non-live sandbox (e.g. gateway down)
warns and lets destroy proceed, mirroring the existing
`removeShieldsState` pattern from NVIDIA#3114.
- Add `test/destroy-wipe-sandbox-state.test.ts` reproducing the issue:
asserts the wipe targets the `workspace/` dir under the agent config
dir, includes `workspace-*` (NVIDIA#1260), passes `ignoreError`, and never
throws on a failed exec.

### Root cause
`openshell sandbox delete` tears down the pod but the workspace lives in
a k3s local-path PVC keyed by sandbox name (inside the shared
`openshell-cluster-nemoclaw` Docker volume), which `delete` leaves
intact. `openshell sandbox delete --help` exposes no storage-wipe flag,
and the cluster volume is only removed on opt-in gateway teardown
(NVIDIA#2166). Re-onboarding with the same name rebinds the PVC. Same bug
class as NVIDIA#3114.

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

## Verification
- [ ] `npx prek run --all-files` passes
- [ ] `npm test` passes
- [x] Tests added or updated for new or changed behavior
- [x] No secrets, API keys, or credentials committed
- [ ] Docs updated for user-facing behavior changes
- [ ] `make docs` builds without warnings (doc changes only)
- [ ] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

<!-- Verification notes: this branch builds (`npm run build:cli`) and
type-checks (`npm run typecheck:cli`) cleanly; `biome check` is clean on
both changed files; and the destroy suites
(`test/destroy-wipe-sandbox-state.test.ts`,
`test/destroy-cleanup-sandbox-services.test.ts`,
`src/lib/domain/sandbox/destroy.test.ts`) pass deterministically. The
full `npm test` and `npx prek run --all-files` were not run because the
local working tree carries heavy unrelated modifications and the full
suite is flaky in this environment; behavior was verified via the
targeted suites above. No docs change is needed — the fix makes code
match the existing contract in docs/manage-sandboxes/backup-restore.md.
-->

## Advisor state

1 required finding that contradicts the advisor's own original required
PRA-5 from this PR. PRA-5 required the wipe run AFTER
gateway-select-before-delete (the bug we fixed). A later round's PRA-2
asks the wipe defer until after delete proves destroy can complete —
physically impossible because `sandbox delete` unmounts the PVC and the
in-sandbox `rm -rf` can no longer reach it. The code keeps PRA-5's
ordering; the contradiction is named at
`src/lib/actions/sandbox/destroy.ts:386-389`. Plus 3 recurring advisory
warnings (source-of-truth recursion pattern — same plateau as NVIDIA#5712 and
NVIDIA#5819). Justifications in `wipeSandboxState()` docstring.

---
Signed-off-by: jason-ma-nv <jama@nvidia.com>

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

## Release Notes

* **Bug Fixes**
* Improved sandbox destruction to best-effort wipe persisted agent state
before deletion, including the agent manifest state plus `workspace` and
`workspace-*` multi-agent data.
* Added safer cleanup execution: failures are non-blocking, and warnings
are logged (e.g., “Could not wipe workspace state”).
* Strengthened security checks to prevent path escaping when generating
the cleanup command.

* **Tests**
* Expanded regression coverage for correct exec invocation, warning
behavior on failures, and secure `rm -rf` script generation (including
`cd` boundary and traversal/absolute-path protections).
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Signed-off-by: Jason Ma <jama@nvidia.com>
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Co-authored-by: Test User <test@example.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Carlos Villela <cvillela@nvidia.com>
Co-authored-by: cjagwani <cjagwani@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: docs Documentation, examples, guides, or docs build VDR Linked to VDR finding

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs(platform): publish launch claims and platform support matrix

5 participants