Writing
JARVIS Became LifeOS. This Weekend, It Learned How to Ship Safely.
AI Automation LifeOS DevOps

JARVIS Became LifeOS. This Weekend, It Learned How to Ship Safely.

A month ago I wrote about building my own JARVIS, a local-first AI hub with voice, memory, tools, and a Second Brain that could carry context from one session into the next.

The question behind that project was simple:

What would it look like if AI actually lived in my workflow instead of waiting in a browser tab?

At the time, I thought the answer was a better assistant.

I was wrong about the unit of design.

The next step was not one smarter AI employee. It was an organization: specialists with distinct responsibilities, shared context, written authority, escalation rules, and a system for turning what they learn into durable improvements.

JARVIS was a product. LifeOS is an operating model.

And this weekend, that operating model learned how to take a bounded software change from an idea to production without using me as the transport layer.

That last clause matters. I did not hand an AI the keys to the company and walk away. I built a chain of authority in which every participant can do its job, no participant can quietly do someone else's, and the system is expected to stop when the evidence runs out.

This is the story of how I got there.

JARVIS solved context. LifeOS had to solve responsibility.

JARVIS began as a local desktop command center. It could search email, create tasks, prepare a morning brief, capture voice notes, assemble project updates, and remember the pieces of my life that normally disappear between apps.

That was useful, but months of daily use exposed a problem with the all-purpose-assistant model: one AI wearing every hat eventually blurs the hats together.

The assistant triaging my inbox should not think like the one reviewing my health data. The one watching cash flow should not have the same authority as the one organizing household work. And none of them should improvise where their responsibility ends.

So I reorganized my life into a "Corporation," and the system into ten "executives".

The LifeOS executive team: ten AI executives, each with a named role, from Chief of Staff to Household Operations

Leo is chief of staff and runs the morning brief. Donna owns calendar, communications, and protected time. Marty is CFO. Huberman watches sleep, training, and health. Alfred runs the household, including a chore rotation my kids have learned to fear. Tony is CTO. Jony owns product and design. Feeny handles learning. Andy runs operations. Simon handles marketing.

The names give the roles a usable identity, but the personalities are not the architecture. The operating manuals are.

Each executive has an in-depth written domain, explicit authority limits, required evidence, and rules for when to act, when to escalate, and when to stay quiet. They share a governed operating environment rather than a single giant prompt.

The org chart was the easy part. The constitution was the real work.

Yes, it has a constitution

LifeOS runs under a written constitution with rules that do not bend just because a model sounds confident.

Recommend, never move. No AI touches money. Marty can build the P&L, flag an unusual charge, and recommend a transfer. Executing it is mine, every time, at every dollar amount.

Protected time is not inventory. Donna cannot offer my workout block or my kids' events to make room for a meeting. Those times are not merely busy. They are outside her scheduling authority.

Never fabricate a signal. If the data is missing, the answer is that the data is missing. An AI that guesses to look competent is worse than no AI at all.

The three-decision ceiling. Outside a real emergency, the system may not place more than three decisions in front of me at once. The executives have to prioritize before they escalate.

Red interrupts. Yellow waits. Green stays quiet. Emergencies reach me immediately. Important, non-urgent items wait for the brief. Routine work happens silently. My phone does not buzz to tell me that nothing happened.

That last rule became more important than I expected. Automation is supposed to remove cognitive load, not convert every healthy background process into a tiny approval ritual.

At one point, for example, Jony's product acceptance could be invalidated by an ordinary application restart because operational timestamps changed. Technically, the system was being cautious. Practically, it was asking the CEO to reapprove the same product evidence because a heartbeat moved.

We fixed the contract so routine heartbeats refresh silently while a material evidence change still reopens review. That small episode captured the larger design principle: governance should preserve judgment, not manufacture chores.

The first JARVIS post argued that the model is the reasoning layer and the product is everything around it. LifeOS is my answer to what the most important part of “everything around it” turned out to be.

It is authority.

Memory tells the AI what is true. Governance tells it what it is allowed to do about it.

Then the organization became productive

LifeOS now runs 41 governed scheduled jobs. It prepares briefs, checks operational state, reconciles inputs, watches for drift, and surfaces decisions through a Boardroom instead of scattering them across chat windows.

The executives also notice problems.

They find a stale workflow, a confusing interface, a missing validator, or a piece of operating doctrine that no longer matches reality. They can frame what is wrong, what “fixed” should mean, what evidence would prove it, and what authority the change would require.

That created an unexpected bottleneck: me.

Every improvement still crossed my desk by hand. I copied the request into a coding agent. I carried the result into Git. I ran tests. I found a reviewer. I merged the pull request. I deployed it to my local production host. Then I checked whether the live LifeOS runtime actually matched the repository.

I had built an automation organization, and I was its clipboard.

So the goal for this weekend was not “let the AI write more code.” Coding was already the easy part.

