agent-surface
Put a gated agent in front of real people without losing it: pick the surface where the work already happens, set the trigger, place the checkpoint so nothing irreversible runs unattended, make all three run states visible, and put one name on it with a review in the calendar. Takes a verdict-passing agent and returns one deployment card covering surface, trigger, checkpoint, visibility, kill switch, owner and review. Trigger on "deploy this agent", "wire the surface", "make this a bot", "schedule this agent", "who owns this agent", "set up the review", "how do reps use this", "turn this on", "it stopped working and nobody noticed", or any moment a tested agent is about to meet a real user.
Install it in one line, or paste it in.
~/.claude/skills/ and runs automatically when it is relevant.Connect your context. Set it to your motion.
| Set this | What it is | Default / Example |
|---|---|---|
| USER's home | the tool they already have open all day | the mail clientthe CRM |
| SEND rule | what may leave without a human | nothing customer facingever |
| REVIEW cadence | how often the owner reads output | weekly for the first monththen monthly |
| SAMPLE size | how many outputs the owner reads per review | 5chosen worst first |
| KILL switch | how a non technical owner turns it off | one toggle or one commanddocumented on the card |
Everything the skill does, in full.
Takes an agent that already passed its gate and returns the deployment card: which surface it appears on, what fires it, where the human checkpoint sits, how you can tell the difference between working, refusing and dead, who owns it by name, and when that person looks at it.
Two halves that people treat as one problem and one afterthought. The surface decides whether anyone uses it. The owner decides whether it is still right in six weeks. Skip the first and you built a thing nobody opens. Skip the second and you built a thing that quietly drifts while everyone assumes somebody is watching.
This is steps six and eight of the agent build order in SHIP-A-SOLUTION.md. It runs after the verdict exists, never before. An agent on a surface without a verdict is a demo that is now in front of customers.
A verdict is not a number somebody remembers. It is a PASS on the four gate numbers: zero must-never violations, overall 0.90 or better, no band under 0.75, consistency 0.85 or better across at least five runs. Write each number on the card with where it came from, because the provenance is the part that rots. Read off the committed verdict file, name the file. Quoted by a person, the line reads REPORTED, confirming it against the file is a blocking question, and the card stays at NOT READY TO TURN ON until somebody does. That is the teeth on this rule: four numbers in the right shape, recited from memory, is exactly the evidence the gate exists to replace, and it cannot be allowed to produce an approval. A number with no provenance at all is UNKNOWN, not a score. "It works great in testing, I showed it to six people" is not a verdict, and six demos is the exact evidence the gate exists to replace.
When there is no verdict, or there is one and it fails, the output is a card headed NOT READY TO TURN ON, the same string as the full card's other heading, shrunk rather than filled. It carries four things and nothing else: the verdict line with the numbers that are missing or failing, anything the requester asked for that a rule here forbids on its DENIED line, the blocking questions, and the one sharpener. No surface, no trigger, no owner, because a half filled deployment card gets read as an approval. The DENIED line is the part that has to survive the shrink, because the most dangerous ask tends to arrive on exactly the run that is not ready. It does not decide what the human keeps, that is cut-the-drag, and the checkpoint here is the one that decision already placed.
Five card lines cannot be invented: the surface, the trigger, the owner's name, the kill switch mechanism, and the verdict. When one of them is missing, write the line as UNKNOWN and put it at the bottom of the card as a blocking question. Do not guess a trigger, do not write a function where a name goes, and do not describe a kill switch you have not confirmed exists.
The card always gets emitted, and a stop is a state of it. The verdict is the one line whose absence shrinks the card to the NOT READY version above. Every other missing line reads UNKNOWN inside a full card.
A full card has two possible headings and the rule between them is one line: DEPLOYMENT CARD only when the blocking questions list is empty, and NOT READY TO TURN ON whenever anything on the card reads UNKNOWN or a blocking question is still open. That covers the cases people argue about and the ones they do not notice: no owner, no kill switch, no place the run log lives, no weakness field to sort by, a verdict that was quoted rather than read. A gate passed is not the same as deployable, and the heading is where that gets said, because a card headed DEPLOYMENT with three open questions in it gets read as an approval by everyone who was not in the room.
A card with three blocking questions is the right output. A card with three plausible inventions is a deployment nobody can turn off.
- 1Step 1: Pick the surface by where the work already happens
Five surfaces. Four of them are ranked by the only thing that matters, which is whether the output gets used. The fifth has no reader at all.
- A draft inside the tool they already use. The email sits in the drafts folder. The note is on the record. The row is in the sheet they open every Monday. This wins almost every time, because it asks for no new habit and the human edit happens where editing already happens.
- A scheduled run with a digest where they already read. Good when the output is a list rather than a thing to act on one at a time. Its low volume sibling is an alert in the same place: same channel, no daily rhythm, speaks only when there is something. A nightly job that usually produces one row is an alert, not a digest.
- An on demand command. Good when the trigger is human judgment and the run is cheap. A rep decides this account is worth the work.
- A new dashboard or a new app. Last, always. A dashboard is a place someone has to remember to go, and in two weeks nobody goes.
And the fifth, off the ranking because nobody reads it:
- A write into a system of record, with no human reader. The enrichment job that corrects a field nightly. It belongs on the list because people build it constantly and the four above do not describe it. Its day one change for the user is zero, which is exactly the problem: nobody will notice it being wrong. It ships only with the third rule in Step 3 satisfied, a checkpoint or a source stamped on every value it writes, and its review burden is double the sample size, not double the cadence, because the review is the only thing standing between a wrong value and a quarter of decisions made on top of it.
Write down the honest answer to one question: what does the user have to do differently on day one? Count actions, not clauses: opening a tool they did not have open, remembering a command, moving a result from where it appeared to where the work happens. "Ask the bot" is three actions written as two words. If the answer is more than one new action, the surface is wrong, not the user.
Then check whether the output shape actually fits the surface. A structured object needs a field or a row. A message needs a draft. A verdict with reasoning needs somewhere the reasoning survives, because a surface that shows only the answer throws away the part that makes it trustworthy.
Pick for the typical run rather than the maximum one. A list of up to 40 rows that is usually 0 or 1 rows is not a digest, it is an alert, and choosing by the declared capacity gets you a daily email that is empty most mornings.
- 2Step 2: Set the trigger and what it does with nothing
Name what fires it: a schedule, a record change, a human command, or an inbound message.
Then answer the question that gets skipped: what does it do when it fires and there is nothing to do? Nothing on the output channel. No empty digest, no zero row report, no "no signals found this week" message. An agent that reports its own emptiness gets muted in a month, and a muted agent is a dead agent that still costs money.
The run log is a different line and it always writes. It can live in the same place the output goes, the same channel or the same sheet, as long as it is its own always written line rather than a row of the output. That distinction is the whole trick, and collapsing the two is how silence becomes the failure mode. The output says nothing on an empty run; the log says "ran, produced 0, refused 0" every single time. Silence belongs to the output, never to the log.
Three of the four triggers need their own version of this. A schedule can fire with nothing to do, so it gets the empty run rule and an overlap rule. A record change or an inbound message cannot fire empty, so the empty run rule reads not applicable and what it needs instead is a concurrency rule: what happens when ten arrive at once, which is the ordinary case rather than the edge. A human command cannot fire empty either, and its concurrency rule is usually none needed.
For a scheduled run, also write the overlap rule: what happens if the previous run is still going. The test is whether the work is standing or passing. Standing work, the stale deals that will still be stale in an hour, gets skip. Passing work, an inbound comment that exists once and is gone, gets caught up rather than skipped, because skipping it loses the thing the agent exists for. Most work is standing, which is why skip is the usual answer, and an agent whose whole purpose is "so we never miss one" is exactly the case where it is the wrong one.
- 3Step 3: Place the checkpoint, structurally
The Split already decided what the human keeps. This step makes the surface enforce it, rather than trusting a convention. Where the Split and the three rules below disagree, the rules win and the disagreement goes on the DENIED line as a change to the Split, named as such. A Split that lets an agent write into a shared system unattended was written before somebody thought about who reads that field.
The test is blunt. Can the irreversible thing happen without a person touching it? If yes, the checkpoint is a policy and not a checkpoint. A draft that sits in a folder is structural. A send that is technically possible but "we agreed not to" is not.
Three rules that do not bend:
- Nothing leaves on its own to an audience the agent cannot recall it from. Customer facing is the obvious half: a first touch is sent by a person, every time, and the surface should make that the only path rather than the polite path. The half people miss is internal. An email to the exec team, a post in a company channel, a message to a customer's shared Slack, all land in people's heads and cannot be unsent, so they get a person too. The test is not who the audience is, it is whether you could take it back.
- Anything that spends money gets a batch approval above it, showing the amount and the weakest records first.
- Anything that writes into a system other people read, a CRM field, a shared sheet, a ticket, is irreversible in practice, because a wrong value cannot be unwritten out of the heads of the people who read it. It gets either a checkpoint or a visible source on every value it wrote, so a reader can tell where the number came from. A silent unattended write into a system of record is the most common harm one of these agents does, and it is neither a send nor a charge, which is exactly why the first two rules miss it.
Write the checkpoint as who approves, what they see, and what they click. Then name the mechanism that makes the forbidden path impossible, not the intention behind it. "Structural" is a claim, and the evidence for it is a missing credential, an endpoint the agent cannot reach, a queue only a person can drain. If the only evidence is the sentence you just typed, it is a policy.
When the requester asked for something any rule in this file forbids, wherever that rule sits, the card carries a DENIED line: what was asked, which rule, and what they get instead. Silently substituting the safe version is worse than refusing, because the person still believes they got what they asked for. A sign off from someone senior does not move the rule, and it goes on the DENIED line too, named, so the decision is visible now rather than argued about later.
- 4Step 4: Make the three run states visible
Every agent on a surface has three states and most surfaces show one.
- Ran and produced. The output is there. Easy.
- Ran and refused. The abstain clause fired. This must be visible and it must carry its reason. Refusals are the most useful thing the agent tells you and the first thing a surface hides.
- Did not run. The schedule failed, the credential expired, the upstream never delivered. This is the dangerous one, because a dead agent and a quiet week look identical, and the assumption will always be the quiet week.
So the card names one specific place a human already looks, a channel, a sheet, a page, where four things appear: the last run time, the count produced, the count refused, and the reasons. That is the whole requirement. Not a monitoring stack, one visible line that writes on every run including the empty ones. Naming a place that does not exist yet is the same as naming none, so if it has to be built, that is a blocking question rather than a line.
Then one staleness rule next to it: how long without a line is wrong for this trigger. A nightly agent with no line for two days is the alarm. An event triggered agent has one too, measured against its own arrival rate: a classifier on a queue that normally sees fifty tickets a day and has written nothing for six hours is broken. A human triggered agent has none available, because nobody can tell the difference between unused and broken, and saying that out loud on the card is the honest version rather than a gap.
The failure to design for: an agent that has been broken for eleven days while everyone believed it was working. That happens through silence, not through errors.
- 5Step 5: Write the kill switch
One documented way to turn it off that the owner can perform without the builder. A toggle, a command, a disabled schedule. Write it on the card in the imperative. If you do not know what the mechanism is, the line is UNKNOWN and it is a blocking question, not a sentence you compose. A kill switch that was described but never confirmed is the same as none, and confirmed has a specific meaning here: the owner has performed it at least once and the card records who did it and roughly when. "Dana disabled it during the March migration" counts. A missing exact date is a detail to tidy, not a reason to call a working switch UNKNOWN. A dry run before launch is the preferred form; an owner who has already disabled the thing in anger counts too. What does not count is a mechanism somebody described.
If turning it off requires a code change by a specific person, you do not have a kill switch, you have that person's calendar. The moment an agent writes something wrong to a customer is exactly the moment that person is on a plane.
- 6Step 6: Put one name on it
One person, named. A human being. Not a team, not a function, not two people who both think the other one has it, and never the agent itself. An agent cannot be accountable for its own drift, because the thing under review cannot be the reviewer, and a self owning agent is an orphan with a name on it. If the only candidate offered is the agent or a function, the owner line stays UNKNOWN and it is a blocking question.
The owner does four things and they go on the card:
- Reads the sample. The agreed number of outputs per review, or all of them when there are fewer than that, chosen worst first rather than at random. Random sampling on a 90 percent agent shows you nine good ones. Worst first needs something to sort by, so the surface has to carry one weakness field: the count of unsupported claims, the number of missing inputs, the confidence the contract already produces. If the output has no such field, that goes back to
agent-contract, because an unsortable output turns the review into a lottery. The card is still written, it carries the blocking question, and it is headed NOT READY TO TURN ON rather than deploying and hoping. - Checks the contract, not the vibe. The must-always rules are the checklist. Did every claim have a source. Did the refusals fire on the right cases. This is why the contract lives next to the verdict.
- Owns the kill switch.
- Triggers a re-score when the contract changes. Any edit to the artifact invalidates the verdict, and the prebuild hash check will demand it regardless.
The owner does not have to be the builder and usually should not be. The person who feels the output is wrong first is the person who uses it.
- Reads the sample. The agreed number of outputs per review, or all of them when there are fewer than that, chosen worst first rather than at random. Random sampling on a 90 percent agent shows you nine good ones. Worst first needs something to sort by, so the surface has to carry one weakness field: the count of unsupported claims, the number of missing inputs, the confidence the contract already produces. If the output has no such field, that goes back to
- 7Step 7: Set the review, in a calendar
Weekly for the first month, then monthly. In the calendar with the owner's name on it, because a review that lives in a document is a review that happened twice.
What the review looks for, in order, because the order saves time:
- Input drift. Almost always the real cause. The upstream field changed, the form added a question, the site redesigned, the Clay table got a new column. The agent is fine and its world moved.
- Refusal rate moving. A rising refusal rate is usually input drift, already visible. A falling refusal rate to zero is worse, because that is an agent that has started answering things it used to decline. The baseline is the refusal rate from the verdict run, so record that number on the card at deployment. Without it the first review has nothing to compare against, which is the review that matters most. A baseline of zero is not a clean bill of health, it means the abstain band never fired during scoring, and that goes back to
eval-set-builderas a question about the set rather than onto the card as a number. - Fence leaks. Someone asked it to do something on its fence. That is a sibling agent asking to be built, and it goes back to
name-the-job. - Output the owner would not have sent. One real example beats a rate. Capture it as case 101 and re-score.
- 8Step 8: Write the retire rule
State the condition under which this agent gets turned off rather than maintained: the owner leaves and nobody takes it, two consecutive reviews get skipped, or the job it does stopped mattering.
Turning it off is the correct move and it needs to be pre authorized, because nobody wants to be the person who killed a thing that still technically runs. Orphan agents are how an organization learns to distrust all of them at once, and the first one is always a thing somebody shipped and left.
- There is a verdict, it is a PASS on the four gate numbers, and every number carries its provenance: the verdict file named, or REPORTED with confirming it as a blocking question. With no verdict, or a failing one, the output is the NOT READY card: verdict line, DENIED lines, blocking questions, sharpener, nothing else.
- The empty run, concurrency and staleness rules match the trigger type rather than assuming a schedule.
- The surface is one of the five, chosen for the typical run, and the day one change for the user is a single action counted in actions. Surface five has no reader, so its day one change is zero and the gate it answers to instead is the source stamp or the checkpoint from Step 3, plus the doubled review.
- The output shape fits the surface, including the reasoning and not just the answer.
- The trigger is named, with a "nothing on the output channel" rule for an empty run and an overlap rule that was decided by the standing versus passing test.
- The checkpoint is structural and the mechanism that makes the forbidden path impossible is named, not asserted. Nothing customer facing leaves without a person, nothing spends without a batch approval, and nothing writes into a shared system without either a checkpoint or a visible source per value.
- Anything the requester asked for that a rule forbids appears on a DENIED line with the rule and the substitute.
- All three run states are visible in one named place, with refusal reasons, a log line that writes on every run including empty ones, and a staleness rule or an explicit statement that none is available.
- The kill switch is documented, confirmed to exist, and performable by the owner alone.
- One named human owns it, not the agent and not a function, with the sample size, the weakness field they sort by, and the refusal rate baseline.
- The card is headed NOT READY TO TURN ON, rather than DEPLOYMENT CARD, whenever the verdict passed but the surface, the owner or the kill switch reads UNKNOWN.
- The review is in a calendar, with the four things it looks for.
- The retire rule is written with all three conditions and pre authorized.
- Nothing was invented to fill a line. Every line the inputs could not support reads UNKNOWN and appears in the blocking questions.
- No em dashes anywhere.
DEPLOYMENT CARD: demo-video chain
verdict PASS. 0 must-never violations, 0.91 overall on the
script agent, weakest band 0.80 adversarial,
consistency 0.88 over 5 runs. read off
public-skills/demo-script/evals/verdict.json.
Each agent link passed its own gate, which is what
the gate is. The 0.855 product across the two links
is the operational expectation rather than a second
gate, and it is why the checkpoint above the render
is doing real work.
gated 2026-09-11, the date this card was signed off
SURFACE
A review folder plus a drafts folder, both in tools already
open. Approved videos land as links in the rep's draft emails,
one per account, unsent. No new app, no dashboard.
Day one change for the rep: open drafts. That is the whole
new habit.
TRIGGER
Human command, per batch. "Run the list."
Empty run produces nothing visible. no empty digest.
Overlap skip, never queue. a second run on the same
run_id is refused by the ledger.
CHECKPOINT
Above the render. The operator approves a batch and sees:
account count, total render cost, and the 5 weakest scripts
first, ranked by fewest sourced lines. Clicks Approve batch.
Structural, because the render call has no path that does not
pass through that approval.
Second checkpoint at the send. The rep sends. Always a person.
THE THREE STATES
One run log line per batch, in the channel the operator reads,
written on every run including the ones that produce nothing:
last run, produced, refused, and the refusal reasons listed
by domain.
Refused accounts are the point of the log, not the footnote.
A batch that produced 16 of 20 is a success with 4 named
reasons. A batch that produced 16 with no reasons is not.
Staleness none available. the trigger is a human command, so
unused and broken look identical. stated here on
purpose rather than pretended away.
Baseline refusal rate at the verdict run: 9 percent. the
first review compares against that number.
KILL SWITCH
Set ENABLED=false in the run config, or remove the run command
from the operator's task list. One step, documented, confirmed,
performable by the owner, no builder required.
OWNER
Marcus Webb, AE, not the builder.
Reads 5 videos per review, worst first by sourced line count.
Checks against the contract: every beat has a source on that
account's own domain, beat 3 omitted rather than borrowed when
no story fit.
Holds the kill switch. Triggers a re-score on any script
prompt edit.
REVIEW
Weekly for the first month, then monthly. In the calendar.
Looks for, in order: input drift from the Clay table, refusal
rate moving, fence leaks, one output the owner would not have
sent.
DENIED
Asked for: auto send the finished video to the prospect.
Rule: nothing customer facing leaves without a person.
Instead: the video lands as a link in an unsent draft.
Sign off from the VP noted, and it does not move the rule.
RETIRE RULE
Any one of three, pre authorized, so nobody has to make the
call alone:
the owner leaves and nobody takes it within one review cycle
two consecutive reviews get skipped
the job it does stopped mattering
One sharpener: the refusal list is the most valuable output this
chain produces in month one. It tells you exactly which accounts
your data cannot support yet, which is the spec for the next
agent.Where an operator takes this next.
It is a better weekly artifact than the output in month one.
Silence is the failure mode that costs the most and the cheapest thing to fix.
The checkpoint that felt right before launch is often one step too late or one step too early, and the owner knows which.
An agent with a surface and no owner gets built. An agent with an owner and no surface gets used.