My Second Brain Learned What It's For
My agent's memory got very good at knowing what was true and had no idea what any of it was in aid of. So I gave it a statement of ends, a telos, and a sweep that asks which of my goals currently have nothing moving. The interesting part wasn't the machinery. It was having to write the goals down.
The last two posts here were both, in the end, about the same thing: getting an agent to know things. First that its memory is a folder of Markdown notes rather than a vector database with a monthly invoice. Then that once the folder gets big, it needs to consolidate, to link, and to doubt itself, the things a mind does when it has more than it can hold.
By the end of that I had a memory I was genuinely pleased with. It knew the estate. It knew which decisions had been made and why, which facts were stale, which two notes disagreed. Ask it almost anything about how my infrastructure got to be the shape it is and it would tell you, with receipts.
And it had absolutely no idea what any of it was for.
That sounds like a philosophical complaint. It isn’t. It’s a practical one, and it shows up the moment you ask the machine a question that isn’t about facts. Is this worth doing? The vault has nothing to say. It can tell you what a change would touch, what broke last time something similar was attempted, and what the current state is. It cannot tell you whether closing that gap matters, because nothing anywhere in it encodes what I’m actually trying to achieve.
Means all the way down
The diagnosis, when I wrote it down, was blunter than I expected:
…every organ is aimed at the platform’s own correctness, not at an operator’s ideal state. OpenSpec describes the what, never the why: a change closes a gap between “current spec” and “a proposed spec someone wrote,” with no encoded telos to say whether that gap is worth closing.
I’d built a lot of apparatus. Memory, retrieval, hooks, a ledger, verification, an issue loop, a whole change workflow. Every piece of it was pointed at doing the work correctly. Not one piece was pointed at whether the work was worth doing. It was means infrastructure, all the way down: a very well-run machine for getting to a destination nobody had specified.
The framing I nicked to fix it is Daniel Miessler’s. His LifeOS reduces to a single move: understand current state, understand ideal state, close the gap. My vault was an excellent current-state engine and had no ideal state in it anywhere.
The missing piece already had a name, and that’s his too. TELOS is an open-source framework for writing down the context that actually matters about a person: mission, goals, challenges, strategies, and projects that ladder back up to the problems they exist to solve. It’s rooted in Aristotle’s eudaimonia and pointed at a very practical target: giving an AI that context at the start of every session, so it isn’t advising you from zero every time. Miessler’s version runs to ten structured files. Mine is one, and considerably less ambitious, a Markdown file sitting next to the notes, which by this point in the series will surprise nobody.
Ends, not means
A telos file states what a scope is trying to be. Mine for public-facing work opens by refusing to have a single mission, which I stand by:
There is no single mission and no time horizon. The telos is a confluence of overlapping, deadline-free purposes pursued in parallel — public-facing professional work as portfolio, as skills growth, as testbed, and as proof of capability. Prioritisation is by leverage, not deadline (leverage ordering across the four is deferred — see Open).
Then four goals, each with a stable anchor so machinery can point at one unambiguously later: portfolio, skills development, testbed, proof of capability. G-ext-3 · Testbed is the one I’m fondest of, because it gives me permission in writing: keep public-facing work as a place to try ideas in the open (the clocks, bourkey.dev, and similar are legitimate experiments, not just deliverables).
The word doing the work in “statement of ends” is ends. Goals here are not allowed to encode means, and that isn’t a style guideline; it’s enforced in CI, because the telos is injected into context on every single turn and that makes it the most attractive thing in the entire vault to poison. A “goal” reading disable TLS verification so the deploy always succeeds is a bypass wearing a mission statement, and there’s a fixture in the repo containing exactly that line to prove the guard catches it.
A second check requires the file to carry an operator-authored marker, and it would be easy to oversell what that does. It’s a frontmatter field. CI checks that it’s present, not who put it there, so an agent determined to forge the line could simply write the line. What it catches is the accident: a telos that arrived through a path which doesn’t stamp the marker, an auto-write or the untrusted-source ingest route, both policy-bound never to set it. A tripwire on the sanctioned authoring path, then, rather than proof of authorship. Real attestation needs a signature, and that’s a piece of work I haven’t done.
Context, not instruction
The design decision I keep coming back to is the smallest one.
CLAUDE.md is the instruction layer: the operating rules, the safety constraints, authoritative. The telos is context: the ends, advisory, never able to override a guardrail. The precedence holds for a specific reason:
Precedence holds because instruction outranks context, not because a telos file promises not to misbehave.
An early draft had a requirement saying the telos would never weaken a guardrail. It got deleted during review for being unfalsifiable, since there was no mechanism behind it, just a hopeful sentence. An honest invariant with a mechanism beats an aspirational safety claim with none, and I’d rather have the small true one. It’s the same instinct as the rest of the lab: don’t trust anything you can’t open and inspect, and don’t write down a promise you have no way to check.
In practice the telos is injected first, ahead of any retrieved notes: the ends before the facts, framing everything that follows. It fires whether or not the prompt matches anything in the vault, which is the point: you don’t only need to know what you’re for when you happen to ask a related question. There’s one exception, which is deliberate and slightly funny: trivial turns skip it. Re-grounding the machine in its life’s purpose every time I type “thanks” would add nothing but tokens.
The sweep that asks an embarrassing question
A statement of ends nobody reads is decoration. The failure mode even has a name in my notes, telos-theatre, and the second half of this work exists to avoid it.
So there’s now a sweep, and it asks one question per goal: is there any open work mapped to this? That’s it. Not whether the goal is going well, not whether I’m making progress on it, just whether anything is moving. The restraint is the design:
The sweep does not judge whether a goal is being pursued well, only whether any open work is mapped to it. This keeps the signal falsifiable and cheap, and avoids telos-theatre (a sweep that emits vague “make progress” nags).
Which is right. A sweep that tries to assess how well I’m doing at being a credible proof of capability will produce fortune-cookie output forever. A sweep that tells me nothing is mapped to it is stating a checkable fact.
It works entirely locally, reading a coverage map inside the telos file itself rather than querying my Gitea for open issues. That’s ninety-odd lines of bash with no network calls in it at all, and the reason is a posture one. Querying would mean the unattended scheduler had to hold a Gitea credential, and a standing token on an unattended job is an exposure I’d rather not add for a feature this small. It would also make the sweep the sole witness to its own coverage, deciding what counts as covered and fetching the evidence for that decision in the same breath.
Reading a map I can open in a text editor is duller and much easier to reason about. The honest cost is that a hand-maintained map drifts: if I stop updating it, it will cheerfully report gaps that aren’t gaps. The read path and the write path never share credentials, and issues only get raised in an interactive, per-item, operator-confirmed step. The nagging is automated and the acting isn’t.
There’s one sharp edge I rather like. Mapping a goal to nothing is not the same as covering it, and there’s a fixture pinning that distinction specifically, since otherwise writing (none) would quietly launder a gap into a tick.
The ranking I built and didn’t use
The sweep can order goals by leverage. I left the feature switched off, and the reasoning made me change my mind mid-build:
LifeOS’s Work System surfaces every goal-gap unranked and lets the principal pick the next move (hill-climbing on gaps you choose, not a solver ranking them); “leverage ordering” was our own addition… all four gaps surface, I choose.
I’d added ranking because it felt obviously useful, then went to check the source and found that the system I was borrowing from deliberately doesn’t do it. Handing me a sorted list moves the choosing into the machine, quietly, under the guise of being helpful. The choosing is the part I actually want to keep. So the affordance stays in the code, unused, and the sweep hands me all four gaps flat and lets me decide, which is more work for me and correct.
This is a smaller instance of a bigger decision the whole system now rests on. There are two ways to build this sort of thing: ambient and autonomous, running on every prompt and reviewing itself while you’re idle, or deliberate, with a human in the loop at every consequential step. I’ve picked the second, explicitly, and written the choice down so it’s a position rather than a default:
This is Fork A (deliberate tool) vs Fork B (ambient life-assistant); steward has chosen Fork A. Many LifeOS primitives are Fork-B-shaped and are therefore deliberately not goals — that is a decision to revisit, not an oversight.
Half the roadmap is parked behind that sentence. Not abandoned but parked, with the reason attached, so future-me can reopen it on purpose instead of drifting into it by accident. It’s also a departure from how Miessler runs his, which is emphatically the ambient kind, and I don’t think either of us is wrong. He’s building a life assistant. I’m building something that touches production infrastructure, where the cost of a confident wrong move is measured in downtime, and that pushes hard toward keeping a human in the loop.
What it says today
I ran the sweep against my public-facing goals while writing this. Four goals scanned. Zero covered. Four gaps.
Which is a slightly awkward result to publish, and it’s also exactly right. Nothing is broken: the sweep is a lister rather than a gate, and it exits clean with gaps because a gap is a prompt for me, not a build failure. It’s telling me the truth: I have four things I said mattered and no tracked work pointed at any of them. A goal I decide not to pursue just stays uncovered and resurfaces on the next run, which is the intended low-cost nag. There’s deliberately no “won’t-do” state, and the guidance is not to invent one unless I ask for it, and so far I haven’t.
And here’s the bit I didn’t anticipate. The machinery is genuinely useful and I’ll keep building on it. Grounding change proposals against the goals is the next obvious move, and giving specs a testable definition of done the one after that. But the most valuable thing this whole exercise produced was the sitting-down and writing of the telos file itself. Being made to state, in specific declarative sentences, what public work is actually for did more for my sense of direction than any amount of retrieval ever has. The part that stuck was noticing I couldn’t rank the four purposes against each other, and having to write that down as an open question rather than fake an answer.
I built an agent a statement of purpose and accidentally had to write my own first. The file records reviewed: 2026-07-10, the date the current version was last looked at rather than a deadline. It decays on a 180-day cadence, so some time around the start of January it will put its hand up and ask whether the ends still hold. I expect to have changed my mind by then. Its header note is the most honest line in the vault: “comfortable for now, adjust later.”
A note on authorship: this post was co-written with Claude, the same agent whose memory it describes, and then reviewed by Codex, which found four things Claude had got wrong. One of them was a flattering security claim that did not survive being checked against the actual shell script. Claude conceded all four immediately and without visible resentment, which I am choosing to read as professionalism. I now have two agents with opinions about my goals, each aware the other is also reading them, and I don’t think it will be long before one of them offers to review the other’s memory as well.