How an agent reads this manual
01This manual is published for machines as much as for people. An agent can fetch any page as plain text, ask where a rule lives, and load the whole corpus in one file sized to its budget.
The machine files
| Address | What it is | When to read it |
|---|---|---|
https://vibevm.org/doc/llms.txt |
the index: one line per page, the page's first paragraph | first, to choose a page |
https://vibevm.org/doc/<package>/<version>/<page>.md |
one page as plain Markdown, block numbers included | to answer one question |
https://vibevm.org/doc/<package>/<version>/<page>.xml |
the same page in its source form, with every rule address and example intact | to quote a rule or run an example |
https://vibevm.org/doc/llms-small.txt, llms-medium.txt, llms-full.txt |
the corpus in three sizes, stable text first | only when a task spans many pages |
https://vibevm.org/doc/manifest.json |
every page with its language, audiences, status and anchors | to navigate programmatically |
https://vibevm.org/doc/resolve/?uri=spec://… |
the resolver: an address in, the page and block out | when a message or a page cites an address |
https://vibevm.org/doc/ru/… |
the same files for another language | when the user reads that language |
03 publishllms.txt(an index with one-line summaries) andllms-full.txtfor the base corpus, plusllms-small.txtandllms-medium.txtunder a token budget, all derived from the same manifest as the navigation, the full corpus ordered by the layer law (stable before mutable); the same files per language and per package; the registryllms.txtis a catalogue of documentations in the arXiv style — title, officiality star, publisher, language, audiences, abstract, link;
04 serve every page as clean Markdown at the address with the.mdsuffix and as raw XML at the.xmlsuffix;
05The site also serves the page manifest, a JSON list of every page with its statuses, languages, audiences and anchors, at /doc/manifest.json, and resolves a spec:// address at /doc/resolve/?uri=…; <package> is the group and name of the manual, org.vibevm.core/vibevm-docs, and <version> is a number or latest.
06 serve the JSON page manifest with officiality statuses, languages, audiences, genres, anchors and summaries (/doc/manifest.json), a resolver endpoint forspec://addresses (/doc/resolve?uri=…), and optionally an MCP server of the site;
Without a network
07The same pages live in the machine store once vibe cache add org.vibevm.core/vibevm-docs has run. vibe explain "spec://org.vibevm.core/vibevm-docs/<page>#<anchor>" prints a page or a block; vibe doc manifest --llms small prints the page list from the store. Nothing on this path contacts the network, which is why proprietary documentation is read this way.
08 The store is warmed withvibe cache add <coordinate>from a registry, orvibe cache add --offline <coordinate>from a project root whose project-local registry holds the package in-tree; the sources ofvibe-docare the store (lookup,list_all), the lock file (Lockfile::read,slot_abs_path), a registry (resolve_and_fetch) and a checkout (LocalRegistry).
Citing a place
09Every block on a page carries a number, p12 and so on, assigned when the page is built and the same in the web page, the Markdown and the XML. A citation is the page address plus that number: spec://org.vibevm.core/vibevm-docs/model/boot-lane#p7. Headings keep their named anchors as well, and a named anchor never changes once published; a block number names the current text and may shift after an edit, like a line number.
10 Numbered blocks. Every flow block of the pivot — paragraph, list, table, fence, quote,example,rule,note,figure,prompt; a heading keeps its own id and is not numbered (clarified 2026-09-12 at implementation, followingPIPE-NUMBERING) — receives an ordinal number and the idpNNat build time in the Rust pipeline (§10), never by a client script. The number is the block's position in the current text of the page, counted beforewhenfiltering, so thatp12names the same block in the build for any platform and agent and in every translation; gaps in the rendered output are accepted. The number appears in the HTML island, in the.mdand.xmlprojections (as[p12]at the start of the block) and inllms-full.txt, so a human and an agent cite one place. After an edit an old#p12may point at a neighbouring block, as a link to a file line does after an edit; this is accepted and nothing tries to «remember» it. Headings keep their named anchors{#id}above the number; named anchors are immutable and renamed only by tombstone, positionalpNNlive by the current text.
11Rules on a page are quoted from the specification by address and shown in the specification's own language. Prefer the address of the specification over the address of the manual when you tell a user what a rule says; prefer the manual's page when you explain why.
12 Everyruleyields adocumentsedge without a pin: the citation is live, and the page shows the fact's current text by address at every render.vibe doc check --citationschecks one thing — that the anchor exists; a vanished anchor without a tombstone fails the build. There are no revisions, no text hashes and no «the spec moved ahead»: such checks would need a history the project does not keep by design.
The procedure the skill teaches
131. On an error, read the address the message names, then the page the diagnostics page maps it to.
142. On a question, answer from one page: the first paragraph is the plain answer, the rule blocks carry the exact wording.
153. On a task, take the page's request block as your task and substitute the user's names and paths. Run it, then run the asserts. The task is done when every assert exits zero.
164. When choosing among documentations of one package, prefer the one marked official and name the publisher of a community one.
175. Never load the full corpus when one page answers.
18 The audience vocabulary of PROP-043 gainsagent;user,authoranddevstay. Text markedaudience="agent"obeys the laws of agent text: a token budget, no narration, and never in a boot prefix — the site serves it in the «for agents» section and first inllms.txt. Audiences are not declared in the manifest; they are derived from the page markup.
The tools of the server
19vibe mcp serve offers the same operations as tools. explain looks at one node of the map by address; query finds nodes, and the two are separate verbs on purpose. select takes up to seven predicates, uri:, symbol:, kind:, scope:, has:, lacks: and depth:, whitespace separated and joined by AND, with no operators. An unknown predicate, a repeated one or an empty query is an error that names the token and lists what was expected.
20queryfinds nodes;explainlooks at one. Until 2026-08-06 the map could only be asked about a target already known by name, so «which of these exist?» was unanswerable — not in the host, not in any language stack, not in the engine.queryis that question, and the two are deliberately separate verbs rather than one verb with a mode: a point lookup and a set filter render differently, cap differently, and fail differently.
21 Seven predicates, whitespace separated, joined by AND, and no operators at all:uri:,symbol:,kind:(the filter level's own),scope:(prefix of a spec address),has:/lacks:(an edge verb),depth:(0..3). No disjunction, no parentheses, no precedence — each of those is a permanent versioning liability, and a predicate can be added without renumbering a language that has no operator layer to renumber.
22 An unknown predicate, an unknown verb, a repeated predicate, an out-of-range depth or an empty query is an ERROR that names the offending token and lists what was expected — never a silently ignored clause. Same law as the markup's typed fences, for the same reason: a grammar that ignores what it does not understand promises everything and checks nothing, and whoever trusted the promise is the one who finds out. An empty query is refused rather than read as «everything», because that answer already exists one verb away.
23query_package returns the full lock entry of an installed package. read_subskill returns the content of an active subskill wherever it lives, in the project tree or in the machine store. materialise_subskill copies a lazily pulled subskill into the project tree and refuses to overwrite without force; it is the one tool that writes.
24query_package— the full lockfile entry for an installed package (kind, version,content_hash, registry, source,files_written, features, active subskills,describesPURL, language). Read-only.
25read_subskill— the concatenated content of an active subskill's files.eager/lazy-pushsubskills read from the project tree;lazy-pullsubskills read from the package cache (PROP-003 §2.5.0), so the agent gets bytes regardless of delivery mode. Read-only.
26materialise_subskill— copy alazy-pullsubskill's content into the project tree. No-op foreager/lazy-push(already on disk); refuses to overwrite withoutforce. The one writing tool.
27The language packages of the mcp kind bring servers of their own with four tools, tcg_validate, tcg_scope, tcg_complete and tcg_type: thin adapters over the operations of the same names. Each takes a required language, typescript or rust, and the operation's own parameters unchanged. Each answers with the enriched result as structured content plus a short text with the findings first.
28 The tools now ship in the per-languagemcp-kind packages (PROP-027:mcp:org.vibevm.ai-native/rust-ai-native-mcp,…/typescript-ai-native-mcp), each serving its own language over the vendoredmcp-coretransport.
29tcg_validate,tcg_scope,tcg_complete,tcg_type— thin schema adapters over the TCG-PROTOCOL ops of the same names, each with:
30language(required; accepts"typescript"and — since the Rust twin landed, exactly as this clause promised —"rust"; any other value is a ToolError NAMING the supported set, so the next language adds an enum value, not new tools);
31 the op's own params per TCG-PROTOCOL §2 (file,position,content, …), passed through verbatim.
32
Responses return the ENRICHED protocol result (TCG-PROTOCOL §3) as
structuredContent, plus a compact human text rendering (findings
first).
Edge cases and rules
33Text written for agents is never part of a project's boot lane; this manual is fetched when needed, not read at every session start.
34 No documentation page entersSTATIC.xml,INDEX.mdor a boot snippet. Adocpackage has no[boot_snippet]; agent-audience text is never in a boot prefix.
35The boot lane itself is pure file reading: nothing in it executes, and the manual is not on it.
36 Boot remains pure file-reading — the redirect never becomes "runvibe", preserving the zero-dependency cross-agent property ofVIBEVM-SPEC.md§6.1.
37A page that exists in the source language but not in the language you asked for is served in the source language under the address you asked for, with a note; do not treat it as missing.
38 Switching the language keeps the place. The language selector leads to the same page in the other language with the same fragment (#pNNor#id), which the block-for-block mirror of §5 makes possible. When the page does not exist in the chosen language, the site serves the source language under the chosen language's address as a statically materialised fallback (<html lang>of the source,rel=canonicalto the source page,noindex), shows a bilingual notice «this page is only in … so far» once per session, and rewrites internal links so navigation stays in the chosen language. The chosen language is remembered in the cookielangfor 365 days — the same name the landing uses, so the domain root and/doc/remember one choice.