The goal was to remove myself from the mechanical handoffs without removing myself from decisions that require my judgment.

The real product was a chain of custody

The finished path looks straightforward on a diagram.

The LifeOS delivery pipeline: intake, sandboxed development, signed review, risk gate, exact-commit deployment, and always-on verification

A structured change request is claimed by a dispatcher. Codex implements it in an isolated worktree. A different model reviews the immutable result. GitHub-hosted CI checks it. A risk gate decides whether it may proceed automatically. An approved Green change merges. Production deploys the exact authorized merge commit derived from the reviewed head, proves the runtime is healthy, and retains the evidence.

But the arrows in that diagram are not ordinary integrations. Each arrow is a trust boundary.

The core artifact is not the code. It is the chain that connects:

original brief → exact commit → independent review → required check → merge identity → deployed identity → live health evidence

If any link changes, the authority does not carry forward.

That is the part I spent the weekend building.

A change starts as a contract

GitHub is now the durable source of truth for LifeOS engineering work: intake, implementation, test evidence, review state, merge authority, and deployment history.

Every automated change begins with a structured Issue Form. It requires the exact brief, measurable acceptance criteria, affected scope, a threat model, the highest data classification involved, a proposed risk tier, a reviewer route, and a rollback plan.

This is not paperwork added after the work. It is the executable boundary around the work.

The dispatcher rejects incomplete contracts. It rejects unauthorized authors. It rejects confidential payloads and credential-shaped material. It rejects Red work from the unattended path. A malformed request does not receive a clever best effort. It fails closed.

That is a recurring theme in LifeOS: ambiguity is not permission.

Development happens in a padded room

The dispatcher runs locally as a scheduled task. When it sees a valid, claimable request, it refreshes the exact canonical main branch, creates a disposable Git worktree, and starts Codex inside it with network access disabled.

The coding agent can read the repository and modify the assigned workspace. It cannot browse for secrets, reach external services, push a branch, or improvise a GitHub operation. GitHub writes belong to a separate, hash-verified wrapper with a narrow contract.

When implementation is complete, the dispatcher verifies the staged diff, scans for credential-like material, pushes the branch through that wrapper, opens a pull request, repeats the original brief in the PR body, and binds the work to the exact commit it produced.

The original request survives the trip verbatim. That matters because review routing and acceptance must be reproducible later, not reconstructed from somebody's memory of the assignment.

The author cannot approve the author

Codex is the developer. Codex does not approve its own work.

Every change is reviewed by a separate AI against an immutable package containing the brief, the exact diff, and a bounded read-only snapshot. Most work routes to Claude for business-analysis traceability and QA. A brief that explicitly requires both Jony and Tony routes to those two executives separately for product and technical review.

The result is signed on my machine. A small publisher validates the signed evidence and creates a GitHub Check Run through a least-privilege GitHub App.

The App can write checks and read only the pull-request metadata it needs. It cannot merge. It is powerful only because the repository rules require a check from that exact App identity.

The approval is bound to the current head SHA. Push one more commit and the approval is no longer valid.

Reviews are also bounded: one initial review, at most one remediation review, and never a third pass under the same goal. Review findings must map to the original brief or declared threat model. AI reviewers are tireless. That is precisely why they need a stopping rule.

Untrusted code stays off the production machine

All pull-request checks run on GitHub-hosted ephemeral runners. The pipeline currently requires seven gates: the change-request policy, Python tests, repository policy, dependency security, two UI builds, and the signed LifeOS review authority.

Every third-party GitHub Action is pinned to an immutable commit rather than a movable version tag.

The deeper rule is simple:

Untrusted pull-request code never executes on my production machine.

The machine running my actual LifeOS environment only sees code after it has been merged, reviewed, and authorized by hosted preflight. Disposable infrastructure handles untrusted code because disposable infrastructure is what untrusted code is for.

Two trust zones: GitHub's disposable cloud infrastructure and the production machine, connected only by signed review verdicts and one re-verified merge commit

Risk is mechanical, not persuasive

The three risk tiers: Green ships itself, Yellow waits for a human decision, Red stops the line for the CEO

Green changes are low-risk and reversible: documentation, tests, generated metadata, narrow copy changes, or isolated UI corrections. Green may auto-merge after every required gate passes.

Yellow changes alter bounded behavior. Yellow remains manual while Green earns an operating history.

Red changes touch governance, authentication, credentials, sensitive data, money, calendar writes, protected time, integrations, deployment behavior, security controls, or other consequential boundaries. Red waits for me.

The classification is not just a label somebody can argue with. Protected paths mechanically escalate the work. A pull request that touches workflows, governance, integrations, or deployment code is Red even if its author calls it Green.

The merge workflow runs against canonical policy from main. It never checks out the pull request's code. It re-reads the risk label, changed paths, review identity, and current head directly from GitHub. If eligibility disappears, an existing auto-merge request is revoked.

