openclaw/src/docs
Vincent Koc e427f280d9
docs(nodes): split the nodes overview by reader job (#142779)
* docs(nodes): split the nodes overview by reader job

docs/nodes/index.md was 68,029 bytes, 8,871 words and 35 headings mixing
pairing how-tos, node-host setup, session hosting, command-policy reference and
per-platform allowlists in one page. One H2, "Remote node host (system.run)",
parented 17 H3 sections that were not about system.run, and the page ended with
no next-steps list.

The page already lived in a directory with eleven siblings (audio, camera,
computer-use, images, location-command, media-playback, media-understanding,
presence, talk, troubleshooting, voicewake), so this extends that directory
rather than creating a parallel one. index.md becomes a real index at the same
/nodes route: intro, a "Node pages" list that also names the eleven existing
siblings, and the anchor table below.

Children, one per reader job:

- pairing-and-status.md - approve a node, read status and host stats, upgrade
  a fleet across the N-1 protocol window.
- node-host.md - foreground, service, SSH-tunnel and headless node hosts,
  gateway preconditions, identity state, and the system.* command surface.
- node-exec.md - allowlist commands, point exec at a node, raw node.invoke,
  and exec node binding.
- mcp-and-skills.md - node-hosted MCP servers, node-hosted skills, and local
  Ollama inference.
- session-hosting.md - nodeHost.workerRuns, device placement and capacity,
  and container isolation.
- session-catalogs.md - Codex, Claude, OpenCode and Pi session discovery and
  continuation on paired nodes.
- file-transfers.md - terminal uploads and the File Transfer plugin tools.
- command-policy.md - the platform default allowlists, dangerous-command
  opt-ins, gateway.nodes/tools.exec config, and the permissions map.
- device-commands.md - widget panel, camera, screen recording, location, SMS
  and device data CLI helpers.

Anchor strategy

Per-anchor redirects are not possible: redirectSource() in
scripts/lib/docs-redirects.mjs rejects any source containing [?#]. Every anchor
the old page published is therefore kept alive on the index itself as authored
<a id="..." /> stubs inside a "Where each section moved" list, each pointing at
its new home. Ids were computed with parseDocsDocument, not a slug
approximation, so the thirteen punctuated headings keep both their encoded and
their cleaned id (for example pairing-%2B-status and pairing-+-status). All 48
ids the pre-split page published resolve on the new index; the index publishes
only two ids of its own, node-pages and where-each-section-moved, so no stub
collides with a heading the index still owns. parseDocsDocument reports zero
collisions on the index and on every child.

Losslessness

Reassembling the 35 section bodies reproduces the original body byte for byte,
apart from the two declared link retargets below. Counts, original body vs
children:

- words 8,634 -> 8,634
- characters 66,320 -> 66,358 (+38, the two retargets)
- code fences 29 -> 29, identical fence for fence as a multiset
- markdown links 30 -> 30
- table rows 16 -> 16, all three tables byte-identical
- the per-platform default-allowlist table is byte-identical: 8 rows, with
  iOS 11, watchOS 3, Android 19, macOS 14, Windows 6 and Linux 2 commands

No prose was rewritten. Two intra-page fragment links whose target moved to a
different child, both `](#command-policy)` in device-commands.md, became links
to /nodes/command-policy#command-policy; that is the whole +38 characters.
Sections keep their original relative order within each child, so the five
directional cross-references the page carried ("the environment fallback
above", "see above", "see below", "the static platform-default table above")
all still resolve on their own page.

Also updated: the "Nodes and media" nav group in docs/docs.json, eight in-repo
deep links repointed at the new pages (docs/releases/2026.9.2.md left
untouched, its anchor still resolves through the stubs), fourteen zh-CN
glossary entries for the new titles and index link labels, and
src/docs/config-path-docs.test.ts, which asserts on the `openclaw config`
bracket-path examples that now live in node-exec.md.

Closes audit findings: r3-0443, r3-0445, r3-0447

* docs(nodes): link the relocated device command examples from the exec page

The exec page's "(camera, screen, location, below)" pointed at helpers the
split moved to /nodes/device-commands. Replace the directional word with a
link. Found by ClawSweeper; the orphan-reference scanner's patterns do not
match a bare trailing "below" with no noun phrase in front of it.
2026-09-09 10:44:24 +08:00
..
channel-config-examples.test.ts
clawhub-plugin-docs.test.ts docs(plugins): split the provider plugins SDK reference by reader job (#141958) 2026-09-08 15:23:11 +08:00
cloud-workers-config.test.ts docs(gateway): split the configuration reference by domain (#140440) 2026-09-07 05:18:18 +08:00
config-path-docs.test.ts docs(nodes): split the nodes overview by reader job (#142779) 2026-09-09 10:44:24 +08:00
environment-docs.test.ts docs(gateway): split the security overview by reader job (#141162) 2026-09-08 19:35:27 +00:00
install-cloud-secrets.test.ts
plugin-doc-examples.test.ts
slash-commands-doc.test.ts