<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">How this manual is maintained</title>
  <status stage="doc" state="work" audience="dev,author"/>
  <p p="1">This manual is a package, and it drifts like any code the day after it ships: the product adds a flag, a reader asks a question no page answers, a paragraph patched five times stops reading well. Nothing stops that on its own, so the manual is kept by a small set of loops with named triggers, a queue that measures the gaps, and a journal that records what each loop found. This page says what the loops are, what runs them, and what you owe when you change the product.</p>
  <fence lang="text" p="2">The maintenance queue by the CURRENT state of the package and the product: obligations nobody tells, citations that no longer resolve, adaptations that do not mirror, pages owed a reading aloud, documentation debt and what the style linter found. It prints the numbers and returns success whatever they say — no technical gate binds a release of the product to its documentation, so this measures rather than stops

Usage: vibe doc todo [OPTIONS]

Options:
      --json
          Produce machine-readable JSON output

      --path &lt;PATH&gt;
          The documentation package. Defaults to the current directory

          [default: .]

      --format &lt;FORMAT&gt;
          How the queue is printed: the week's report for a person, or the month's eight numbers for a machine

          [default: md]
          [possible values: md, json]

      --quiet
          Reduce output to a single summary line (useful in scripts / CI)

      --examples
          Also run every documented example and fold the red ones in. Without it they are not measured, and the queue says so rather than reporting none: the runner builds a sandbox per fixture and costs minutes, which is not what a weekly reading should cost

      --invoked-by &lt;AGENT&gt;
          Identifier of the agent or harness invoking this command. Free-form string; conventional values are `claude-code`, `claude-desktop`, `cursor`, `opencode`, `codex`. When set, the value is stamped onto every JSON envelope vibe emits (`"invoked_by": "&lt;value&gt;"`) so the caller's context is recoverable from logs and machine-readable output. Falls back to the `VIBE_INVOKED_BY` environment variable when the flag is absent; flag wins on conflict. The `vibevm` skill installed by `vibe mcp install --with-skill` instructs each agent to pass this flag automatically

      --agent-mode &lt;MODE&gt;
          PROP-054 `##AGENT-HANDSHAKE`: how this invocation executes `agent` lifecycle contributions. `cli` calls the configured provider and pays for it (the R7.2 behaviour); `agent` never constructs a provider — each selected agent row is PARKED as a Markdown task under `.vibe/agentic/outbox/&lt;run-id&gt;/` for the hosting agent to perform, and the same command resumes the run once the declared outputs exist. The default, `auto`, resolves to `agent` exactly when the resolved `--invoked-by` / `VIBE_INVOKED_BY` value is present (something is hosting this process) and to `cli` otherwise. An explicit `cli`/`agent` always wins over `auto`'s inference

          Possible values:
          - auto:  Infer from the resolved invoked-by value: present → `agent`, absent → `cli`
          - cli:   Always call the configured provider, as R7.2 did
          - agent: Never construct a provider; park each agent row for the hosting agent

          [default: auto]

      --min &lt;PERCENT&gt;
          The bar the coverage and style readings state. It changes what the report says the target is, never whether this command succeeds

          [default: 100]

      --backlog &lt;PATH&gt;
          The debt file to count `docs:` lines in. Defaults to `BACKLOG.md` at the root of the checkout this runs in

      --unattended
          Run unattended — skip every confirmation prompt and refuse to open any interactive wizard. Equivalent to passing `--assume-yes` (`vibe install` / `vibe uninstall`) or `--yes` (`vibe mcp install` / `upgrade` / `uninstall`) to whichever subcommand needs it. Falls back to the `VIBE_UNATTENDED` environment variable (truthy values: `1`, `true`, `yes`, `on` — case-insensitive); flag wins on conflict. Stamps `"unattended": true` on every JSON envelope so log aggregators can tell scripted runs from interactive ones. Designed for first-time-user provisioning, CI, and other fully scripted environments

      --journal &lt;PATH&gt;
          The journal to count entries owing a decision in. Defaults to `JOURNAL.md` in the documentation package

      --offline
          PROP-010 §2.5: forbid network access for the invocation. Under `--offline`, resolution and fetch must be satisfiable entirely from local sources (the cache, `file://` mirrors, the project's own `vibe.lock` + `vibedeps/`); anything not available locally is a hard error with an actionable message — never a silent degrade to a partial result. Falls back to the `VIBE_OFFLINE` environment variable (truthy values: `1`, `true`, `yes`, `on` — case-insensitive), then the user-config `[net].offline` key; the flag wins on conflict. Online remains the default and is unchanged. `vibe install --offline` (PROP-030 §3.1) stays and ORs into the same posture as one more input

      --binary &lt;PATH&gt;
          The `vibe` binary the examples run and the surface is read from. Defaults to the running one

      --sandbox &lt;PATH&gt;
          Where example sandboxes are built

      --timeout &lt;SECONDS&gt;
          Seconds one documented command may take before it is killed

          [default: 300]

  -h, --help
          Print help (see a summary with '-h')</fence>
  <section id="no-lock" title="No lock between the product and the manual">
    <p p="3">The product ships many times a day and merges many pull requests; the manual cannot follow every one of them, and that is accepted. No gate holds a product release for the documentation, and no step of the self-check panel turns red because the product moved ahead of a page. The panel is red only when the manual is broken on the inside: an example whose output changed, a `derived` block that no longer builds, a citation whose [anchor](../glossary/index.xml#anchor) vanished.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#GATE-INTERNAL-RED" p="4"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#MAINT-MANDATE" p="5"/>
    <p p="6">Instead of a lock there is a measure. The queue command prints the gaps as numbers: obligations no page tells, examples that no longer match, citations that do not resolve, pages nobody has read aloud, debt lines, the linter's count. It never fails a build, and it distinguishes «nothing found» from «nobody looked»: a section that did not run prints `null`, not zero.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#TOOL-TODO" p="7"/>
  </section>
  <section id="what-you-owe" title="What you owe when you change the product">
    <p p="8">A change a user can see carries its page in the same commit: a new or changed command or flag, a [manifest](../glossary/index.xml#manifest) or lock-file field, a report format, an error message with an address, a spec [fact](../glossary/index.xml#fact) marked for documentation, a new [specification](../glossary/index.xml#specification). The developer guides already work this way, and the pull-request template keeps the habit with one checkbox: documentation updated, debt recorded, or not needed.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#LOOP-COMMIT" p="9"/>
    <p p="10">When the page cannot come with the commit, the commit brings a debt line instead: a row in the host's `BACKLOG.md` prefixed `docs:`, with a severity and the address of the change. A line without an address is not accepted. The monthly loop drains the list.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#DEBT-LINE" p="11"/>
    <p p="12">Before any edit, look at `git status` and make sure no other session is writing in the same tree. In a tree shared with parallel workers, commit only with explicit paths, so that nobody's staged files travel inside your commit.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#LOOP-COMMIT-FIRST-ACTION" p="13"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#TOOLING-SHARED-TREE" p="14"/>
  </section>
  <section id="the-loops" title="The loops">
    <p p="15">The weekly loop takes under an hour. A cheap model runs the queue and the checks over the whole package and files the report. The maintainer sorts the queue: what takes five minutes is fixed now, at most five edits per loop; what is bigger becomes a debt line; what is disputable becomes a one-line question to the owner. One page is read aloud, the next one along the reading rota, and every stumble becomes an edit or a debt line. A journal entry closes the loop.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#LOOP-WEEKLY" p="16"/>
    <p p="17">The monthly loop takes half a day with the owner: eight metrics with their trend, an audit of the corpus, the debt list drained, the linter's lists fed with the ticks that slipped past it, every journal entry given its decision, three pages read aloud, and a republication under the same number with a dated entry in the changelog, written by hand.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#LOOP-MONTHLY" p="18"/>
    <p p="19">The full reconciliation is a promise the team makes itself, once a quarter and before a major milestone: the manual is checked against the current release binary, every page is reread against the product with the help text and the specification open beside it, [adaptations](../glossary/index.xml#adaptation) are reread against their sources, and the package ships a version that matches the release. Its only gate is its own: zero gaps and no reading date older than the reconciliation.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#LOOP-RECONCILE" p="20"/>
    <p p="21">The version change starts only when the owner bumps the product version. A snapshot of the product's surface is recorded for the new version, the difference between two snapshots names the pages to update with a reason each, and only those pages are touched. Readers see a version number and a changelog, never the diff.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#LOOP-VERSION" p="22"/>
    <p p="23">Until the owner says otherwise, every number this repository publishes stays `1.0.0`, and a change goes out under the same number in place: the site shows the current content of the number, the changelog records what changed by date, and a project that pinned the number keeps the bytes its [lock file](../glossary/index.xml#lock-file) recorded.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-057#VERSION-OVERWRITE-POLICY" p="24"/>
  </section>
  <section id="what-is-kept" title="What the package keeps for this">
    <p p="25">`maintenance/reviews.toml` records when each page was last read aloud and by whom. It is written by hand, holds a date and a reader, and knows nothing about revisions or hashes: the fact it keeps is that somebody sat down with a page on a day. A page without a row has never been read aloud, and the queue says so. The order of the rows is the reading rota.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#TOOL-REVIEWS" p="26"/>
    <p p="27">`JOURNAL.md` is the journal of the loops. An entry is written in the atom where the event happened, never at the end of the week from memory; it names the evidence and the rule it confirms, changes or creates. A rule of the regulation that no entry produced is a hypothesis until a loop confirms it.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#JOURNAL-SAME-ATOM" p="28"/>
    <p p="29">`CHANGELOG.md` says what changed for the reader, by version, in plain text. The checklists under `maintenance/` are the loops as lists: `weekly.md`, `monthly.md`, `release.md`, and after the first reconciliation `reconcile.md`, written from what was lived.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#TOOL-CHECKLISTS" p="30"/>
  </section>
  <section id="changing-the-tools" title="Changing the tools">
    <p p="31">The queue, the checks, the surface snapshots and the generators are code, and the campaign that built them left rules for anyone who changes them. Two of them bite first: never stop a process you did not start, even to free a binary the build needs, and never take before-and-after measurements while another packet regenerates code in the same tree.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#TOOLING-NO-FOREIGN-PROCESS" p="32"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#TOOLING-PAIRED-MEASUREMENTS" p="33"/>
    <p p="34">A step that reads the output of `vibe doc build` runs at least once over the real manual before it is committed, and a number written into a task is a guess until it is measured on the built output. Both rules exist because fixtures were green while the real output lost two projections of three and a policy expected two inline scripts where the output carried forty-seven.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#TOOLING-LIVE-RUN" p="35"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#TOOLING-NUMBERS-ARE-MEASURED" p="36"/>
  </section>
  <section id="edge-cases" title="Edge cases and rules">
    <p p="37">A small edit is one commit with a concrete description; the fifth small edit of a page since it was last read aloud sends the page to the front of the reading rota. A small edit that pulls other pages after it is not small and becomes a debt line with an atom.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#EDIT-ONE-COMMIT" p="38"/>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#EDIT-NOT-SMALL" p="39"/>
    <p p="40">The journal ships with the package. An entry therefore names no private infrastructure, no unconfirmed defect of a neighbouring product and no path of somebody's machine; the same gate that guards the campaign records runs over it.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#JOURNAL-PUBLISHABLE" p="41"/>
    <p p="42">The cadences, who is on duty for the weekly loop, whether small edits ship weekly or monthly, and whether an agent may write a `docs-gap:` line into a project's backlog are the owner's open questions; until his word the loops run as written here and the [skill](../glossary/index.xml#skill) only proposes.</p>
    <rule ref="spec://org.vibevm.core/vibevm/common/PROP-058#SELF-OPEN-CADENCE" p="43"/>
  </section>
</spec>
