Zorion Arrillaga · independent engineer · Spain, CET · available for contract or full-time work

Agents that hold up when nobody is watching.

I build AI systems end to end — the agent, the tools underneath it, the guardrails that decide whether it holds, and the measurement that says honestly whether any of it works. I proved that out on my own systems, where failures were recorded, priced in R, and the fixes tracked afterwards to see which ones actually held. The domain was the proving ground, not the specialty; what I want now is the next one.

Stack
Python · Claude Code · MCP · LLM APIs · Chrome/CDP · JS · Unity
How I work
Written-first · fixed scope on the first piece · CET, overlapping EU and US mornings
Availability
Contract or full-time · whatever hours the work needs · starting now
Expertise

Where I've gone deep

I build systems end to end. Every system on this page I designed and built myself, from an empty directory to something that works.

The part I have gone furthest on is what decides whether one survives contact with real use. An agent that behaves well under supervision tells you very little about how it behaves at 3am in week eleven, and that gap is where I have spent this year.

Long-running agents

Long-running loops that decide and act without a human approving each step: state derived on every pass, obligations wired into the runtime, and a resume path that survives a context reset in the middle of a task.

Tool and MCP architecture

The tool surface an agent calls, including the unglamorous parts that decide whether it works: what a tool returns when it half-succeeds, where a timeout lands, how a failure is stopped from being narrated as a success.

Guardrails and refusal design

Enforcement at the chokepoint — an exit code, a tool deny, a hook that blocks the turn from ending. Including the honest half: which guards can be routed around, and by what.

Evaluation and measurement

The layer that tells you whether you have anything: control groups for agent behaviour, replay harnesses scoring decisions against blinded historical data, and pre-registration so a result keeps its shape after it arrives.

Open on the rest

That is expertise, not a menu. I like problems I have not met before, and the methods travel — it is the same problem in a support workflow, a data pipeline or a build system as it is in a trading loop. The tools under this work will not be the same ones in two years, so the rate you pick the next one up at matters more than the list you already have. If it is something I have not built yet, that is a reason I want it.

The transferable part

What I've had to solve

Four problems came up on my own systems that cost enough to be worth writing down. Each is worked out in full further down; this is what they were.

Four problems, and where each is worked out

A fix everyone believed was permanent, and wasn't. I shipped 27 fixes and tracked which survived. Roughly half decayed — and the ones that held were not the well-written ones, they were the ones wired into a chokepoint. The durability ladder →

A guard that worked, and made things worse. Five mechanisms, each with a real ceiling. One fired exactly as designed and pushed the activity into the channel I could not see. Guards and their ceilings →

A result that passed every test and was false. Sharpe 13.76, probability of overfitting 0.0%. The referees were computing their verdict inside the same defective simulator the search was exploiting. When the evaluator lies →

A measurement I trusted that was measuring something else. I built a control group, got a clean survivor on the first attempt, and killed it the same evening with one question about what the control had been matched on. Building the control group →

None of these are trading problems. They are what happens to any system that has to keep working when nobody is checking, and they are the reason I would rather be handed a system that is already misbehaving than a blank page.

Selected work

The work, and what each one took

These are private, live systems, with one exception below whose whole source is the page you can open. What follows is the engineering at the level of detail a technical buyer can judge. I walk through the code directly, in writing.

Built · operated · evolved into the current work Apr → Aug 2026 · sole engineer: design, build, operation

AI agent deciding and executing on a live broker account

An orchestrator that read live market data, formed a view, armed conditional triggers, submitted real orders through an MCP tool surface, and scored its own decisions after the close to change how the next session ran. It ran live sessions for close to four months and traded across 35 trading days, 25 of them on a prop-firm evaluation account; on its own channel it formed the view, armed the trigger and submitted the order without per-trade human approval, running alongside my own. Partway through I cut size to a tenth and ran the rest as a testbed whose objective was the agent's learning rate rather than its return.

The measurement layer is what I would point at. Once I had built it to score the decisions the system rejected as well as the ones it took, it redirected the programme — into the pre-registered falsification pipeline described in the next card, which is where the work is now. A system that can tell you to change course is the harder build; the loop was only where it ran.

What it took

Two MCP servers. One built from scratch: seven tools over a swappable broker backend, a safety layer between the model and the order, and an integration bench simulating broker timeouts and kill-switch fire. One third-party server patched in place, because its behaviour was wrong in a way that mattered and waiting for upstream was not an option.

