<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title id="root">PROP-018 — Agentic and standalone modes</title>
  <status stage="impl" state="done" action="continue" comment="C 2026-07-25: the §4 MVP is implemented end to end (23 implements / 8 verifies across 8 sections); §6&apos;s heavier surface stays parked; fact grain 2026-07-24"/>
  <p p="1"><fact id="status-line" status="impl/done">**Status: the §4 MVP is IMPLEMENTED** (specified 2026-06-16 in an
owner-requested design session; verified against the tree 2026-07-25 by the
spec-actualization campaign — `vibe agentic explain`, `vibe command`, the
`[[skill]]` section and the `agentic_explain` MCP tool are all live, with 23
specmap `implements` and 8 `verifies` edges across eight sections). Everything
heavier stays parked in §6 (far backlog). This is the spec home for vibevm's
*product modes* — a cross-cutting concept, distinct from PROP-006's *session*
postures (see §1.3).</fact></p>
  <p p="2"><fact id="related" status="spec/done">**Related:** [PROP-015](../modules/vibe-mcp/PROP-015-mcp-integration.xml)
(the MCP server + agent-integration machinery — the `Agent` enum, the
per-agent config/skill writers, and `vibe mcp install` — that this PROP
reuses and extends), [`VIBEVM-SPEC.md` §3.2](../../VIBEVM-SPEC.md) (the
committed *CLI-first, agent-agnostic* posture and the
deterministic/probabilistic split this PROP formalises into modes),
[`VIBEVM-SPEC.md` §10.4](../../VIBEVM-SPEC.md) (the future `vibe-llm`
provider layer — the standalone built-in inference backend §2.2 names),
[PROP-006](PROP-006-operating-modes.xml) (session operating postures — a
*different* concept, §1.3), [PROP-003 §2.5](../modules/vibe-resolver/PROP-003-dep-evolution.xml)
(subskill *delivery* into the project tree — distinct from agent-skill
*projection*, §2.5), [PROP-017 §8](../modules/vibe-resolver/PROP-017-resolvo-resolver.xml)
(a sibling far-backlog).</fact></p>
  <section id="motivation" title="1. Motivation">
    <section id="problem" title="1.1 The problem">
      <list ordered="false" p="3">
        <item><fact id="commands-split" status="spec/done">vibevm has commands that are pure algorithm (`install`, `check`, `list`)
  and commands that genuinely need reasoning (explain, build, review). The
  algorithmic ones already run from a bare terminal with no LLM
  (`VIBEVM-SPEC.md` §3.2).</fact></item>
        <item><fact id="reasoning-question" status="spec/done">The reasoning ones raise a question of *who does
  the reasoning, and how*.</fact></item>
      </list>
      <list ordered="false" p="4">
        <item><fact id="invoked-by-agent" status="spec/done">vibevm is almost always invoked *by* a coding agent (Claude Code,
  OpenCode, Codex) that already holds a capable LLM, the live context, and
  the tools.</fact></item>
        <item><fact id="executor-vs-author" status="spec/done">For reasoning work in that setting the agent is the right
  **executor** — but vibevm is the right **author** of the task.</fact></item>
        <item><fact id="domain-knowledge" status="spec/done">vibevm carries stable, algorithmic knowledge of its own domain (the
  spec-driven model, the dependency and package rules, the discipline), so an
  instruction it composes is more informative and more trustworthy than one
  the agent would improvise from scratch.</fact></item>
        <item><fact id="roles-named" status="spec/done">This PROP gives the two their natural roles — vibevm composes the
  domain-grounded instruction, the agent carries it out — and names the
  operating contexts so the codebase branches on them cleanly.</fact></item>
        <item><fact id="standalone-aside" status="spec/done">vibevm can also reason with *no* agent present, via a
  built-in `vibe-llm` engine — `VIBEVM-SPEC.md` §10.4, far-backlog §6 — but
  that is standalone mode; it is not what makes agentic mode worthwhile.</fact></item>
      </list>
    </section>
    <section id="axis" title="1.2 The two modes — one axis">
      <p p="5"><fact id="one-axis" status="spec/done">The modes are not two codebases. They are one question: **where does an
