Docs research
Two sources, two different questions, not interchangeable.
| Source |
Answers |
Cost and caveat |
the instance's own docs command, through ocexec.py <instance> -- docs "<query>" |
what my runtime thinks — the vocabulary, flags and defaults of the version actually installed |
not free: it loads the config and the plugins, so on a degraded instance it can fail for reasons unrelated to your question. On an old instance the answer is old by exactly the age of that instance |
| the project documentation site |
what is recommended now |
says nothing about whether this instance supports it |
Divergence between them is a finding, not an obstacle. An instance whose own docs describe a flag
the site no longer documents is an instance running behind — record it, do not paper over it.
Which source, when
- "How does this work on my box?" → the box first. Its
--help, its docs command, its config, its
catalogue. The site cannot tell you what this build supports.
- Any recommendation to change something → a live source is mandatory. Memory does not qualify, and
neither does an in-box doc page when the change is "adopt the current recommendation".
- Neither network nor CLI reachable → unverified-knowledge mode: observations yes,
recommendations no. Say what was observed on the host, state that no source could be reached, and
stop. A recommendation with no source is the failure mode this whole skill exists to prevent.
Fetch ladder
Use the first tool actually available in the session; detect availability, never assume it. Whatever
answers, quote the URL in the finding.
- A connected search-and-scrape MCP tool (full-page scrape → markdown, or a schema-driven extract).
- A semantic code-aware search tool, for "find the page that explains X".
- A ranked-search or answer-with-citations tool, for "what is the current recommended way to X".
- A clean-reader tool, for a known URL that other tools rendered empty.
- A library-documentation tool, for the surrounding CLIs — the secret-injection CLI, the model
vendors' CLIs, the container runtime — rather than OpenClaw's own site.
- The built-in web fetch and search, always available, the floor of the ladder.
When a page returns empty, it is usually client-rendered: retry with a longer wait, or move one step
down the ladder. A tool returning nothing is not evidence that the page says nothing.
Documentation map
Entry points; if a path 404s, search within the site rather than guessing a new path.
| Topic |
Where |
| docs home, configuration reference |
https://docs.openclaw.ai/ |
| gateway authentication, providers |
https://docs.openclaw.ai/gateway/authentication |
| OAuth concepts, profiles, PKCE |
https://docs.openclaw.ai/concepts/oauth |
| model providers, refs and runtimes |
https://docs.openclaw.ai/concepts/model-providers |
| CLI backends |
https://docs.openclaw.ai/gateway/cli-backends |
| the models subcommand |
https://docs.openclaw.ai/cli/models |
| memory and embeddings |
https://docs.openclaw.ai/ (search "embeddings", "memory index") |
| skills and plugins loading |
https://docs.openclaw.ai/ (search "skills load", "plugins load paths") |
| health endpoints and monitoring |
https://docs.openclaw.ai/ (search "healthz", "readyz") |
| release channels and upgrades |
https://docs.openclaw.ai/ (search "release channels") |
| releases and changelog |
https://github.com/openclaw/openclaw/releases |
Version truth — three sources, three questions
This is where confident guessing does the most damage, so each fact has exactly one authority.
| Question |
Authority |
Never use |
| what does channel X point at right now? |
the package registry dist-tags |
version ordering over the release list |
| when was that version promoted (the soak clock)? |
the release entry's date for that exact version |
the registry publish date — a build is published to a pre-release tag first and promoted later without a version bump |
| what is actually running? |
the image digest of the running container |
the tag it was pulled by |
Three wrong methods that all look reasonable and all ship regularly:
- Highest non-prerelease version. Correction releases are published as
<version>-1, <version>-2;
a hyphen suffix parses as a pre-release, so a correct semver maximum discards exactly the releases
that fix the one it keeps.
- Newest non-prerelease release entry by date. The trailing channel is also published as a
non-prerelease and lags the main line by about a month. This hands back a month-old fleet-wide
rollback while you believe you are current.
- Comparing publish dates across the two sources. They disagree by weeks, and the disagreement is
the promotion mechanism, not an error.
${CLAUDE_PLUGIN_ROOT}/scripts/versions.py implements all of this, including the soak gate and the
digest comparison. Use it rather than re-deriving; if you must state a version in prose, state it as
the script's output, dated.
Moving tags — the channel-named ones — are rebuilt on a schedule under the same name. Pin a plain
version or a digest for any mutation (gate.is_moving_tag, gate.pin).
Model names
- Zero real model ids in a recommendation position. Not in this repository, not in a skill, not in
a report. Model ids expire, get renamed and change price; a frozen one is a defect with a long fuse.
- Write the shape instead:
<provider>/<model-id>, with the runtime override attached separately.
When a literal is unavoidable in an illustration, it must be visibly fake and inside a comment
marked as example-only.
- Procedure for a real name: read this instance's catalogue —
ocexec.py <instance> --json -- models list — and take the id from there.
- Substitution rule: any model id entering a diff must be an echo from the box — present in
that instance's catalogue. An id that came from memory, from another instance, or from a
documentation page is not an echo (
fleet.config.model-id-unverified).
- Pin ids; do not follow a moving alias. An automatic move to a new model on a production fleet is a
change in price and behaviour with no change in the config.
Common mistakes
- Quoting a flag, a subcommand spelling or a config key from memory because it "has always been that".
Spellings drift between versions, and this fleet spans several.
- Treating the in-box docs command as free. It loads config and plugins; on a broken instance it fails
for its own reasons and the failure gets misread as an answer.
- Resolving "the current version" from the release list because the registry felt like an
implementation detail. It is the only mechanical statement of where a channel points.
- Reporting a recommendation with no URL. A finding outside the runtime's own check contract needs the
citation quoted in the report — no citation, no action.
- Letting a documentation page override an observation. The site describes the current release; the box
describes what is running. When they differ, both go in the report.
1---2name: docs-research3description: Use when anything about OpenClaw is about to be stated or recommended that could have changed — a config key, a CLI flag or subcommand spelling, an auth method, a release channel, a current version, a model name, whether a feature exists or is deprecated — and whenever a claim needs a citation, two sources disagree, an instance's own documentation looks older than the project's, or the situation is offline and it must be decided what may still be said without a live source.4---56# Docs research78Two sources, two different questions, not interchangeable.910| Source | Answers | Cost and caveat |11|---|---|---|12| the instance's own docs command, through `ocexec.py <instance> -- docs "<query>"` | **what my runtime thinks** — the vocabulary, flags and defaults of the version actually installed | not free: it loads the config and the plugins, so on a `degraded` instance it can fail for reasons unrelated to your question. On an old instance the answer is old by exactly the age of that instance |13| the project documentation site | **what is recommended now** | says nothing about whether this instance supports it |1415**Divergence between them is a finding, not an obstacle.** An instance whose own docs describe a flag16the site no longer documents is an instance running behind — record it, do not paper over it.1718## Which source, when1920- **"How does this work on my box?"** → the box first. Its `--help`, its docs command, its config, its21 catalogue. The site cannot tell you what this build supports.22- **Any recommendation to change something** → a live source is mandatory. Memory does not qualify, and23 neither does an in-box doc page when the change is "adopt the current recommendation".24- **Neither network nor CLI reachable** → **unverified-knowledge mode**: observations yes,25 recommendations no. Say what was observed on the host, state that no source could be reached, and26 stop. A recommendation with no source is the failure mode this whole skill exists to prevent.2728## Fetch ladder2930Use the first tool actually available in the session; detect availability, never assume it. Whatever31answers, **quote the URL** in the finding.32331. A connected search-and-scrape MCP tool (full-page scrape → markdown, or a schema-driven extract).342. A semantic code-aware search tool, for "find the page that explains X".353. A ranked-search or answer-with-citations tool, for "what is the current recommended way to X".364. A clean-reader tool, for a known URL that other tools rendered empty.375. A library-documentation tool, for the **surrounding** CLIs — the secret-injection CLI, the model38 vendors' CLIs, the container runtime — rather than OpenClaw's own site.396. The built-in web fetch and search, always available, the floor of the ladder.4041When a page returns empty, it is usually client-rendered: retry with a longer wait, or move one step42down the ladder. A tool returning nothing is not evidence that the page says nothing.4344## Documentation map4546Entry points; if a path 404s, search within the site rather than guessing a new path.4748| Topic | Where |49|---|---|50| docs home, configuration reference | `https://docs.openclaw.ai/` |51| gateway authentication, providers | `https://docs.openclaw.ai/gateway/authentication` |52| OAuth concepts, profiles, PKCE | `https://docs.openclaw.ai/concepts/oauth` |53| model providers, refs and runtimes | `https://docs.openclaw.ai/concepts/model-providers` |54| CLI backends | `https://docs.openclaw.ai/gateway/cli-backends` |55| the models subcommand | `https://docs.openclaw.ai/cli/models` |56| memory and embeddings | `https://docs.openclaw.ai/` (search "embeddings", "memory index") |57| skills and plugins loading | `https://docs.openclaw.ai/` (search "skills load", "plugins load paths") |58| health endpoints and monitoring | `https://docs.openclaw.ai/` (search "healthz", "readyz") |59| release channels and upgrades | `https://docs.openclaw.ai/` (search "release channels") |60| releases and changelog | `https://github.com/openclaw/openclaw/releases` |6162## Version truth — three sources, three questions6364This is where confident guessing does the most damage, so each fact has exactly one authority.6566| Question | Authority | Never use |67|---|---|---|68| what does channel X point at **right now**? | the package registry **dist-tags** | version ordering over the release list |69| when was that version **promoted** (the soak clock)? | the **release entry's date** for that exact version | the registry publish date — a build is published to a pre-release tag first and promoted later **without a version bump** |70| what is **actually running**? | the **image digest** of the running container | the tag it was pulled by |7172Three wrong methods that all look reasonable and all ship regularly:7374- **Highest non-prerelease version.** Correction releases are published as `<version>-1`, `<version>-2`;75 a hyphen suffix parses as a pre-release, so a correct semver maximum discards exactly the releases76 that fix the one it keeps.77- **Newest non-prerelease release entry by date.** The trailing channel is also published as a78 non-prerelease and lags the main line by about a month. This hands back a month-old fleet-wide79 rollback while you believe you are current.80- **Comparing publish dates across the two sources.** They disagree by weeks, and the disagreement is81 the promotion mechanism, not an error.8283`${CLAUDE_PLUGIN_ROOT}/scripts/versions.py` implements all of this, including the soak gate and the84digest comparison. Use it rather than re-deriving; if you must state a version in prose, state it as85the script's output, dated.8687Moving tags — the channel-named ones — are rebuilt on a schedule under the same name. Pin a plain88version or a digest for any mutation (`gate.is_moving_tag`, `gate.pin`).8990## Model names9192- **Zero real model ids in a recommendation position.** Not in this repository, not in a skill, not in93 a report. Model ids expire, get renamed and change price; a frozen one is a defect with a long fuse.94- Write the **shape** instead: `<provider>/<model-id>`, with the runtime override attached separately.95 When a literal is unavoidable in an illustration, it must be visibly fake and inside a comment96 marked as example-only.97- **Procedure for a real name**: read this instance's catalogue — `ocexec.py <instance> --json --98 models list` — and take the id from there.99- **Substitution rule**: any model id entering a diff must be an **echo from the box** — present in100 that instance's catalogue. An id that came from memory, from another instance, or from a101 documentation page is not an echo (`fleet.config.model-id-unverified`).102- Pin ids; do not follow a moving alias. An automatic move to a new model on a production fleet is a103 change in price and behaviour with no change in the config.104105## Common mistakes106107- Quoting a flag, a subcommand spelling or a config key from memory because it "has always been that".108 Spellings drift between versions, and this fleet spans several.109- Treating the in-box docs command as free. It loads config and plugins; on a broken instance it fails110 for its own reasons and the failure gets misread as an answer.111- Resolving "the current version" from the release list because the registry felt like an112 implementation detail. It is the only mechanical statement of where a channel points.113- Reporting a recommendation with no URL. A finding outside the runtime's own check contract needs the114 citation quoted in the report — no citation, no action.115- Letting a documentation page override an observation. The site describes the current release; the box116 describes what is running. When they differ, both go in the report.