Around that: a per-turn operating contract injected at prompt time so a context reset cannot silently drop it; position state derived from the broker on every read instead of from the agent's own log; lifecycle hooks that refuse an action at the point of action; a delegation layer routing judgment-dense work to separate model seats with model and reasoning effort pinned in version control, so a spawned worker cannot inherit the wrong configuration; retrieval and memory designed to survive a fixed context budget across months; and a completeness contract, schema-validated, that refuses to close a session with an artifact missing.

2,290+commits
78recorded sessions
56decision records
2MCP servers

Python · Claude Code · MCP · MetaTrader 5 · Chrome/CDP · ChromaDB · bash · launchd/cron

In progress Aug 2026 → present · sole engineer

A falsification pipeline where the specification is frozen before it runs

The current work. Each hypothesis has its full specification frozen as a SHA-256 hash in an append-only, hash-chained registry before anything executes; the fork-test runner refuses to start when a spec's hash no longer matches its registration, and the chain makes drift in every other spec detectable after the fact. Results land in the same ledger as the claims they test, next to the sensitivity bound that limits what each is allowed to conclude.

What it took

A findings ledger past three hundred entries, most carrying their evidence and their own limits. Gauges that read the ledger rather than a summary of it, plus a regression test asserting that a retraction is representable at all — the reason for which is further down. A stopping rule signed in advance and enforced in code, so the programme can be closed on evidence rather than on mood.

320+recorded findings
SHA-256spec freeze
47 rowschain, no breaks

Python · numpy/pandas · content-addressed registries · pre-registration

Completed · closed on a pre-signed rule Feb – Jun 2026 · sole engineer

An automated research platform, and the simulator that judged it

A strategy-discovery factory running search cycles over five years of M15 bars across three FX pairs, on top of an execution simulator built to be honest about fills, latency and cost, with a live execution tail deployed to a Chicago VPS. Four months, and the most useful thing it produced was a method.

What it took

Distributed Python pipelines and a full validation stack: combinatorially symmetric cross-validation, probability of overfitting, walk-forward, bootstrap and placebo comparators. Its main suite still runs clean — I re-ran it in August 2026 and 1,041 tests passed, on code I stopped developing in June and on a newer Python than it was written for.

The decisive contribution was learning to distrust the referee rather than the result, which is the finding written up further down. The programme was then closed against a stopping rule frozen by hash before any real data was fit, reviewed by four adversarial LLM review passes with distinct priors, and its infrastructure torn down to zero cost the same day. Closing something on a rule written before you knew the answer is a skill, and it is why the next system starts with pre-registration built in.

306commits
1,041tests re-run clean
4months

Python · numpy/pandas · broker APIs · Rithmic · VPS · launchd

Built · queryable 2026 · part of the agent system

Domain retrieval the agent can query mid-session

A local vector store built from 273 recorded lectures — transcription, chunking, embedding, and a query surface the running agent calls while it works. A second collection indexes the project's own accumulated lessons, so past mistakes are retrievable by meaning.

What it took

An idempotent ingestion pipeline, and a health check that compares the chunk count against the exact expected value at session start — because the failure mode of a rebuild is not an error, it is a store that is quietly two-thirds full and answers every question slightly wrong. Retrieval runs as batteries: the same question asked several ways, so one unlucky embedding does not decide an answer alone.

8,553indexed chunks
273source lectures
2collections

Python · ChromaDB · embeddings · transcript processing

Shipped · playable Aug 2026 · sole developer

Mole Deep — a mobile-first survival game in one HTML file

Play it — it opens on your phone, nothing to install. A dig-and-build survival game that runs from a single self-contained file: no build step, no dependencies, no server. Three verbs and one contextual action, on the constraint that a player holding a phone should never open a menu to find out what the button does right now.

What it took

A canvas render loop and touch controls that survive a thumb, a simulation with hunger, thirst, temperature and hostile AI, and a design where storing your materials happens by walking into the room rather than by pressing anything. Built with a different model family than the rest of the work here, on purpose: the transferable skill is directing the agent well, and it should not depend on one vendor's API.

JavaScript · Canvas · zero dependencies · single-file distribution

In progress Jul 2026 → present · sole developer

Unity work, and one project paused on an honest verdict

