Skip to content

docs: replace the compatibility CUDA checker with a generated support matrix - #12215

Merged
dagil-nvidia merged 9 commits into
mainfrom
dagil-nvidia/compatibility-page-cleanup
Aug 1, 2026
Merged

docs: replace the compatibility CUDA checker with a generated support matrix#12215
dagil-nvidia merged 9 commits into
mainfrom
dagil-nvidia/compatibility-page-cleanup

Conversation

@dagil-nvidia

@dagil-nvidia dagil-nvidia commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Overview

The Compatibility page opened with Find a Compatible Release, an interactive picker (RunsWhereWizard) that asked the reader to select a backend and a CUDA driver generation before showing anything. This replaces it with the matrix itself, collapsed in a native Fern <Accordion>.

Two problems motivated the change. The picker gated a plain lookup behind two choices, one of which — your CUDA driver generation — is frequently the thing the reader came to the page to find out. And the complete CUDA-and-driver-by-release table had become unreachable from the sidebar: it survived only in reference/releases-data.mdx (marked hidden: true in index.yml) and in the <llms-only> agent twin, neither of which a browsing reader will find.

What Changed

  • RunsWhereWizard is unmounted from compatibility.mdx, along with its import and the heading and prose that introduced it. The component file is left in placecompatibility.mdx was its only consumer, but deleting it is the author's call, not this PR's.
  • A collapsed <Accordion> takes its slot, under a new ## Release Support Matrix heading, carrying CUDA toolkit and minimum driver per backend for all 60 rows in CUDA_HISTORY.

The Table Cannot Drift

The numbers are generated from docs/fern/components/releases.data.ts, the single source of truth the other reference pages already use. No version data is hand-copied into the MDX, so the matrix regenerates at every release bump like the rest of the reference content.

gen_llms_tables.py previously supported one generated span per page. It now keys spans by marker name, so compatibility.mdx carries a human-visible support-matrix span alongside its existing llms-tables twin. Both call the same cuda_table() renderer. The new span fails closed when its markers are absent rather than appending itself to the end of the file, keeping placement under human control.

Scope

The matrix covers every released line — stable releases and their patches. Platform previews (-dev.N) and model-specific builds are excluded; the CUDA_NOTES bullets beneath the table cover their toolkit support in prose. CUDA_HISTORY carries no preview or model-build rows today, so that filter is currently a no-op, but it is expressed on release kind rather than on the data happening to be clean, so a future preview entry cannot leak in unnoticed.

Note on Duplication

The accordion and the <llms-only> twin now emit the same 60 rows. Keeping both is deliberate. The twin exists precisely because component-rendered output may be dropped from Fern's agent-facing markdown exports, and <Accordion> is a component. The local dev server does not serve the .md export (returns 400), so this could not be verified here, and losing the matrix for agents is a worse failure than repeating it. A comment in the generator records the intent so it is not pruned without checking; the redundancy can be removed once the deployed .md export is confirmed to carry Accordion children.

Verification

  • fern check — 0 errors
  • scripts/check_reference.sh — gates 1-4 pass (agent twins fresh, custom.js parses, no stale matrix links, absolute reference hrefs match the nav)
  • Generator idempotency confirmed with --check
  • Local preview: accordion renders data-state="closed", 60 data rows, both wizard headings gone, and the link out to the machine-readable page resolves

Pre-Existing Failure, Not From This PR

check_reference.sh gate 5 reports two fern docs broken-links errors inside reference/, both from a single dead link definition:

[kv-routing]: ../user-guides/kv-cache-aware-routing.md

That line is byte-identical on main and is untouched by this diff — no user-guides/ directory exists anywhere under docs/fern. main fails this gate today without these changes. Flagging rather than fixing, since the correct target is a guess and the link belongs to a neighbouring section.

Data Accuracy

Spot-checked the matrix against the build system and the pre-refactor authoritative table. No drift found. container/render.py pins cuda_version to 13.0 for vllm, 13.1 for trtllm and 13.0 for sglang, matching the v1.3.0 rows exactly, and every row agrees with the old docs/reference/support-matrix.md including the Experimental notes on the v0.8.x CUDA 13.0 rows.


