I keep doing this thing where I open a new AI session and expect it to remember why yesterday mattered.
It never does.
Not because the model is bad. The model can be brilliant for ten minutes. Sometimes for two hours. The problem is that the work is not ten minutes long. The work has yesterday in it. It has the decision you already made, the thing you tried and killed, the weird constraint that only makes sense if you were there when it became a constraint.
And if the session forgets that, guess who becomes the database.
Me.
Very scalable. Great architecture. Someone should put it on a cloud diagram.
So I built the boring version.
A private repo. A few markdown files. A dashboard. Some scripts. A rule that sounds too strict until you live with it for a day: a mission is either 0 or 100. It is not done because the assistant says it is done. It is done when there is proof.
Commit hash. Screenshot. Generated state. Report. Command output. Live URL. Pick one. Prefer more.
The pieces are not glamorous:
MASTERPLAN.mdsays what the machine is trying to becomeMISSION_STATE.mdsays where we are right now- tickets are markdown files with dependencies
- work happens in disposable git worktrees
- the dashboard is generated from repo state
- local models handle cheap bulk work
- Scribe audits whether yesterday survived
- Promoter turns the proof trail into things I can publish
This sounds small.
It is small.
That’s the point.
The project was called JARVIS, which is a ridiculous name and also exactly the name you pick when you are building something for yourself at 2 a.m.
The first useful thing was not intelligence. It was orientation.
Every session starts by reading the same files. The plan. The current state. The tickets. The rules. The things I am not allowed to relitigate just because a new chat window feels like a fresh universe.
That changed the shape of the work immediately.
Before, a new session started with me explaining the world again. What we built. What broke. What I wanted. What I definitely did not want. What was parked. What was promoted. What was killed.
After, the repo explained the world.
I stayed the editor.
The repo became the memory.
<rect x="250" y="18" width="120" height="38" rx="5" fill="var(--bg-alt)" stroke="var(--border)" stroke-width="1.5"/>
<text x="310" y="42" text-anchor="middle">MISSION_STATE</text>
<line x1="310" y1="56" x2="310" y2="88" stroke="var(--ink-3)" stroke-width="1" opacity="0.35"/>
<rect x="470" y="25" width="110" height="38" rx="5" fill="var(--bg-alt)" stroke="var(--border)" stroke-width="1.5"/>
<text x="525" y="49" text-anchor="middle">tickets</text>
<line x1="470" y1="44" x2="390" y2="104" stroke="var(--ink-3)" stroke-width="1" opacity="0.35"/>
<rect x="28" y="106" width="112" height="38" rx="5" fill="var(--bg-alt)" stroke="#10b981" stroke-width="1.5"/>
<text x="84" y="130" text-anchor="middle" fill="#10b981">worktrees</text>
<line x1="140" y1="125" x2="230" y2="125" stroke="var(--ink-3)" stroke-width="1" opacity="0.35"/>
<rect x="480" y="106" width="112" height="38" rx="5" fill="var(--bg-alt)" stroke="#10b981" stroke-width="1.5"/>
<text x="536" y="130" text-anchor="middle" fill="#10b981">dashboard</text>
<line x1="480" y1="125" x2="390" y2="125" stroke="var(--ink-3)" stroke-width="1" opacity="0.35"/>
<rect x="72" y="188" width="92" height="38" rx="5" fill="var(--bg-alt)" stroke="#6366f1" stroke-width="1.5"/>
<text x="118" y="212" text-anchor="middle" fill="#6366f1">Scribe</text>
<line x1="164" y1="202" x2="242" y2="156" stroke="var(--ink-3)" stroke-width="1" opacity="0.35"/>
<rect x="456" y="188" width="104" height="38" rx="5" fill="var(--bg-alt)" stroke="#f59e0b" stroke-width="1.5"/>
<text x="508" y="212" text-anchor="middle" fill="#f59e0b">Promoter</text>
<line x1="456" y1="202" x2="378" y2="156" stroke="var(--ink-3)" stroke-width="1" opacity="0.35"/>
The three-day plan was intentionally too tight.
Not because I enjoy stress. I have enough hobbies.
Because loose systems let you keep adding furniture before the house has plumbing. I wanted the factory, not all the furniture. The operating system, the compute layer, the satellites, the publishing surface, and the final demo.
Day one was the boring spine: process, decisions, tickets, worktrees, dashboard.
Day two was the machine room: local model, router, night shift.
Day three was the public layer: Scribe, Promoter, the personal site, the post you are reading now.
Some things got parked.
Hermes got evaluated and parked. Multi-machine inference got killed for the three-day window. A security satellite and UX satellite became tickets. The personal website takeover started as a parked idea and then got promoted because the public artifact was clearly the bottleneck.
That is the part I like most.
The system does not just do work. It says no.
The worktree rule did more than I expected.
Main checkouts stay clean. Every task gets a branch under C:\dev\.wt. If the ticket is bad, the worktree is disposable. If the work is good, it merges and disappears.
This sounds like git hygiene.
It is, but the real effect is psychological. A task stops feeling like a permanent mess in the repo and starts feeling like a small room you can close the door on. Agents are better in small rooms. Humans are too.
The dashboard then turns the whole thing into something I can glance at. Current mission. Tickets. Satellites. Score. Worktrees. Reports.
I don’t want to read a dashboard.
I want to notice when it looks wrong.
Scribe was the first satellite that made the system feel less like scripts and more like a machine.
It scans recent commits, tickets, worktrees, and reports. It checks whether yesterday left a trace. It writes a compact daily report. It does not ask me to summarize my day, because that would just make me the database again with nicer formatting.
Promoter was the second one.
Promoter looks at commits, reports, and lessons, then turns them into drafts. LinkedIn. Blog. X. Personal site notes. Slack updates. GitHub profile text. Project ideas. It also designs the visual cards now, which is useful because “write a post someday” is where public proof goes to die.
It still does not publish for me.
That boundary matters.
Automation that prepares is leverage. Automation that publishes in my voice without me reading it is how you wake up to a post that sounds like a conference sponsor wrote it in a hotel lobby.
No thank you.
The personal site became the strange center of the last night.
I did not want another portfolio page. I have seen enough “builder, writer, operator” hero sections to last a few careers. The useful site is a cockpit: what I am building, what proof exists, what systems are active, what writing explains the work, and what changed recently.
So me.balgaly.com is becoming that.
Not a resume.
An operating profile.
The page is static HTML and JSON. No framework bundle. No external font. An animated system map, reduced-motion support, source rail, proof ledger, writing links, and a small contract that says what the site is trying to be.
The funny part is that the website is not done until it proves the operating system. Which means the website is both the artifact and the test.
Naturally.
The thing I keep coming back to is proof.
Agents are very good at sounding done.
This is not their fault. Humans are also very good at sounding done. We invented status meetings and then acted surprised.
So the system does not accept “done” as a vibe. It wants a command. A screenshot. A report. A commit. A URL. Something external to the sentence.
That one rule made the rest possible.
It made the dashboard honest.
It made the tickets small.
It made the blog post possible, because the story was already sitting in the repo as evidence instead of living in my head as a vague sense that a lot happened.
I’m not saying every AI workflow needs a private JARVIS repo with missions and satellites and a dashboard.
Most people should not name anything JARVIS. Start there.
I am saying that if the agent needs your memory to continue, you did not build a system. You built a very talented interruption.
The chat is useful. The chat is where the work happens while it is hot.
But the chat is not the product.
The operating contract is.
The files that tell the next session what matters. The tickets that say what can start. The reports that say what happened. The dashboard that makes drift visible. The proof that makes lying harder.
That is the part I trust.
Not the model.
The contract around it.