Megan Casebier

Essay · 14 min read

Delegate the labor. Write down the judgment.

Agents made labor cheap. Judgment costs what it always did, and it doesn’t delegate. So for about six months I’ve written mine down: a ledger that outranks everyone, a gate that checks everyone, and lanes that refuse each other’s work. This is the case for that law, the receipts for what each piece of it cost, and the day it earned the one job I’d kept for myself.

The order arrived in the wrong terminal. It was a full case-study rebuild: new structure, approved copy, an image plan, reminders about the gate. The agent that received it builds demos, in a different repository, for a different lane.

It checked first, read-only, and changed nothing. Then it filed four holds instead of building. The paste had dropped, and both of its placeholders had arrived unfilled, so it asked for the whole message again. The reference images the order named weren’t anywhere it could find on disk. The order said the rulings were merged on main, and the repository said they weren’t. The fourth hold was the one that mattered.

Holds

The paste dropped. Both placeholders arrived unfilled: [paste … contents here] and [paste … contents here]. Without the first, I don’t have the approved copy (Part 2) that R-227 and R-228 edit. Per the order, please resend the whole message.

The Ferrari images didn’t arrive. ferrari-rail-crop.png and ferrari-full-clean.png aren’t in the message or anywhere I can find on disk. Please attach them or give me their path.

“Merged on main” doesn’t match the repo. Should I wait for the rulings branch to merge and then branch from main, or build on r227-quote-builder-rulings?

Routing. I’m the demos agent for [the demos repo]. Under standing law the site agent owns [the site repo], and I’ve never worked with a “foreman”. Is this case-study rebuild meant for me, or for the site agent? If it’s mine, please confirm the lane change and who the foreman is, so that my PR doesn’t collide with the site agent’s work in the same repo.

Four holds instead of a build. Bracketed phrases replace location-revealing text.

Then it waited for a confirmed lane change before touching anything.

It was the most useful thing an agent did all week, and it did nothing at all.

Labor delegates. Judgment doesn’t.

Here’s the problem as anyone running agents feels it. Building is cheap now: describe a screen and you get a screen, describe a fix and you get a pull request. What you can’t hand over is the part that decides: which claim is true, which image is safe to publish, whether this is the order you meant, whether it ships. Delegate the labor without the judgment and you don’t get a team. You get a fast, confident stranger with access to production.

I’ve run agent fleets for about six months, across several repositories and several fleets, on work prototypes and this portfolio site alike. The ledger’s ruling numbers run in one sequence across the site’s sessions and the work-side ones, which is why it has gaps that aren’t missing law. The answer was never a better prompt. It was law, in three parts.

A ledger that outranks everyone. Every ruling is numbered and dated. Rulings beat every other authority in the repo, and none is edited in place: a superseded ruling gets a new number and a pointer.

A gate that checks everything. Nothing publishes until a script has read every page for figures the record doesn’t hold, and every image and video for blocked words and real faces. A deploy runs only on the gate’s passing exit code.

Lanes that refuse each other’s work. Each agent has one job in one place. Builders build, the foreman gates and merges, and no lane’s work gets merged into another lane’s. An order addressed to another lane comes back unexecuted.

The cast is small.

  • I’m the principal. I own every deploy and answer every hold.
  • The assistant drafts orders and answers on my side of the wall. Every order arrives “from the principal via the assistant.”
  • The foreman is the site’s long-lived agent. It owns the gate, the ledger, the numbers and the merges.
  • The contractor builds on its own branch and never gates or merges.
  • The demos agent lives in another repository entirely.

That separation has a price, and it’s me. Agents can’t reach each other’s terminals, so every order between lanes travels through my side of the wall, and anything carried by hand can be misdelivered. The working document says the principal should touch decisions, not transport. I’m not there yet. I take the cost. The alternative is agents that route work to each other on their own judgment, and the refusal above is what the cost buys.

That’s the trade. The generic version of all three parts, written so anyone can run it, is the working document, the Foreman Method.

Every rule has a scar

The method wasn’t designed in advance. The rules that do the most work each arrived with an incident attached, and the ledger records the incident next to the rule. These carry the rest.

Nothing deploys on an agent’s word