Open in Devin Review

Summary by CodeRabbit

  • Documentation
    • Replaced the compatibility wizard with a release support matrix.
    • Added an expandable table showing CUDA toolkit and minimum driver requirements by release and backend.
    • Added notes covering patch versions, early-access images, and experimental CUDA 13 image availability.
    • Improved generation of multiple independently updated tables within documentation pages.

@dagil-nvidia
dagil-nvidia requested a review from a team as a code owner July 27, 2026 19:07
@github-actions github-actions Bot added documentation Improvements or additions to documentation docs labels Jul 27, 2026

@devin-ai-integration devin-ai-integration 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.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The generator now supports multiple marked spans per page and produces a released-version CUDA support matrix. The compatibility page replaces its release wizard with a generated accordion containing CUDA, driver, patch-version, and early-access information.

Changes

Compatibility documentation generation

Layer / File(s) Summary
Multi-span page generation
docs/fern/scripts/gen_llms_tables.py
Adds configurable Block definitions, marker-specific matching, replacement or append behavior, and sequential rendering of multiple spans per page.
Support matrix rendering
docs/fern/scripts/gen_llms_tables.py
Filters CUDA history to released stable and patch versions, renders the support matrix, and raises an error when no matching rows exist.
Compatibility page integration
docs/fern/reference/compatibility.mdx
Replaces the compatibility wizard with a generated release support matrix accordion and supporting release notes.

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

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR has solid overview and verification details, but it omits the required 'Where should reviewer start?' and 'Related Issues' sections. Add a 'Where should reviewer start?' section and the required Related Issues block (e.g. Closes #XXXX or the no-issue checkbox).
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately describes the main change: replacing the compatibility CUDA picker with a generated support matrix.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

@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 (2)
docs/fern/scripts/gen_llms_tables.py (2)

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

Consider keyword arguments for Block's boolean fields to avoid the boolean-trap.

Block("support-matrix", render_support_matrix, False, False) and the other Block(...) call sites rely on positional booleans (llms_only, append_if_missing) that are indistinguishable at the call site without checking the class definition. Since Block is a NamedTuple, callers can pass keyword args for clarity.

♻️ Proposed refactor
 PAGES: dict[str, tuple[Block, ...]] = {
     "compatibility.mdx": (
-        Block("support-matrix", render_support_matrix, False, False),
-        Block("llms-tables", render_compatibility, True, True),
+        Block("support-matrix", render_support_matrix, llms_only=False, append_if_missing=False),
+        Block("llms-tables", render_compatibility, llms_only=True, append_if_missing=True),
     ),
     "release-artifacts.mdx": (
-        Block("llms-tables", render_release_artifacts, True, True),
+        Block("llms-tables", render_release_artifacts, llms_only=True, append_if_missing=True),
     ),
     "model-early-access-builds.mdx": (
-        Block("llms-tables", render_model_ea_builds, True, True),
+        Block("llms-tables", render_model_ea_builds, llms_only=True, append_if_missing=True),
     ),
-    "releases-data.mdx": (Block("llms-tables", render_releases_data, False, True),),
+    "releases-data.mdx": (Block("llms-tables", render_releases_data, llms_only=False, append_if_missing=True),),
 }
🤖 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/fern/scripts/gen_llms_tables.py` around lines 955 - 982, Update the
Block constructions in PAGES to pass llms_only and append_if_missing as keyword
arguments rather than positional booleans, preserving each existing value and
renderer.

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

No accompanying test for the newly parameterized critical regex.

block_re is now built from a variable marker name (previously a hard-coded pattern) and is central to correctly locating/replacing generated spans across multiple pages/markers. As per coding guidelines, "Be careful with regex escaping in raw strings... when changing critical regexes, add a one-line test to prove it matches." No test evidence for this regex change is included in this diff.

🤖 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/fern/scripts/gen_llms_tables.py` around lines 991 - 999, Add a focused
one-line test for block_re that verifies a parameterized marker is correctly
matched and escaped when locating a generated span, including the expected
begin/end markers. Keep the test scoped to block_re and preserve its support for
edited note text between the markers.

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/fern/scripts/gen_llms_tables.py`:
- Around line 955-982: Update the Block constructions in PAGES to pass llms_only
and append_if_missing as keyword arguments rather than positional booleans,
preserving each existing value and renderer.
- Around line 991-999: Add a focused one-line test for block_re that verifies a
parameterized marker is correctly matched and escaped when locating a generated
span, including the expected begin/end markers. Keep the test scoped to block_re
and preserve its support for edited note text between the markers.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 78a67533-89e9-4ebc-afdb-478d3ea88c85

📥 Commits

Reviewing files that changed from the base of the PR and between 0fe93a1 and 912dc86.

📒 Files selected for processing (2)
  • docs/fern/reference/compatibility.mdx
  • docs/fern/scripts/gen_llms_tables.py

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 912dc86875

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/fern/scripts/gen_llms_tables.py Outdated
Comment thread docs/fern/pages/reference/general/compatibility.mdx
Comment thread docs/fern/scripts/gen_llms_tables.py Outdated
Comment thread docs/fern/scripts/gen_llms_tables.py Outdated
@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

The Find a Compatible Release picker asked readers to state their backend
and driver generation before showing anything. Replace it with the matrix
itself, collapsed in a native Fern Accordion, so the CUDA toolkit and
minimum driver requirements are scannable across releases in one view.

This also closes a nav gap: the full CUDA-and-driver-by-release table was
reachable only from reference/releases-data.mdx (hidden from the sidebar)
and the llms-only twin, neither of which a browsing reader will find.

gen_llms_tables.py grows support for more than one generated span per
page, keyed by marker name, and emits the accordion from CUDA_HISTORY so
the numbers stay tied to releases.data.ts at every release bump. The new
span fails closed when its markers are absent rather than appending
itself, keeping placement under human control.

Mainline is read as the stable minor lines (v1.3.0 down to v0.7.0);
CUDA_NOTES already records that patch releases inherit the CUDA support
of their base version, so their rows would only restate the mainline row.

RunsWhereWizard.tsx is left in place -- compatibility.mdx was its only
consumer, but deleting the component is the PR author's call.

Signed-off-by: Daniel Gil <dagil@nvidia.com>
Signed-off-by: Dan Gil <dagil@nvidia.com>
The accordion listed only the stable minor lines, on the reasoning that
patch rows restate their base version. That drops real information: a
reader running v1.2.1 had to infer their row from v1.2.0. Cover every
released line instead -- stable releases and their patches -- taking the
matrix from 29 rows to all 60 in CUDA_HISTORY.

Platform previews and model-specific builds stay out. CUDA_HISTORY
carries no rows for them today, so filtering on kind is currently a
no-op, but the filter is expressed on kind rather than on the data
happening to be clean, so a future -dev entry cannot leak in unnoticed.

The accordion and the llms-only twin now emit the same 60 rows. Keeping
both is deliberate: the twin exists because component output may be
dropped from the agent-facing exports, and <Accordion> is a component.
The local dev server does not serve the .md export, so this could not be
verified here; losing the matrix for agents is a worse failure than
repeating it. Comment records the intent so it is not pruned blindly.

Signed-off-by: Daniel Gil <dagil@nvidia.com>
Signed-off-by: Dan Gil <dagil@nvidia.com>
The widened matrix runs 60 rows. In a collapsed accordion a single flat
run pushes its header off screen almost immediately, so the reader loses
track of which column is which. Split it into one captioned table per
minor line (1.3.x down to 0.7.x, largest group 15 rows) inside the same
single <Accordion> -- the header repeats every few rows and there is
still only one panel to open.

Separate tables rather than printing the version once and blanking the
repeats: blank leading cells are ambiguous once the page is flattened
into the agent-facing markdown export.

The agent twin keeps the matrix as one flat table. The human and agent
spans are now genuinely different renderings -- grouped for scanning,
flat for parsing -- so carrying both is justified on the merits rather
than on uncertainty about whether <Accordion> children survive the
export.

Signed-off-by: Dan Gil <dagil@nvidia.com>
[kv-routing] pointed at ../user-guides/kv-cache-aware-routing.md. No
user-guides/ directory exists under docs/fern and no file ever lived at
that path in this repo's history, so the reference resolved nowhere and
failed fern broken-links twice (once per docs variant).

The note it sources -- SGLang multimodal plus KV-aware routing is not
supported -- is mirrored from docs/fern/backends/sglang/README.md, which
compatibility.mdx names as its source for the SGLang matrix. That README
carries the identical note and cites components/router/README.md, whose
multimodal section documents image routing for the TRT-LLM and vLLM
router paths only. Pointing at the same target keeps the two pages
citing one authority instead of diverging.

reference/ broken-link errors go 2 -> 0. One pre-existing error remains
in kubernetes/api-reference.md, untouched here.

Signed-off-by: Dan Gil <dagil@nvidia.com>
@dagil-nvidia
dagil-nvidia force-pushed the dagil-nvidia/compatibility-page-cleanup branch from dac7782 to 99614d7 Compare July 28, 2026 23:21
@dagil-nvidia

Copy link
Copy Markdown
Collaborator Author

/ok to test 99614d7

One conflict, on the [kv-routing] link definition in compatibility.mdx.
#12243 repointed it at ../kubernetes/kv-aware-routing.md; this branch had
repointed it at ../components/router/README.md. Kept this branch's target:
#12241 introduces a separate [mm-kv-routing] reference for the multimodal
claims and keeps [kv-routing] on the router README, so taking the other
side would re-conflict one PR later. Both targets exist; the link resolves.

Also regenerated releases-data.mdx, which went stale on a dependency bump
(nixl 1.1.0 -> 1.3.1).

check_reference.sh: all 5 gates pass, 0 broken links in reference/.

Signed-off-by: Dan Gil <dagil@nvidia.com>
@dagil-nvidia

Copy link
Copy Markdown
Collaborator Author

/ok to test b5ff7ab

@dagil-nvidia
dagil-nvidia enabled auto-merge (squash) July 29, 2026 20:24
One conflict, in docs/fern/reference/releases-data.mdx. That file is
generated by gen_llms_tables.py, which auto-merged, so the conflict was
resolved by regenerating rather than hand-merging the markers.

gen_llms_tables.py --check is idempotent afterwards, and fern broken-links
reports 0 errors in reference/.

Signed-off-by: Dan Gil <dagil@nvidia.com>
@copy-pr-bot

copy-pr-bot Bot commented Jul 30, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@dagil-nvidia

Copy link
Copy Markdown
Collaborator Author

/ok to test 6d8df6a

Resolve conflicts:
- docs/fern/pages/reference/general/compatibility.mdx: keep main's relocated
  reference paths under developer-guide/knowledge-base and use-cases.
- docs/fern/scripts/gen_llms_tables.py: preserve this PR's Block/support-matrix
  architecture (support-matrix + llms-tables markers) and adopt main's current
  generated filename releases-machine-readable.mdx (was releases-data.mdx).

Regenerate outputs; compatibility.mdx accordion now links to
releases-machine-readable.mdx.

Signed-off-by: Daniel Gil <dagil@nvidia.com>
dagil-nvidia added a commit that referenced this pull request Jul 31, 2026
Propagate #12215's main merge (0a01ca7) into #12223.

Resolve conflict in docs/fern/scripts/gen_llms_tables.py PAGES dict:
- Keep #12215's rename releases-data.mdx -> releases-machine-readable.mdx.
- Preserve #12223's release-stats block, but relocate its page target from
  the legacy release-notes/README.mdx path to the current
  releases/release-history.mdx path so the release-stats:begin/end markers
  in the live Release History page continue to be updated.

Signed-off-by: Daniel Gil <dagil@nvidia.com>
dagil-nvidia added a commit that referenced this pull request Jul 31, 2026
Propagate #12223's updated parent (707fac7, which itself carries #12215's
merge of main and the releases-machine-readable.mdx rename) into #12241.

Resolve conflict in docs/fern/pages/developer-guide/knowledge-base/
modular-components/backends/sglang/overview.md Note 1: keep this PR's
corrected SGLang KV-routing text (hash-forwarding patch on Dynamo's image,
fallback to text-prefix on custom builds) and update its `Source` href to
the current relocated site path use-cases/multimodal-serving/
multimodal-kv-routing.md (matching notes 2/3 already using the relocated
knowledge-base paths). The compatibility.mdx SGLang cell auto-merged with
the same correction; the driver-floor renderer/table and generator tests
carry over untouched at their current paths.

Signed-off-by: Daniel Gil <dagil@nvidia.com>
Signed-off-by: Dan Gil <dagil@nvidia.com>
Signed-off-by: Daniel Gil <dagil@nvidia.com>
@dagil-nvidia

Copy link
Copy Markdown
Collaborator Author

/ok to test 9934563

…ave it

The support-matrix accordion told readers that the notes below it cover the
toolkit support of every platform preview and model-specific build the matrix
excludes. They do not. CUDA_NOTES names v1.1.0-dev.* and
v1.2.0-deepseek-v4-dev.3; RELEASES also carries v1.3.0-dev.1 and
v1.2.0-deepseek-v4-dev.2, and neither has a note or a CUDA_HISTORY row. A
reader on one of those two was sent to information that is not there.

No CUDA version is recorded for either build anywhere in the repo -- not in
releases.data.ts, not in model-early-access-builds, not in the generated
inventory -- so documenting them would mean inventing toolkit requirements
rather than reporting them. The caption is narrowed instead: it now promises
coverage for the builds a note actually names and continues to point at the
machine-readable inventory for the rest. The comment on SUPPORT_MATRIX_KINDS
records which builds are uncovered and why the wording is hedged, so the next
person to add a note knows what the gap is.

Validation: gen_llms_tables.py --check reports all seven outputs unchanged
after regeneration (compatibility.mdx is the only one that moved, by the one
caption sentence). fern check is 0 errors / 1292 warnings, the baseline.
check_reference.sh gates 1, 2, 3 and 5 pass, including fern broken-links at 0
site errors; gate 4 raises StopIteration on main as well, from #12373 removing
the nav variants layer, and is untouched here.

Signed-off-by: Dan Gil <dagil@nvidia.com>
@dagil-nvidia

Copy link
Copy Markdown
Collaborator Author

/ok to test 2f71a70

@dagil-nvidia
dagil-nvidia merged commit 398cdc3 into main Aug 1, 2026
93 of 94 checks passed
@dagil-nvidia
dagil-nvidia deleted the dagil-nvidia/compatibility-page-cleanup branch August 1, 2026 18:38
dagil-nvidia added a commit that referenced this pull request Aug 1, 2026
#12215 merged and its branch was deleted, so this retargeted to main. Four
files conflicted.

gen_llms_tables.py: took main's narrowed accordion caption and
SUPPORT_MATRIX_KINDS comment, both from #12215's own review fix, and kept
this branch's driver-floor work. The PAGES entry now carries driver-floors,
support-matrix and llms-tables; #12529 deletes SUPPORT_MATRIX_KINDS and
released_versions(), which driver_floor_table() and newest_release_per_base()
call, so that sibling conflict must not be resolved by taking the deletion.

compatibility.mdx: kept the generated driver-floors block.

release-history.mdx and releases.data.ts: kept this branch's first-timer
definition -- release-wide, blank rather than undercounted -- which is the
correction the PR exists to make. Main still carried 23 and 12.

Restored pages/use-cases/multimodal-serving/parallel-media-decoding.md, added
on main and dropped by the merge while index.yml still referenced it.

Verified: gen_llms_tables --check 0 stale; 14 tests pass; fern check 0 errors
and 1292 warnings, matching main's baseline. The driver-floor table renders
0.7.0.post1 on the 570 row, release-history shows 24 and a blank v1.1.0, and
the corrected SGLang KV-routing claim has no stale occurrences left.

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

Labels

docs documentation Improvements or additions to documentation size/XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants