nemo-helix
AGENTS.md138 starsChanged 20 days agoApache-2.0View on GitHub
The docs site is built with Fern, not MkDocs/Sphinx. Pages are .mdx under docs/; the Fern config lives in docs/fern/. Read docs/fern/README.md for the full guide — this file is the short version for anyone (human or agent) editing docs. Run these from the repo root (they wrap cd docs/fern && npm run …): Normal authoring and local preview read docs/fern/versions/latest.yml. During production publish, .github/workflows/publish-fern-docs.yaml also runs npm run materialize:versions to discover origin release branches and generate one version per…
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,774 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository18 other files it gives its agents.
- AGENTS.mdAGENTS.md
- web/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- web/CLAUDE.mdCLAUDE.md
- .cursor/rules/dot-files.mdcCursor rule
- .cursor/rules/nemo-helix.mdcCursor rule
- .cursor/rules/uv.mdcCursor rule
- .cursor/rules/writing-docs.mdcCursor rule
- add-studio-feature-flagSkill
- contributor-create-prSkill
- create-release-notesSkill
- data-designer-skill-refreshSkill
- data-designer-version-bumpSkill
- nhx-cliSkill
- release-test-scopeSkill
- studio-devSkill
- nemo-data-designer-pluginSkill
- nemo-evals-pluginSkill
The file
We split this AGENTS.md into the rules it gives an agent
4 rules. About 0 are common, 0 are distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 10
Run these from the repo root (they wrap cd docs/fern && npm run …):
- Very specific: line 29
Use make docs when you are only editing docs/fern/ config.
- Very specific: line 36
Internal links: use canonical nav URLs like /documentation/get-started/core-concepts/workspaces, not relative .md/source paths.
- Very specific: line 50
Use one permanent file per release: docs/about/release-notes/release-<major>-<minor>-<patch>.mdx.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
<!-- SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. --><!-- SPDX-License-Identifier: Apache-2.0 -->Documentation (Fern)
The docs site is built with Fern, not MkDocs/Sphinx. Pages are .mdx under docs/; the Fern config lives in docs/fern/. Read docs/fern/README.md for the full guide — this file is the short version for anyone (human or agent) editing docs.
Build / preview / check
Run these from the repo root (they wrap cd docs/fern && npm run …):
| Command | What it does |
make docs-deps | Install docs tooling (first run on a machine) |
make docs | Local dev server (live preview) |
make docs-watch | Local dev server plus repo-level watcher for docs/** changes outside docs/fern/ |
make docs-check | fern check + MDX validation + NotebookViewer artifact validation + gated-link check (what CI runs) |
make docs-lint-snippets | Check Python syntax across all docs, type-check the curated executable-doc subset, validate Helm YAML and API examples, and run docs-check-base-url |
make docs-lint-helm-snippets | Parse Helm docs YAML, reject duplicate keys, and check chart-value nesting against k8s/helm/values.yaml |
make docs-lint-api-examples | Validate explicit OpenAPI examples against schemas, reject empty required objects that Fern drops, and check bodyless response samples |
make docs-check-base-url | Flag snippets that bypass the CLI context: Python that reads NHX_BASE_URL, or shell that assigns it a literal URL |
make docs-check-python-snippets DOCS_PATH=... | Syntax-check and type-check Python fenced snippets in one doc |
make docs-run-notebook DOCS_PATH=... | Execute the source notebook for one Fern .mdx/.ipynb doc using nemo-nb markers |
make docs-broken-links | Report broken links |
make docs-fix-links | Auto-delink references into gated pages |
Normal authoring and local preview read docs/fern/versions/latest.yml. During production publish, .github/workflows/publish-fern-docs.yaml also runs npm run materialize:versions to discover origin release branches and generate one version per branch from its current docs. Branches without Fern navigation are skipped. A version is marked preview until a stable tag from that same release line is reachable from the branch tip; tags never supply docs content. No release-branch allowlist is needed.
Use make docs when you are only editing docs/fern/ config. Use make docs-watch when you are editing page content elsewhere under docs/, since it restarts the Fern dev server when repo-level docs files change outside docs/fern/.
Rules that bite if you miss them
- Navigation is the build. Fern only builds pages listed in a version nav file. For ordinary docs work, that is
docs/fern/versions/latest.yml. A.mdxnot in the nav is not built (404, not indexed) — that is how unready features are gated. Do not usehidden: truefor gating (it still builds/serves the page). - Publication state is nav-derived. Do not maintain or rely on a hard-coded list of gated directories. Check
docs/fern/versions/latest.yml: listed pages are published in Latest, and omitted pages are gated.docs/fern/gated-nav.ymlcontains reference blocks for some gated features. To publish one: move its block intolatest.yml, re-add inbound links, runmake docs-check && make docs-broken-links. - Don't link into gated pages. A link from a published page into a gated page is a dead link.
make docs-checkfails on it;make docs-fix-linksdelinks it to plain text. (Replaces the old MkDocshide_unready_docsauto-delinking.) - Internal links use canonical nav URLs like
/documentation/get-started/core-concepts/workspaces, not relative.md/source paths.make docs-broken-linksis the check. - Connect through the CLI context, not
NHX_BASE_URL. Build Python clients withNemoClient.from_config()and leaveNHX_BASE_URLunset fornemocommands. Direct-URL tools such ascurlmay default it with${NHX_BASE_URL:-http://localhost:8080}. Mark a deliberate override with{/* @nemo-docs: allow-nhx-base-url */}before the fence.make docs-check-base-urlenforces this; seedocs/cli/connect-to-deployments.mdxfor the user-facing guidance. - No
{{variable}}substitutions. Fern has no substitution step; product names are inlined as literal text. (Prompt-template tokens like`{{input}}`inside backticks are real content — leave them.)
Snippet lint coverage
Python snippets are syntax-checked across all docs; the curated executable-doc subset is also checked with ty. These static checks do not verify notebook execution order, so an import in a later cell can hide an earlier runtime error. Prefer a narrow, explained ty: ignore[unresolved-import] for a tutorial-only dependency over skipping an entire block's type checks.
Helm YAML syntax alone does not catch flattened nesting that still parses. The Helm snippet linter also checks partial overrides against the chart defaults, flags implicit empty values, and allows free-form configuration maps. Use explicit null for intentional deletion of a Helm default. These checks do not validate SCC admission, credentials, filesystem permissions, or whether prose agrees with configuration; those still need review or runtime tests.
API examples live in service route/model definitions, not generated pages. Required object examples must have representative nonempty values: Fern can omit {} fields from its generated snippets even when the schema accepts them. The API example linter validates source examples and checks explicit bodyless-response code samples; it does not replace inspecting a Fern preview of generated language snippets.
Release notes
Use one permanent file per release:
docs/about/release-notes/release-<major>-<minor>-<patch>.mdx. Label its Fern nav
entry with the version (for example v0.8.0) and give it the explicit slug
release-0-8-0. Keep the release index and nav in descending semantic-version
order, including when adding patches for an older release line. Do not overwrite
or archive another version's page when adding a release. This avoids unrelated
release lines sharing a rolling notes file; the index and nav still need normal
merge reconciliation. Link to a version's canonical page, or to the release
index when no specific version is intended.
Generated pages — do not hand-edit
These are generated; edit the source and regenerate:
| Page | Regenerate with |
docs/cli/reference.mdx, docs/fern/snippets/_snippets/cli-summary.mdx | make generate-cli-reference-docs |
docs/set-up/config-reference.mdx | make generate-config-reference-docs |
docs/auth/authorization/permissions-reference.mdx | uv run python services/core/auth/scripts/auth-tools.py generate-docs |
API reference
The REST API reference is rendered natively by Fern from the generated OpenAPI spec. docs/fern/openapi/openapi.yaml is a symlink to the generated repo-root openapi/openapi.yaml. docs/fern/generators.yml must point at that spec, surfaced by the - api: API Reference nav node. No <swagger-ui> embed.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

