docs: replace the compatibility CUDA checker with a generated support matrix - #12215
Conversation
WalkthroughThe 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. ChangesCompatibility documentation generation
Estimated code review effort: 4 (Complex) | ~45 minutes 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (2)
docs/fern/scripts/gen_llms_tables.py (2)
955-982: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueConsider keyword arguments for
Block's boolean fields to avoid the boolean-trap.
Block("support-matrix", render_support_matrix, False, False)and the otherBlock(...)call sites rely on positional booleans (llms_only,append_if_missing) that are indistinguishable at the call site without checking the class definition. SinceBlockis aNamedTuple, 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 winNo accompanying test for the newly parameterized critical regex.
block_reis 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
📒 Files selected for processing (2)
docs/fern/reference/compatibility.mdxdocs/fern/scripts/gen_llms_tables.py
There was a problem hiding this comment.
💡 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".
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>
dac7782 to
99614d7
Compare
|
/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>
|
/ok to test b5ff7ab |
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>
|
/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>
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>
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>
|
/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>
|
/ok to test 2f71a70 |
#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>
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(markedhidden: trueinindex.yml) and in the<llms-only>agent twin, neither of which a browsing reader will find.What Changed
RunsWhereWizardis unmounted fromcompatibility.mdx, along with its import and the heading and prose that introduced it. The component file is left in place —compatibility.mdxwas its only consumer, but deleting it is the author's call, not this PR's.<Accordion>takes its slot, under a new## Release Support Matrixheading, carrying CUDA toolkit and minimum driver per backend for all 60 rows inCUDA_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.pypreviously supported one generated span per page. It now keys spans by marker name, socompatibility.mdxcarries a human-visiblesupport-matrixspan alongside its existingllms-tablestwin. Both call the samecuda_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; theCUDA_NOTESbullets beneath the table cover their toolkit support in prose.CUDA_HISTORYcarries no preview or model-build rows today, so that filter is currently a no-op, but it is expressed on releasekindrather 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.mdexport (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.mdexport is confirmed to carry Accordion children.Verification
fern check— 0 errorsscripts/check_reference.sh— gates 1-4 pass (agent twins fresh,custom.jsparses, no stale matrix links, absolute reference hrefs match the nav)--checkdata-state="closed", 60 data rows, both wizard headings gone, and the link out to the machine-readable page resolvesPre-Existing Failure, Not From This PR
check_reference.shgate 5 reports twofern docs broken-linkserrors insidereference/, both from a single dead link definition:That line is byte-identical on
mainand is untouched by this diff — nouser-guides/directory exists anywhere underdocs/fern.mainfails 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.pypinscuda_versionto13.0for vllm,13.1for trtllm and13.0for sglang, matching the v1.3.0 rows exactly, and every row agrees with the olddocs/reference/support-matrix.mdincluding theExperimentalnotes on the v0.8.x CUDA 13.0 rows.Summary by CodeRabbit