← Back to Blog

Institutional Memory for a Team of One

My scaling problem has never been compute, or code, or even time. It is memory. I run several products by myself, and what breaks first is not the machine. It is me forgetting why I did something, what already burned me, and what is half-finished in a corner I have not looked at in three weeks. A team survives this because the knowledge is spread across many heads and someone remembers. A team of one has no such redundancy. When I forget, it is simply gone.

So the most valuable infrastructure I have built is not in any product. It is the memory layer underneath all of them: a set of structured records that hold what I would otherwise have to keep in my head, written so the tools consult them automatically instead of relying on me to recall.

Underneath it sit two ideas. Forgetting is the binding constraint for a solo operator: the institutional memory a team carries in its people has to live somewhere outside your one unreliable head, or it does not exist. And externalized memory only works if it is consulted by default rather than remembered: layered records, each with a single job, loaded automatically by the tools that do the work.

What forgetting costs#

Watch what a single forgotten fact costs. You re-make a decision you already made carefully, because the reasoning evaporated and only the conclusion remained, and now you are not sure you trust the conclusion. You re-break something that already burned you once, because the lesson lived in your memory and your memory moved on. You re-derive context (the why behind a config, the shape of a half-built feature) that you already paid to build and then lost.

None of these are dramatic. They are a slow tax, a few percent off everything, forever. On a team the tax is smaller because the knowledge is redundant: the person who made the decision is still around, or wrote it in a channel, or sits next to whoever needs it. Alone, every fact you hold is a single point of failure, and the failure is silent. You do not notice the memory you lost. You only notice the work you redid.

Memory in layers, each with one job#

The fix is not one big document. It is several kinds of record, each answering a different question, each written and read in a different way.

Layer What it holds Written when Who reads it
Operational lessons "This bit us, here is the rule" The moment an incident happens Every future change, before deploy
Decision records Why, not just what Before the code, as a spec or ADR Anyone who questions the choice later
Project memory What is in flight, goals, constraints When state changes The next session, picking up cold
Preferences How the work should be done When a correction lands Every task, as standing rules
Per-repo manual How this specific system operates As the system evolves Anyone, or any agent, touching the repo

The separation matters. A lesson is append-only and numbered, because you never want to lose one and you want to cite it. A decision record is reasoning-first, because the conclusion is the cheap part and the why is what you actually lose. Project memory is disposable and current, a snapshot you overwrite, because stale state is worse than none. Preferences are short and absolute. Smashing all of these into one file produces something nobody reads, which is the same as having no memory at all.

The trick is automatic consultation#

The part that took me longest to understand: externalized memory you have to remember to read is just a diary. It does not change anything, because the failure was never a lack of writing, it was a lack of recall, and a diary still depends on recall.

The leverage comes from memory the tools load whether or not I think to ask. An index that drops into context at the start of every session, so the relevant facts are simply present. Operational lessons that live in the repo the agent reads before it acts, so the rule that a deploy step and a route must change together is enforced by something that always looks. A per-repo manual the agent honors by default. The goal state is that the knowledge arrives unbidden, at the moment it is relevant, without my memory being in the loop at all. I stopped trying to remember more and started making sure the system could not help but remind me.

The discipline that keeps it honest#

A memory layer is only as good as its hygiene, and there are a few rules I had to learn the hard way. Write at the moment of the lesson; it is nearly free then and expensive to reconstruct a month later from a vague sense that something went wrong. Keep it findable: an index, one fact per file, a hook you can scan, so retrieval is cheap enough to actually happen. Convert relative dates to absolute, because "last week" rots the instant you write it. Do not store what the code or the git history already records; that duplication drifts out of sync and earns distrust. And prune ruthlessly. A confidently wrong memory is worse than a blank one, because it does not just fail to help, it actively misleads the next decision.

That last rule separates a memory system from a hoard. The value is in the records being trustworthy enough that the system, and the next version of me, can act on them without re-verifying. A note you cannot trust is a note you have to check, which costs as much as not having it.

A system that remembers for me#

Forgetting, not compute or code or time, is what actually caps a team of one, and the fix was never a better memory. It is external records, layered so each kind does one job, and consulted automatically by the tools rather than recalled by me, because recall is the exact faculty that failed. I did not get better at remembering. I built a system that remembers for me, and then I learned to trust it.


Related:

Keep reading

Post

I Don't Trust My Own Findings

The most dangerous result is the one you want to be true. Your own review is compromised by the same motivation that produced the finding, so the fix is a standing skeptic whose job is to refute, not confirm, before you act on anything.

Read
Post

Leverage by Subtraction

The instinct with agentic tooling is to add: more agents, more skills, more clever prompts. The leverage runs the other way. Here is the test I use to decide whether a piece of work should be a script, a hook, a skill, or an agent, and why most of them should not be an agent at all.

Read
Post

CloudWatch for a Portfolio

I stopped staring at market dashboards. A set of alarms now watches a dozen signal dimensions across the market and taps me on the shoulder only when something actually needs a decision.

Read
Post

When CI Costs More Than It Saves

GitHub Actions' default minute allowance is priced for a team that types at human speed. At agent velocity the bill breaks before the engineering does. Here is how a forced workaround, a local CI mirror plus local deploys, became the better default.

Read
Post

Ballast: An LLM App Whose Best Feature Is Saying 'I Don't Know'

I built a self-healing RAG pipeline, a guardrails gateway, and an eval gate as one system, then threw 44 adversarial questions at it. Zero hallucinations, because the most important thing it does is refuse. Here is how trust got built into the architecture instead of the prompt, and the safety check that leaked the very thing it was guarding.

Read
Post

Building an AI-Native Platform: A Retrospective

A year of building and operating a small fleet of finance and content products almost entirely through an AI coding agent. What worked, what was hard, the honest failures (including a flagship signal that measured nothing and an edge that vanished net of costs), and the lessons that transfer.

Read
Written by Eric Caskey. I build AI tools you can actually use. Explore the Tools or see the case studies.