operation's reasoning happen?**</fact></p>
      <list ordered="false" p="6">
        <item><fact id="MODE-AGENTIC" status="spec/done">**agentic** — vibevm is driven by a host agent during that agent's own
  work. For a step that needs reasoning, vibevm composes a domain-grounded
  instruction and *delegates it back* to the agent, which executes it on
  its LLM with the live context vibevm lacks. The split is by strength, not
  a workaround: the agent is the better executor in-session, vibevm the
  better author of the instruction. (Pure-algorithm operations still run
  directly — agentic is about the *reasoning* steps.)</fact></item>
        <item><fact id="MODE-STANDALONE" status="spec/done">**standalone** — vibevm stands on its own. Reasoning runs on vibevm's
  *own* backend: algorithmic where the work allows, and — when `vibe-llm`
  lands — a built-in inference engine. Today the standalone backend has no
  LLM, so the only standalone functionality this PROP ships is the
  **non-reasoning** one: projecting skills into agents (§2.6).</fact></item>
      </list>
      <list ordered="false" p="7">
        <item><fact id="UNIFYING-STATEMENT" status="spec/done">The unifying statement (§2.1): **a mode is a choice of inference backend.**
  Non-reasoning operations behave identically in both modes; reasoning
  operations branch on the backend.</fact></item>
        <item><fact id="THE-SEAM" status="spec/done">This is the seam everything else hangs off.</fact></item>
      </list>
    </section>
    <section id="not-prop-006" title="1.3 What this is NOT — PROP-006">
      <list ordered="false" p="8">
        <item><fact id="P006-SESSION-POSTURES" status="spec/done">[PROP-006](PROP-006-operating-modes.xml) defines *session operating
  postures*: codewords ("move fast and break things") that change **how an
  agent behaves within one work session** (whether to pause for
  confirmation, how freely to spend tokens). Those govern the *agent's*
  conduct.</fact></item>
        <item><fact id="P018-INFERENCE-SOURCE" status="spec/done">PROP-018 modes govern **where vibevm gets inference** — a property
  of *vibevm's* execution, orthogonal to any session posture.</fact></item>
        <item><fact id="orthogonal-example" status="spec/done">A session can be in "move fast" posture while vibevm runs in agentic
  mode; the two never collide.</fact></item>
        <item><fact id="NO-OVERLOAD" status="spec/done">Do not overload one onto the other.</fact></item>
      </list>
    </section>
  </section>
  <section id="decisions" title="2. Decisions">
    <section id="mode-is-backend" title="2.1 A mode is a choice of inference backend">
      <p p="9"><fact id="req-mode-backend" status="spec/done">`req r1`</fact></p>
      <list ordered="false" p="10">
        <item><fact id="MODE-INFERRED" status="spec/done" action="continue" actionstage="doc" audience="user,agent">**Decision.** Mode is not a global flag the user sets; it is **inferred per
  operation from how vibevm was reached and what backend is available.**</fact></item>
        <item><fact id="OP-DECLARES" status="spec/done">An operation declares whether it needs inference; if it does, the active
  backend decides the realisation:</fact></item>
      </list>
      <list ordered="false" p="11">
        <item><fact id="REACH-SUBPROCESS" status="spec/done">reached as a **subprocess of an agent** (CLI one-shot or MCP call) →
  the **relay backend** (§2.7): delegate the intent back to that agent.</fact></item>
        <item><fact id="REACH-STANDALONE-ENGINE" status="spec/done">reached **standalone** with a built-in engine available (future) → the
  **built-in backend**: run inference in-process via `vibe-llm`.</fact></item>
        <item><fact id="REACH-STANDALONE-NO-ENGINE" status="spec/done" action="continue" actionstage="doc" audience="user">reached **standalone** with no engine (today) → a reasoning operation
  **fails loud** with "this needs an inference backend; run me under an
  agent, or wait for the built-in engine," and a non-reasoning operation
  runs normally.</fact></item>
        <item><fact id="mode-inferred-why" status="spec/done">**Why:** §1.2 `##UNIFYING-STATEMENT` fixes what a mode is — *"a mode is a choice of inference backend"* — and §2.3 `##AFFINITY-OF-WORK` fixes who chooses: *"Affinity is a property of the work, not a user choice."* Mode-by-inference is that same principle one level up: which backend can serve a call is a fact about the call's reach, not a preference.</fact></item>
        <item><fact id="mode-inferred-rejected" status="spec/done">**Considered and rejected:** **a global mode flag the user sets** (`--mode agentic|standalone` or a `vibe.toml` key) — rejected: a user could then name a backend the operation has no affinity for, which the dispatcher must refuse anyway (`##DISPATCHER-REFUSES`), or name one that does not exist on this machine, which today is every standalone reasoning call (`##REACH-STANDALONE-NO-ENGINE`). The flag would be a way to ask for a refusal.</fact></item>
        <item><fact id="mode-inferred-revisit" status="spec/done">**Revisit when:** `BuiltinBackend` ships over `vibe-llm` (`##FB-BUILTIN-BACKEND`, `VIBEVM-SPEC.md` §10.4) — from that day two backends can both serve one standalone call, and *"what backend is available"* stops determining the answer on its own. Observation point: the far-backlog item closing, i.e. a `vibe-llm` inference path in the workspace. Second clause: a reach appears that the inference cannot classify — a persistent console (`##FB-CONSOLE`) or an invocation through a wrapper that hides the agent parentage — observed as a mis-chosen backend in a bug report.</fact></item>
      </list>
    </section>
    <section id="pluggable-backend" title="2.2 The pluggable inference backend">
      <p p="12"><fact id="req-pluggable" status="spec/done">`req r2`</fact></p>
      <list ordered="false" p="13">
        <item><fact id="BACKEND-TRAIT" status="spec/done">**Decision.** Inference sits behind one trait, `InferenceBackend`, so an
  operation never names a provider.</fact></item>
        <item><fact id="INTENT-CONSTRUCT" status="spec/done">An operation that needs reasoning constructs an `Intent` (a structured
  prompt + the inputs it needs) and hands it to the active backend.</fact></item>
        <item><fact id="two-backends-lead" status="spec/done">Two backends are foreseen:</fact></item>
      </list>
      <list ordered="false" p="14">
        <item><fact id="RELAY-BACKEND" status="spec/done">**`RelayBackend`** (agent mode) — vibevm authors the `Intent` and
  *parks* it for the calling agent to execute, returning "delegated"
  (§2.7). Not a stopgap: in agent mode the agent is the right executor.</fact></item>
        <item><fact id="BUILTIN-BACKEND" status="spec/done">**`BuiltinBackend`** (standalone mode; far backlog §6) — runs the
  `Intent` on `vibe-llm` in-process, for when no agent is present.</fact></item>
      </list>
      <list ordered="false" p="15">
        <item><fact id="NOT-OVERBUILT" status="spec/done">This is deliberately **not** over-built: the trait exists so reasoning
  operations are written once against an abstract backend, and the standalone
  engine slots in later without touching them.</fact></item>
        <item><fact id="SINGLE-HOME-OPS" status="spec/done">Operations with a single
  natural home (skill-install is standalone-only; a "rewrite this spec
  section" op may be agentic-only until the engine exists) simply do not
  offer the other backend (§2.3).</fact></item>
      </list>
    </section>
    <section id="affinity" title="2.3 Per-operation backend affinity">
      <p p="16"><fact id="req-affinity" status="spec/done">`req r2`</fact></p>
      <list ordered="false" p="17">
        <item><fact id="AFFINITY-DECL" status="spec/done">**Decision.** Each operation declares an **affinity**: `agentic-only`,
  `standalone-only`, or `both`.</fact></item>
        <item><fact id="AFFINITY-OF-WORK" status="spec/done">Affinity is a property of the *work*, not a
  user choice — scanning a manifest is `standalone-only` (pure algorithm,
  needs no agent); a free-form "explain this project in prose" is
  `agentic-only` until the built-in engine exists; a task expressible either
  as a deterministic pass or as reasoning is `both`.</fact></item>
        <item><fact id="DISPATCHER-REFUSES" status="spec/done">The dispatcher refuses
  an operation invoked through a backend it has no affinity for, with a
  message naming the right one.</fact></item>
      </list>
    </section>
    <section id="skill-decl" title="2.4 Agent-installable artifacts are declared separately from the package kind">
      <p p="18"><fact id="req-skill-decl" status="spec/done">`req r3`</fact></p>
      <list ordered="false" p="19">
        <item><fact id="SKILL-SECTION-NOT-KIND" status="spec/done" action="continue" actionstage="doc" audience="author">**Decision.** A package declares which of its files are **skills** for
  agents in a dedicated manifest section — **not** by introducing a
  package kind of its own. The kind register (`package_ref.rs`,
  `VIBEVM-SPEC.md` §4.1) stays closed to skills.</fact></item>
        <item><fact id="ANY-KIND-RATIONALE" status="spec/done">**Why:** skills can
  live inside a package of *any* kind and be structured any way. A `tool`
  package `vim` can ship the tool itself **plus** a skill for driving vim
  — one self-contained package, two artefact classes. Kind answers "what
  is this package"; the new section answers "what does it project into an
  agent."</fact></item>
        <item><fact id="MCP-HALF-SUPERSEDED" status="spec/done">This unit's original text sketched MCP servers as a second
  any-kind section; that half is SUPERSEDED — MCP servers became their own
  `mcp` kind with their own laws, owner resolution 2026-07-07:
  [PROP-027](../modules/vibe-mcp/PROP-027-mcp-packages.xml). The skill law
  here is unchanged.</fact></item>
        <item><fact id="skill-decl-rejected" status="spec/done">**Considered and rejected:** **a fifth package kind for skills** — explicitly rejected (`##OOS-FIFTH-KIND`): kind answers *"what is this package"* while the section answers *"what does it project into an agent"*, and skills can live inside a package of any kind (`##ANY-KIND-RATIONALE`). **MCP servers as a second any-kind section** — proposed in this unit's original text and **superseded**: they became their own `mcp` kind with their own laws, owner resolution 2026-07-07 ([PROP-027](../modules/vibe-mcp/PROP-027-mcp-packages.xml), `##MCP-HALF-SUPERSEDED`). The skill law is unchanged; the MCP half is the counter-example that shows where the line falls.</fact></item>
        <item><fact id="skill-decl-revisit" status="spec/done">**Revisit when:** an agent-installable artefact class arrives that needs **its own lifecycle laws** — install / uninstall semantics, resolution or conflict rules of its own — rather than only a projection path. That is exactly the state that fired for MCP servers on 2026-07-07 (`##MCP-HALF-SUPERSEDED`), so the trigger has a worked precedent. Observation point: the kind register in `crates/vibe-core` (`package_ref.rs`) and `VIBEVM-SPEC.md` §4.1 — whose `##INV-VOCABULARY` already anticipates `app`; the register growing is the fired state.</fact></item>
      </list>
      <p p="20"><fact id="SKILL-TABLE-SHAPE" status="spec/done" action="continue" actionstage="doc" audience="author">The MVP section is an array-of-tables, matching the manifest's existing
`[[requires_any]]` / `[[registry]]` / `[[mirror]]` shape:</fact></p>
      <fence lang="toml" p="21">[[skill]]
name        = "vim"                 # becomes the skill dir name in the agent
path        = "skills/vim"          # file or dir (relative to package root) = the skill body
description = "Drive vim from an agent"   # optional; shown in listings
agents      = ["claude", "opencode"]      # optional; default = all skill-supporting agents</fence>
      <p p="22"><fact id="SKILL-EXTERNAL-SHAPE" status="impl/done" action="continue" actionstage="doc" audience="author">A reference-backed bridge MAY select its body from a declared external
source, and any skill MAY add authenticated source resources below a dedicated
subdirectory:</fact></p>
      <fence lang="toml" p="23">[[skill]]
name   = "codebase-design"
source = "upstream"
path   = "skills/engineering/codebase-design"
include = ["SKILL.md", "*.md"]

[[skill.resource]]
embedded_source = "upstream"
path    = "templates"
include = ["*.md"]
target  = "references/upstream"</fence>
      <p p="24"><fact id="SKILL-EXTERNAL-LAWS" status="impl/done" action="continue" actionstage="doc" audience="author">`source` and `embedded_source` name a manifest `[[embedded_source]]`.
Absent `source` retains the package-root meaning. Resource targets are portable
relative paths below `references/`; they cannot replace the local `SKILL.md`,
scripts, or another resource. Include selection, case-fold collision checks and
no-follow traversal apply before any agent directory is changed.</fact></p>
      <p p="25"><fact id="MCP-TABLE-RESERVED" status="spec/done">A sibling `[[mcp]]` table (command / args / target agents) is specified the
same way but is **near-term, not MVP** (§6) — the schema is reserved here so
the vim-style "tool + mcp + skill" package is expressible end to end.</fact></p>
    </section>
    <section id="projection" title="2.5 Skills are an orthogonal projection, not a delivery mode">
      <p p="26"><fact id="req-projection" status="spec/done">`req r3`</fact></p>
      <list ordered="false" p="27">
        <item><fact id="PROJECTION-DEF" status="spec/done" action="continue" actionstage="doc" audience="user,author">**Decision.** Installing a skill into an agent is a **projection**: read the
  declared skill body from the package (in `vibedeps/…` once installed) or an
  external source authenticated by the package's matching lock record, and
  write it into each target agent's skill directory in that agent's own
  convention (`.claude/skills/&lt;name&gt;/…`, `.opencode/skills/&lt;name&gt;/…`,
  `.agents/skills/&lt;name&gt;/…` — the paths PROP-015 §2.6 already resolves).</fact></item>
        <item><fact id="DISTINCT-FROM-DELIVERY" status="spec/done">This
  is distinct from PROP-003 §2.5 subskill *delivery* (which materialises
  content into the **project tree**). Skill projection materialises **out of**
  the workspace, into the **agent**.</fact></item>
        <item><fact id="NO-SHARED-CODE" status="spec/done">The two share no code path beyond the
  `Agent` skill-path resolver.</fact></item>
        <item><fact id="EXTERNAL-PROJECTION-BOUNDARY" status="impl/done">An external tree is projected only through the owning package declaration
  and matching `vibe.lock` pin. A direct path into the machine cache is not a
  package identity or installation surface and cannot bypass package ownership.
  The bridge slot remains the provider root; the external tree is a separately
  named content root carrying its own commit/hash/licence provenance.</fact></item>
      </list>
    </section>
    <section id="vibe-skill" title="2.6 Standalone MVP — `vibe skill install`">
      <p p="28"><fact id="req-vibe-skill" status="spec/done">`req r3`</fact></p>
      <p p="29"><fact id="SKILL-CMD-FAMILY" status="spec/done">**Decision.** A new command family projects package-declared skills into
agents, reusing PROP-015's agent machinery (`Agent` enum, detection, the
idempotent skill writer, the per-(agent, scope) report records):</fact></p>
      <list ordered="false" p="30">
        <item><fact id="CMD-SKILL-LIST" status="spec/done" action="continue" actionstage="doc" audience="user">**`vibe skill list`** — skills declared by installed packages.</fact></item>
        <item><fact id="CMD-SKILL-INSTALL" status="spec/done" action="continue" actionstage="doc" audience="user">**`vibe skill install [--agent …] [--scope project|user|both] [&lt;pkgref&gt;] [&lt;skill&gt;…]`**
  — project skills into agents. **Default: all declared skills**; narrow
  with explicit skill names or a pkgref. Idempotent, `--dry-run`, confirm
  (or `--assume-yes`), per-(agent, scope) report — the same lifecycle and
  merge discipline as `vibe mcp install` (PROP-015 §2.7).</fact></item>
        <item><fact id="CMD-SKILL-UNINSTALL" status="spec/done" action="continue" actionstage="doc" audience="user">**`vibe skill uninstall …`** — the inverse; strips only vibevm-projected
  skills, leaves foreign skill dirs untouched.</fact></item>
      </list>
      <p p="31"><fact id="ONLY-STANDALONE-V1" status="spec/done">This is the **only standalone functionality v1 of this PROP ships.** It