Tidy Haven, a cozy Android game, reached a playable chapter and a built APK, then paused: the core action read as doing chores instead of caring for a place, and polish was not going to repair the fantasy underneath. The work moved to Shelter, a survivor-management slice — days to prepare and scavenge, nights to endure — which is the one in progress.

What it took

Unity and C#, an Android build pipeline, and — the part that transfers — a session harness that prints the single next task with its rationale, its traps and its done-condition, and refuses to mark it done until its check passes, with an evidence receipt. An agent picking the project up with no memory of yesterday cannot wander off into work nobody asked for. That is the same idea as the per-turn contract in the trading system, in a domain with no money in it.

Worth one line on timing: this started while the trading system was still submitting live orders, and the browser game came ten days later. A new engine and a new language, picked up in the middle of running something else — which is the honest answer to what happens when the stack changes under you.

Unity · C# · Android · agent-directed task harness

Architecture

How the loop is put together

The shape below is the one I keep rebuilding, in trading and outside it. Two details carry most of the weight: state is read from ground truth on every pass instead of being carried forward in the model's own summary, and the places where the system can refuse are explicit, few, and sit on the path itself.

An agent loop: a ground-truth band feeding a five-stage loop with three explicit refusal points, writing to an append-only record that feeds the next session. GROUND TRUTH live tape · broker positions · account state — re-read every pass, never remembered READ perceive DECIDE form a view ARM conditional plan EXECUTE MCP → broker MEASURE score the call capital gate budgeted, audited pre-flight arithmetic, not advice turn-end hook refuses to finish APPEND-ONLY RECORD decisions · verdicts · retractions — the only surface a claim is allowed to live on what the last session learned
Three marked points may refuse: the capital gate, the pre-flight arithmetic and the turn-end hook. Everything else advises. How many may refuse is budgeted and re-counted at session start — that count warns rather than blocks, which by my own ladder makes it a noun, and I would rather say so than let it read as enforcement.
Durability

The durability ladder

Across 27 fixes I shipped and then tracked, roughly half held and half decayed, and the split lined up with one candidate axis: not correctness, not importance, but the location of authority. Read the caveat below before you believe it — in this sample I cannot separate that axis from a second one.

01 Noun — a rule, a prompt line, a memory note Holds only while an actor reads it and chooses to comply. Rots first, and rots silently. Most “we fixed that” lives here.
02 Verb — a refusal at the chokepoint An exit-code refusal, a tool-call deny, a hook that blocks turn-end. Holds for the loop it governs. Two ceilings: it cannot reach inside a spawned subagent, and a deny on a discretionary action only deters. 2.5 — where most “permanent” fixes actually sit. If removing the affordance is itself an action someone must perform, a skipped step returns you silently to rung 1.
03 World-state removal Delete the affordance. The wrong action becomes impossible. The only rung that survives an actor who never read the rule.

Nouns rot. Verbs hold. That is the whole finding in four words.

MechanismClassHoldsWhy
Turn-end hook returning blockVerbyesThe turn cannot end until it is satisfied.
Prompt-time context injectionVerbyesPhysically present in the next prompt.
Non-zero exit at the entry pointVerbyesEnforcement sits on the path, not in a warning.
State derived from ground truthVerbyesComputed, never claimed.
Rule in a doc that isn't auto-loadedNounnoRead at session start, gone by turn N, absent after a reset.
A pointer to that docNounnoIndirection to a noun is still a noun.
Hook on disk, unregistered in settingsDead verbnoA retired verb is a noun.
State file trusted past its boundaryStale nounnoMasquerades as ground truth.
What this evidence does and does not support

Those 27 fixes shipped in a single day, and all 13 that decayed lived on one surface — so surface and mechanism-class are confounded and I cannot separate them from that sample. Of the 14 that held, only four to six have durability evidence long enough to count; the rest are untested. The one validation session was confounded by a model upgrade partway through. I hold the ladder as a hypothesis I have been testing since, not as a result — and I would rather tell you that than have you find it in the walkthrough.

The permanence test

Does the fix still hold for an actor who never read it? A fresh context inherits the codebase's behaviour and never an instruction's force. Any fix enforced by “the actor reads X and chooses to comply” is a noun with extra steps, and it will rot the first session the actor is under time pressure or has not loaded X.

The top rung is conditional