The site’s governance landed before any workstream did. The first batch of rulings committed the ledger and the facts files, and merged them, before a single page changed. The same day, the site already live under my name was found carrying material from work it should never have shown, including a reproduced message thread. It came down on an expedited path. That meant a condensed review, my merge go and a deploy, then live checks that the file returned a 404 and the banned strings were gone from every page and preview.

Once the leak was closed, the fast path closed with it. R-29 restored the standing rule: nothing deploys without my explicit “deploy go” in session. The first deploy under it found a second lock nobody had written down, at the host. Since then, “locked” has meant both locks, and an unlocked window holds exactly one deploy. Every deploy since has had the same shape: gate, unlock, deploy, lock, verify, with the previous version one redeploy away.

The go was mine. For a long time it was the only job I never handed over.

Gate → Unlock → Deploy → Lock → Verify

Previous version: one redeploy away.

The shape of every deploy since.

Stop, cite, ask

An independent review, relayed through the assistant, ordered a fix: a bracketed phrase inside a published quote looked like a leftover placeholder. The foreman held. The brackets were deliberate and already ruled on: the quote’s original words named a colleague, and the brackets told the reader those words weren’t the speaker’s. Removing them would have presented substituted words as the speaker’s own. So the foreman named the ruling the order contradicted and asked which side I meant. The order was wrong. The flag was my side’s error.

What came out of it is now standing law. When an order contradicts a standing ruling, the agent holds that item, names the ruling it conflicts with, and asks rather than executing either side, while the rest of the order proceeds. Holding isn’t stalling. It’s the only honest answer an agent has when two of my instructions disagree.

The agent was right.

Keep the bracket (R-206), or move the line out of quotation marks as a paraphrase?

The hold as filed: one question, two answers, no guess.

Write every order for a stranger

One early ruling exists in the ledger only as a commit message from the session it was meant for, saying it never arrived. The ledger’s missing stretch was later rebuilt from commit history, and the instruction was to flag whatever couldn’t be reconstructed rather than invent it. The rebuild lists the rulings it couldn’t attest, by number, as unknown. Later, a batch of answers was lost to a connection outage, and the next order replaced it whole rather than patching it from anyone’s memory. A request that carried a placeholder for a bullet that didn’t exist was asked about, not filled. After one deploy, the foreman’s own context compacted, and the next order opened by telling it to assume nothing from its earlier context. The misrouted rebuild order dropped its placeholders too, and it met the same answer: resend the whole message.

So every order is now written to survive total amnesia on the receiving end. It names its addressee, carries its own sources, and assumes nothing from the session’s earlier context.

Context windows die. The ledger doesn’t.

A removal is not a rule

The first exposures were in text and in pixels. Captures on a page that has since been cut showed colleagues’ names, so the page came down with its thumbnail and share image. The image audit then joined the definition of done, covering derived and cropped images and everything already published, not just new files. Carrier names came off the site unless a public source named them. Later, the principal’s blocklist moved into the gate itself: case-insensitive, with spelling variants, over page text and filenames. Each check was proven by planting a violation on a throwaway branch. The no-faces rule arrived when re-staged captures turned out to carry real photo avatars. Its reasoning is one line: a photo is a likeness whatever name sits under it.

Then the list showed its limit. A real carrier name sat live on a published screenshot for days. An earlier fix had deleted a different file carrying the same name, but never added the name to the list. The pixel scan had read the name correctly. Nothing was looking for it. The fix went in at the master image and at the list both. The gate was proven to fail on the old main before it passed on the new branch.

A removal isn’t a rule. The list is how the gate remembers what we took out.

TEXT case-studies/obie-homeowners/images/coverage-customization.webp [carrier]
The gate failing the old main on purpose, before the fix was allowed to pass.

The day the gate was beaten

In October 2026, one preview deploy went out from a publish set the gate had refused. It wasn’t production: it was a draft preview at its own address. The deploy command had piped the gate through a filter that showed only its last lines, then chained the deploy after it. The filter’s exit code stood in for the gate’s, so the refusal never stopped anything. The refusal itself was false. The set had been built in a scratch directory under a private path, and the gate’s path checks matched the whole path, so “no private material” fired on every file. The content was the same set of files that then passed clean.