needs no LLM, so it works today, agent-present or not.</fact></p>
    </section>
    <section id="relay" title="2.7 The agentic relay — delegate intent back to the caller">
      <p p="32"><fact id="req-relay" status="spec/done">`req r4`</fact></p>
      <list ordered="false" p="33">
        <item><fact id="RELAY-PARKS" status="spec/done" action="continue" actionstage="doc" audience="user,agent">**Decision.** When a reasoning operation runs under the relay backend, it
  does not act. It writes an `Intent` — a markdown prompt with light
  frontmatter (id, source command, created-at, status) — to a **single-slot
  mailbox**, the project-local `.vibe/agentic/command.md` (§3), and returns a
  pointer telling the caller to drain it.</fact></item>
        <item><fact id="DRAIN-VERB" status="spec/done" action="continue" actionstage="doc" audience="user,agent">The **consumer seam is one
  command**, `vibe command`: it prints the pending `Intent` to stdout and
  clears the slot (consume-on-read; the spent intent is archived to
  `.vibe/agentic/command.done.md`).</fact></item>
        <item><fact id="EMPTY-SLOT-OK" status="spec/done" action="continue" actionstage="doc" audience="agent">Re-running with an empty slot prints "no
  pending command" and exits `0`.</fact></item>
      </list>
      <p p="34"><fact id="two-step-lead" status="spec/done">Two properties make the two-step (produce → `vibe command`) worth its
