Vincent Tan Bean We← What I build

How it's built

Four maps of how it works.

Each of these is something I built by hand, from need — and then found the industry already had a name for. I’ve drawn each one in the standard vocabulary, and each ends on what the standard tool would add. Together: how code ships, how the agent works, how services run, and how you know it did what it said.

1 · How code ships

How code reaches the households

A self-hosted delivery pipeline, built by hand from need and then mapped onto standard delivery vocabulary. It matched.

How code reaches the householdsA change passes local checks, is pushed, tested, rolled out to every household and verified; a red result rolls back automatically and loops through an agent fix and a human review. 1Before the pushChange readyStarts the looptriggerQuick checksRed: push refusedpre-push hooksPush to mainPush is approvaltrunk-basedChecks green2TestFast testsRed: nothing shipssmoke testsBreak-it testsSpare householdstaging tenantWhat changed?Since each deploypath filtersArmed?Default: practicedry runArmed. Risky parts get a flag, not a restart3Roll out and verifySave last goodBefore buildinglast-known-goodRoll outTo every householdfleet deployAll healthy?Health plus testsverificationLiveDoneendNot healthy4If it goes redAuto-rollbackNo human neededrollbackFile a taskWith the red logsincident ticketAgent writes fixNot its own judgeroll-forwardPerson pushesAfter reviewingapproval gateTags name the standard delivery term. Teal: rollback needs no human.A reviewed fix loops back to the push.
Swipe sideways to pan the diagram.

Automate what needs no judgment; keep a human on what does.

Rollback is mechanical, so it fires unattended. A fix needs a brain, so it waits for a person — because the easiest way to turn a red test green is to weaken the test.

“Didn’t run” is not “passed”.

A check that couldn’t run, or a change set that couldn’t be computed, is red — never rounded to green.

What a standard delivery platform adds

Arriving at the same primitives proves I understand them. What I’d gain by adopting one:

  • GitOps reconciliation — a controller keeps the live system matching the repo, continuously, instead of only at push time.
  • Managed progressive delivery — real canaries that ship to one household first; my fleet shares one image, so a bad build is fleet-wide.
  • Identity-separated runners — short-lived, least-privilege credentials per job; mine uses one long-lived privileged credential and rests on the network perimeter.
  • Delivery metrics for free — the four DORA measures, dashboards included.
The full vocabulary map
What I builtWhat delivery pipelines call it
Quick checks that refuse a broken push before it leaves my machinePre-push hooks (shift-left)
A push is a human decision, so the push is the approvalTrunk-based delivery, perimeter as the control
One household that exists to be broken by testsStaging tenant / blast-radius control
“Deploy only the parts whose files changed since they last deployed”Path filters + a per-unit revision ledger
Practice mode is the default; arming is explicitDry run / fail-safe default
Parts too risky to bounce automatically get a flag, not an actionManual approval gate
Snapshot the running version before building the new oneLast-known-good image tag
Household health table + post-deploy testsVerification gates
Undo automatically on redAutomated rollback (cuts time-to-restore)
Failure files a ticket; an agent fixes; a human pushesRoll-forward behind a human approval gate

2 · How the agent works

How the agent runner works

An autonomous agent that works its own queue: an explicit state machine with a checkpointer and a hard human approval gate, built from first principles and later mapped onto standard agent-framework vocabulary.

How the agent runner worksA scheduled agent runner wakes and decides, does the work with a checkpoint, then hands the result to a human approval gate. 1Wake up and decideScheduled tickOn a timerentry pointReconcileWhat changed?stateFetch queueRead open taskstool nodeAnything to do?Else, quiet exitconditional edgeTask ready, or resume2Do the workTake the taskClaim or resumecheckpointerAgent worksTools and commitsLLM nodeReported back?No: stays openconditional edgeLeft openNext tick resumescheckpointReported back3Hand to a humanRecordWho did whattool nodeHuman approval gateThe agent never approves itselfhuman-in-the-loopHand overHuman has the ballendTags name the standard framework term. Dashed: saved state. Teal: where a person decides.
Swipe sideways to pan the diagram.

What an agent framework adds