Nobody caught it. The foreman disclosed it, unprompted, in the same turn, and rebuilt the preview from a clean set.

It’s my gate and my fleet, so it’s my miss. The machine did exactly what the command told it to. Forbidding that command was my job, and the law hadn’t done it yet. Weeks earlier, the ledger had written down that a false refusal is how a gate dies. This one didn’t kill the gate. It went unseen, which is worse.

The repair came with its own bill. Three fixes landed. The gate’s path checks now run from inside the set, so where a set lives can’t trip them. Deploys are gated on the gate’s own exit code. Sets are built outside the private path. Rewriting those path checks left one other check without its closing parenthesis. That check’s command was now a syntax error. The check counted the error’s empty output as zero hits, so it printed “ok” on every run from then until a separate fault surfaced the gap. The same pass found a second hole: videos after the first had never been pixel-scanned, because the first video’s decoder swallowed the rest of the list. Nothing slipped through either gap. They were untested, not exploited. That’s the price: a fix that made the gate quieter, and for a while less true.

Then the law it produced. A deploy runs only on a passing gate, and the repo’s law now forbids filtering the gate’s output before the deploy that depends on it. Any check whose own command errors now fails, which was proven on a deliberately broken check. An incident list records every time something left the gate’s control, even briefly, with its exposure and its resolution. The working document already had the line: a check that can’t fail isn’t a check. Now ours can fail.

gate "$SET" | tail && deploy
gate "$SET" && deploy
One pipe stood between the refusal and the deploy.

Eleven holds, then a build

The rebuild of the quote-builder case study ran about 48 hours from order to locked deploy. It’s the clearest record of the whole machine running end to end. What the page says is the case study’s own business, because it owns its pivot and its climax. This is the machinery.

The order commissioned a full rebuild, and the foreman built nothing. It sent back eleven holds: month anchors with no source, a quote with no clearance ruling, a ship claim beyond the record, a cross-link that was wrong, a headcount to verify. That’s the cost of holds, stated plainly: the rebuild produced no page until every answer came back. I answered each one as an exact edit, old text to new, and the answers became R-227.

Hold 2 was the one that mattered. The draft had put the project’s expensive first direction on an earlier project. The ledger said the half-year story belonged to this one, and the ledger won. The page came out stronger, not just more correct: the costly first act became the project’s own, and the recovery became its story. A memory that outranks the writer wrote the truer page.

The gate checked my answers too

Inside my answers, the foreman found two errors. Two different replacement texts claimed the same section. A quantity I’d imported had no row behind it. Both came from my side of the wall. The gate that checks every builder caught them on the same terms, and R-228 settled them: the quantity was cut, and one wording governs.

Governance that exempts the operator isn’t governance. No exemptions, including me.

88 pixels

The exports were the first control. I delivered them at a final resolution where the sensitive detail doesn’t exist in the pixels. The gate checked them as delivered, with no upscaling, and inspected blown-up crops. One export passed. The other failed. It still carried two photo avatars, each too small to read as a person, and its caption called the screen “as shipped” with no release on record. The no-faces rule has no size threshold.

I approved a mask as a foreman-side edit. Both avatars were painted over with neutral discs in the live page’s grey. A full-frame diff confirmed 88 pixels changed, all inside those two discs, and nothing else in the file moved. The fingerprints went into the ledger: SHA-256 21c4d477…2c10 before, ca18b371…ae0 after. The caption was re-approved to say “as designed.” I acknowledged both misses on the record: photos had come across the wall, and the caption had overclaimed.

The unit of trust isn’t an agent saying it touched only the avatars. It’s a diff anyone can check.

88 pixels changed · all inside two discs · nothing else moved

SHA-256 before: 21c4d477…2c10

SHA-256 after: ca18b371…ae0

The edit, proven rather than promised.

Trust is a diff.

The exception, written down