seam rather than just printing the intent from the producer:</fact></p>
      <list ordered="true" p="35">
        <item><fact id="SEAM-UNIFORMITY" status="spec/done">**Uniformity.** *Any* vibevm command that discovers mid-run it needs
   reasoning parks an intent the same way — not only `vibe agentic …`
   commands. The agent learns one drain verb, not per-command stdout
   parsing.</fact></item>
        <item><fact id="SEAM-DECOUPLING" status="spec/done">**Decoupling.** Producer and consumer need not be the same invocation,
   which is what lets a future deterministic command (`vibe build`) park a
   reasoning step and exit, the agent draining it afterward.</fact></item>
      </list>
      <list ordered="false" p="36">
        <item><fact id="NO-WRITE-BACK" status="spec/done" action="continue" actionstage="doc" audience="agent">**MVP carries no write-back** (`req r4`): the relay is fire-and-forget.</fact></item>
        <item><fact id="AGENT-ORCHESTRATES" status="spec/done">The calling agent orchestrates the conversation — if it wants vibevm to
  see the result, *it* arranges that with a follow-up command.</fact></item>
        <item><fact id="SKILL-STATES-NO-CHANNEL" status="spec/done">The installed skill (§2.9) states this contract explicitly so agents do
  not wait for a channel that is not there. (Full bidirectional
  conversations are §6.)</fact></item>
        <item><fact id="relay-why" status="spec/done">**Why:** the two-step seam buys two properties a direct print cannot, both stated at `##two-step-lead`: **uniformity** — any command that discovers mid-run it needs reasoning parks an intent the same way, so an agent learns one drain verb rather than per-command stdout parsing (`##SEAM-UNIFORMITY`); and **decoupling** — producer and consumer need not be the same invocation, which is what lets a future deterministic command park a reasoning step and exit (`##SEAM-DECOUPLING`).</fact></item>
        <item><fact id="relay-rejected" status="spec/done">**Considered and rejected:** **printing the intent directly from the producer**, with no `vibe command` seam — rejected for the two reasons above; it is cheaper by one command and forfeits both. **A return channel (write-back)** — **deferred, not rejected**: the MVP relay is fire-and-forget (`##NO-WRITE-BACK`), the calling agent orchestrates (`##AGENT-ORCHESTRATES`), and full bidirectional conversations are parked at §6 `##FB-CONVERSATIONS`.</fact></item>
        <item><fact id="relay-revisit" status="spec/done">**Revisit when:** either the **single slot overflows** — a producer runs while `.vibe/agentic/command.md` already holds an undrained intent, which the mailbox's own shape makes mechanically observable (`##FILE-COMMAND-MD`) — **or** the fire-and-forget contract starts costing a round trip, observed as an agent issuing a follow-up `vibe …` command whose only purpose is to hand a result back (the case `##SKILL-STATES-NO-CHANNEL` tells agents not to expect). Either fires §6's `##FB-CONVERSATIONS`.</fact></item>
      </list>
    </section>
    <section id="transports" title="2.8 One operation, two transports">
      <p p="37"><fact id="req-transports" status="spec/done">`req r5`</fact></p>
      <p p="38"><fact id="ONE-OP-TWO-TRANSPORTS" status="spec/done" action="continue" actionstage="doc" audience="agent">**Decision.** A reasoning/agentic operation is defined **once**, as a
