Setup
.vouch/config.yaml (inspect
them with vouch schema list):
| kind | frontmatter | rule |
|---|---|---|
contact | role (required), org, email | a person you work with |
org | website | a company or organisation |
project-record | record_status (required), owner | one project’s living record |
meeting-notes | date, attendees | notes from one meeting |
followup | due_at, followup_status (required), owner | a dated commitment |
decision-record | — | must cite claims/sources |
voice | — | must cite the examples it distills |
config.yaml: page_kinds — a schema
change is a reviewed diff like everything else.
The conventions
A person or org is an entity plus a typed page.kb_propose_entity
(type person / company) pairs with a contact / org page carrying the
structured frontmatter. Relations (owned_by, relates_to) link people to
orgs and projects.
Work is a project-record; commitments are followup pages. A followup
carries due_at and followup_status: open. Closing one is a page-edit
proposal (slug_hint: <page id>, followup_status: done) — status changes
go through the gate and land in the audit log like any other write.
Decisions and voice must cite. The decision-record and voice kinds
set required_citations: true, so the gate rejects an uncited one at both
propose and approve time. They are also protected: true: even under
review.approver_role: trusted-agent, a protected page always needs a
reviewer other than its proposer.
Querying records
kb.list_pages (and the vouch pages mirror) filters on kind and
frontmatter — equality plus inclusive bounds that order numbers and ISO
dates correctly:
Feeding the brain
Evidence comes in two ungated intake channels (sources are evidence, not knowledge — only claims and pages go through review):source fetch stores the exact bytes once, content-addressed, so claims
cite an immutable snapshot the live page can’t drift away from. It fetches
conservatively: http/https only, redirects re-validated, private-network
hosts refused, 2 MiB cap. The inbox is the hands-free path: drop meeting
notes or a memo into a folder, each new file becomes a registered source
plus one pending page proposal citing it. Both channels only propose;
neither can approve.
Staying responsive
Configure outbound webhooks so the reviewer learns the queue grew without polling:vouch notify sweep (cron it next to the digest) fires the configured
events idempotently; vouch notify test --url <u> verifies an endpoint.
Delivery is best-effort — a dead endpoint never wedges anything.
The daily loop
Agents file proposals all day (see the slash commands below). A human reviews withvouch review or vouch approve <id...>. The briefing that
tells you where to spend attention:
kb.digest exposes the same briefing to agents over MCP/JSONL.
Slash commands (installed with the claude-code adapter)
/vouch-ask— answer from the KB with citations, or say what’s missing./vouch-remember— register the user’s words as a source, propose claims citing it./vouch-record— file a contact/org/project as entity + typed page./vouch-followup— file a dated commitment./vouch-standup— narratevouch digest.
kb_propose_*; none may call kb_approve. The
human at the gate decides what the brain believes.
The honest constraint
A team memory multiplies small writes, so the review queue is the bottleneck by design: “remember X” is invisible to retrieval until someone approves it.vouch digest, batch approval (vouch approve a b c), and
vouch review keep the queue moving; if you stop reviewing, the brain
stops learning — that’s the deal, and it’s what makes the answers
trustworthy.