Arriving at the same primitives proves I understand them. What I’d gain by adopting one:

  • A standard graph API — the next engineer reads a known shape, not my bespoke control flow.
  • Visualisation and tracing for free — this diagram had to be drawn by hand.
  • An ecosystem — ready-made nodes, integrations, checkpoint backends.
  • Other people’s bug reports — every edge case I hit alone, thousands have already hit.
The full vocabulary map
What I builtWhat agent frameworks call it
Task status that survives restarts and crashesState (persisted graph state)
“Anything to do?” · “Did it report back?”Conditional edges
One agent turn: the model reasons and calls toolsAgent / LLM node
The task queue, version control, commit helpersTool nodes
A baseline snapshot + attempt counter, so a killed run resumes where it wasCheckpointer (durable execution)
The review gate the agent cannot pass on its ownHuman approval gate
Chaining several related tasks in one warm sessionBeyond the vanilla graph — custom

3 · How services run

My platform mapped onto Kubernetes

I built the equivalent by hand, from need, and can map it primitive for primitive. I don’t run Kubernetes — this shows which of its pieces mine correspond to, and where they don’t.

My platform mapped onto KubernetesHand-built platform pieces grouped by how Kubernetes relates to them: control loops it provides, workloads it hosts, and the host layer it runs on. 1Control loops Kubernetes providesReconcile loopShould vs. iscontrollerSupervisorRestarts crashesrestart policyMemory checkBefore model loadschedulerHostname routerHost to serviceIngress2Workloads, one namespace per householdHousehold stackIsolated per homenamespacesApp servicesStatelessDeploymentConfig, secretsLoaded per stackConfigMap+SecretDatabasesKept off k8sStatefulSet3Host layer the cluster would sit onShared foldersMounted inPersistentVolumePort forwardingHost-to-VM rulesreplaced by DNSHost servicesHonest gapnot yet a podTitle: what I built. Tag: what Kubernetes calls it. Dashed: not a clean one-to-one.
Swipe sideways to pan the diagram.

What Kubernetes adds

Each piece above is its own hand-built mechanism with its own failure modes — about five separate systems for reconciliation, restarts, scheduling, routing and isolation. Kubernetes makes them one model: one declarative spec, one control loop, one way to route, isolate and schedule. The value isn’t any single primitive — it’s that they’re the same substrate, so they compose, and everyone who’s run it before has already hit my bugs.

4 · How you know

How you know the agent did it

Proof is made at the tool, checked at the boundary, and audited in the agent’s reply — built from need, then mapped onto standard reliability vocabulary.

How you know the agent did itProof is made at the tool, checked at the boundary, and audited against the record in the agent reply. 1At the tool: each action hands back proofFile writeReturns a checksumread-after-writeHonest exitCan't fake successpipefailBackground jobStarted, not done202 AcceptedSearchSays why it endedhas_more2At the boundary: no proof, no passOne proof shapeMachine-checkabletyped schemaCheckpointNo proof, no passcontract checkGradual rolloutOne tool at a timefeature flagMaker firstThen the checkerexpand-contract3At the reply: words versus the recordClaim checkAgainst the tracegrounding checkCannot check?Never says cleanpass/fail/skipAI judgeRetiredLLM-as-judgeEmail deliveryNot built yetdelivery hooksTitle: what I built. Tag: the standard term. Dashed: retired, or not built yet.
Swipe sideways to pan the diagram.

Absence of evidence is not evidence of success.

An empty search, a quiet error stream, a job that hasn’t reported back — each one used to read as “fine”. Every piece above exists to make “I don’t know” look different from “it worked”.

What the standard tooling adds

Arriving at the same primitives proves I understand the problem. What I’d gain by adopting the standard tools instead of my own:

  • Tracing for free — OpenTelemetry gives every tool call a span; I built my own trace.
  • Schema validators — off-the-shelf libraries enforce the contract I hand-check.
  • Contract tests — Pact-style tests catch producer/consumer drift before deploy, not after.
  • Signed proof — signed attestations make receipts tamper-evident; mine aren’t signed yet.

Building something similar, or think I could help? I’m always up for a conversation.

Email me →