transport-agnostic core (the `Intent`-producing function over a project
context), and exposed by **two thin adapters**:</fact></p>
      <list ordered="false" p="39">
        <item><fact id="TRANSPORT-CLI" status="spec/done">**One-shot CLI** (`vibe agentic &lt;op&gt;`) — stateless, one process per call.
  An intent is delivered through the §2.7 file relay. Best when vibevm is
  touched once and discarded — e.g. an agent scanning a directory of
  hundreds of vibevm projects for a quick fact. All per-session state
  (future conversation/context, §6) is lost on exit, by design.</fact></item>
        <item><fact id="TRANSPORT-MCP" status="spec/done">**MCP server** (`vibe mcp serve`, PROP-015 §2.1) — persistent,
  zero-latency, can hold session context. The same op is registered as an
  MCP tool; an intent is returned **synchronously in the tool result**, so
  no file mailbox is needed on this path. Best for sustained work inside
  one project.</fact></item>
      </list>
      <list ordered="false" p="40">
        <item><fact id="CHOICE-IS-AGENTS" status="spec/done">The choice is the **agent's**, by situation, and the skill (§2.9) teaches
  the heuristic.</fact></item>
        <item><fact id="CORE-ADAPTER-BLIND" status="spec/done">The core never knows which adapter called it.</fact></item>
      </list>
    </section>
    <section id="usage-skill" title="2.9 The vibevm-usage skill teaches the protocol">
      <p p="41"><fact id="req-usage-skill" status="spec/done">`req r5`</fact></p>
      <p p="42"><fact id="USAGE-SKILL-TEACHES" status="spec/done">**Decision.** The skill `vibe mcp install` already projects