With every content decision already ruled and both images fingerprinted, I issued a one-time ruling: for this rebuild only, the foreman would build the pull request itself. The ledger records it as not precedent. The discipline came attached. The foreman built on a branch, then gated its own work as a separate pass, with a written report, as if the work had come from another lane: blocklist, faces, numbers, and a fingerprint match on every placed image. The report posted before the preview link. My preview read and my deploy go stayed exactly where they were. The next ruling declared the merge spent and restored the lanes.

A rule system that can bend on the record is stronger than one that pretends it never bends. This one bent once, in writing. Then it was spent.

The foreman built, gated its own work and handed me the preview. Before my go, my side ran seven exact-wording checks of the preview against the record, and every one passed. The go came from me. The gate ran on main first. The unlock, deploy and lock ran only on its exit code, and the previous version stayed one redeploy away. The deploy record went up as its own pull request, and I merged it.

Then it locked.

Routine, under a clock

In October 2026, the PM was suddenly presenting the prototype of a core account page to an unexpected audience. The prototype was functionality-grade on purpose. It existed to iron out behavior. The current design lived in the design file, in updates deliberately never ported, because porting wasn’t the prototype’s job. The gap between working right and looking right was about to be on a projector.

I didn’t open the code. I said “Give me 20 minutes,” and sent the prototype’s foreman an order: port the design updates from the file to the prototype. The demo went up at its best, on time.

It wasn’t the first rep. In September 2026, before an all-hands demo, the PM sent a punch list of the prototype’s visual gaps, and the gaps were closed the same morning. In that same list, the PM wondered whether it would be easy to ask the agent to stretch the very top bar. A design request had arrived already written as an order to the fleet.

The save wasn’t heroics. It was routine, executed under a clock. The time existed only because moving design from the file into code was already a governed, repeatable operation. The dramatic moment was boring to execute, and that’s the whole brag.

Even this story needed the method. My first account of that day, written into this essay’s source file, described the wrong save. I corrected it before it reached the fleet, and the essay was drafted from the corrected account. The discipline that overruled the case study’s draft applies to my memory too.

Boring is the point.

The desk is optional. The judgment isn’t.

One Saturday in August, the build phase of five pull requests ran unattended during a 45-minute dog walk, and review and merges came after. That morning belongs to the delivery-system case study, which tells it.

What the walk proved is the claim this whole page makes. The method didn’t make me faster at the desk. It made the desk optional. Judgment is the only part that has to come with me, and written down, it travels light.

Every ruling was still mine, and so was every answer to every hold. So was the last manual job: the deploy.

The last manual job

R-29 had stood since the site’s first week: nothing deploys without my explicit go, typed in session. Then R-235 amended it into standing deploy authority. The foreman may deploy without asking, but only while every one of its conditions holds.

  • The gate runs on main and exits clean before every deploy. A deploy without a passing gate run is a violation, whatever the outcome, which turns R-186’s lesson into a condition.
  • One page per deploy, verified live immediately afterward at desktop and phone width. If a live check fails, the prior locked version is redeployed at once and then reported, with no fixing forward without me.
  • Every deploy files its record pull request and is announced to me with the live address and what shipped. I read after, not before, and the previous version stays one redeploy away.
  • Scope is this repository and its existing workstreams. Anything novel still holds for me first: a new page type, a new asset class, any edit to the law files beyond records.
  • It’s revocable with one line. Any gate failure anywhere in a train suspends it until I reinstate it.

The authority is enforced, not just written. It runs as a permission rule I set in the repository, scoped to merging and deploying. Before that rule existed, the foreman tried once and the session’s own permission system refused it. Nothing ran.

Its first exercise is the next stretch of the ledger, R-236 through R-239: the Homeowners case study, then the delivery system, then the rules engine, then the quote builder. They went one page at a time. Each deploy ran a clean gate on main first, was published and locked, and was checked live at both widths, with no errors, no overflow and every image loading. Each left its predecessor one redeploy away, and each was filed as its own ruling. I read them afterward.

None of this means the robots took over the deploy. It means the deploy was delegated the only way I delegate anything: in writing, with conditions, on the record, revocable in one line. I didn’t stop owning the go. I wrote down when it’s already given, and when it isn’t. This page is the exception: it’s new, so it waited for my go.

The working document is open. It has the roles, the life of a change, the law and the proof culture, made generic so you can run it tomorrow.