The automation cannot talk its way into more authority.

The weekend did not go cleanly

This is where the story became more interesting than the architecture diagram.

The pipeline failed five distinct ways on its path to a complete proof:

  • a Windows text-encoding bug wrote a configuration file with the wrong byte-order marker;

  • a workflow lacked the permission GitHub native auto-merge actually required;

  • GitHub's recursion guard prevented an Actions-token merge from triggering the normal push deployment;

  • the dispatcher held a stale canonical branch reference during a proof attempt;

  • and a review-state race treated an actively running signed review as if it had already failed.

There were other hardening details too: pinning the production Python and Hermes launchers, validating a detached deployment against the canonical remote ref, and making the dispatcher reinstall transaction safe.

None of that is glamorous. All of it is the work.

The important result was not that the pipeline had no bugs. It was that each defect stopped the chain before unauthorized work reached production. The failures produced evidence instead of guessing their way forward.

The recursion guard was my favorite.

GitHub deliberately avoids triggering new workflows when a workflow's own token performs an action. That prevents infinite bot loops. It also meant an automatically merged Green pull request could land successfully and never deploy, because the usual push event did not exist.

The fix was an explicit handoff with no inherited trust. After the merge, the canonical merge workflow dispatches the production workflow with the exact merge SHA. The deployment gate then treats that input as a claim, not a command. It independently proves the SHA is the current tip of main, verifies the undeployed range is eligible, checks the exact authorization phrase, and rejects stale or duplicate requests.

The dispatch rings the doorbell. The production gate still checks ID.

We also tested the thing nobody likes to test

Deployment is not successful because a script exits zero.

The production runner checks out one exact authorized SHA, deploys the governed LifeOS profile transactionally, verifies the Hermes profile, probes the Boardroom UI and API, compares all managed jobs and runtime content, runs the doctrine audit, and records a GitHub deployment with sanitized evidence.

Then we deliberately made it fail after the live files had already changed.

The rollback restored all 62 governed files byte for byte. The before-and-after scope hashes matched. All 41 scheduled jobs still matched their specifications. Hermes health passed. The Boardroom UI and API answered. The doctrine/runtime audit came back clean.

Rollback stopped being a sentence in a runbook and became observed behavior.

Monday, 12:07 p.m.

The build happened over the weekend. The clean proof arrived Monday.

At 11:59 a.m. Eastern, I submitted one intentionally boring Green contract: add a single documentation file containing a prescribed phrase, the issue number, the baseline commit, and a verification section. Change nothing else.

The dispatcher claimed it from canonical main. Codex created the one-file change in its sandbox. The dispatcher opened the pull request. GitHub-hosted CI passed. Claude reviewed the exact head. The signed App check appeared. Native auto-merge merged it without a manual merge command.

At 12:06 p.m., the merge landed.

At 12:07 p.m., the exact merge commit had passed the production authorization gate, deployed successfully, cleared the profile and Boardroom health checks, and completed the doctrine/runtime audit.

It was a documentation file. That was the point.

The first end-to-end autonomous production proof should be boring. You do not prove a new brake system by aiming at a cliff.

LifeOS had taken a bounded request from contract to production without me copying a prompt, moving a diff, chasing a review, pressing merge, dispatching a deployment, or deciding whether the evidence counted.

For that class of change, the policy had already decided.

by-the-numbers

Where I still sit

I did not automate myself out of the decisions that matter.

I still own risk policy. I still approve every Red change. I still hold the budget, the credentials, deployment cutover authority, and the kill switch. Money does not move. Protected time does not become inventory. Sensitive actions do not become automatic because the pipeline is convenient.

Yellow work is still waiting. Green gets to earn trust first.

What changed is that I am no longer required to carry every artifact from one responsible party to the next.

The judgment stays. The clipboard is gone.

What actually changed from JARVIS to LifeOS

The visible change is that one assistant became ten executives.

The deeper change is that the system gained institutions.

It has a constitution. It has separation of duties. It has evidence requirements. It has risk tiers. It has limited terms of authority. It has an appeals court of exactly one human. It has a software delivery process that can improve the operating system without bypassing the operating system's rules.

The first JARVIS post ended with four words: context, memory, tools, trust.

I would write that list differently now.

Context lets the system understand the work.

Memory lets it carry truth forward.

Tools let it affect the world.

Governance determines whether it deserves to.

That is the evolution from JARVIS to LifeOS. It is not primarily a story about a smarter model, ten AI personalities, or an elaborate CI/CD pipeline.

It is a story about turning intelligence into bounded agency.

The engines are getting cheaper and more capable every month. The interesting engineering is in the brakes, the lane markers, the handoffs, and the proof that the vehicle actually stopped when it was supposed to.

This weekend, LifeOS did not become autonomous in the science-fiction sense.

It became trustworthy enough to ship one boring thing on its own.

That is a much more useful milestone.