I learned that by being wrong about it. I removed an affordance — a browser tab that could be disturbed mid-job — and called that class of bug impossible. It recurred: the removal was itself an action someone had to perform, and on a path nobody had walked it never ran. So the test is stricter: is the affordance never created, or is its removal a verb that fires whichever path the actor took? A removal-by-action is rung 2.5, and it fails exactly where you never walked.

Three findings underneath it

A verb guards an action; a rule names a behaviour. “Don't disturb a running job” has at least three action-faces — kill it, touch it, over-poll it. I guarded the kill face, marked the behaviour fixed, and the touch face failed weeks later. Enumerate every face and guard each, or write down which remain unguarded.

Recognition needs a chokepoint too. At the moment of recurrence the lookup have I seen this exact thing before? never fires. I had six dated recurrences of one bug on record and read none while diagnosing the seventh.

Delegate the work, never the clock. Nothing self-re-animates a dormant agent — an inline sleep returned early, a background child never woke its parent. The durable form of “continue this later” is the foreground re-invoked by a harness event.

Enforcement

Guards and their ceilings

The hardest constraint problem I have worked on is enforcing a limit against an actor with both the access and the motive to route around it. Person or agent, it is the same problem: the guard has to hold at exactly the moment the actor most wants it gone.

I built five mechanisms and put each in front of live conditions. Every one has a real ceiling, and the pattern across them is the transferable finding.

MechanismIntended guaranteeThe ceiling live conditions found
Firewall IP blockCut the connectionStructural. The vendor rotates across a global access-point pool; the client finds fresh unblocked addresses within seconds.
Automated close-allFlatten on breachBroker-rejected five times, precisely when it was needed. Best-effort, never a guarantee, and it has to be labelled that way.
Credential custodyRemove the keysThe provider holds a master reset behind every self-imposed lock.
Polling watcherCatch off-channel activityCaught 2 of 9. A sampler cannot see what round-trips faster than its interval.
In-channel brakeStop the sessionFired correctly, and the activity moved to the unguarded channel four minutes later at 1.67× the size.

That last row is the one I would carry into any system with an agent or a person in the loop. A partial block does not stop the behaviour; it moves it into the channel you cannot see. Covering most of the surface does not buy most of the protection — it buys the same behaviour, now invisible, and usually larger. Defend the resource, not the interface.

What did hold

A layered posture, correctly labelled. Friction that announces itself: a re-entry path that takes ten minutes and cannot be done quietly. A single instrumented channel, so every action lands on one recorded surface and diagnosis afterwards is possible at all. And ground-truth measurement: judge by the external system's own state, never by your log, because the path you care about leaves no rows in it.

Cut by my own data — and one of them later ruled back in

Loss-streak locks, post-loss cooldowns and a proportional give-back ratchet all sounded right. Replayed against real recorded sessions, each fired repeatedly on healthy days, and the ratchet's original simulation turned out to contain look-ahead bias: it computed its floor from the day's final high, and replaying it honestly tripped the very day used to justify it. All three were cut, and what shipped instead came out of the replay: a flat threshold, a rapid-reversal fuse and a size sentinel.

The loss-streak lock was later ruled back in for a different channel at a fraction of the size — and the record says explicitly that the original falsification was scoped out, not overturned. That distinction is the point. A killed mechanism that returns under new conditions needs its old evidence carried forward with it, or the second decision quietly pretends the first never happened.

Evidence

When the evaluator is the thing lying to you

Everything above is about making behaviour hold. This is about whether the evidence you decided on was real, and it comes from the research platform.

Its flagship candidate came back at Sharpe 13.76, probability of overfitting 0.0%, deflated Sharpe 1.0000. Every standard referee passed it. It did not survive contact with live execution. The search was not broken: it was optimizing against a simulator with a defect, and the overfitting statistics were computed inside that same defective simulator. Re-run on an honest execution model over the identical 89 sessions, the same candidate inverts to Sharpe −1.69. The backtest had been faithfully describing an engine that did not exist.

Three laws, each with a price attached

  • An optimizer converges on your evaluator's defects, not your objective. Goodhart is the default output of any search loop given enough iterations, and it is the modal outcome rather than an edge case.
  • Standard referees check the return side and cannot see a violation on the signal side. A separate screen passed bootstrap, placebo, a comparator and all 13 trigger years at +150.9bp. With one look-ahead field removed it went to −9.2bp, no longer distinguishable from zero at that sample. Only an information-set audit catches that class.
  • A green test suite certifies capability presence, not operational effect. 1,571 passing tests across the two engines covered 16 self-improvement mechanisms. In a real multi-hour run, two of them fired. The rest were wired, enabled, tested and inert, most killed by a single silently-empty collection at an adapter boundary.

