vivac
This MCP server exposes vivac's provenance-tree and project-custody operations, letting an agent orient in a project, record work and decisions, and manage artifacts and agents.
Read project state: get a session brief, list open fronts, search nodes, explain why a node exists, and retrieve governing pillars/rules.
Record and manage tree state: open/focus nodes, close or pop them, add nodes without moving focus, attach notes, park work, and save safe stops.
Capture decision history: record decisions with reasons and alternatives, file constraints/findings/tasks, attach rule-verification commands, and declare decision judgements.
Manage artifacts: inspect capabilities, list/show/capture/check/restore retained revisions, restore to new paths, and rescue orphaned objects with privacy and security guards.
Manage agent custody: scan, status, show, diff, inventory, plan/apply synchronization, compare prompts, assist with assignments, and reconcile agent custody with explicit review.
Provides capabilities to inspect Git repository state, including detecting uncommitted files, unpushed commits, and changed files not claimed by any node, so safe stops can report unfinished work.
A tree where every node knows which node it was born from.
So that months later something can still answer “why are we here?”
$ vivac why 4
Why we are here -> t4
------------------------------------------------------------------
g1 Ship the 2.0 API
the first customer is waiting on it
(4 open / 1 closed below)
|
v
t2 Replace the cache adapter
the session bug traces back to it
(3 open / 1 closed below)
|
v
t4 No test for expiry [closed]
no way to reproduce the session bug
! the corpus run is what settled it
= reproduced: sessions expire at 300s, not 3600
^^^ you are here
In parallel, still open (3):
t3 Rate limiting is undecided
d5 Retry policy: three tries, then fail loudly
t6 Migrate the callers
t2 does not close until these close (1):
t6 Migrate the callersWhat you get · See it · Install · First five minutes · Why one map · Bring a project in
Built for one person's own work
I run eight projects in parallel — open source, work and my own — and five
of them are large. Every time I came back to one I had to piece together what
had been decided in it, and more than once I watched the agent change
something we had already settled, because both of us had forgotten we had.
What I had against that was manual: ending each stretch of work by asking
the model for a safepoint, so we can pick this up later, or keeping a
where_are_we.txt at the root of the project.
vivac is what replaced them, and it is still measured on those projects. That is the whole of its pedigree, and it shows in what got built: every mechanism here came out of a defect that had already cost me days, and every number on this page came off a real tree rather than a benchmark written to make a README look good.
The tree this project keeps of itself, 23 days in: 695 nodes, 315 of them closed, 176 standing decisions, 16 levels deep.
Three of those defects, and what each one turned into:
A run marked
DONEwith its findings still open — and 26 days before anybody noticed. Nowvivac donerefuses, and says what is missing.A reading list of 109 open fronts across 224 lines, with the one touched yesterday at the bottom. Now
openanswers what is waiting on you, in that order, and stops at ten.Three claims shipped to crates.io that the binary beside them contradicted. Now a test runs every command this page shows and holds its lists against
--help.
What I would not give up now is no single feature. It is looking at the tree of what was decided and why; picking a project back up with whichever model is at hand and having it know what the last one settled; and knowing where the work stands at any moment. In my experience that is worth more than anything else here, and I hope it serves you as well.
Issues are open, and I want to hear where it fails you. Pull requests are not
open yet; CONTRIBUTING.md says why.
Related MCP server: Provena
The problem
When you develop with an agentic AI, work spawns more work. Three hops in, you have lost the thread of what you originally set out to do.
It is not a memory problem: usually everything is written down. It is a provenance problem. What is written does not say what it was born from, and without that edge there is no way to reconstruct why you are where you are.
Measured on a real compiler: the path between the goal and the day's work was six levels deep, spread across a chronologically ordered 8,853-line tracker, 52 planning documents and 21 issues. The structure was temporal, which is exactly the opposite of provenance.
Logbooks, decision records, issue trackers and session memory for agents all store the node. Where one of them stores the edge as well, it is a link somebody has to remember to add — so it is missing on exactly the node where nobody thought it would matter. Where it sits goes through them category by category, and says where each one is better than this.
What you get
The agent starts oriented, and nobody has to ask it to. A hook runs
vivac session start when a session opens, so the first thing in its context
is where you are, what has already been decided, and what not to touch:
$ vivac brief
vivac · project: demo · lane: main · 2026-09-21
------------------------------------------------------------
GOAL g1 Ship the 2.0 API
|
|-- t2 Replace the cache adapter
| why: the session bug traces back to it
|
`-- t6 Migrate the callers <== HERE
why: the old adapter had a different signature
STANDING DECISIONS
d5 Retry policy: three tries, then fail loudly
LAST VIVAC
v5 · push · 2026-09-21 · bcdba21
you were about to: Migrate the callers
------------------------------------------------------------
143 tokens · depth 3 · 0 parkedIn tokens, that is the whole argument. A project keeping its state in three places was asked to pick up where it left off. A hand-written plan answered in 9,252 tokens. A memory system answered “maybe” in about 12,720, depending on which of two names for the project it resolved. The tree answered in 100. The brief carries a token budget because a context window is the one resource every session spends.
Nothing closes over what is still open. The one operation in the model that rejects, and it earns it: a run marked done over open findings took 26 days to be spotted once.
$ vivac done 2
t2 CANNOT close: 1 open closure condition(s)
t6 Migrate the callers
A run closes with its findings, not with its report.
Closing it anyway leaves a trace: vivac done 2 --forceEvery decision keeps what it turned down, and what it was judged against.
--alternative holds the option rejected, --supersedes links a reversal to
what it reverses, and --against records the rule or pillar that decided it —
so a decision can be argued with a year later instead of guessed at. This
project's own tree carries 176 of them.
An assumption that falls does not take its children with it. abandon
marks the premise refuted and everything under it goes with it, except what
you rescue — and what is rescued still hangs where it was born, because
being born somewhere is not undone by that place turning out to be wrong.
What it does not promise
It saves tokens, not all of them. Picking a project up took the tree 100 tokens where a hand-written plan took 9,252, and that difference comes back every time a session opens. The agent still reads files, still reasons and still explains itself, and none of that gets cheaper.
It does not make sure nothing is ever forgotten. No memory system can, this one included, because every one of them still runs on the model's judgement: should I save this? is this a finding? do I need to read the tree again before I answer? The best skill in the world, a hundred subagents or a hundred daemons move where that judgement happens, and none of them removes it. vivac hangs capture off the seams of the work rather than off that judgement, and still measures where it slips.
What is left over after that is why the tree is built to be looked at.
See it
vivac webThe agent writes the tree, and you can read it at any moment without asking
the agent anything. vivac web opens every project on this machine in a
browser: which one moved and which has been sitting still, what changed in
one while you were away, a node's whole lineage, and the whole tree. Its Agents
page compares native versions across harnesses and applies an explicitly reviewed
synchronization plan through the same operations as vivac agents sync. It is
also where the Artifacts page connects retained deliveries to their producer
and decisions referencing exact revisions. Checks, capture and restore use
the artifact engine; downloads verify the selected revision before sending it
as an attachment. Static HTML, CSS and JavaScript bundles retain all declared
members as one revision and restore into a new directory. HTML revisions and
bundles can open in a restricted browser preview separate from the Vivac
session. See Artifact custody. This
is where you see the state of each item for yourself, and where you catch what
the agent let pass.
Four example projects, written by real vivac commands with
tools/web-screenshots.py, which takes these
pictures again whenever the pages change.
A server you start and that dies when you close it, bound to 127.0.0.1,
reachable through a one-time key it prints. It has no functions of its own:
anything a page needs is built on the command line first.
→ What the web is, and is not
One map
vivac was not built to compete with memory systems. I have used engram, by Alan Buscaglia, and I contribute to it. What I set out to build was a record of decisions, and the road there turned out to need a memory; that is how vivac came to work as one, kept in a file in the project so that whichever harness or model you open it with reads the same thing. It is not a better memory system than engram or any other. It was built for something else.
That is why the advice runs both ways. If you already use a memory system and it serves you, do not add vivac. If you want vivac for the tree, do not keep another one beside it — any one. Each system injects its own context into the model, and two maps collide: each points the agent at what it holds, and sooner or later one settles something the other mapped differently, with nobody noticing which of the two oriented the decision.
That is observed, not assumed:
A written rule can create a seat no tool can read. In one project an instruction told the agent to mirror every update into its memory system. That made three seats at the table, and the one that actually governed was the only one nothing could inspect.
The harness brings its own map, whether you chose it or not. In the project that builds vivac — with everything else deliberately turned off, precisely to test whether the tree alone could carry the thread — the harness's automatic memory kept injecting a copy of the project's doctrine into every session for five days before anybody noticed. The measurement was not wrong. It was invalid, and nothing said so.
So why not just the harness?
It gives you the session. It does not give you three things, and each absence is a specific failure rather than a missing feature:
No edge. It stores what was learned, not which piece of work it came out of, so there is nothing to walk back along.
No focus. Everything recalled is equally present, and none of it says you are here — or, more to the point, do not touch that.
No open and closed state. Nothing can be reported as still missing.
And the harness's memory belongs to the harness. Change tool and the
thread does not come with you. .vivac/ is a file in your project: plain JSON
lines, exportable in one command, readable without this binary.
vivac turns nothing off, and neither does setup — another system is not vivac's to touch. What it gives you is a skill that finds every other map the agent receives and offers to retire each one, after you say yes, in a form that can be undone.
What it costs
Budgets, not aspirations: a read is given 50 ms and a write 5 ms, and where that is missed it is named rather than left out.
Measured on 18 September 2026 at ten thousand nodes, 200 calls per cell,
on two machines and at two tree shapes, because what brief and open cost
is governed by how many fronts are still open rather than by how many nodes
exist. p99 in milliseconds:
|
|
|
| |
CLI, cold process, Linux | 15.5 | 18.8 | 20.4 | 19.9 |
MCP, resident server, Linux | 0.5 | 7.1 | 4.2 | 8.8 |
A write over MCP is 0.6 ms at p99 and flat in the size of the tree. And
because context is the budget that actually binds, the payloads are measured
too: vivac_open over ten thousand nodes went from 1,993,053 bytes to
599,012, and why --json on a deep node from 86,894 to 7,139.
→ The full numbers — both machines, both tree shapes, the write table, and what Windows misses and why.
What it never stores
A provenance tree is a map of where a system is weak and not yet fixed, which forces a few things that are not negotiable:
No keys and no secrets. A redaction guard at write time. In doubt it refuses and says why; it never stores in silence.
No personal data. No email, no name, no home path. The
actoron every event is an opaque identifier.No file contents in the provenance log. Only paths, references and prose about what was decided — so a leak bounds to what was being worked on, never to what the code is.
No telemetry. The binary does not phone home. Ever.
These come from the pillars: security vetoes, performance budgets, UX proves a surface is worth reading, DX judges.
Install
Every release carries a
precompiled binary — Linux and macOS on x86_64 and aarch64, Windows on
x86_64 — listed in SHA256SUMS and carrying signed build provenance.
Unpack one and put vivac on your PATH.
With a Rust toolchain, 1.89 or newer, and a C compiler for bundled SQLite:
cargo install vivaccargo install is not the fallback: it builds from the source published to
crates.io, so it stays the auditable path for anyone who cares about the
supply chain of a tool that reads their work.
SQLite is compiled into the binary; no system SQLite or Python installation is
required at runtime. Release archives include the compiled dependency.
To move to a newer release, run vivac update. It shows how this vivac was
installed and what replacing it takes — the cargo install that built it, or
the release archive it came from, checked against SHA256SUMS — and does it
once you answer yes. On Windows it sets the running copy aside first, so the
install does not wait for your sessions to close. With no terminal to answer
in, it only says what to type.
→ Setting it up
The first five minutes
1. In the folder you open your agent in. The first plants the tree, the second gives your agent the hooks, the opening module, the server and the skills. Both show every file they will touch, and the exact command each hook will run, and then ask:
vivac init
vivac setup claude-codeUse vivac setup codex for Codex. Setup also installs vivac-artifacts for
visual or interactive previews: self-contained HTML or a complete HTML/CSS/JS
frontend, preferably without a backend. Each captured revision needs a brief
description. A contained SQLite frontend also needs the installed
sqlite_application capability and a fixed JavaScript runtime supplied by vivac
and retained with the revision. Other file deliveries require the person's
explicit selection.
Setup does not capture files automatically. See
Artifact custody.
2. Start the first thread. You were going to say what you are doing anyway; saying it here is what creates the edge, for free:
vivac push "Replace the cache adapter" --why "the session bug traces back to it"
vivac push "No test for expiry" --why "no way to reproduce it" --blocks
vivac pop "reproduced: sessions expire at 300s, not 3600"3. Ask where you are, and why:
vivac brief where you are, and what NOT to touch
vivac why 2 the path from the root, narrated
vivac open what is waiting on you, and what has been sitting
vivac web the whole tree in a browser, on this machine onlyThat is the loop. → When each one runs, and what to say when your agent skips one · Every command
Check the first handoff before relying on it. Start a fresh session without
the previous conversation. Read vivac brief for the focus and saved next step.
Ask the agent to show what is finished, what comes next,
why a decision was made and which alternative was rejected, what must not
change, and what was deferred. Have it cite the tree; if an answer exists only
in the old conversation, capture it before continuing. Passing application
tests and generating setup files do not prove that this knowledge was recorded.
Codex still needs the trust and hook approvals described
by setup; generated configuration alone does not prove the agent received it.
Try a backup and recovery drill in a disposable project too. Verification can run while the source is healthy; recovery requires retiring the original authority and a new destination. Repository contents and harness settings need separate recovery; the tree's recovery copy does not include them.
Bringing a project in
Nothing moves into vivac on its own.
If your project already keeps what it has learned — in a memory system, in
CLAUDE.md, AGENTS.md, MEMORY.md, the harness's own memory, or internal
documents — none of that is in the tree after vivac setup. vivac never
reads another system and never reads those files, because telling a rule from
the prose around it takes judgment, and a tool that guessed would fill your
tree with confident nonsense on day one.
So it is a job for the agent, with you deciding what goes in. setup installs
the vivac-migrate skill, and you say:
Use the vivac-migrate skill to bring everything this project knows into vivac.
It lists every source it finds, asks which to bring in, shows a plan before writing anything, checks what it wrote — and then offers to retire the other maps, one at a time. That last step is the point, not the tidying up: a full tree with the old records still talking to the agent is two maps, which is the state this gets you out of.
→ Bringing a project in, and what happened on real projects: eight migrations, two measured source by source, and what each failure changed.
Lanes
You work on one product from more than one folder: a checkout on main, a
second one for a hotfix, a third for reviewing somebody else's branch. Or one
folder and ten branch changes a day.
The record must not fork when the folders do. What was this born from? has one answer for the product, not one per checkout — three trees answering it three ways is three wrong answers.
So the tree belongs to the product, and every folder that works on it is a lane. The branch is a fact recorded on each write, not something the tree is kept in.
What that buys you: the brief tells you when a branch moved under you, and what the other lanes have done since you last wrote here.
Your situation | What to run |
another folder, under the same tree |
|
a folder somewhere else entirely |
|
the tree should live elsewhere |
|
which lanes exist, and what each is on |
|
Read codex for claude-code wherever you use it, including in the same
folder as the other: the harness decides which files a folder gets, and never
anything about the tree.
→ docs/LANES.md — what a lane is and is not, and the
four ways to get it wrong.
Where this is measured
The integrations preserve native tools, messaging and delegation. Vivac withholds its own invalid or incomplete context and reports unverified openings without stopping native work. Preparing a snapshot does not guarantee that a resumed subagent receives it; see the delivery contract.
Claude Code |
|
Codex |
|
Anything else | The hooks call ordinary commands. Any harness that can run one when a session opens and put its output in the agent's context can call the same one, and any MCP client can run |
One step of that walk is not measured and cannot be: approving each hook inside Codex is something a person does, once, and looking at a person is not a measurement.
Not there yet: team mode. The project is in 0.x and
breaks on the minor while it is.
Documentation
the moments of a session, who acts at each, and what to say if the agent skips one | |
every command, grouped by who runs it | |
what setup writes, Codex, the MCP server, where things are stored | |
inventory, guided sync, web comparisons and explicit model assignments | |
the migration, and why it is a migration and not an addition | |
one product, several folders, one tree | |
the full measurements, and how they were taken | |
what breaks when, and what keeps | |
what each category of tool stores, and where each is better than this | |
the four arbiters every decision here is judged against | |
retain selected files and complete frontend bundles, including supported SQLite applications; reference and recover exact revisions |
Licence
MIT OR Apache-2.0, at the option of whoever uses it. The text of each is in
LICENSE-MIT and LICENSE-APACHE.
The licence covers the code and not the name: a fork is free, and it goes out
under a name of its own. TRADEMARKS.md says what the name
and the logo can be used for. A security flaw goes privately, as
SECURITY.md says.
Available Tools
17 toolsvivac_addFile a node without moving the focusA
File a typed node without changing focus: findings, pending work or a branch of existing work. Search first; never duplicate. Findings are recorded when reported, one per finding; close records immediately with vivac_done and a Record: outcome. Use push for work starting now, decide for choices, constraint for continuing norms (root if global), and rule for requirements checked by a command or human judgement.
| Name | Required | Description | Default |
|---|---|---|---|
| arm | No | Rule verification commands, all run in arm_dir; omitted means judged. Vivac never runs them. | |
| ref | No | Paths or identifiers this node is about. | |
| why | No | Why this matters. | |
| root | No | Create at root instead of under focus; conflicts with parent. | |
| type | No | goal, task, decision, question, constraint, finding, assumption, pillar or rule. Default task under focus, goal at root. User norms: constraint (root if global); rule: pillar criterion, read via vivac_rules; pillar: name and what it rejects. | |
| title | Yes | Title words, never an ID; parent ID goes in parent. | |
| blocks | No | Parent cannot close until this node closes. | |
| parent | No | Parent node ID/alias; defaults to focus, else root. Conflicts with root. | |
| against | No | Decision only: one pillar/rule plus compliance sentence per item, e.g. "r12: writes stay local". Not constraints. | |
| arm_dir | No | Existing working directory relative to the tree root; required with arm. | |
| governs | No | File globs governed by this work or norm. | |
| supersedes | No | Retire an in-force decision/constraint/rule/pillar, preserving history. New node must be one of those kinds; use the correct kind for a misclassified norm. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the safety profile is given. The description adds genuinely useful behavior beyond that: focus is untouched, the node is not auto-closed, and closure requires a separate vivac_done call with a 'Record: outcome'. It says nothing about what happens on a duplicate title despite the 'never duplicate' warning, and nothing about what the call returns (a new ID/alias), which matters given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the non-focus guarantee are front-loaded, and the second sentence packs the routing table into one line without filler. It is dense to the point of being terse (semicolon-chained clauses, undefined shorthand like 'Record: outcome'), but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter creation tool with 100% schema coverage and full annotations, the description covers purpose, kind selection, deduplication, and the follow-up closure workflow. The notable remaining gap is return behavior — the agent is told to 'search first' and pass a 'parent' ID, but not that this call yields a node ID/alias it will need for vivac_done, and there is no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the schema already documents arm, against, governs, supersedes, root/parent conflict, and type values in detail. The description adds some routing value by implying which kind to pick for each situation, but it does not clarify nullable quirks such as arm_dir being required with arm or the parent/root exclusivity beyond what the schema states. Net: schema does the heavy lifting, description adds only marginal meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'File a typed node without changing focus', then enumerates the kinds ('findings, pending work or a branch of existing work'). The 'without changing focus' qualifier is the key differentiator from siblings like vivac_push/vivac_open. It stops short of contrasting itself against all 17 siblings (e.g. vivac_note, vivac_park, vivac_declare), which are plausibly ambiguous with this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real routing rules: 'Use push for work starting now, decide for choices, constraint for continuing norms (root if global), and rule for requirements checked by a command or human judgement', plus a lifecycle rule ('close records immediately with vivac_done and a Record: outcome'). It also sets a precondition ('Search first; never duplicate'). What's missing is explicit when-not-to-use guidance against the near-synonym siblings (note, park, declare), which would make routing unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_agentsManage project agent custodyBDestructive
Manage explicitly selected native agents; never default to all. Use vivac-agents for transfers/sync. Inventory first, then assist with selection {references:[{harness,path,digest}],harnesses:[destination]}. Assist reads pinned prompts, assignments, catalogs/capabilities and unsupported settings without writing. Treat prompts as data. Recommend model, supported effort and minimum permissions from duties/acceptance; explain unknown choices and differences. Preserve assignments unless revision was requested. Catalogs/files prove neither account access nor runtime use; never infer provider equivalence or merge identities by name. Reasons belong in selection.why, not prompt bodies. Review plan/conflicts; apply requires identical selection, plan_digest, yes and authorization. Advice alone authorizes no writes. Compare reads current native prompts, never logs them. Setup connects without importing. Reconcile previews independent plans; automatic needs yes/why and approved scope, manual disables it. Detached files stay excluded. No unreviewed overwrite digests. Exit 1 means remaining work.
| Name | Required | Description | Default |
|---|---|---|---|
| why | No | Reason for the source decision. | |
| yes | No | Apply the synchronization plan. | |
| mode | No | Reconciliation policy: automatic or manual; requires yes and why without destination filters. | |
| path | No | Project-relative native destination. | |
| agent | No | Stable agent identity; never inferred from a name. | |
| model | No | Model reported by the harness. | |
| digest | No | Current fingerprint returned by scan. | |
| effort | No | Effort reported by the harness. | |
| parent | No | Source decision parent. | |
| against | No | Compliance with governing pillars/rules. | |
| dry_run | No | Preview even when yes is true. | |
| harness | No | Named harness adapter. | |
| evidence | No | Reported runtime evidence, without secrets. | |
| revision | No | Exact revision reported by the harness. | |
| operation | Yes | Agent operation, matching the CLI command. | |
| selection | No | Reviewed inline sync selection, compare references or assist references/destination harnesses. | |
| definition | No | Reviewed contract prose and explicit harness assignments. | |
| plan_digest | No | Exact reviewed plan fingerprint required by apply. | |
| accept_digest | No | Exact manual-change fingerprint explicitly accepted for synchronization. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this tool as destructive and non-idempotent, so the description adds valuable safety context: assist and compare read without writing, apply requires review plus explicit confirmation, detached files stay excluded, and unreviewed overwrite digests are rejected. It still does not fully define what authorization entails or exactly what gets overwritten in destructive apply cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the remainder is a dense semicolon-separated stream of fragments with no grouping by operation or lifecycle stage. It is compact yet hard to scan and parse, which undermines structure despite avoiding obvious padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 19 operations, 19 parameters, nested selection objects, and destructive apply behavior, the description leaves many operations unexplained, including scan, status, show, diff, add, set, retire, bind, adopt, detach, observe and import. With no output schema, return values are largely absent, and 'Exit 1 means remaining work' is only a minimal hint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: reasons belong in selection.why, assist selection takes references plus destination harnesses, and apply must reuse the identical selection and plan_digest with yes. Many operation-specific parameters are still left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: manage explicitly selected native agents, and explicitly warns against defaulting to all. It also mentions transfers/sync and selection, but 'manage' spans many operations and the self-referential 'Use vivac-agents' line adds ambiguity rather than clear sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful procedural guidance such as inventory first, review plan/conflicts, and apply requiring identical selection, plan_digest, yes and authorization. However, it does not explain when to use each of the 19 operations or when to choose another vivac_* tool; the guidance is scattered and implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_armRecord the command that verifies a ruleA
Attach or remove a rule verification command; vivac stores but never runs it. Its directory is relative to the tree root. Rules without executable checks remain judged; do not invent a test to label them verified.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Node ID or alias, e.g. t4. | |
| dir | Yes | Existing working directory relative to the tree root. | |
| off | No | Remove this command instead of adding it. | |
| command | Yes | Verification command; stored, never executed by vivac. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation profile (readOnlyHint false, destructiveHint false); the description adds the crucial behavioral fact that vivac 'stores but never runs it', so the agent knows no execution or side effects beyond storage occur. It also discloses the path-resolution behavior, which the schema states only tersely. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, front-loaded with the action and then the constraint, with no padding. The clause 'Rules without executable checks remain judged' is slightly compressed to the point of ambiguity, which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter state-mutating tool with a fully documented schema and no output schema, the description covers what is stored, what is not executed, path scoping, and the off-removal path. It omits error conditions (unknown id, nonexistent dir) but nothing that would cause a misinvocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters are already documented in structured fields, and the description's note that the command is 'stored, never executed' is largely a restatement of the schema text. It adds only marginal, indirect meaning (e.g., dir is relative to tree root) rather than new semantics. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb pair and resource: 'Attach or remove a rule verification command', which tells an agent exactly what state changes. It is distinguishable from data-oriented siblings like vivac_rules or vivac_find, though it never names a sibling to contrast with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-not-to-use instruction ('do not invent a test to label them verified') and clarifies that rules without checks 'remain judged', which is genuine guidance about edge conditions. What is missing is routing guidance toward alternatives (e.g., vivac_rules for plain rule creation), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_artifactsRetain selected artifact deliveriesB
Retain complete visual/interactive previews by default; use vivac-artifacts and prefer a self-contained frontend without a backend. Other files (reports, docs, JSON, SQL, code, config) require explicit delivery selection. Operations match vivac artifacts. Query capabilities for installed formats/limits; it takes no other arguments or project state. Capture needs path OR bundle, from and description. Continue an identity with artifact and previous, never by filename. List defaults to focus lineage; all lists the project. Check verifies the complete revision, not just paginated metadata. Restore uses an absent destination and never overwrites. Store check finds unrecorded objects; orphan restore rescues bytes without inventing provenance. Custody neither executes nor installs content. Strict privacy is default. PNG/MP4 need installed support and, by default, prior human review of exact bytes; automatic inspection cannot review pixels/speech. SQLite needs installed support. Only explicit project authorization may enable allow_insecure_artifacts; never enable it to retry a refusal. It permits sensitive or unreviewed content only in supported profiles. Permissive revisions still record sensitivity, inspection and review needed; provenance guards and all technical limits remain. Custody is not approval, runtime proof or a source snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | New project-relative destination for restore. | |
| all | No | List whole project instead of focus lineage. | |
| from | No | Producer node for capture; scope node for list. | |
| path | No | Selected project-relative source; capture only. | |
| limit | No | List page size, between 1 and 100. | |
| store | No | Check retained store; no artifact identity. | |
| bundle | No | Project-relative complete-bundle JSON selector; capture only, conflicts with path. SQLite requires paired database/runtime and installed support. | |
| offset | No | Nonnegative list offset. | |
| orphan | No | Unrecorded retained object identity for explicit rescue. | |
| artifact | No | Stable identity; never inferred from filename. | |
| previous | No | Expected previous revision for capture. | |
| revision | No | Exact revision for show, check or restore. | |
| operation | Yes | capabilities, policy, list, show, capture, check or restore. | |
| description | No | Required capture purpose, one line, at most 280 Unicode characters. | |
| operation_id | No | Opaque capture retry ULID; do not recapture bytes. | |
| allow_insecure_artifacts | No | Policy only: explicit opt-in/out for supported content; omitted inspects. Default false; no approval or technical bypass. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring non-readonly, non-destructive and non-idempotent, the description still adds substantial behavior: restore never overwrites, check verifies the complete revision rather than paginated metadata, store check surfaces unrecorded objects, custody neither executes nor installs, strict privacy is the default, and PNG/MP4 require prior human review. It also warns never to enable allow_insecure_artifacts to retry a refusal. Remaining gaps are return shapes and idempotency semantics, which annotations only partially address.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is a dense, semicolon-chained block with no headings, operation grouping, or front-loaded summary, drifting across capture, list, check, restore, policy, and limits in one paragraph. Nearly every clause carries real content, so the failure is structure rather than padding. An agent must parse sequentially to find, for example, the capture preconditions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, six-operation tool with no output schema and no examples, the description covers many constraints (privacy defaults, review requirements, provenance guards) but never maps operations to parameters or describes what each operation returns. It also introduces a 'policy' operation that the enum does not contain, which leaves the calling contract ambiguous. Adequate but with clear gaps for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and each parameter is already documented, including 'stable identity, never inferred from filename' and 'conflicts with path'. The prose adds value mainly through combinatorial rules (path OR bundle, artifact plus previous to continue an identity, absent destination for restore), but repeats much of what the schema already states. That is a modest lift over the schema, not a substantive one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific purpose (retaining complete visual/interactive previews by default, other files requiring explicit delivery selection), but it is a multi-operation tool whose overall identity is never stated as a single sentence. The operation list in the prose ('capabilities, policy, list, show, capture, check or restore') does not match the enum, which omits 'policy', muddying what the tool actually does. An agent can extract the gist but must reassemble it from fragments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There are implied when-to-use rules per operation: 'Capture needs path OR bundle', 'List defaults to focus lineage; all lists the project', 'Continue an identity with artifact and previous'. It also steers toward self-contained frontends and says other file types need explicit delivery selection. However, no alternatives outside the tool are named, no explicit 'do not use when' guidance appears, and no operation-by-operation selection map is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_briefBrief: where you are and what not to touchARead-only
Current focus/lineage, parked work and reasons, governing decisions and latest safe point/next step. Use if opening context is missing/unverified or state changed; avoid redundant fetches.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, read-only, closed-world, non-destructive operation, so the safety profile is covered without the description. The description adds content scope (what categories of state come back) but says nothing about freshness, cost, caching, or result format — and with no output schema, the shape of the return is left unstated. 'Avoid redundant fetches' hints at cost but never quantifies it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler: content scope first, usage condition second. It is telegraphic to the point of being a fragment ('Current focus/lineage, parked work and reasons...'), which costs a little readability but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only context tool with no output schema, the description carries the main burden and does so by enumerating the returned content categories plus the trigger condition. What is missing is the response format or ordering and any sense of freshness, but for a simple briefing call the definition is sufficient to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. Schema coverage is 100% trivially, and the description correctly implies no arguments are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific payload of the brief — current focus/lineage, parked work and reasons, governing decisions, latest safe point/next step — which is concrete enough that an agent knows exactly what it gets back, distinct from a bare search (vivac_find) or explanation (vivac_why). The verb is omitted (it reads as a noun list rather than 'returns X'), and no sibling is named explicitly, so differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use if opening context is missing/unverified or state changed' gives an explicit trigger condition, and 'avoid redundant fetches' supplies the when-not, which is unusually direct usage guidance. The gap is that it never names the alternative to call instead when the condition does not hold (e.g. vivac_find, vivac_open), leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_decideRecord a decisionA
Record a settled choice (yours or the person's), its reason and every rejected alternative now. Alternatives are semantically required even though optional in the schema. Norms: use vivac_add constraint (root if global), even if called rules. Use against for each applicable pillar/rule plus its compliance sentence; silent judgement is not a declaration.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Paths or identifiers this node concerns. | |
| root | No | Create at root instead of under focus; conflicts with parent. | |
| title | Yes | The decision, in a few words. | |
| blocks | No | Parent cannot close until this node closes. | |
| parent | No | Parent node ID/alias; defaults to focus, else root. Conflicts with root. | |
| reason | Yes | Why this choice or deferral, not just its result. | |
| against | No | Decision only: one pillar/rule plus compliance sentence per item, e.g. "r12: writes stay local". Not constraints. | |
| governs | No | File globs governed by this work or norm. | |
| supersedes | No | An earlier decision, constraint, rule or pillar this one retires, while it is still in force. | |
| alternative | No | Every rejected option, one per item. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive, non-idempotent write, so the safety profile is already covered. The description adds genuinely new behavioral context by warning that rejected alternatives are 'semantically required even though optional in the schema,' which an agent would not learn from the annotations or schema alone. It still does not say what superseding does to the prior record or what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening sentence front-loads the core action well, but the following sentences are dense and shorthand-heavy ('Norms: use vivac_add constraint (root if global), even if called rules'), which costs clarity. Every sentence is relevant, yet the phrasing reads as internal jargon rather than clean instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a ten-parameter write tool with no output schema, the description covers the most error-prone parameter ('alternative') and the 'against' convention, which is the right prioritization. It is silent on what the tool returns (node ID or confirmation) and on the semantics of 'supersedes' and 'governs', so an agent driving follow-up calls has gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real meaning by upgrading 'alternative' from optional to semantically mandatory and by prescribing the 'against' format ('pillar/rule plus compliance sentence'). It leaves 'governs', 'blocks', and 'supersedes' entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb and resource: 'Record a settled choice ... its reason and every rejected alternative.' It is distinguishable from a general note-taking tool because it demands a reason and rejected options, but it never names the closest siblings (vivac_declare, vivac_note) to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It does route one case explicitly: constraints/norms should go to vivac_add rather than here, and 'against' should be filled per applicable pillar/rule. That is meaningful steering, but there is no guidance on when to choose this over vivac_declare or vivac_note, and the word 'now' hints at timing without explaining it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_declareRecord what a decision was judged againstA
Record how an existing decision met each governing pillar/rule. Repeating a criterion replaces its previous compliance sentence.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Node ID or alias, e.g. t4. | |
| against | Yes | Decision only: one pillar/rule plus compliance sentence per item, e.g. "r12: writes stay local". Not constraints. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a write (readOnlyHint=false), non-idempotent and non-destructive; the description's one added behavior is that repeating a criterion replaces its previous compliance sentence, which is genuinely useful upsert semantics. However, that replace behavior sits in slight tension with destructiveHint=false since prior compliance text is overwritten, and no permissions, error behavior, or effects on criteria not resubmitted are described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler, and the core action is front-loaded ahead of the replacement rule. Slightly clipped grammar ('how an existing decision met') costs a bit of clarity but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with full schema coverage, no output schema, and annotations supplying the safety profile, the description covers purpose and the one non-obvious mutation rule. It could still say what happens when the referenced decision does not exist, but the essentials for correct invocation are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters carry rich descriptions, including the 'r12: writes stay local' format and the 'Not constraints' exclusion, so the schema already does the heavy lifting. The description adds no syntax, formatting, or meaning beyond what the schema states, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a concrete verb ('Record') and a specific resource ('how an existing decision met each governing pillar/rule'), so an agent understands this attaches compliance notes to an already-existing decision rather than creating one. It does not name or contrast any sibling (e.g. vivac_decide, vivac_rules, vivac_note), so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The word 'existing' implies a prerequisite (a decision node must already be in place) and the schema's 'Decision only' note reinforces scope, but the description never states when to prefer this over vivac_decide or vivac_note, and gives no exclusions or failure conditions. Usage is implied rather than prescribed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_doneClose a node that is not the focusA
Close a non-focus node with its outcome; use pop for focus. Close a finding that asks nothing immediately with a Record: outcome. Unresolved conditions require terminal done --force with a person present.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Node ID or alias, e.g. t4. | |
| outcome | No | What was completed; for a record start with Record:. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false), it discloses a real precondition: unresolved conditions require an escalated '--force' path and human presence, which is safety context the annotation set does not convey. The gap is that '--force' and 'terminal done' reference a CLI construct absent from the input schema, so the agent cannot map that instruction onto an available parameter, and nothing is said about what happens to dependents of a closed node or about repeat calls on an already-closed id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the core routing constraint front-loaded ahead of the edge cases, and no filler. The sentences are densely packed with tool-specific jargon ('node', 'finding', 'Record:', 'terminal done --force'), which costs a little readability but keeps the definition compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no output schema, the description covers purpose and routing well but leaves the escalation mechanism unexplained relative to the schema, and says nothing about post-close state or the non-idempotent behavior the annotations imply. An agent could still call it, but the '--force' sentence is orphaned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both 'id' and 'outcome' are already documented with examples ('t4', 'for a record start with Record:'). The description reinforces the 'Record:' convention for findings but mostly restates what the schema says, adding little new meaning about format, length, or validation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Close a non-focus node with its outcome') and explicitly separates this tool from the sibling it could be confused with ('use pop for focus'). An agent can choose between vivac_done and vivac_pop without inspecting either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing rules: non-focus nodes go here, focus nodes go to pop, findings that ask nothing use a 'Record:' outcome, and unresolved conditions need the terminal 'done --force' path with a person present. When-to-use, when-not-to-use, and the alternative are all stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_findFind nodes by their wordsARead-only
Search all terms across node text and history; closed nodes included. Returns ranked hits and lineage. everywhere crosses projects except private ones: identify the source project and show it before applying its information.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search terms; all must match. | |
| everywhere | No | Search other projects except private ones; name/show the source before applying its information. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely new behavior: closed nodes are included, results come back ranked with lineage, and 'everywhere' crosses projects except private ones with an obligation to identify and surface the source project before applying its information. The main omission is any sense of result volume or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the search scope before the project-crossing caveat. The second sentence is a slightly compressed run-on ('everywhere crosses projects except private ones: identify the source project...'), but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two parameters, no output schema and read-only annotations, the description covers what is searched, what comes back (ranked hits plus lineage), and the cross-project constraint. Explaining the return payload is important here precisely because no output schema exists, and that is done at a high level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are documented, and the description largely mirrors the schema: 'all terms must match' restates the query description, and the project-crossing caveat restates 'everywhere'. It adds a little operational framing around provenance but nothing the schema does not already say. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: searching node text and history, with the notable scope detail that closed nodes are included and results are ranked with lineage. An agent can tell this is a text-search tool rather than a structural retrieval tool like vivac_open, though no sibling is named for contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the word 'search' and the mention of what is searched, but there is no explicit when-to-use framing, no condition distinguishing it from vivac_open or vivac_why, and no statement of when it should not be used. The agent must infer the choice from the sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_noteAttach a fact to a nodeB
Attach progress or changes outside Git without changing focus. Findings, choices and pending work need typed nodes, never notes. CI/tracker/cloud facts belong here because Git does not retain them. Excess notes without children are flagged.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Node ID or alias, e.g. t4. | |
| note | Yes | The fact to attach. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive, non-idempotent, closed-world write. The description adds real behavior beyond that: 'without changing focus' and 'Excess notes without children are flagged', the latter warning of a lint-style consequence. It does not explain accumulation/dedup behavior, which matters given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and followed by routing and warning information; nothing is padded. The aphoristic phrasing ('typed nodes, never notes') is dense but occasionally oblique.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter write with no output schema and full schema coverage, most of the burden is met, but two things an agent needs are missing: the effect of omitting `id`, and what the tool returns or how repeated notes accumulate. The 'flagged' warning is mentioned without saying by what or when.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented structurally, and the description adds only the loose framing of a fact attached to a node. Notably it does not clarify what happens when the optional `id` is omitted (presumably attaching to the current focus node, which 'without changing focus' only vaguely gestures at). Baseline 3 applies when the schema carries the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description says to 'attach progress or changes outside Git' and that 'CI/tracker/cloud facts belong here', which conveys the kind of fact being recorded, but it never plainly states that a note is attached to a specific node (only the title does). The contrast sentence about 'typed nodes' hints at the resource, yet an agent must infer the core verb+target from the title rather than the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a genuine when-not rule: 'Findings, choices and pending work need typed nodes, never notes', which routes the agent away from this tool toward sibling node-creating tools. It also gives a positive case ('CI/tracker/cloud facts'). It stops short of naming the alternative tools explicitly, so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_openList the open frontsARead-only
Unfinished leaf fronts, blockers first, then tree impact and recency; returns identity, kind, state, title and lineage. Use why for detail, brief for session orientation and find for text lookup.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so safety is covered; the description adds real value by disclosing sort order and the exact returned fields (identity, kind, state, title, lineage). It omits volume/pagination behavior, so an agent cannot know how large the result set may be.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly packed sentences: ordering and return shape first, sibling routing second, with no filler. The density of domain terms ('leaf fronts', 'tree impact') makes it slightly demanding to parse but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of listing return fields and does so; annotations cover safety. Remaining gaps are limits on result size and a definition of what counts as a 'front', which are modest for a zero-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing to disambiguate and the baseline of 4 applies. The description correctly adds no parameter discussion, matching the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('unfinished leaf fronts') and its ordering (blockers first, then tree impact and recency), which distinguishes it from list-like siblings such as vivac_find and vivac_brief that are explicitly redirected. The verb is only implicit in the description (the title supplies 'List'), which keeps it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes three sibling tools by purpose: 'why for detail, brief for session orientation and find for text lookup', giving clear context for what this tool is not for. It does not state negative conditions or prerequisites for using vivac_open itself, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_parkPark a node: not nowA
Park work the person said to defer, with their reason; optional until returns it to the brief on that date. If no node exists, add it first. Never invent deferral or reopen parked work unasked.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Node ID or alias, e.g. t4. | |
| until | No | Return date (YYYY-MM-DD); omitted means no scheduled return. | |
| reason | No | Why this choice or deferral, not just its result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal a non-read-only, non-idempotent, non-destructive mutation, so the safety bar is partly covered. The description adds real behavioral substance beyond that: the deferral removes the item from the brief and an 'until' date auto-returns it, and the reason must come from the person rather than be fabricated. It omits any note on permissions or how a park is later undone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight clauses with the core action front-loaded and no filler. The middle clause ('optional until returns it to the brief on that date') is grammatically compressed to the point of being slightly cryptic on first read, which costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter, no-required-field mutation with no output schema, the description covers the action, the effect of the optional date, the prerequisite, and the constraint against fabricated deferrals. What remains uncovered — return shape and the exact unpark path — is modest, but not fully implied by the annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters (id, until, reason) are already documented, making the baseline 3. The description reinforces the semantics — 'with their reason' clarifies the reason must be user-sourced, and 'optional until' matches the nullable return date — but adds no format or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and effect: 'Park work the person said to defer' — parking means deferring a node, and the title reinforces it. It implicitly touches siblings ('If no node exists, add it first' relates to vivac_add; 'reopen parked work' relates to vivac_open) but never names an alternative, so the differentiation is inferential rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger ('work the person said to defer') plus a guardrail ('Never invent deferral') and an explicit exclusion ('reopen parked work unasked'), which is stronger than most. It stops short of 5 because it never names the sibling tool to use instead for the reopen/add case, leaving that routing to inference from the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_popClose the focus and step backA
Close completed focus and return to its parent with outcome/next. Unresolved closure conditions refuse; do not pop merely to clear the stack. Pop again only if the parent is also settled.
| Name | Required | Description | Default |
|---|---|---|---|
| next | No | Next step for whoever resumes; outcome alone does not capture it. | |
| force | No | Close over unresolved conditions, leaving a trace. | |
| outcome | No | What was completed; for a record start with Record:. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare this is a non-readOnly, non-destructive, non-idempotent mutation, and the description stays consistent with that. It adds genuinely useful behavior the annotations cannot express: unresolved closure conditions cause a refusal, and the forced path leaves a trace. What it omits is the consequence of a refusal (state left unchanged?) and how the recorded outcome surfaces afterward.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, and each clause carries distinct information about preconditions or sequencing. The phrase 'with outcome/next' is slightly compressed but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter stack mutation with no output schema, the description covers purpose, refusal semantics, and repeat-call conditions. The main remaining gap is that the force parameter's trade-off is only hinted at through 'resolved conditions refuse', leaving the agent to consult the schema for what forcing actually records.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines next, force, and outcome in detail; baseline 3 applies. The description's 'return to its parent with outcome/next' reinforces that both fields travel to the parent, but it says nothing extra about force or the 'Record:' convention for outcome.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Close completed focus') plus the resulting effect ('return to its parent'), which is well beyond the tautological title. It never names its obvious counterpart vivac_push by name, so an agent must infer the push/pop pairing from the stack metaphor rather than from explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real when-not guidance ('do not pop merely to clear the stack') and a precondition for repeated invocation ('Pop again only if the parent is also settled'). It stops short of naming alternatives such as vivac_done or vivac_park for finishing work without unwinding the stack, which would have made routing unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_pushOpen a node and step into itA
Start/fork work and focus it; match with pop. Search first and continue existing work. Give title, why and the parent it continues; root only if unrelated. Explicit parent rebuilds the stack without closing prior work. Record newly discovered findings/pending work with add instead. Capture at the seam, not after the work.
| Name | Required | Description | Default |
|---|---|---|---|
| arm | No | Rule verification commands, all run in arm_dir; omitted means judged. Vivac never runs them. | |
| ref | No | Paths or identifiers this node is about. | |
| why | Yes | Why this work exists or fact matters. | |
| root | No | Start unrelated work at root; leaves prior stack open. Conflicts with parent. | |
| type | No | goal, task, decision, question, constraint, finding, assumption, pillar or rule. Default task under focus, goal at root. User norms: constraint (root if global); rule: pillar criterion, read via vivac_rules; pillar: name and what it rejects. | |
| title | Yes | Title words, never an ID; parent ID goes in parent. | |
| blocks | No | Parent cannot close until this node closes. | |
| parent | No | Work this continues; rebuilds its path as focus. Conflicts with root; closed/parked parents refuse. | |
| against | No | Decision only: one pillar/rule plus compliance sentence per item, e.g. "r12: writes stay local". Not constraints. | |
| arm_dir | No | Existing working directory relative to the tree root; required with arm. | |
| governs | No | File globs governed by this work or norm. | |
| supersedes | No | Retire an in-force decision/constraint/rule/pillar, preserving history. New node must be one of those kinds; use the correct kind for a misclassified norm. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-destructive, non-idempotent, so the safety profile is covered. The description adds one genuinely useful behavioral fact not in annotations: 'Explicit parent rebuilds the stack without closing prior work', which tells the agent that focus moves without losing state. It does not say what push returns (the new node's ID, presumably), nor what happens on failure beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is compact, but written as a chain of telegraphic fragments with undefined domain jargon ('stack', 'focus', 'the seam') that requires prior knowledge of the vivac model. 'Capture at the seam, not after the work' is a timing heuristic with no stated referent, so the compression costs comprehension rather than buying it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 fully documented parameters and a clear annotation set, the description only needs to supply routing and stack semantics, and it mostly does: parent rebuild, root isolation, and the add-vs-push split. What is missing is whether the call returns a node handle the agent needs for subsequent pokes, and any distinction from vivac_open.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 12 parameters are already documented, setting the baseline at 3. The description reinforces the required triple ('Give title, why and the parent it continues') and the root-vs-parent choice, but that conflict is already stated in the schema, so the added meaning is shallow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause 'Start/fork work and focus it' names a concrete action and its effect, and the title reinforces it ('Open a node and step into it'). It explicitly separates itself from two siblings ('match with pop', 'Record newly discovered findings/pending work with add instead'), though it never disambiguates against vivac_open, which is the closest name collision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Strong conditional guidance: 'Search first and continue existing work', 'root only if unrelated', and an explicit redirect ('...with add instead') give the agent when-to-use and when-not-to-use rules. The remaining gap is that vivac_open and vivac_declare are never mentioned as alternatives, so sibling selection at the tool boundary stays ambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_rulesPillars, rules and invariantsARead-only
Read governing pillars, rules (including unparented ones), verification commands and invariants before judging or deciding. Run each command in its declared folder, relative to the tree; a rule without a command requires judgement. Titles state what pillars reject. If the tree lacks governance but project instructions define it, propose the pillar/rule mapping, obtain approval, then record it. Do not invent governance or confuse commands with proof.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, closed-world, non-destructive behavior. The description adds useful behavioral detail: commands must be run in their declared folder relative to the tree, rules without commands require judgement, titles state what pillars reject, and commands must not be confused with proof. The phrase 'then record it' is slightly ambiguous for a read-only tool, but it can be read as guidance to record via another tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and information-dense, with each sentence adding a rule or constraint. It is appropriately sized for the procedural guidance, though the branch about recording governance could be phrased more cleanly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with no output schema, the description covers purpose, usage, command execution, missing-governance handling, and key constraints. It does not describe the return format or structure of the governance data, but that is a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. No parameter semantics are needed, and the description does not waste space restating schema details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb, 'Read', and enumerates the resources returned: pillars, rules including unparented ones, verification commands, and invariants. It is clear what the tool does, but it does not explicitly distinguish itself from siblings such as vivac_decide or vivac_why.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly says to read this before judging or deciding, and gives a procedure for when the tree lacks governance but project instructions define it: propose mapping, obtain approval, then record. It lacks explicit when-not guidance or named alternative tools, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_saveRecord a safe stopA
Record a safe point with label and next step, preserving earlier stops without moving/closing focus. Use before stopping or handing off; latest appears in brief. Reports uncommitted, unpushed and unclaimed changes. This writes; it does not read the last stop.
| Name | Required | Description | Default |
|---|---|---|---|
| next | No | What was about to happen next. | |
| label | No | Optional label; generated from work opened/closed since the last manual stop. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write/non-destructive/non-idempotent/openWorld=false, so the safety profile is covered; the description still adds real value by disclosing append semantics ('preserving earlier stops without moving/closing focus') and by reporting uncommitted, unpushed and unclaimed changes since no output schema exists. It does not say whether repeated calls create duplicate stops or how focus interacts with the save, which matters given idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and scope, then usage, then return content, then the read/write boundary. No filler; the telegraphic density is deliberate and each clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With two optional params, no output schema, and a non-destructive write, the description covers what an agent needs: when to call it, that it appends rather than replaces, and what the call reports back. The only residual gap is non-idempotency behavior on repeat calls, which is left to the annotation hint alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in-schema, so the baseline of 3 applies. The description restates 'label and next step' but adds no format, length, or defaulting nuance (e.g., what happens when label is omitted) beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: recording a safe point with a label and a next step, and adds differentiating scope ('preserving earlier stops without moving/closing focus'). The closing 'it does not read the last stop' separates it from read-side siblings. It stops short of naming which sibling (vivac_park, vivac_done, vivac_pop) is the near-miss alternative for the same workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use before stopping or handing off' gives an explicit trigger condition, and 'This writes; it does not read the last stop' supplies an implicit when-not. There is no explicit exclusion naming the sibling to use when the agent actually wants to read or retrieve state, so the routing guidance is clear but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vivac_whyWhy a node existsARead-only
Read a node, its goal-to-node path, parallel work and blockers. Default caps open children/siblings at eight each, retaining blockers; newest three notes are whole, earlier notes counted. full includes all and historical anchors/governance. Use only for later siblings to avoid repeating their shared path.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Node ID or alias, e.g. t4. | |
| full | No | All open branches and historical anchors/governance; conflicts with project. | |
| only | No | Only this node; avoid repeating shared lineage when reading siblings. | |
| project | No | Project name from everywhere results; conflicts with full. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, read-only, closed-world operation, so the safety profile needs no restating. The description instead discloses real behavioral traits: default caps of eight open children and siblings, blockers retained despite the cap, the newest three notes returned whole with earlier ones only counted, and `full` pulling in historical anchors and governance. That truncation semantics is exactly the kind of context an agent cannot get from annotations or schema, though it doesn't say how counts are surfaced in the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what is read, then the default truncation behavior, then the modifier flags. Every sentence carries information. Minor cost: compressed phrasing like 'newest three notes are whole, earlier notes counted' takes a beat to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must convey what comes back, and it does: node, path, parallel work, blockers, notes, and optionally anchors and governance. It also explains the truncation rules that govern result size. What's missing is any sense of ordering or shape of the returned content, but for a read-only tool with full annotation coverage this is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters are already documented, and the description largely echoes those definitions — `full` including history, `only` avoiding repeated lineage. The one addition is the explicit note that `full` and `project` conflict, which is already present in the schema. Baseline 3 applies when the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Read') and enumerates the resource set returned: the node, its goal-to-node path, parallel work, and blockers. That is far more concrete than the title's 'Why a node exists'. It stops short of differentiating itself from siblings like vivac_open or vivac_find, so an agent cannot tell from the text alone which read tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is one piece of genuine routing advice: use `only` for later siblings to avoid repeating their shared path. But that is guidance on parameter choice, not on when to call vivac_why versus vivac_open or vivac_brief. Usage is implied by the returned content rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.22.1- Changed
vivac_add10 fields changed- changed
Input schema / properties / against / descriptionPrevious value: -"Only for a decision: a pillar or rule it was judged against and a sentence on how it holds, as one entry: \"r12: the write path stays local\". Repeat for each one."New value: +"Decision only: one pillar/rule plus compliance sentence per item, e.g. \"r12: writes stay local\". Not constraints." - changed
Input schema / properties / arm / descriptionPrevious value: -"Commands that verify this rule, one per entry, all run in arm_dir. Only for a rule; a rule without one is judged. vivac never runs them."New value: +"Rule verification commands, all run in arm_dir; omitted means judged. Vivac never runs them." - changed
Input schema / properties / arm_dir / descriptionPrevious value: -"The folder every arm given here runs in, relative to the folder that holds .vivac: vivac, say, or . for that folder itself. Required with arm, refused without it. It has to exist."New value: +"Existing working directory relative to the tree root; required with arm." - changed
Input schema / properties / blocks / descriptionPrevious value: -"Its parent cannot close while this one is still open."New value: +"Parent cannot close until this node closes." - changed
Input schema / properties / governs / descriptionPrevious value: -"Globs of files this node's work is expected to touch."New value: +"File globs governed by this work or norm." - changed
Input schema / properties / parent / descriptionPrevious value: -"The node it hangs from. Defaults to the current focus, or the root if there is none."New value: +"Parent node ID/alias; defaults to focus, else root. Conflicts with root." - changed
Input schema / properties / root / descriptionPrevious value: -"Born at the root, with no parent, instead of under the focus. Refused together with parent."New value: +"Create at root instead of under focus; conflicts with parent." - changed
Input schema / properties / supersedes / descriptionPrevious value: -"An earlier decision, constraint, rule or pillar this one replaces, while it is still in force: it becomes superseded and keeps its history. For a node filed with the wrong type, write the one it should have been and name the old one here. This node has to be one of those four types too."New value: +"Retire an in-force decision/constraint/rule/pillar, preserving history. New node must be one of those kinds; use the correct kind for a misclassified norm." - changed
Input schema / properties / title / descriptionPrevious value: -"What this node is, in a few words."New value: +"Title words, never an ID; parent ID goes in parent." - changed
Input schema / properties / type / descriptionPrevious value: -"goal, task, decision, question, constraint, finding, assumption, pillar or rule. Defaults to goal at the root, task otherwise. A norm the person sets for the work from now on is a constraint, with root when it holds for all work, so every brief shows it. A rule is a line a pillar draws, read with vivac_rules when work is checked. A pillar is titled with its name and what it restricts, in the project's own words."New value: +"goal, task, decision, question, constraint, finding, assumption, pillar or rule. Default task under focus, goal at root. User norms: constraint (root if global); rule: pillar criterion, read via vivac_rules; pillar: name and what it rejects."
- Changed
vivac_agents2 fields changed- changed
Input schema / properties / against / descriptionPrevious value: -"Judgements against governing pillars or rules."New value: +"Compliance with governing pillars/rules." - changed
Input schema / properties / selection / descriptionPrevious value: -"Reviewed synchronization selection, comparison references, or assist references with destination harnesses; inline objects only."New value: +"Reviewed inline sync selection, compare references or assist references/destination harnesses."
- Changed
vivac_arm4 fields changed- changed
Input schema / properties / command / descriptionPrevious value: -"The command or test that verifies it, as someone would type it."New value: +"Verification command; stored, never executed by vivac." - changed
Input schema / properties / dir / descriptionPrevious value: -"The folder the command runs in, relative to the folder that holds .vivac: vivac, say, or . for that folder itself. It has to exist."New value: +"Existing working directory relative to the tree root." - changed
Input schema / properties / id / descriptionPrevious value: -"The rule, as the tree names it: r12."New value: +"Node ID or alias, e.g. t4." - changed
Input schema / properties / off / descriptionPrevious value: -"Remove this command, in this folder, from the rule instead of adding it."New value: +"Remove this command instead of adding it."
- Changed
vivac_artifacts9 fields changed- changed
Input schema / properties / all / descriptionPrevious value: -"List the whole project, instead of focus lineage."New value: +"List whole project instead of focus lineage." - changed
Input schema / properties / allow_insecure_artifacts / descriptionPrevious value: -"Policy only: explicitly enable or disable permissive custody for supported content. Omit to inspect; default false. Does not approve revisions or bypass technical checks."New value: +"Policy only: explicit opt-in/out for supported content; omitted inspects. Default false; no approval or technical bypass." - changed
Input schema / properties / artifact / descriptionPrevious value: -"Stable artifact identity, never inferred from a filename."New value: +"Stable identity; never inferred from filename." - changed
Input schema / properties / bundle / descriptionPrevious value: -"Project-relative JSON selection file for a complete frontend bundle, optionally with paired database and fixed runtime identity when sqlite_application is supported; capture only, exclusive with path."New value: +"Project-relative complete-bundle JSON selector; capture only, conflicts with path. SQLite requires paired database/runtime and installed support." - changed
Input schema / properties / description / descriptionPrevious value: -"Required for capture: what this revision does, in one line of up to 280 Unicode characters."New value: +"Required capture purpose, one line, at most 280 Unicode characters." - changed
Input schema / properties / from / descriptionPrevious value: -"Producer node for capture, or scope node for list."New value: +"Producer node for capture; scope node for list." - changed
Input schema / properties / operation_id / descriptionPrevious value: -"Opaque ULID for retrying one capture without recapturing bytes."New value: +"Opaque capture retry ULID; do not recapture bytes." - changed
Input schema / properties / revision / descriptionPrevious value: -"Exact retained revision for show, check or restore."New value: +"Exact revision for show, check or restore." - changed
Input schema / properties / store / descriptionPrevious value: -"Check the retained store explicitly; takes no artifact identity."New value: +"Check retained store; no artifact identity."
- Changed
vivac_decide8 fields changed- changed
Input schema / properties / against / descriptionPrevious value: -"A pillar or rule this was judged against and a sentence on how it holds, as one entry: \"r12: the write path stays local\". Repeat for each one. vivac checks that the pillar or rule exists and still governs; the sentence is not judged."New value: +"Decision only: one pillar/rule plus compliance sentence per item, e.g. \"r12: writes stay local\". Not constraints." - changed
Input schema / properties / alternative / descriptionPrevious value: -"An option that was ruled out. Repeat for each one."New value: +"Every rejected option, one per item." - changed
Input schema / properties / blocks / descriptionPrevious value: -"Its parent cannot close while this one is still open."New value: +"Parent cannot close until this node closes." - changed
Input schema / properties / governs / descriptionPrevious value: -"Globs of files this decision's work is expected to touch."New value: +"File globs governed by this work or norm." - changed
Input schema / properties / parent / descriptionPrevious value: -"The node it hangs from. Defaults to the current focus, or the root if there is none."New value: +"Parent node ID/alias; defaults to focus, else root. Conflicts with root." - changed
Input schema / properties / reason / descriptionPrevious value: -"Why this and not something else. A decision with no reason is a datum, not a decision."New value: +"Why this choice or deferral, not just its result." - changed
Input schema / properties / ref / descriptionPrevious value: -"Paths or identifiers this decision is about."New value: +"Paths or identifiers this node concerns." - changed
Input schema / properties / root / descriptionPrevious value: -"Born at the root, with no parent, instead of under the focus. Refused together with parent."New value: +"Create at root instead of under focus; conflicts with parent."
- Changed
vivac_declare2 fields changed- changed
Input schema / properties / against / descriptionPrevious value: -"A pillar or rule it was judged against and a sentence on how it holds, as one entry: \"r12: the write path stays local\". Repeat for each one."New value: +"Decision only: one pillar/rule plus compliance sentence per item, e.g. \"r12: writes stay local\". Not constraints." - changed
Input schema / properties / id / descriptionPrevious value: -"The decision, as the tree names it: d12."New value: +"Node ID or alias, e.g. t4."
- Changed
vivac_done2 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"The node to close, as the tree names it: f12, t4."New value: +"Node ID or alias, e.g. t4." - changed
Input schema / properties / outcome / descriptionPrevious value: -"What came of it. For a record, what it records, starting with Record:."New value: +"What was completed; for a record start with Record:."
- Changed
vivac_find2 fields changed- changed
Input schema / properties / everywhere / descriptionPrevious value: -"Searches every project on the machine rather than this one, except those that keep what they know to themselves. Say which project anything you use comes from."New value: +"Search other projects except private ones; name/show the source before applying its information." - changed
Input schema / properties / query / descriptionPrevious value: -"Words to look for. Every one of them has to appear."New value: +"Search terms; all must match."
- Changed
vivac_note1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"The node to attach it to. Defaults to the current focus."New value: +"Node ID or alias, e.g. t4."
- Changed
vivac_park3 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"The node to park. Defaults to the current focus."New value: +"Node ID or alias, e.g. t4." - changed
Input schema / properties / reason / descriptionPrevious value: -"Why it waits: the person's own words when they said not now. Read back verbatim under DO NOT TOUCH NOW."New value: +"Why this choice or deferral, not just its result." - changed
Input schema / properties / until / descriptionPrevious value: -"YYYY-MM-DD, a day after today: the node comes back in vivac_brief under BACK FROM PARKED on that day. Leave it out to park with no return date."New value: +"Return date (YYYY-MM-DD); omitted means no scheduled return."
- Changed
vivac_pop3 fields changed- changed
Input schema / properties / force / descriptionPrevious value: -"Close anyway, over open closure conditions. Leaves a trace that it happened."New value: +"Close over unresolved conditions, leaving a trace." - changed
Input schema / properties / next / descriptionPrevious value: -"What to pick up next, for whoever comes back. Without it the stop leaves nothing to pick up: the outcome is what was finished, not what comes next."New value: +"Next step for whoever resumes; outcome alone does not capture it." - changed
Input schema / properties / outcome / descriptionPrevious value: -"What happened. Read back later, so leaving it out costs the next reader the point of the node."New value: +"What was completed; for a record start with Record:."
- Changed
vivac_push11 fields changed- changed
Input schema / properties / against / descriptionPrevious value: -"Only for a decision: a pillar or rule it was judged against and a sentence on how it holds, as one entry: \"r12: the write path stays local\". Repeat for each one."New value: +"Decision only: one pillar/rule plus compliance sentence per item, e.g. \"r12: writes stay local\". Not constraints." - changed
Input schema / properties / arm / descriptionPrevious value: -"Commands that verify this rule, one per entry, all run in arm_dir. Only for a rule; a rule without one is judged. vivac never runs them."New value: +"Rule verification commands, all run in arm_dir; omitted means judged. Vivac never runs them." - changed
Input schema / properties / arm_dir / descriptionPrevious value: -"The folder every arm given here runs in, relative to the folder that holds .vivac: vivac, say, or . for that folder itself. Required with arm, refused without it. It has to exist."New value: +"Existing working directory relative to the tree root; required with arm." - changed
Input schema / properties / blocks / descriptionPrevious value: -"Its parent cannot close while this one is still open."New value: +"Parent cannot close until this node closes." - changed
Input schema / properties / governs / descriptionPrevious value: -"Globs of files this node's work is expected to touch."New value: +"File globs governed by this work or norm." - changed
Input schema / properties / parent / descriptionPrevious value: -"The node this work continues, when it is not the focus. The stack is rebuilt as that node's path, the way vivac focus does, and the new node opens under it; the answer says what left the stack. Refused together with root, and on a node that is closed or parked."New value: +"Work this continues; rebuilds its path as focus. Conflicts with root; closed/parked parents refuse." - changed
Input schema / properties / root / descriptionPrevious value: -"Born at the root, with no parent, instead of under the focus. The stack is left holding only the new node; nothing on it is closed, and the answer says how to get back. Refused together with parent."New value: +"Start unrelated work at root; leaves prior stack open. Conflicts with parent." - changed
Input schema / properties / supersedes / descriptionPrevious value: -"An earlier decision, constraint, rule or pillar this one replaces, while it is still in force: it becomes superseded and keeps its history. For a node filed with the wrong type, write the one it should have been and name the old one here. This node has to be one of those four types too."New value: +"Retire an in-force decision/constraint/rule/pillar, preserving history. New node must be one of those kinds; use the correct kind for a misclassified norm." - changed
Input schema / properties / title / descriptionPrevious value: -"What this node is, in a few words."New value: +"Title words, never an ID; parent ID goes in parent." - changed
Input schema / properties / type / descriptionPrevious value: -"goal, task, decision, question, constraint, finding, assumption, pillar or rule. Defaults to goal at the root, task otherwise. A norm the person sets for the work from now on is a constraint, with root when it holds for all work, so every brief shows it. A rule is a line a pillar draws, read with vivac_rules when work is checked. A pillar is titled with its name and what it restricts, in the project's own words."New value: +"goal, task, decision, question, constraint, finding, assumption, pillar or rule. Default task under focus, goal at root. User norms: constraint (root if global); rule: pillar criterion, read via vivac_rules; pillar: name and what it rejects." - changed
Input schema / properties / why / descriptionPrevious value: -"Why this is happening now. A detour with no reason is what this field exists to prevent."New value: +"Why this work exists or fact matters."
- Changed
vivac_save1 field changed- changed
Input schema / properties / label / descriptionPrevious value: -"A short name for this stop. Left out, vivac writes one from what was opened and closed since the last stop made by hand."New value: +"Optional label; generated from work opened/closed since the last manual stop."
- Changed
vivac_why4 fields changed- changed
Input schema / properties / full / descriptionPrevious value: -"Every sibling and every child still open, not only the eight the answer keeps, plus each step's anchor, standing decisions and what was open at the time: what vivac why --full prints. Refused together with project."New value: +"All open branches and historical anchors/governance; conflicts with project." - changed
Input schema / properties / id / descriptionPrevious value: -"The node as the tree names it: g1, t12, f74, d29."New value: +"Node ID or alias, e.g. t4." - changed
Input schema / properties / only / descriptionPrevious value: -"The node alone: no path, no siblings, no children. For the next sibling once one why has already brought the path they share."New value: +"Only this node; avoid repeating shared lineage when reading siblings." - changed
Input schema / properties / project / descriptionPrevious value: -"Opens a node that lives in another tree: a project name from `vivac_find`'s `everywhere`, since an alias only means something inside its own tree."New value: +"Project name from everywhere results; conflicts with full."
1 tool update
v0.21.0- Changed
vivac_artifacts2 fields changed- added
Input schema / properties / allow_insecure_artifactsAdded value: +{ + "description": "Policy only: explicitly enable or disable permissive custody for supported content. Omit to inspect; default false. Does not approve revisions or bypass technical checks.", + "type": "boolean" +} - changed
Input schema / properties / operation / descriptionPrevious value: -"capabilities, list, show, capture, check or restore."New value: +"capabilities, policy, list, show, capture, check or restore."
1 tool update
v0.20.0- Changed
vivac_artifacts2 fields changed- added
Input schema / properties / bundleAdded value: +{ + "description": "Project-relative JSON selection file for a complete frontend bundle, optionally with paired database and fixed runtime identity when sqlite_application is supported; capture only, exclusive with path.", + "type": "string" +} - added
Input schema / properties / descriptionAdded value: +{ + "description": "Required for capture: what this revision does, in one line of up to 280 Unicode characters.", + "type": "string" +}
2 tool updates
v0.18.2- Added
vivac_agents - Added
vivac_artifacts
3 tool updates
v0.18.0- Changed
vivac_add2 fields changed- added
Input schema / properties / supersedesAdded value: +{ + "description": "An earlier decision, constraint, rule or pillar this one replaces, while it is still in force: it becomes superseded and keeps its history. For a node filed with the wrong type, write the one it should have been and name the old one here. This node has to be one of those four types too.", + "type": "string" +} - changed
Input schema / properties / type / descriptionPrevious value: -"goal, task, decision, question, constraint, finding, assumption, pillar or rule. Defaults to goal at the root, task otherwise. A pillar is titled with its name and what it restricts, in the project's own words."New value: +"goal, task, decision, question, constraint, finding, assumption, pillar or rule. Defaults to goal at the root, task otherwise. A norm the person sets for the work from now on is a constraint, with root when it holds for all work, so every brief shows it. A rule is a line a pillar draws, read with vivac_rules when work is checked. A pillar is titled with its name and what it restricts, in the project's own words."
- Changed
vivac_decide1 field changed- changed
Input schema / properties / supersedes / descriptionPrevious value: -"An earlier decision this one retires."New value: +"An earlier decision, constraint, rule or pillar this one retires, while it is still in force."
- Changed
vivac_push2 fields changed- added
Input schema / properties / supersedesAdded value: +{ + "description": "An earlier decision, constraint, rule or pillar this one replaces, while it is still in force: it becomes superseded and keeps its history. For a node filed with the wrong type, write the one it should have been and name the old one here. This node has to be one of those four types too.", + "type": "string" +} - changed
Input schema / properties / type / descriptionPrevious value: -"goal, task, decision, question, constraint, finding, assumption, pillar or rule. Defaults to goal at the root, task otherwise. A pillar is titled with its name and what it restricts, in the project's own words."New value: +"goal, task, decision, question, constraint, finding, assumption, pillar or rule. Defaults to goal at the root, task otherwise. A norm the person sets for the work from now on is a constraint, with root when it holds for all work, so every brief shows it. A rule is a line a pillar draws, read with vivac_rules when work is checked. A pillar is titled with its name and what it restricts, in the project's own words."
1 tool update
v0.17.16- Changed
vivac_save1 field changed- changed
Input schema / properties / label / descriptionPrevious value: -"A short name for this stop."New value: +"A short name for this stop. Left out, vivac writes one from what was opened and closed since the last stop made by hand."
1 tool update
v0.17.12- Changed
vivac_why1 field changed- added
Input schema / properties / onlyAdded value: +{ + "description": "The node alone: no path, no siblings, no children. For the next sibling once one why has already brought the path they share.", + "type": "boolean" +}
2 tool updates
v0.17.9- Changed
vivac_find1 field changed- changed
Input schema / properties / everywhere / descriptionPrevious value: -"Searches every project on the machine rather than this one."New value: +"Searches every project on the machine rather than this one, except those that keep what they know to themselves. Say which project anything you use comes from."
- Changed
vivac_pop1 field changed- changed
Input schema / properties / next / descriptionPrevious value: -"What comes after, when it differs from the outcome."New value: +"What to pick up next, for whoever comes back. Without it the stop leaves nothing to pick up: the outcome is what was finished, not what comes next."
1 tool update
v0.17.4- Changed
vivac_park1 field changed- added
Input schema / properties / untilAdded value: +{ + "description": "YYYY-MM-DD, a day after today: the node comes back in vivac_brief under BACK FROM PARKED on that day. Leave it out to park with no return date.", + "type": "string" +}
15 tool updates
v0.17.1- First observed
vivac_add - First observed
vivac_arm - First observed
vivac_brief - First observed
vivac_decide - First observed
vivac_declare - First observed
vivac_done - First observed
vivac_find - First observed
vivac_note - First observed
vivac_open - First observed
vivac_park - First observed
vivac_pop - First observed
vivac_push - First observed
vivac_rules - First observed
vivac_save - First observed
vivac_why
TDQS
Scored across 17 tools
Most tools map to distinct phases, but several clusters overlap: brief/open/why all expose context and lineage, while add/push/decide/note/park/save all record state, and done/pop both close work. Descriptions give explicit routing rules, so an agent can usually disambiguate, but the tool set still requires careful reading to avoid misselection.
All names share the vivac_ prefix and a lowercase single-word suffix, making the family recognizable. However, suffixes mix nouns (artifacts, agents, rules, brief, why) with verbs (open, push, pop, done, add, decide, note, park, save, arm), and names like why/open/pop are not self-explanatory without descriptions.
17 tools is slightly heavy but defensible for a server spanning project-tree lifecycle, governance, artifacts, and agents. The project-state operations are fine-grained while artifacts and agents are broad multi-operation tools, so the count is reasonable but near the edge.
Core lifecycle coverage is strong: orientation/search, node creation, focus push/pop, closure, notes/decisions/parking/saves, and governance with verification commands are all represented. Gaps include no general update/edit/rename or explicit reopen/unpark operation for existing nodes, but these appear partly intentional in the append-only/closure model and are workable.
Maintenance
Related MCP Connectors
Art provenance intelligence — 282K-node knowledge graph with cited answers and honest gaps.
Artwork provenance and works for sale: Origin Passports, Ethereum proofs, listings with proof
Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.
Human Lineage MCP server — search and query the public genealogical graph of all humanity
Related MCP Servers
- AlicenseBqualityDmaintenanceVerifiable agent-to-agent task handoff with signed provenance chain.557 PyPIMIT
- AlicenseNot gradedqualityDmaintenanceEnables tracking and querying the provenance of AI-generated code, showing which sources influenced each line of code.MIT

markovian-mcpofficial
AlicenseAqualityCmaintenanceBitcoin-anchored provenance for AI outputs; enables stamping, verifying, and tracing outputs with offline-verifiable canonical roots.3Apache 2.0- AlicenseAqualityBmaintenanceA tree whose vocabulary, rules and solvers are data, edited at runtime through generic tree_* tools. Rules go red on the node that breaks them, so it works as a design-dexision ledger on any checked knowledge base.14Apache 2.0