(`skill_template.md`) gains a section that teaches an agent:</fact></p>
      <list ordered="false" p="43">
        <item><fact id="TEACH-TRANSPORT" status="spec/done">the transport heuristic (one-shot CLI for a quick/one-off or a wide scan;
  MCP server for sustained in-project work) — §2.8;</fact></item>
        <item><fact id="TEACH-RELAY" status="spec/done">the relay contract: some `vibe …` commands park reasoning instead of
  doing it; after such a command, run `vibe command`, then **carry out the
  returned instruction yourself**;</fact></item>
        <item><fact id="TEACH-NO-WRITEBACK" status="spec/done">there is **no automatic write-back** — if the result should reach
  vibevm, the agent issues the follow-up itself.</fact></item>
      </list>
      <p p="44"><fact id="SKILL-DATA-NOT-CODE" status="spec/done">The skill stays *data, not code* (PROP-015 §2.6).</fact></p>
    </section>
    <section id="explain" title="2.10 `vibe agentic explain` — the MVP demonstrator">
      <p p="45"><fact id="req-explain" status="spec/done">`req r4`</fact></p>
      <p p="46"><fact id="EXPLAIN-DEMONSTRATOR" status="spec/done" action="continue" actionstage="doc" audience="user,agent">**Decision.** The first `vibe agentic` operation, `explain`, exercises the
whole relay with zero real risk. Run under an agent, it parks an `Intent`
to `.vibe/agentic/command.md` of roughly:</fact></p>
      <fence p="47">Task — explain this project. In ≤3 short paragraphs, tell the reader