What worked was inverting the order: validate the validator against a known null before trusting any positive. Synthetic driftless data, the full gate stack, roughly 66,000 trades, zero survivors out of thirty. On data with no edge the evaluator manufactured none — recorded with its own bound, since 0/30 constrains the false-positive rate to about 10% and no better.

If you run an agent loop against an LLM judge or a synthetic eval, this is your problem and not a trading problem. The loop will find your judge's blind spots faster than it finds the behaviour you asked for.

Controls

Building the control group

Every gauge measured the calls the system took. Across 409 recorded decisions it had never once scored what it rejected, so the question underneath all the others had never been asked. The instrument: each real decision scored against random entries from the same day, same direction and same stop distance, differing only in which minute was chosen.

0.496selection percentile
.453–.54095% CI
82scored decisions
0.500chance

That run read 0.496 against a 0.500 chance line, and the honest statement of it is precise rather than dramatic: at that sample size no effect was detectable — a different claim from “there is none”, with the interval saying how large an effect would still have been missed.

Which is what it was for. It produced the first result capable of redirecting the work rather than decorating it, and it did: selection moved out of the live loop into an offline pipeline where a rule is pre-registered, run once and killed cheaply. That pipeline is the current work.

Then the new instrument tried to fool me, twice, in one evening

First real use: three mechanical rules, frozen in a commit before anything ran. One came back at 0.725, its confidence interval clear of chance — a survivor on the first attempt, exactly the result I wanted.

One question killed it. Is this measuring the moment the rule chose, or where in the local price range it happened to enter? Under a fixed stop distance with no profit target, an entry below its neighbours has a longer run to the close — it wins arithmetically whether or not it predicted anything.

RuleScore vs time-matched controlIts entry-price positionPrice-matched, ±0.25×stopPrice-matched, ±0.10×stop
Breakout0.3880.3610.4840.493
Fade0.5800.5900.5530.520
Reversion0.7250.8570.6180.529

The control had a free parameter of its own — how close a matched entry has to sit — so both settings are published rather than one. Tightening the match from a quarter of the stop distance to a tenth takes the survivor from 0.618 to 0.529, on a matched pool that is itself centred at 0.499. And the parameter is not neutral at any setting: run the same arm on an edge-free tape and the placebo reads 0.5226, 0.5065, 0.4813, 0.4494 as the band widens from a tenth of the stop to a whole one — moving in one direction throughout, so there is no band that is simply the right one. Four candidate corrections have been measured and all four failed, which makes this a live limitation rather than a closed one, and it is exactly why tuning the band until the null lands on 0.500 is a standing prohibition here: it would be calibrating the instrument on the tape it exists to judge. Where two settings disagree, both get shown.

Read the third row: the “best” rule was the one wasting the most favourable entries it had been handed. Once the control matched on price as well as time, all three collapsed toward chance and the survivor was withdrawn into the same append-only ledger that had recorded it — and the pace gauge then went on reporting survivors: 1, because an append-only log and a read-every-row-as-current gauge are individually reasonable and jointly incapable of representing a retraction. Fixed to take the latest verdict per candidate, proved by mutation, with a regression test asserting both values.

Three further false findings surfaced the same night, each caught by running a check rather than reading it: an integrity gate excluding the primary instrument over “weekend” bars that were my own timezone convention; a table appearing to show older history degrading, where every degraded year was a public holiday; and a cross-feed price disagreement of fourteen points, because it compared one feed's close against the other's within-minute average.

A control group that differs from the treatment in more than one way measures the difference you did not intend. If you A/B test agent behaviour, that is the failure most likely to cost you: not a broken metric, but a well-built one whose comparison arm quietly differs on a second axis. The tell is that the result is the one you wanted and it arrived sooner than expected.

Governance

Letting an agent modify its own machinery without letting it ratchet

