<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">How an agent reads this manual</title>
  <status stage="doc" state="work" audience="agent"/>
  <p p="1">This 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.</p>
  <section id="the-files" title="The machine files">
    <table p="2">
      <tr>
        <td>Address</td>
        <td>What it is</td>
        <td>When to read it</td>
      </tr>
      <tr>
        <td>`https://vibevm.org/doc/llms.txt`</td>
        <td>the index: one line per page, the page's first paragraph</td>
        <td>first, to choose a page</td>
      </tr>
      <tr>
        <td>`https://vibevm.org/doc/&lt;package&gt;/&lt;version&gt;/&lt;page&gt;.md`</td>
        <td>one page as plain Markdown, block numbers included</td>
        <td>to answer one question</td>
      </tr>
      <tr>
        <td>`https://vibevm.org/doc/&lt;package&gt;/&lt;version&gt;/&lt;page&gt;.xml`</td>
        <td>the same page in its source form, with every rule address and example intact</td>
        <td>to quote a rule or run an example</td>
      </tr>
      <tr>
        <td>`https://vibevm.org/doc/llms-small.txt`, `llms-medium.txt`, `llms-full.txt`</td>
        <td>the corpus in three sizes, stable text first</td>
        <td>only when a task spans many pages</td>
      </tr>
      <tr>
        <td>`https://vibevm.org/doc/manifest.json`</td>
        <td>every page with its language, audiences, status and anchors</td>
        <td>to navigate programmatically</td>
      </tr>
      <tr>
        <td>`https://vibevm.org/doc/resolve/?uri=spec://…`</td>
        <td>the resolver: an address in, the page and block out</td>
        <td>when a message or a page cites an address</td>
      </tr>
      <tr>
        <td>`https://vibevm.org/doc/ru/…`</td>
        <td>the same files for another language</td>
        <td>when the user reads that language</td>
      </tr>
    </table>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#SEO-LLMS-FILES" p="3"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#SEO-RAW-PROJECTIONS" p="4"/>
    <p p="5">The 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=…`; `&lt;package&gt;` is the group and name of the manual, `org.vibevm.core/vibevm-docs`, and `&lt;version&gt;` is a number or `latest`.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#SEO-MANIFEST-AND-RESOLVER" p="6"/>
  </section>
  <section id="offline" title="Without a network">
    <p p="7">The same pages live in the machine [store](../glossary/index.xml#store) once `vibe cache add org.vibevm.core/vibevm-docs` has run. `vibe explain "spec://org.vibevm.core/vibevm-docs/&lt;page&gt;#&lt;anchor&gt;"` 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.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#LOCAL-WARMUP" p="8"/>
  </section>
  <section id="citing" title="Citing a place">
    <p p="9">Every 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](../glossary/index.xml#anchor) as well, and a named anchor never changes once published; a [block number](../glossary/index.xml#block-number) names the current text and may shift after an edit, like a line number.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#READER-NUMBERED-BLOCKS" p="10"/>
    <p p="11">Rules on a page are quoted from the [specification](../glossary/index.xml#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.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#OBS-RULE-EDGE-UNPINNED" p="12"/>
  </section>
  <section id="procedure" title="The procedure the skill teaches">
    <p p="13">1. On an error, read the address the message names, then the page the diagnostics page maps it to.</p>
    <p p="14">2. On a question, answer from one page: the first paragraph is the plain answer, the rule blocks carry the exact wording.</p>
    <p p="15">3. 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.</p>
    <p p="16">4. When choosing among documentations of one package, prefer the one marked official and name the publisher of a community one.</p>
    <p p="17">5. Never load the full corpus when one page answers.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#OBS-AUDIENCE-AGENT" p="18"/>
  </section>
  <section id="the-tools" title="The tools of the server">
    <p p="19">`vibe 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.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-015#MAP-QUERY-ANSWERS-A-DIFFERENT-QUESTION" p="20"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-015#SELECT-SEVEN-PREDICATES-JOINED-BY-AND" p="21"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-015#SELECT-AN-UNKNOWN-PREDICATE-IS-AN-ERROR" p="22"/>
    <p p="23">`query_package` returns the full lock entry of an installed package. `read_subskill` returns the content of an active [subskill](../glossary/index.xml#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.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-015#TOOL-QUERY-PACKAGE" p="24"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-015#TOOL-READ-SUBSKILL" p="25"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-015#TOOL-MATERIALISE-SUBSKILL" p="26"/>
    <p p="27">The 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.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-026#TOOLS-NEW-HOME" p="28"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-026#FOUR-TOOLS" p="29"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-026#PARAM-LANGUAGE" p="30"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-026#PARAMS-PASSTHROUGH" p="31"/>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-mcp/PROP-026#ENRICHED-RESPONSES" p="32"/>
  </section>
  <section id="edge-cases" title="Edge cases and rules">
    <p p="33">Text written for agents is never part of a project's [boot lane](../glossary/index.xml#boot-lane); this manual is fetched when needed, not read at every session start.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#INV-DOC-NEVER-BOOTS" p="34"/>
    <p p="35">The boot lane itself is pure file reading: nothing in it executes, and the manual is not on it.</p>
    <rule ref="spec://org.vibevm.core/vibevm/modules/vibe-workspace/PROP-009#PURE-FILE-READING" p="36"/>
    <p p="37">A 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.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#READER-LANGUAGE-SWITCH-KEEPS-PLACE" p="38"/>
  </section>
</spec>
