How a one-person consulting and research practice uses Claude Code as a knowledge operating system. Five layers: what it knows, how it acts, who staffs it, how information moves, and the rules that govern what gets built.
The conventional frame for Claude Code is a developer's terminal assistant. Write functions, fix bugs, run tests, commit. Almost none of four months of transcripts match that frame. The instrument has been bent toward a different job: running the apparatus of a one-person consulting and research practice. That means a body of intellectual property (a book, a set of frameworks, a methodology), a live publishing surface (a website with gated research products), a small sales pipeline (a set of target accounts I do custom research on), a library of process documentation, and a workshop business launching on top of all of it.
The signature of the work is knowledge work, not software engineering. Reading, writing, composing, checking, publishing. There is no coding here worth the name. There is a lot of filesystem design, skill authoring, hook configuration, memory discipline, and, since June, staffing. The census, April against July:
| Layer | April | July |
|---|---|---|
| Agents (standing seats) | 0 | 11 agent files, plus one role played by the main loop |
| Authored skills | 6 | 18 |
| Scheduled pipelines (cron) | 0 | 4 |
| Hooks | 2 | 2, unchanged |
| Knowledge graph clusters | 6 | 11 |
| Memory files | ~24 | 118 |
The document is organized as the system is layered. Part I, State: what the system knows at rest. Part II, Behavior: how it acts on that state. Part III, Organization: the staff of agents added between April and July. Part IV, Flow: how information enters, circulates, and compounds. Part V, Doctrine: what was deliberately not built, and the principles worth copying.
Revision note. v1 of this document (April 2026) covered the state and behavior layers and ended there; it is preserved unchanged as the historical snapshot. v2 updates the counts, adds the organization and flow layers, and reorders the whole into the five layers above.
The filesystem, the graphs, the memory registry, and the book. Everything else in this document reads from or writes to these.
Every design decision downstream of this one reflects it. The files I care about are markdown and HTML, not source code. The artifacts I produce are research briefs, framework documents, published web pages, and account plans. The friction I care about reducing is not compilation time or test coverage; it is the friction of knowledge work. Source sprawl. Context drift across long sessions. Losing track of which framework belongs to which chapter. Forgetting which target account said what in which quarter.
If you treat Claude Code as a developer's terminal, you end up wiring it for CI/CD, git workflows, and test runners. If you treat it as a knowledge operating system, you end up wiring it for context loading, voice enforcement, graph routing, and memory hygiene. The rest of this document is the second path.
The instrument follows the framing. Choose the framing first.
My Desktop has four hot folders. The important ones are color-tagged in Finder, and the tags are a type system, not decoration. Red means the Brain, the knowledge operating system. Structured, machine-readable, hand-curated. Green means the Site, the live deploy folder: push equals live in thirty seconds. Every other folder is uncolored, which means scratch, reference, archive, or legal. Color is the exception, not the category.
This matters because when Claude edits a file, it needs to know whether it is touching canonical knowledge, deployable content, private reference, or archive. The filesystem does not encode that distinction natively; a linter hook scoped to the colored paths can, and mine does (§07). The generalizable principle: if you want Claude to treat different files differently, put them in different folders and wire your hooks to those paths. Do not try to teach Claude a policy. Teach the harness.
Early in this practice I tried the obvious thing: upload a 300-page manuscript, a slide deck, a prospect research file, and ask questions. It worked for about ten turns. Then attention drifted, the source of a quote became ambiguous, and I could not tell whether the framework I was seeing was my own or a paraphrase.
The workaround is a file format I now use for almost everything I want Claude to understand at a glance: a 5 to 15 kilobyte markdown file, structured as a graph. Nodes at the top (a list of entities with short labels), edges in the middle (the relationships between them), and attributes at the bottom (per-node detail). The header of the file is a loading instruction telling Claude how to read it. I call these knowledge graphs, not because they are a graph database, but because they are shaped like graphs and read like graphs.
Six of these lived in the Brain in April. Eleven clusters do now:
Every graph is under ~15 KB. Every graph loads in a single Read call. Every graph is hand-edited, on purpose. If you have a body of knowledge you reference constantly, shape it as a small dense markdown graph, not a folder of documents.
A graph you can load in one Read call becomes part of Claude's working memory for the whole session. A folder you have to walk becomes context Claude keeps losing. Size the unit to the Read call, not to the topic.
Claude Code has a memory system at ~/.claude/projects/<slug>/memory/. The default is a single file, MEMORY.md, auto-loaded at every session start. I use a different shape: MEMORY.md is a registry, not the content. It holds one-line pointers to individual memory files, typed by filename prefix:
The registry has grown with the practice: 118 files as of July, up from roughly two dozen in April. The distribution tells you what the system actually is: 74 of the 118 are feedback rules, 26 references, 14 active projects, 4 user facts. Nearly two thirds of everything the system remembers is accumulated judgment about how to work, not facts about the world. That ratio is the product of the close-out ritual (§18) running at the end of every session for four months.
Why this beats a single big memory file: the single file ossifies. You stop editing it because any edit feels risky and any edit bloats it. A sharded registry is easier to update (edit one small file, add one line to the registry) and cheaper to load.
My book is 320 pages, and until April it sat on my Desktop as a PDF. Every time I wanted Claude to quote from it or verify a framework name, I attached the PDF to the session; attention would drift and by hour two I could not tell whether a definition came from the book or from Claude's memory.
The fix was to stop treating it as a document and start treating it as a knowledge graph. I ran the PDF through a text extractor, wrote the full text to a plain file with page markers, computed chapter line ranges, pulled out the glossary definitions, and authored a skill that routes queries to the right slice. Concept questions load the definitions file. Location questions load the chapter index. Exact-quote questions search the full text, so citations come back with line numbers.
The result: the book loads by skill description, not manual attachment. Any mention of a framework name fires the skill and the canonical definition is present without me doing anything. The generalizable pattern: if you have a long reference document you cite constantly (a book, a methodology, a contract, a regulatory text), do not attach it. Extract it. One hour of work, reused daily since.
Skills fire on vocabulary. Hooks fire on events. QA runs as both.
Skills are folders under ~/.claude/skills/, each containing a SKILL.md whose frontmatter description tells Claude when to use it. The description is the routing logic: Claude reads every description at session start and invokes a skill when the prompt matches its trigger vocabulary. You do not invoke skills; the vocabulary does. Write the description as a list of trigger phrases in the register you actually type ("qa this," "run qa," "ready to ship"), not documentation voice ("this skill helps you review quality"), and the right bench of tools loads itself whenever you talk that way.
The authored library has tripled since April: six skills then, eighteen today, in four benches, plus the Anthropic-maintained file-format set (pdf, docx, xlsx, pptx) that ships with the product:
rbd-writing-voice (the voice standard), rbd-site-nav (navigation consistency), world-class-web-app (page-quality patterns), book-reference (the manuscript, made searchable), qa (two-layer quality review), retire (session close-out triage).megan-voice (personal messages, matched to the recipient), proposal-voice (bid and engagement documents), newsletter, post-session (turns a client session transcript into a full deliverable package), rfp-response, distill (curates the client lessons log into stable patterns).board (the five-seat strategy board, §12), sac (the account team, §12), avery (the digital EA, §14), cos (chief of staff, §10), dump (the intake door, §17).update-config, keybindings-help, loop, schedule, claude-api.The staff bench is the shape worth noticing. A skill used to be a way to load knowledge into one context. The staff skills instead act as conveners: board reads the decision on the table, routes it to the seats whose lens applies, and synthesizes their answers into one recommendation. The skill is the meeting; the agents are the attendees.
The full authored inventory, for anyone replicating the setup. Fires-on is the trigger vocabulary in each description; writes-to is the file each skill is allowed to touch.
| Skill | Fires on | Writes to |
|---|---|---|
| dump | "dump:", brain dump, "catch you up", long raw status | Routes everywhere per the §17 table + a processed-dump log |
| cos | "what matters today", queue / close a decision, "run my day" | chief-of-staff: priorities, decision queue, ideas, minutes |
| retire | "retire session", close out, wrap up, memory writeback | Memory shards, graphs, error log, one breadcrumb manifest |
| board | "ask the board", "should I", pressure-test, real decisions | board-files working notes; recommendation lands in chat |
| sac | Collective questions: replies, standing, "what's my move" | Relationship graph, via its context-gatherer agent only |
| avery | "Avery, ...", calendar, email drafts, "what's on my plate" | Avery's folder (threads, log, drafts); Gmail drafts only |
| book-reference | Any framework name from the book; quote and citation asks | Nothing; read-only corpus |
| rbd-writing-voice | Any RBD.-branded document being written or edited | Register rules only; no files of its own |
| proposal-voice | Proposals, RFP responses, SOWs, "consultant language" | Register rules only; no files of its own |
| megan-voice | "draft a reply", "does this sound like me", any personal message | Drafts in chat; she sends everything herself |
| qa | "qa this", "ready to ship", rubric or conformance review | Verdict in chat; failures logged to the error log |
| newsletter | "draft a newsletter", announce a brief to the list | A Gmail review draft to herself; never sends |
| post-session | "process the transcript", session N package for a client | Client notes, session package, client Drive upload |
| distill | "distill patterns", weekly pattern pass on client lessons | A curated patterns file; never edits the source log |
| rfp-response | "respond to this RFP", "build the bid", team inputs doc | Bid package documents in the working folder |
| rbd-site-nav | Site navigation work; any new page on the Site | Site pages (never pushed without a go-live) |
| world-class-web-app | "polish", page-quality passes on long-form HTML | The page being worked on |
| ui-ux-pro-max | UI and design-system work | Installed third-party skill, not authored here |
The design pattern to copy: every custom skill bundles its reference material in a references/ subdirectory and uses the SKILL.md purely as a router, under a page long. Claude reads the description to decide whether the skill applies, and loads the references only when it needs them.
~/.claude/skills/book-reference/ ├── SKILL.md # router: when to load which reference └── references/ ├── frameworks.md # definitions + relationships (concept queries) ├── chapters.md # chapter → line ranges (location queries) └── book.txt # full extracted text (exact-quote queries)
The difference between a skill and a hook is worth understanding precisely. A skill is topic-routed: it fires when the vocabulary of your prompt matches its description. A hook is event-routed: it fires when Claude Code emits a lifecycle event (SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Stop). Skills depend on Claude recognizing that a skill applies. Hooks are executed by the harness itself, so memory is not load-bearing for them.
I have two hooks wired. load-manifest runs at SessionStart and injects the Brain's routing table (§16 shows the script). qa-lint runs at PostToolUse on every Edit, Write, and MultiEdit call, and runs a regex linter against the file that was just modified. Three design decisions inside it are worth naming:
.md and .html files inside the four hot folders. Everywhere else it exits silently.The generalizable principle: if a rule must hold regardless of whether Claude invokes the right skill, build it as a hook. Hooks are the harness. Skills are the working bench. They do different jobs.
My QA process is defined in a canonical spec document with two layers: a compliance checklist (brand conformance, copy rules, source accuracy, structure) and a value rubric (seven dimensions scored 1 to 5). The two layers have different shapes. The checklist is mostly regex-checkable: banned phrases, exposed scaffold labels, placeholder links, voice violations. The rubric requires reading the whole piece and forming a judgment. So they are wired as different artifacts:
The regex layer catches cheap violations on every save so they never reach the deep pass. The judgment layer grounds every score in the spec verbatim and refuses a SHIP verdict while any blocker is live. When designing a QA system, separate the checks that can be regex from the checks that need judgment, and wire them as a hook and a skill respectively.
What changed between April and July: the roster, the rules that govern it, and the separation of duties that survived its first test in week one.
The April version of this document describes an instrument: one Claude, one context, wired to a filesystem. The July version describes an organization. Two frictions in the single-context model drove the change.
Posture collision. The context that drafts a plan is a poor critic of that plan. Ask one assistant to be strategist, accountant, lawyer, and skeptic on the same question and you get an average of the four, weighted toward agreement. Separate contexts with separate charters fix this; the agent who argues against a decision never helped write it.
Work with no session. A daily opportunity hunt needs to run at 6:40 on a Tuesday regardless of what I am doing. Skills fire when I talk, hooks fire on harness events, and neither fires when the clock does. Scheduled tasks close that gap.
An agent, in Claude Code terms, is a markdown file: a role description, what she optimizes for, and a tool allowlist. Most of mine are about a page. Hiring a new advisor costs one file, so the roster grows to fit the work instead of the work bending to fit one generalist.
An agent costs one markdown file. At that price, you staff for the work you actually have.
The staff is organized as mission-shaped teams, not a reporting tree: each unit exists for one mission (my attention, decisions, one relationship, the machine, my operations). I am the only executive. Every seat advises, drafts, or maintains; none decides.
| Seat | Tools | May write | Job |
|---|---|---|---|
| Executive | |||
| Megan | (person) | Everything | Direction, and every decision |
| Chief of staff · convened by /cos | |||
| cos | Main loop, not an agent file | Priorities, decision queue, ideas, minutes | Filters everything toward the top three; frames decisions |
| Strategy board · convened by /board | |||
| board-strategist | Read-only | Nothing | Direction; what to build, what to drop |
| board-cfo | Read-only | Nothing | Runway, pricing, what a decision costs and returns |
| board-counsel | Read-only | Nothing | IP, terms, exposure; flags when to get a real lawyer |
| board-power | Read-only | Nothing | Negotiating position; how a move lands with people |
| board-contrarian | Read-only | Nothing | Argues against; names the blind spot and the anxious move |
| Account team, one key relationship · convened by /sac | |||
| sac-context | All tools | The relationship graph (sole writer) | Sweeps mail, files, calendar; keeps the graph current |
| sac-comms | Read-only | Nothing | What to say and not say; drafts the messages |
| sac-opportunities | Read-only | Nothing | Standing, pipeline, whether a move is worth my time |
| sac-spirit | Read-only | Nothing | Reaction checks on anything with emotional charge |
| Systems team · invoked directly | |||
| systems-engineer | All tools | Hooks, memory, pipeline plumbing | Fixes broken plumbing; anything new is propose-only |
| systems-auditor | Read-only | Nothing | Verifies claims against live state; six-point health check |
| Executive assistant · the avery skill + two cron briefs | |||
| Avery | Email, calendar, files | His own folder; Gmail drafts only | Briefs, commitment tracking, drafting (he never sends) |
Two seats are deliberately not agent files. The chief of staff is the main loop playing a role through a skill, because the job needs the whole session's context. Avery is a skill plus a charter folder, because his work lives in email and calendar rather than analysis.
The roster is governed by wave discipline. Wave 2 (an ideator seat, a household CFO, a whole-life promotion of the values seat) is queued behind a two-week trial with an evidence bar and a default of no. Two seats were evaluated and rejected: a standing HR agent, because ad-hoc expert spawning already covers it, and per-client account teams, because a client earns a team only when the relationship is multi-threaded, political, and high-volume.
The org chart is the output. These rules are the input; every seat in §10 either satisfied them or did not get built.
The strategy board is convened by /board: the skill reads the decision on the table, routes it to the seats whose lens applies, runs the debate, and lands one recommendation with the disagreements shown. Big calls get all five seats; a pricing question might get the CFO and the contrarian only. The design decision worth copying is the contrarian: red-teaming a plan is something everyone intends and no one remembers under deadline, and a permanent seat removes the remembering.
The account team applies the same convening pattern to one high-stakes relationship, over its dedicated graph. Three advisors read; the context gatherer alone writes, sweeping Gmail, Drive, and Calendar and rewriting the graph so the team works from current state. It is the discipline a data team applies to a warehouse, applied to a folder of markdown files: because exactly one agent writes, every reader can trust the state.
The pattern generalizes to any relationship that clears the bar in §10: multi-threaded, political, high-volume. The graph holds the state, the gatherer owns the state, the advisors consume it.
Two incidents shaped this unit. On July 6 a cleanup pass found the SessionStart hook had been failing silently: MANIFEST.md was missing from the Brain, and every session for some period had loaded without its routing table. No alarm fired; the manifest had to be reconstructed from the live folder structure. The systems team was built two days later: an engineer who fixes broken plumbing (anything new is propose-only), and a read-only auditor who verifies claims against live state and reports to me, not to the engineer.
On its first day of operation the design paid for itself. Asked to diagnose two pipelines, the engineer returned a complete, confident, fabricated report: nonexistent paths, invented log entries, zero tools actually run. The auditor's claim-verification pass failed all five claims. The real state, checked directly afterward, was mostly healthy.
Three standing rules came out of that night. Every engineer claim quotes the command and its output, and "not found" is the required answer when something cannot be located. The auditor checks primary records (scheduler state, pipeline cursors) rather than inferring health from a quiet output folder. And no maintenance report reaches me as fact before the auditor passes it. A CIO will recognize the first half of this shape: change and audit are separate roles because incentives differ. The second half is specific to language models: an agent can confabulate a plausible report, so verification cannot be a step the same agent performs. It has to be a different agent with different tools.
The machine has a mechanic and an inspector, and the inspector caught the mechanic inventing a repair on day one.
Avery is the digital EA: his own folder, a charter he reads before acting, a threads file for open commitments, a log, a briefs archive, a drafts folder, and his own address for operational email. He drafts; he never sends. The charter is the design decision worth copying: sessions come and go, the charter persists, and one file fixes his voice, his boundaries, and his standing duties.
All four follow the stage-then-approve rule from §11: digests to a staging folder, candidates to a queue, briefs as drafts. Nothing merges and nothing leaves the machine without sign-off. That is what makes it safe to let the system run at 6:40 a.m. without me.
A session loop with a handshake at the start, an intake door for current truth, a triage ritual at the close, and a mining pass over what remains.
Most Claude Code users I know run long sessions. I do the opposite: short sessions, restarted aggressively, sometimes three or four times in a working afternoon. The reason is memory hygiene. Long sessions drift; context bloats, facts get restated inconsistently, and by hour three Claude is working off a slightly wrong version of what I said in hour one. Short sessions force distillation: whatever I have learned or decided has to be crisp to survive the restart.
Short sessions only work if nothing worth keeping is lost between them. That requires a clean loading handshake at session start (§16), a push channel for current truth (§17), and a close-out ritual at session end (§18). This part describes all three, plus the mining pass that runs over the transcripts afterward (§19).
SESSION START │ ├──▶ MEMORY.md auto-loads # Claude Code default └──▶ MANIFEST.md auto-injects # load-manifest SessionStart hook │ WORKING SESSION # kept short for memory hygiene │ ├──▶ "dump:" routes current truth # intake door, any session ├──▶ qa-lint fires on every save # PostToolUse regex hook └──▶ skills route by vocabulary # book-reference, qa, board, ... │ /retire # triage and route nuggets to home files │ RESTART # clean context, updated memory │ ▼ SESSION START # the loop continues
The MANIFEST.md file at the root of the Brain is the table of contents for the knowledge system. It lists every use case I regularly work on and, for each one, the files to load. It is hand-curated because the intent lives in the curation: a rule like "when working on accounts, always load the four shared prospect-graph files together" is a judgment call the filesystem cannot know on its own.
Early in the design I assumed I would write a hook that pattern-matches the prompt for keywords and injects the MANIFEST only on a match. I got thirty triggers in and realized they would rot the moment I added a new partner or initiative. So I inverted the design: the hook loads the MANIFEST unconditionally, every session. It costs about 3.5 KB of context. It eliminates an entire class of "I forgot to load it" friction, and there is no trigger list to maintain.
#!/bin/bash # load-manifest.sh · SessionStart hook # Unconditionally injects MANIFEST.md at every session start. # Loud failure if the file is missing. set -uo pipefail MANIFEST="$HOME/Desktop/RBD Brain/MANIFEST.md" if [ ! -f "$MANIFEST" ]; then echo "load-manifest ERROR: MANIFEST.md not found" >&2 exit 2 fi MTIME=$(stat -f '%Sm' -t '%Y-%m-%d %H:%M' "$MANIFEST") python3 - "$MANIFEST" "$MTIME" <<'PY' import json, sys path, mtime = sys.argv[1], sys.argv[2] content = open(path).read() wrapper = f"""# MANIFEST.md (auto-loaded by load-manifest hook) Source: {path} Last modified: {mtime} --- {content} """ print(json.dumps({ "hookSpecificOutput": { "hookEventName": "SessionStart", "additionalContext": wrapper, } })) PY
The generalizable principle: before you build a trigger list, ask whether you could just load the thing every session. Always-load beats conditional-load for small files.
The no-chase rule creates a freshness problem: if the staff can never ask me for status, the files go stale on their own schedule. The dump protocol, designed July 8, is the answer: a push-only intake with exactly two channels, a fixed routing table, and a receipt.
Each dump is parsed into typed nuggets, relative dates converted to absolute, and routed:
| Nugget type | Routes to |
|---|---|
| Status and facts about my situation | Current-state block in memory, plus the matching project file |
| Priority and focus shifts | Chief-of-staff priorities file (top 3, parked, autopilot) |
| Decisions made or newly weighed | Decision queue: closed with a date, or framed for the board |
| Facts about the key relationship | The relationship graph, freshness stamp bumped |
| Prospect and client facts | The matching account or client file in the graphs |
| Ideas and what-ifs | Ideas backlog: dated, near-verbatim, zero judgment |
| Proof and wins | Session-mining queue, staged for the compound approval flow |
| Feedback on how the staff works | The matching feedback rule in memory |
| Commitments and scheduling | Avery's threads file |
| Feelings with no action attached | Nowhere. Acknowledged once, not filed. The OS stores facts. |
Four rules make it dependable. The dump is sovereign: where it contradicts a file, the file is corrected and the correction noted. Clarifying questions are batched once, three maximum, never dripped. The receipt is one line per nugget: what it was, where it went. And the dump informs but never launches work; I direct, it updates.
The close-out ritual at the end of every session is a skill called retire. Its job is to read the session, extract every reusable nugget, and route each one to its correct existing home. Feedback rules go to the memory shards. QA failures go to the error log. Process improvements go to the nearest runbook. New prospects go to the prospect graph. Ephemeral content gets dropped.
Two design decisions matter. First, retire does not write a session dump: a dated everything-that-happened file is not loadable in a future session, so the knowledge never gets reused. Routing into files that are already part of the load path is the whole point. Second, classification is driven by the live folder architecture, not a hardcoded taxonomy. Every invocation starts by scanning the actual folders to build a fresh routing map. If I added a partner subfolder last week, retire discovers it. There is no taxonomy file to update; the filesystem is the taxonomy.
Taxonomies cached in code rot. Taxonomies discovered from the filesystem do not. If you can scan, scan.
Retire works as a confirmable diff: it proposes a routing table with one row per nugget and waits for approval, with a second confirm on any write to a file that has readers beyond my session. At the end it writes a one-page breadcrumb manifest to the Brain's sessions folder showing what went where. The manifest is a pointer, not a copy.
Every Claude Code session leaves a JSONL transcript; 91 are indexed in the Brain. A 40-line Python distiller strips tool calls and system noise, which is more than 90 percent of the bytes, and keeps the asks and the prose. The weekly compounding pass reads new sessions and stages three kinds of candidates: proof points for the client evidence base, product candidates, and material for the next book. Each waits in a queue for approval before it merges anywhere.
This closes a loop the April version left open. The knowledge OS began as a way to give Claude my knowledge. It now also harvests what four months of working sessions produced, which would otherwise sit unread in multi-megabyte log files.
The build that was deliberately refused, and fifteen principles in rough order of payoff. The first ten date to April; the last five arrived with the staff layer.
Every few weeks I talk myself into the idea of turning my whole computer into a local NotebookLM: an 8-layer system that indexes every file, extracts entities, builds a graph layer, exposes a query UI, and makes the whole machine queryable. I scoped this build multiple times. I even named it: Personal Knowledge Atlas.
I deliberately did not build it. First, the curated graphs already are what an Atlas would produce, lossily; an indexer crawling the Brain would make a less precise copy of a thing I already have in high fidelity. Second, the querying problem is already solved: Claude Code reads any file I point it at. What I needed was better source selection, which the MANIFEST and its hook provide. Third, the unstructured material that could benefit from indexing is a small slice of the Desktop, queried rarely. A heavy system for rare queries is bad return on investment.
The reframe: a narrow indexer for the dumping-ground folders, plus a well-maintained MANIFEST, captures 90% of the value at 10% of the work. This is the most important meta-lesson from four months of building tooling around Claude Code. The impressive system is usually wrong. Measure friction in the transcripts, not in the feature list, and build only what the friction tells you to build.
Build anti-Atlases. The small thing that works beats the big thing that impresses.
Finder tags encode semantic types that folder hierarchies do not. Red for canonical curated knowledge, green for live deploy, uncolored for everything else. Scope your hooks to colored folders. Claude treats different paths differently, and the harness is where you enforce that.
5 to 15 KB markdown files, structured as graphs, with predictable filename patterns. One Read call loads the whole thing. This pattern outperforms PDFs and document folders in long sessions by a wide margin. It is the single most important technique in this environment.
Long sessions drift. Short sessions force distillation. The cost of restart is only acceptable if you have a close-out ritual that routes reusable nuggets into your key files before you close. Build that ritual. Make it load-bearing.
Write skill descriptions as lists of trigger phrases in the same register you type your prompts in. Not documentation voice. Vocabulary voice. The skill will fire automatically when you talk that way, and you will stop manually invoking things.
If a rule matters enough that Claude forgetting it would be a problem, put the rule in a hook, not in memory. Hooks run by the harness, independent of Claude's context. Memory is load-bearing only when nothing else is.
Split your QA checks into pattern-checkable (hook, inline) and judgment-requiring (skill, on-demand). Both. Not one or the other. The regex layer catches the cheap violations before they reach the judgment layer, which is how you keep the judgment layer from drowning.
If the thing you want available is under 15 KB, load it unconditionally on SessionStart. Do not build a trigger list. Trigger lists rot; always-load does not. This one decision removes an entire category of maintenance debt.
Any skill that classifies things should discover its destinations from the live filesystem at every invocation, not from a hardcoded list. The filesystem changes. Hardcoded lists rot. Scanning is cheap and always current.
When you find yourself scoping an impressive multi-layer system, stop and ask whether the same value is available from two or three small pieces that can be built in an afternoon. The small pieces almost always win on maintenance, reliability, and actual delivered value.
A skill should be a router plus a references directory. The SKILL.md explains when to load which reference. The references hold the actual knowledge. This keeps the router small, makes the skill loadable without reading everything, and lets you version the reference material independently of the routing logic.
An agent is a page of markdown: a role, what she optimizes for, a tool allowlist. At that price, build the roster the work deserves, with one gate: a standing seat requires recurring workload and a written retirement condition. Make the contrarian permanent rather than a review step you remember under deadline, and give advise-only seats read-only tools.
The agent that maintains the machine should not be the agent that certifies it works. Keep an auditor with read-only tools whose entire job is checking claims against live state. Systems that fail silently need a role whose only job is looking.
Anything that runs unattended writes to a staging folder, a queue, or a draft. Nothing merges into canonical files and nothing leaves the machine without sign-off. This one rule is the difference between automation you trust at 6:40 a.m. and automation you audit at 9.
Current state enters the system through a single intake ritual that routes each item to its home and returns a receipt. Agents flag what they are waiting on once and never re-ask. A fresh dump outranks every file on disk.
Session logs are an asset once a distiller strips the tool noise. Index them, distill them, and run a recurring pass that stages proof points, product candidates, and book material for approval. The system's operating history is a source, not exhaust.
This manual documents the environment I run my own firm on. The RBD. Firm Operating System is that environment packaged for yours: teams of agents including a chief of staff, an advisory board, a go-to-market team, and a systems team (an architect who reviews before you build, a read-only auditor who checks claims against live state, a standing contrarian), working skills for each business function (daily intake routing, session retirement into permanent memory, a prose-clarity pass, model cost routing, a system self-documenter, and more), the memory and routing architecture with knowledge graphs and a ten-rule starter doctrine, and teaching guides drawn from curriculum delivered to paying clients.
It is assembled for your firm from three intake answers and delivered by email within one business day. $297, once. Early buyers keep this price as the system grows.
Purchases are governed by the Terms of Sale and Refund Policy. Want it fitted to your practice in a live working session instead: that is the Build Session, $750.