what this project is and does. Sources, in priority order: (1) `README.md`
at the project root — summarise it; (2) if `vibe.toml` is present, fold in
what its structure reveals (the package `kind`, what it `requires`, what
it `provides`). If `README.md` is absent, say so and explain from
`vibe.toml` alone. Write for a developer seeing the repo for the first
time. Do not invent features the sources do not support.</fence>
      <list ordered="false" p="48">
        <item><fact id="EXPLAIN-NO-LLM" status="spec/done">`vibe agentic explain` does no LLM work and reads no file content itself; it
  only composes the intent (it *may* check which of `README.md` / `vibe.toml`
  exist to tailor the prompt).</fact></item>
        <item><fact id="EXPLAIN-FLOW" status="spec/done">The agent then runs `vibe command`, gets this
  instruction, and produces the explanation on its own LLM.</fact></item>
        <item><fact id="EXPLAIN-AFFINITY" status="spec/done">Affinity: `agentic-only` until the built-in backend exists (§2.3).</fact></item>
      </list>
    </section>
  </section>
  <section id="vibevm-dir" title="3. The `.vibe/agentic/` relay directory">
    <p p="49"><fact id="req-relay-dir" status="spec/done">`req r4`</fact></p>
    <list ordered="false" p="50">
      <item><fact id="RELAY-DIR" status="spec/done">**Decision.** Agentic relay state lives under the existing project-local
  `.vibe/` scratch root, in a dedicated **`.vibe/agentic/`** subdirectory
  (created on demand) — one dot-dir, not two.</fact></item>
      <item><fact id="INHERITS-IGNORE" status="spec/done">`.vibe/` is already vibevm's
  project-local scratch space (`init.rs` scaffolds `.vibe/cache/` for the
  package cache) and is already git-ignored by its own `.vibe/.gitignore`
  (`*`), so the relay inherits that ignore for free: no `vibe init` change,
  and no second near-homonym dot-dir sitting beside `.vibe/`.</fact></item>
      <item><fact id="SUBDIR-DISAMBIGUATION" status="spec/done">Subdirectories
  disambiguate the two concerns — `.vibe/cache/` is the package cache,
  `.vibe/agentic/` is the agent↔vibevm relay channel (and the future home of
  the §6 conversation state).</fact></item>
    </list>
    <p p="51"><fact id="mvp-contents-lead" status="spec/done">MVP contents:</fact></p>
    <list ordered="false" p="52">
      <item><fact id="FILE-COMMAND-MD" status="spec/done">`.vibe/agentic/command.md` — the single pending intent (absent when none).</fact></item>
      <item><fact id="FILE-COMMAND-DONE-MD" status="spec/done">`.vibe/agentic/command.done.md` — the last consumed intent (archive aid).</fact></item>
    </list>
    <list ordered="false" p="53">
      <item><fact id="PATH-INTERNAL" status="spec/done">The relay path is an internal detail: the installed skill (§2.9) teaches
  the agent the `vibe command` verb, never the path, so the location carries
  no external contract and can move freely.</fact></item>
      <item><fact id="CACHE-CLEAN-SCOPE" status="spec/done">A future `vibe cache clean` must
  scope to `.vibe/cache/` — never the whole `.vibe/` — so cache eviction
  cannot nuke an in-flight relay intent.</fact></item>
    </list>
  </section>
  <section id="mvp" title="4. MVP scope — what this PROP authorises now">
    <list ordered="true" p="54">
      <item><fact id="MVP-MANIFEST" status="spec/done">**Manifest** — the `[[skill]]` section in `vibe-core` (§2.4), parsed,
   validated, round-tripped; `[[mcp]]` schema reserved but not wired.</fact></item>
      <item><fact id="MVP-STANDALONE" status="spec/done">**Standalone** — `vibe skill list` / `install` / `uninstall` (§2.6)
   over the existing agent machinery.</fact></item>
      <item><fact id="MVP-AGENTIC-CORE" status="spec/done">**Agentic core** — `InferenceBackend` + `Intent` + `RelayBackend`
   (§2.2, §2.7); affinity (§2.3).</fact></item>
      <item><fact id="MVP-RELAY" status="spec/done">**Agentic relay** — `.vibe/agentic/command.md` mailbox (§3); `vibe command`
   consumer (§2.7); `vibe agentic explain` producer (§2.10).</fact></item>
      <item><fact id="MVP-DUAL-TRANSPORT" status="spec/done">**Dual transport** — the explain op exposed as both `vibe agentic
   explain` (CLI) and an MCP tool (§2.8).</fact></item>
      <item><fact id="MVP-SKILL" status="spec/done">**Skill** — `skill_template.md` updated to teach the protocol (§2.9).</fact></item>
    </list>
    <p p="55"><fact id="CRATE-PLACEMENT" status="spec/done">Crate placement (flagged to owner): a dedicated **`vibe-agentic`** crate for
