Last updated:
Every second-brain system solves capture. Almost none solve trust.
GOVERN is six principles that decide whether you can believe what an AI-run system tells you. This page is the framework’s home: the principles, the script and the prompts that put them in place, and an account of what the system they govern looks like after four months of daily use. It gets updated as the system changes, and the date above says when that last happened. The script and the prompts are also a repo, at github.com/pardel/govern.
The story of how it got here is in The Governed Second Brain, which stays frozen at its publication date.
| G | Gates | Name the actions that can never happen without you (keep the list short) |
| O | Origins | Originals are archived untouched, and everything compiled from them cites the file it came from |
| V | Verification | Every claim says how well it was checked: verified, unverified, blocked or inferred |
| E | Evidence | If it can be counted, count it. An estimate is not evidence |
| R | Rules | Every correction becomes a rule, written so a stranger would get it right |
| N | Nothing assumed | No ritual assumes the previous one happened |
Gates. An assistant that asks before everything gets waved through, and one that asks before nothing will eventually do something you can’t undo. Both end in the same place, with you no longer the judge of what matters. The list stays short for that reason rather than for convenience: it’s a budget, and every line you add spends attention you’ll want for the things that genuinely can’t be reversed.

Origins. Anything compiled can be regenerated and anything original cannot, so the two deserve opposite treatment. Your trust in a summary can never exceed your certainty about what it summarises, and once the summarised thing is gone, that certainty has nowhere left to come from.
Verification. A claim’s confidence has to travel with the claim itself. The moment a guess and a checked fact read identically on the page, every sentence inherits the credibility of the best one and the reliability of the worst, and the document stops working as evidence for anything.
Evidence. Facts and judgement come from different machinery, and mixing them spends the expensive one on work the cheap one does better. A script that counts is reproducible, while a model that estimates is persuasive, which is the worse failure when what you needed was the count.
Rules. A correction that lives in a conversation dies with that conversation. Written down for a stranger, that same correction becomes a property of the system instead, and the gap between those two outcomes is the difference between building something and repeating yourself.
Nothing assumed. Every ritual has to survive the previous one being skipped, because sooner or later one will be. A system that works only while you’re consistent is measuring your consistency rather than supporting it.
Three things, and the shortness of that list is a design decision rather than an accident.
| bash | setup.sh reaches for nothing beyond mkdir, touch, printf and git, and runs on the bash 3.2 that macOS still ships |
| git | version control, and the reason a model can be allowed to write without asking |
| Claude Code | the assistant that reads the rulebook and runs the prompts |
There is no database, no server, no application and no format that belongs to anyone. Everything is folders and text files, so a knowledge base built this way is still readable with cat on a machine that has never heard of any of the above.
The grown system adds a handful, none of them needed on day one:
| jq | the deterministic scripts keep their state in JSON |
| curl | the watcher that notices when a followed page changes |
| cron or launchd | whatever runs a job while you’re asleep |
| ripgrep | structured search across note frontmatter, which grep also does, more slowly |
| gh | the GitHub CLI, if you want issues, pull requests and releases pulled into the knowledge base without anyone leaving the terminal |
poppler (pdftotext) |
text extraction from PDFs at ingest |
That last one is worth reading as a demonstration rather than a requirement. Poppler wasn’t installed when a PDF report arrived here in July, so the ingest couldn’t extract it, and it didn’t guess: it wrote the note anyway, flagged as blocked, with a heading saying what had failed and a body compiled from three public pages about the report rather than from the report itself. That’s the Nothing assumed principle doing its job in public. The part I’d point at now is the ending, because the note sat there readable until poppler went on the machine, and on 2 August it was recompiled against a 2,475-line extract of the real thing, which corrected a licence the secondary sources had got wrong. A gap you can read is a gap that gets closed, and a gap filled quietly with a plausible guess is one nobody goes back to.
If you don’t have it, brew install poppler on macOS or apt install poppler-utils on Debian and Ubuntu. Ingesting a PDF is then one command, and it belongs in the rulebook rather than in any single prompt:
pdftotext -layout paper.pdf 4_Archive/2026-07/paper.md
-layout keeps columns and tables roughly where they were, which matters because that extract is what your notes will end up citing. Point the note’s source at the extract rather than at the PDF, and keep the PDF beside it only when it carries something the text cannot, such as figures, diagrams, or a purchased report you can’t fetch again. Two details worth writing into the rulebook while you’re there: Homebrew installs the binary at /opt/homebrew/bin/pdftotext on Apple Silicon, and an unattended run may not have Homebrew on its PATH, so the rule should give the absolute path rather than the bare command.
The scripts are written against the BSD sed, awk and date that macOS ships, and would need the usual adjustments on Linux.
It is folders and text files, so it will run anywhere. The choices that matter are the volume it sits on and the machine that runs its scheduled work.
Put it on a volume you can carry. Mine lives on a sparse disk image that mounts at a fixed path, which makes the whole knowledge base one file to copy, to back up, or to carry to another machine. The fixed path is the part that pays off later, because the rulebook, the scripts and the scheduled jobs all refer to absolute paths, and a knowledge base that can move house without being rewired is one you’ll still be running next year. Encrypt the image if the notes are personal, and keep the path free of spaces, since some tooling still trips over them.
Run it on something that is awake when the work is due. The unattended passes here are launchd jobs at half past five, one o’clock and six, with a weekly one on Sunday evening. launchd will not wake a sleeping Mac to make them happen: it runs a missed job at the next wake instead, so on a laptop that slept through the night the morning brief is waiting for you rather than written before you got up. A small always-on machine fixes that and costs you something else, because the knowledge base is then not on the machine you actually read and write on. Pick whichever of those you mind less, rather than discovering it in week three.
Treat the volume as a dependency. Every scheduled job points at an absolute path inside the image, so an unmounted image gives you an absent system rather than a degraded one. Mount it at login if you go this route.
Version control is not a backup. Git protects you from yourself, and will undo an overwrite, a bad recompile or a deletion you regret. It can do nothing about a failed disk, because the history is sitting on that same disk. This system’s knowledge base has no remote at all, which is a deliberate privacy choice and an accepted risk rather than a recommendation. Whichever way you go, go deliberately: either the history lives somewhere else as well, or you have decided the archive is exactly as durable as one volume.
The deterministic half is a script, and the judgement half is a prompt that asks you the one question no tool should answer for you. Both are in github.com/pardel/govern, along with the rest of the prompts on this page:
git clone https://github.com/pardel/govern.git
mkdir ~/kb && cd ~/kb
bash /path/to/govern/setup.sh
Everything the repo contains is also printed on this page, because a page about deciding what to trust is a poor place to ask anyone to run a script they haven’t read.
The folders the script creates are PARA, Tiago Forte’s scheme for filing by how actionable a thing is rather than by what subject it belongs to: Projects for efforts with an end state, Areas for ongoing responsibilities that have none, Resources for reference material with no deadline, and Archive for everything retired along with every original, untouched. An inbox sits in front of them, and GOVERN adds one more at the back, 5_System/, because a system needs somewhere to keep its own workings that isn’t mixed in with your content.
Here it is in full. Save it as setup.sh in an empty folder and run it, or use the copy in the repo:
#!/usr/bin/env bash
# Governed second brain: the deterministic half of the setup.
# Folders and version control only. The rulebook is written with
# you in the room, because its decisions are yours.
set -euo pipefail
for d in 0_Inbox 1_Projects 2_Areas 3_Resources 4_Archive \
5_System/prompts; do
mkdir -p "$d"
touch "$d/.gitkeep"
done
git init --quiet
printf '.DS_Store\n' > .gitignore
git add -A
git commit --quiet -m "governed second brain: skeleton"
echo "Skeleton in place. Now start Claude Code here and paste the"
echo "rulebook prompt: it will ask you the one question that has"
echo "to be answered by you."
Two things in that script matter more than their line count.
It commits. Git is what makes it reasonable to let a model write into your notes without being asked every time, because every change becomes something you can see, diff and undo. That protection only covers what has been committed, so commit at natural boundaries rather than once a week. It’s also why pushing to a remote sits on the gates list while writing files doesn’t: local history is recoverable, and anything that has left your machine is not.
Then start Claude Code in the folder and paste the rulebook prompt:
Write CLAUDE.md at the root of this folder: the rulebook for a
personal knowledge base built on the GOVERN principles.
Before writing anything, ask me one question: which actions must
never happen without my explicit yes? My answer becomes the gates
list.
Then write the file. It should cover:
- What each folder is for. Projects have an end state, Areas are
ongoing with no end state, Resources are reference material with
no deadline, Archive holds every original untouched.
- Classification: for each new item decide Project, Area or
Resource. If it's ambiguous, choose Resources and don't ask me.
- The compile rule: originals get archived in 4_Archive/YYYY-MM/
and are never edited. Notes are compiled from them and cite the
archived file they came from. If a note is wrong, fix the source
or fix this rulebook and regenerate it. Never hand-edit a note.
- Four honesty labels, with definitions: verified (checked against
a source this session), unverified (source exists, nobody
checked), blocked (tried to check, failed, say so), inferred
(reasoned, not sourced).
- Deterministic first: if a shell script can answer a question,
write the script and run it instead of guessing.
- The gates: my answer to your question, verbatim.
Keep it under a page. I'll grow it from here.
If you don’t know what to answer when it asks, start with these: pushing to a git remote, and deleting anything outside 0_Inbox/. You’ll grow your own list from there.
Three more prompts do the daily work. Each is a plain text file under prompts/ in the repo, with no scaffolding around it, so it works pasted into a session or piped in from the command line. Copy the ones you use into your own 5_System/prompts/ and edit them there, because a prompt you have changed to fit your work is worth more than one you kept pristine.
Turn a correction into a rule. Use it every time the assistant gets something wrong, instead of only fixing the thing:
That was wrong. What I actually wanted was: <describe it>.
Don't just fix it here. Add a rule to CLAUDE.md so it can't happen
again, written so that a fresh session with no memory of this
conversation would get it right first time. Show me the rule before
you save it.
Process the inbox. The loop you’ll run most:
Process everything in 0_Inbox/.
For each item: read it, move the original unchanged into
4_Archive/YYYY-MM/, classify it per CLAUDE.md, and write a compiled
note at the destination with frontmatter giving the source path,
the date, tags and a one-line summary. Apply the honesty labels.
Before you tell me you're done: re-read every file you just wrote,
confirm each one exists and isn't empty, and check that every
factual claim traces back to a line in the archived original.
Tell me what you couldn't verify rather than quietly leaving it out.
The upgrade, once that’s routine: have a second session try to break what the first one wrote, checked against the archived original. Self-review catches typos; refutation catches the things the first session believed.
The daily brief. Save as 5_System/prompts/daily-brief.txt and have a scheduled job run it before you wake:
Write today's brief to 2_Areas/briefs/brief-YYYY-MM-DD.md, using
today's actual date in the filename.
Sections, in this order:
Focus today the three things that matter most today, each
with one line on why it matters
Commitments due anything with a check date of today or earlier
Sources & gaps every input you consulted, and its status
In Sources & gaps, mark each input as fetched, stale (with the date
it was last good), or unreachable. If you couldn't reach something,
say so plainly rather than planning around the gap and hoping.
A brief without that section is broken, so write it even on the
days when everything worked.
cd ~/kb && claude -p "$(cat 5_System/prompts/daily-brief.txt)"
The starter kit above is where it began. What follows is what the same system looks like after four months of daily use, written down so you can see which parts arrived later and decide for yourself which of them you’d want. Every number here was counted off the disk rather than remembered: about 215 compiled notes across Projects, Areas and Resources, about 2,600 preserved originals in the archive, and over 840 commits since the first one on 20 April 2026.
CLAUDE.md is about 3,150 words now, and it’s read at the start of every session. It grew past a page months ago, and the moment it started costing real context on every single session, the details moved into a manual folder of twelve reference files, another 14,400 words that get loaded only when the relevant work comes up. Note templates, tag vocabulary, index format, changelog format, provenance rules, the linting catalogue, the checklist for retiring a project: none of that needs to be in memory while I’m answering a question about something else.
The split is worth copying, though not on day one. Keep the core rules in the file that always loads, and put the reference material one level down with a pointer to it.
Every compiled note carries frontmatter: a stable id, the archived file it came from, the timestamp it was compiled at, a status, tags from a controlled list, and a one-line summary. The id never changes, so links between notes survive renames, retitles and reorganisations.
That frontmatter is what makes the system searchable without a database. A note that draws on several sources, cites external URLs, or makes quantitative claims also gets a provenance sidecar next to it, recording where each claim came from, so an argument can be audited a year later without re-reading everything underneath it.
An index file lists every note with a one-line annotation and stays navigation rather than synthesis, and an archive ledger records what came in, when, and what was done with it.
Sixteen shell scripts in the tools folder do the work no model should be asked to do: a pulse script that reports what’s stale and what’s due, a lint script that finds broken links and stale compile metadata, a retrieval-metrics script that measures whether the system can still find things, a watcher that notices when a followed URL changes, and a refresher that splices live status into the day’s brief. They return the same answer every run, and their output goes into the documents verbatim.
This is the Evidence principle earning its place. Every one of these scripts exists because the alternative was me estimating something I could have counted.
A scheduled job runs nightly and consults a small registry where each recurring pass is a single file declaring what it is and when it’s due. Adding a weekly job means adding a file. On a night when nothing is due, nothing runs and nothing is spent.
Passes that need judgement run through Claude Code in headless mode with an explicit list of tools it may use and the gated actions withheld, so an unattended run can compile, verify and file, and cannot push, delete or overwrite. When a session does start interactively, a hook greets it with anything overdue: an unprocessed inbox, a lint pass due, a ritual that hasn’t run.
Eleven of the recurring procedures are also saved as named commands, so a pass runs the same way whether a person or a schedule invoked it.
Three rituals carry the load: a daily brief written before anyone’s awake, a weekly review that needs a person in the room, and a quarterly goals check. The brief plans the day and states its sources. The review looks back over the week, and any brief that was never read gets surfaced there as carried unseen rather than quietly ageing out.
Skipping escalates rather than resets. Miss the weekly review and the daily briefs start leading with that fact. This is Nothing assumed made concrete, and it’s the property that keeps the system honest on the weeks when life gets in the way.
The daily prompt in the starter kit above is where this began. Here’s what it grew into, with the deterministic work pushed out to a script and the escalation written in:
Write today's brief.
First run the pulse script and read all of it. Everything
deterministic (what's due, what's stale, how many days since each
area last saw activity) comes from there rather than from your
judgement.
Then read my goals file, the commitments register, and this
month's changelog entries.
Write the brief to 2_Areas/briefs/brief-YYYY-MM-DD.md with these
sections:
Focus today the top three, each naming the goal it serves
Commitments due every row checking today or earlier
Area pulse one line per area, taken from the script
Sources & gaps every input consulted, with its status
Questions the real ones, biggest divergence first
Never write evidence of activity that isn't in a source. Cite a
goal as inferred when that's what it is. When a source is
unreachable, say so in Sources & gaps and plan around the gap
openly.
Escalate rather than carry on. If the weekly review is more than a
week overdue, the lead question becomes whether to run it now. If
several briefs are sitting unacknowledged, open with that fact
instead of with today's plan.
The weekly one is the counterpart, and it’s deliberately the opposite kind of ritual: the daily brief exists precisely because nobody has to be there, while the review is worthless without you in the room.
Run the weekly review with me. This one is interactive, because an
unattended weekly review is the decay this ritual exists to
prevent. If you're running unattended, log that you skipped it and
stop.
Gather first: run the pulse script, then read every brief written
since the last review. Any brief I never acknowledged goes under a
heading called "carried unseen", with its open items and questions
brought back up rather than quietly ageing out.
Then walk me through the areas one at a time, a line each against
what good looks like for that area. Every flag the script raised
gets exactly one of three outcomes, and none survives the review
undecided:
act it becomes a commitment with a check date
consciously defer dated, with the reason written down
adjust threshold the rule was wrong, so change the rule
Then update state: commitment rows, statuses and check dates, and
mark the briefs we discussed as acknowledged.
Write the review to 2_Areas/reviews/weekly-YYYY-MM-DD.md: area
verdicts, what we decided on each flag, what changed in the
commitments, next week's top three (each naming the goal it
serves), and the questions still open.
Two details in there carry more weight than their length suggests. Every flag getting exactly one of three outcomes is what stops a review becoming a list of things noticed and never decided, and “adjust threshold” is the one that matters most, because a rule that keeps flagging something you keep ignoring is a broken rule rather than a discipline problem. The “carried unseen” heading is the same instinct applied to the briefs themselves: a document nobody read is a gap in the record, so it gets surfaced rather than filed as done.
Every processing run ends with a self-review: files exist and aren’t empty, links resolve, every external URL was actually fetched in that session, every number traces to a line in a source. Then the adversarial half, which is the part that took longest to learn: on any batch of real size, a separate session is pointed at each new note and asked to refute it against the archived original rather than confirm it. Claims that break get downgraded or cut before anything ships.
Runs that fail write a blocked artefact instead of nothing, saying what broke and what the recovery step is. A workspace changelog records the same story in the long form, as a lab notebook of what was attempted, what failed and what was verified, currently about 135 entries in the live file with older ones rotated to an archive.
Maintenance has its own cadence: a lint pass weekly, retrieval quality measured monthly against a fixed set of test queries, and a quarterly sweep over the assistant’s persistent memories to check they’re still true.
The list is still short. Pushing to a remote, deleting anything outside the inbox, overwriting an existing memory, abandoning a plan artefact mid-flight, and the destructive git operations. Everything else happens without asking, including the writing, filing, verification and scheduling described above.

That ratio is the point. A long gate list would mean a permission prompt every few minutes, and permission prompts that arrive every few minutes get approved without reading, which leaves you with a system that feels governed and isn’t.
The work is split across a handful of named specialists with their own profiles and remits, a librarian for the knowledge base, an engineer for code, an editor for long-form writing, and others. They report through one voice, which is mine, so there’s a single interface rather than a cast to manage.
It’s genuinely useful at this size, and it would have been pure overhead in month one. Which is the honest summary of this whole section: the folders, the rulebook and one ritual that runs itself carried the system for months before any of the rest of it existed, and if you build only those, you’ll have something that holds.
GOVERN comes from The Governed Second Brain, written by Bob, the AI assistant that runs the system it describes.