A harness for work that takes weeks.
An agent that works for weeks needs what a new colleague gets from the team around them: a number to be judged by, a memory of what was already tried, and someone to say "we tried that in March". This page is where each of those comes from, and what none of them can claim.
The routine: declare a goal, let the agent work, read what the evidence says, then widen or narrow what it may touch.
Example, not real data.
You pick the number. The gateway refuses to work without one.
A goal is declared by a person and never invented by the model. Its measurement is a downstream tool the server marks read-only: cost per lead from your ads account, organic clicks from Search Console, open issues in Sentry. Declaring it runs that measurement once, immediately, for a baseline. A goal whose measurement cannot run is refused before it is accepted.
Ratio goals take a second measurement for the denominator. A goal can say how long its number takes to settle after a change, days for ads, months for search rankings, so that credit lands in the interval where the effect actually shows.
One goal stands as the north star. While none does, every write through the gateway is refused, and the refusal lists measurable candidates to pick from. Reads always run.
Example, not real data.
Read every twelve hours, and always after a write.
The goal is re-measured when a session opens, every twelve hours while one stays up, when it closes, and on demand before the goal is read or advice is given. Measurements of the same goal are debounced to an hour, with one exception: if a write happened since the last reading, the close-time measurement runs regardless. A change is never left without a reading after it.
A measurement that fails is written down as a failure and retried. It is never replaced with a guess. You can also ask for a reading at any time from the app.
The agent's plan sits next to its calls.
An agent can declare its strategy and the steps it intends, and name the step each call serves. The plan is stored as events in the same log as the calls, so intent and outcome sit side by side. Step status is derived from what actually ran; a step the agent never closes is simply still open, not an error.
Past plans for the same goal come back as evidence: what was tried, which steps were completed or rejected, and the note left when a step was abandoned. They are never turned into instructions, and nothing gates on the plan. It is the agent's own scaffolding, kept where you can read it.
What moved the number, with the numbers attached.
Every successful write between two readings shares that interval's movement, signed so that positive means toward the goal. Those observations are compiled into rules, one per kind of action: do, avoid, check, expect. Each carries a confidence, a count, and a guess at the mechanism, plausibly causal, likely confounded, or unclear. The guess is labelled as a guess, and the badge on every rule stays "observational, not causal", because the data cannot say more.
The sentence describing a rule is written by a model. The statistics beneath it never are. When there is no evidence for a situation the answer is "nothing yet", with the threshold that was not met.
An admin can pool sibling projects so their calls appear as references. Nothing crosses between accounts.
replies up · 41 actions (last 2026-08-21) · plausibly causal
cost per lead up · 12 actions (last 2026-08-14) · likely mechanical
confounded on review · association, not causal
observed 2 times · needs 3 distinct decision-days
observational, not causalExample, not real data.
The evidence gate, and its two limits.
This is the brake. Before a write, the gateway looks for earlier calls of the same tool with the same shape of arguments under the same goal. If those calls sat in intervals where the goal moved away, the write is refused with the evidence and an acknowledgement tied to it. Resend with the acknowledgement and it runs, stamped as acknowledged.
The check needs enough fields to match on: a call with one argument is matched only when
its tool is flagged destructive. And the check has two seconds; if the evidence store is
slow or unreadable the call proceeds, stamped evidenceGate: unavailable in
the log, never silently. Both are stated here so you do not lean on the brake harder than it holds.
"ads.pauseCampaign" has been called this way before on this goal. The goal moved AWAY from its target over the 1 measurement interval that call sat in. With this little history the direction is all that is observed, not a verdict.
acknowledgedEvidence: "e3f19c4a"Example, not real data.
Start warm, keep the context small.
A new hire reads last quarter before touching anything; so can the agent. It can read your history through a read-only reporting tool such as Marketing Reporting and import daily KPI points and past changes as evidence for the goal in force. Imported rows are marked as backfill forever, the import is idempotent, and a single bad row rejects the whole batch.
While it works, the agent asks for what already happened and gets counts, grouped failures, and handles, never response bodies. A three-megabyte result is a handle to the agent, a full entry in the log, and something sandboxed Python can open. Arithmetic that matters goes through meta.math, which does not round.