§2.2/§2.3/§2.7 core (it will grow per §6), with adapters in `vibe-cli` and
`vibe-mcp`. Lighter alternative: fold the core into `vibe-mcp` for the MVP
and extract later.</fact></p>
  </section>
  <section id="out-of-scope" title="5. Out of scope (now)">
    <list ordered="false" p="56">
      <item><fact id="OOS-FIFTH-KIND" status="spec/done">**A fifth package kind** — explicitly rejected (§2.4).</fact></item>
      <item><fact id="OOS-MCP-WIRING" status="spec/done">**`[[mcp]]` bundled-server install** — schema reserved (§2.4), wiring is
  near-term, not MVP.</fact></item>
      <item><fact id="OOS-BUILTIN" status="spec/done">**Built-in inference** — `BuiltinBackend` waits on `vibe-llm`
  (`VIBEVM-SPEC.md` §10.4); MVP relay-only.</fact></item>
      <item><fact id="OOS-WRITE-BACK" status="spec/done">**Write-back / conversations** — §6.</fact></item>
      <item><fact id="OOS-PROP-006" status="spec/done">**Changing PROP-006** — untouched (§1.3).</fact></item>
    </list>
  </section>
  <section id="far-backlog" title="6. Far backlog">
    <p p="57"><fact id="far-backlog-lead" status="spec/done">Parked deliberately; recorded so the MVP's seams are cut to admit them:</fact></p>
    <list ordered="false" p="58">
      <item><fact id="FB-CONVERSATIONS" status="spec/done">**Full vibevm↔agent conversations.** A request/response protocol shaped
  like the OpenAI Chat/Responses API: write-back, multi-turn, and full
  multi-agency — calling agents open any number of conversations; vibevm
  keeps a fast cache and the context each conversation needs. This is where
  the §2.7 relay grows a return channel and the §2.8 MCP transport grows
  session state.</fact></item>
      <item><fact id="FB-CONSOLE" status="spec/done">**An OpenCode-style console.** A persistent vibevm session with
  `--resume &lt;id&gt;`, reachable both from an agent (e.g. Claude Code) and
  interactively by a human at a terminal.</fact></item>
      <item><fact id="FB-BUILTIN-BACKEND" status="spec/done">**`BuiltinBackend`** over `vibe-llm` (§2.2) — the standalone inference
  engine that lets reasoning operations run with no agent present.</fact></item>
      <item><fact id="FB-MCP-PROJECTION" status="spec/done">**`[[mcp]]` bundled-server projection** (§2.4) — install a package's
  bundled MCP server into agents alongside its skills.</fact></item>
    </list>
    <p p="59"><fact id="sibling-backlogs" status="spec/done">(Sibling far-backlogs: PROP-017 §8. If these lists keep growing, a
consolidated backlog doc may be warranted — not today.)</fact></p>
  </section>
  <section id="acceptance" title="7. Acceptance">
    <list ordered="false" p="60">
      <item><fact id="ACC-MANIFEST" status="spec/done">`vibe-core` parses and round-trips `[[skill]]`; an unknown key fails
  (`deny_unknown_fields`); a `[[skill]]` with a missing `path` is a typed
  manifest error citing this PROP.</fact></item>
      <item><fact id="ACC-SKILL-INSTALL" status="spec/done">`vibe skill install` projects a fixture package's declared skill into each
  skill-supporting agent under the right path, preserves foreign skill dirs,
  is idempotent, and reports per-(agent, scope); `uninstall` is its inverse;
  `list` writes nothing.</fact></item>
      <item><fact id="ACC-EXTERNAL-SKILL" status="impl/done">A locked reference-backed bridge projects a direct upstream skill or
  package-local adapter plus selected upstream resources; a missing/mismatched
  pin, hash mismatch, link/gitlink, traversal or target collision fails before
  an agent directory is changed.</fact></item>
      <item><fact id="ACC-EXPLAIN-RELAY" status="spec/done">`vibe agentic explain`, run with a fixture project, writes a well-formed
  `.vibe/agentic/command.md` (frontmatter + the §2.10 prompt) and writes no other
  state; `vibe command` prints it, archives it to `command.done.md`, and
  empties the slot; a second `vibe command` reports "no pending command"
  and exits `0`.</fact></item>
      <item><fact id="ACC-MCP-TRANSPORT" status="spec/done">The same explain op invoked through the MCP transport returns the intent
  in the tool result and touches no mailbox file.</fact></item>
      <item><fact id="ACC-FAIL-LOUD" status="spec/done">A reasoning operation invoked standalone with no engine fails loud with
  the §2.1 message; `vibe skill install` invoked standalone succeeds.</fact></item>
      <item><fact id="ACC-SKILL-SECTION" status="spec/done">The projected `SKILL.md` contains the §2.9 protocol section; the existing
  PROP-015 acceptance still holds.</fact></item>
    </list>
  </section>
</spec>