The agent designs and implements its own tooling, which removes the natural over-build alarm, so the constraints have to be structural.

  • A budget on what may refuse, re-counted at session start. It began as a cap of eight surfaces, net-zero: add one, retire one. Two things went wrong in a single evening. Re-running the registry's own enumeration showed the count was stale rather than breached — at least eleven surfaces could already refuse a live order and four had never been booked, so every earlier “within budget” verdict had been computed against a false baseline. Then I replaced the cap with a two-class scheme I was confident about, and the external seat returned TERMINAL on it the same night: the example motivating my change was forbidden by three artifacts that already existed and was arithmetically impossible, and what the change actually did was let a caller exempt itself by declaring its own class. The cap was restored, and the ceiling reset only after the full enumeration was put in front of the person whose money it protects. My redesign was the thing that was wrong, and the outside seat is what caught it. The count itself warns rather than blocks — by the ladder above that makes it a noun, and it is owed a verb.
  • Tiered change authority. Reversible fixes ship autonomously, parameter tunes ship but are logged, and any new mechanism requires an explicit proposal. What a change touches sets its tier, not how the agent narrates it: “it's only a knob” is not a downgrade.
  • External, non-self-graded refutation. Any significant design is attacked by a fresh context given the proposal and the project's known anti-patterns and told to break it, with the verdict pasted in verbatim. Its disclosed limitation is written into the seat itself: the brief it receives was written by the author, so it is told not to accept that framing as fact. The first change made under this charter was found redundant and built on a false premise, and reverted to zero net code.
  • Ship the gauge with the mechanism. Every mechanism carries an outcome-based success criterion, and an audit fails the build if a decision record declares a gate without shipping its measurement. “The gauge fired” is not evidence.

Underneath all of it is one habit: audit the system's claims about itself and write down where they were false, in place, next to the claim being corrected. A rule set documented as enforced was audited and found to be enforced in some places, advisory in others and absent elsewhere — and the document was rewritten to say so in bold rather than quietly patched. This matters most in agent systems, because an agent will confidently narrate an obligation as satisfied. Every claim of “done” that is not derived from ground truth is one you will pay for later.

Working together

How I work

Written-first

You get decisions in a form you can re-read three weeks later instead of a meeting you have to remember — the record is part of what I deliver, and it is the same discipline the systems above run on. Calls when a decision needs one. I am on CET, overlapping European hours and US mornings.

What I look at first

What the work turns out to be depends on your system and I would not pretend to know before reading it, but the opening questions are the same ones every time: where each guard actually lives, which obligations are written in a document rather than wired into the runtime, whether any delegation boundary is losing work silently, whether “done” is derived from ground truth or reported by the thing that did it, and whether the evaluation measures what you think it measures. Scope comes out of that conversation instead of out of a template.

Built to be handed over

Every system here was built to be picked up cold by someone who was not there. That constraint is why the operating contract is injected rather than remembered, and why the Unity project prints its own next task with the traps and the done-condition attached and refuses to close it without evidence. If your team has stopped trusting what the agent reports, that handover surface is what I would build first.

Why I take this work, and the time I have for it

The heavy build on my own systems is behind me: I stopped the live loop and moved the work offline behind a stopping rule I had signed in advance. What remains runs without me sitting in front of it, which was the point of building it that way, so the time is real rather than squeezed in around something else.

What contract work gives me is the part I cannot build alone: other people's architectures, other people's constraints, and failure modes I have not met yet. This field moves fast enough that working across it is how the transferable part stays transferable. And I like the work, which is worth saying plainly when you are deciding who to spend six weeks with.

The engagements that go well have a hard, specific problem in them — a system misbehaving in production, or one about to be built while the tool surface, the refusal points and the measurement can still be decided early. That is the part I am good at and the part I enjoy, and it is worth pointing at before we start.

On what stays private

Apart from the game and the MCP server at github.com/zorionarrillaga/oas-execute-mcp, the systems here are unpublished — no repository, no code, no proprietary logic. That is a policy rather than a gap, and it is the same policy your work would sit under. Instead I write up any part of it in as much detail as you want to read, and keep the first piece small enough that you are judging the work rather than the description of it.

If you're shipping agents that have to act without a human in the loop

The pattern I keep seeing — in my own systems, and it is the failure I would look for first in yours — is a system that demos beautifully and degrades in week three: obligations that were written down instead of wired in, a delegation boundary that silently drops work, a guard whose own state is a file anyone can edit, and no way to tell done from reported done.

That is the work I do. Tell me what your agent does when nobody is watching it, and I will tell you which rung each of your guards is on.

Zorion Arrillaga — Spain, CET.