On May 3 I rebuilt my AI work OS from scratch three times before it held. I moved files across four migrations, ran two classifier passes through a two-tier model, and renamed a skill that had been wrong since I first wrote it. Most of what I built before noon was deleted by dinner.

The system I was replacing had been running for a few weeks. It organized everything across four areas: HTO, Blog, Business Ops, and Agent System. Sessions, thoughts, epics, and dashboards all lived inside those areas. The logic was sound on paper. A session working on the blog pipeline naturally belonged under Blog. A thought about infrastructure naturally belonged under Agent System.

The problem showed up the first time a session crossed the line. I was working on HQ-9, a content-side ticket, and found myself opening vault files in three different areas to do one thing. The session manifest pointed at one area. The relevant epics were in another. The dashboard I needed to check was in a third. The hierarchy was logically correct and practically useless.

why clever was the wrong frame

I had built an organizational model that described relationships accurately. That was the mistake. Describing relationships accurately is what a knowledge graph does. A work OS needs to do something simpler. It needs to tell you where to put a file without thinking.

The four-area model required thinking every single time. Was a session about building the blog ingester under Blog because it serves the blog, or under Agent System because the ingester is an agent? The answer changed depending on what the session was actually doing that day.

I ran a two-tier classifier pass to try to resolve this. The classifier collapsed the model from four areas to two areas plus JIRA epics. The idea was that JIRA epics would carry the semantic weight, and the two top-level areas would be coarser containers with cleaner edges.

That looked right for about two hours. I shipped the migration. Then I looked at the result and saw the same problem wearing a slightly smaller coat.

the second pivot, same day

The insight that finally held was not about areas. It was about what outlives what.

Epics are projects. Projects end. When a project ends, its epic closes, its tickets close, and the organizational unit that held everything together disappears. If sessions and dashboards and notes are organized primarily by epic, they go stale at the same rate the epic does. You end up with a hierarchy that was useful during the project and noisy afterward.

Components are different. Blog is not a project. It is a surface I am building indefinitely. Agent System is not a project. It is a layer of tooling that keeps running. Components have dashboards that stay relevant because the component keeps going. They accumulate context across multiple epics without disappearing when a ticket closes.

I switched from epic-tier organization to four stable components: HTO, Blog, Business Ops, Agent System. Same words as the original four areas. The difference was the logic underneath them. Instead of areas-as-categories, they became components with per-component dashboards generated from the session manifest. Manifest-sourced views meant I was not maintaining an overview page by hand. The component dashboard was always current because it was computed from ground truth, not edited by a human on a bad day.

The two classifier passes I ran earlier were both trying to solve the wrong problem. The classifier was deciding which category a piece of content belonged to. The real question was which stable noun it should live next to for the next year.

the rename that revealed a wrong assumption

Somewhere around mid-afternoon I changed /done to /close.

On the surface that is a one-word rename. What it exposed was a conflation I had been carrying for weeks. Done meant the session was over. Close meant the work item reached a terminal state. Those are different moments, different objects, different states. A session can end without the work being done. Work can be done while a session is still open. Collapsing them into one verb meant I was treating session state and work state as the same thing, and the skill was enforcing that wrong mental model every time I ran it.

The rename cost an afternoon of updating references. It was worth it. Naming things precisely is not ceremony. It is the only way to notice when two things you thought were one thing are actually two.

the gap a ticket-only system cannot cover

JIRA-only organization has a blind spot. Work that does not map to a ticket.

Not all work is ticketable. Research, architecture decisions, exploratory sessions, context-building for future work. This is real work. It takes real time. If your system can only represent work that has a JIRA ID, it systematically undercounts the actual operation. I added a manual-task layer for this. A session can attach to a task that lives in the vault instead of in JIRA, with the same manifest-linking behavior. The session gets counted, the context gets captured, the work shows up in the dashboard.

In parallel with the structural overhaul, I applied the same shift to the content side. HQ-9 got reparented under a new blog epic. HQ-10 through HQ-15 got created. Content engine, ingester work, distribution layer, each with a ticket and a per-ticket working-folder convention so blog scratch work lives next to the task that produced it. Draft files, source material, classifier outputs all land in the ticket folder. The convention is the same logic as the stable-component idea. The question is not what category something belongs to. The question is where you will look for it in three months.

what this actually cost

Seven migration phases, two classifier passes, four model revisions, and most of a working day.

The agents I used for the classifier passes did their job accurately. The two-tier collapse was technically sound given the question I asked. I asked the wrong question. That is not a Claude failure. That is the kind of mistake that happens when you trust the model in your head more than the friction in the actual workflow. The classifier computes the right answer to the specification you give it. When the specification is wrong, correct output and wrong output are indistinguishable until you try to use it.

The right signal arrived mid-afternoon, when I noticed I was still having to think every time I filed something. A work OS that requires classification on every write is not a work OS. It is a filing system with ambitions.

If your agent workspace needs a paragraph to explain what a session belongs to, the hierarchy is already too clever to survive real use. Your agent system needs boring nouns before it needs clever automation.