SKILL
agent-surface✓ APPROVED

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.

01 / HOW TO USE

Install it in one line, or paste it in.

1
In Claude Code (one command)
Copy the install line, paste it into your terminal, and restart Claude Code. The skill installs itself to ~/.claude/skills/ and runs automatically when it is relevant.
2
In Claude, ChatGPT, or a Project (no terminal)
Open the file, then upload it to your chat or paste its contents in. A skill is just a markdown file of instructions, so any capable AI can follow it.
New to skills? A skill is a plain-text file that teaches your AI a workflow. Point any capable assistant at it and it follows the steps, on your data.
02 / MAKE IT YOURS

Connect your context. Set it to your motion.

SET IT TO YOUR MOTION
Set thisWhat it isDefault / Example
USER's homethe tool they already have open all daythe mail clientthe CRMSlack
SEND rulewhat may leave without a humannothing customer facingever
REVIEW cadencehow often the owner reads outputweekly for the first monththen monthly
SAMPLE sizehow many outputs the owner reads per review5chosen worst first
KILL switchhow a non technical owner turns it offone toggle or one commanddocumented on the card
03 / THE FULL SKILL

Everything the skill does, in full.

WHAT THIS DOES

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.

WHEN SOMETHING YOU NEED IS NOT THERE

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.

THE METHOD
  1. 1
    Step 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.

    1. 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.
    2. 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.
    3. 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.
    4. 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:

    1. 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.

  2. 2
    Step 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.

  3. 3
    Step 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.

  4. 4
    Step 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.

  5. 5
    Step 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.

  6. 6
    Step 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.

  7. 7
    Step 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:

    1. 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.
    2. 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-builder as a question about the set rather than onto the card as a number.
    3. 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.
    4. Output the owner would not have sent. One real example beats a rate. Capture it as case 101 and re-score.
  8. 8
    Step 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.

QUALITY GATES
  • 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.
OUTPUT (EXAMPLE)
EXAMPLE OUTPUT
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.
EXAMPLE CHAT
EXAMPLE CHAT
You
The script agent passed. Let's put it behind a Slack bot so people can ask it for a video.
CLAUDE
That is surface four wearing surface three's clothes, and I would push back on it. Who is the user, and where do they spend the day?
You
Reps. In their inbox, mostly.
CLAUDE
Then the video belongs in a draft in their inbox, attached to the account they were already going to email. A Slack bot means the rep has to remember the bot exists, switch tools, know the syntax, and then move the result to where the work happens. Three new steps on day one, and none of them is the work.
You
Slack felt more impressive.
CLAUDE
It demos better and it gets used less. The draft is invisible as a product and that is exactly why it works: nobody has to adopt anything. If you want the impressive version for the walkthrough, the run log in a channel is the part worth showing, because it shows the refusals.
You
Why would I show the failures?
CLAUDE
Because the refusals are the proof that it is not making things up. Sixteen of twenty produced, four named accounts skipped with a reason, is a far stronger claim than twenty of twenty. The first is a system with judgment. The second is a system that cannot tell you when it does not know, and everyone watching already suspects that is what these things do.
You
Fine. Who owns it?
CLAUDE
One rep, by name, and not you. You built it, so you will read its output as what you meant. The person who will notice it has gone wrong is the person whose face is in the video or whose name is on the send. Five videos a week, worst first, and they hold the off switch. One sharpener: write the retire rule today, while nobody is attached to it. It is a two line decision now and an awkward meeting in four months.
04 / GO FURTHER

Where an operator takes this next.

01
Ship the refusal list as a surface of its own

It is a better weekly artifact than the output in month one.

02
Instrument the last run line before anything else

Silence is the failure mode that costs the most and the cheapest thing to fix.

03
Re-read the Split at the first review

The checkpoint that felt right before launch is often one step too late or one step too early, and the owner knows which.

04
Name the owner before the surface

An agent with a surface and no owner gets built. An agent with an owner and no surface gets used.

GET NEW SKILLS IN YOUR INBOX

One operator-built skill a week. Free.