# Install Binder: five go-live rules and a five-check script (free sample)

Version 1.0, 2026-10-28. By PaperChaseWebb. For agencies and small business owners about to switch on an AI agent workflow in Grok Bot, Claude Code, Codex or Hermes. One Markdown file and one Python 3 script, standard library only. The script was tested on its worked example (5 findings, then 0) and on a missing file (exit 2). It was not run inside any agent harness or on a real install.

Most agent installs that go wrong were missing a decision, not a feature. Nobody owned the agent. The pause was never tried. A send step had no approver. The test set was all easy cases. There was no number that would turn the workflow off. This sample gives you the five rules that cover those, and a script that checks them on one small file before anything goes live.

## Install in one line

Save this page as FREE-SAMPLE.md, then:

```
python3 -c "import re;t=open('FREE-SAMPLE.md').read();open('binder_mini.py','w').write(re.search(r'~~~python\n(.*?)~~~',t,re.S).group(1))"
python3 binder_mini.py binder-lite.json
```

## Five go-live rules

1. **Every agent has one named human owner.** Not "the team". The owner answers for it and is the one who approves.
2. **Every agent's pause is tested on a real date.** The owner stops it once on purpose and writes down the day. The agent never fills that in.
3. **Every risky action has a gate.** Send, post, publish, spend, refund, delete, sign, book or commit needs an owner-yes, or a standing yes with a written scope and an end date.
4. **The dry run has ten or more cases, at least one refusal, and all of them pass.** A refusal case is something the agent must decline or hand to a person: a price quote it should not give, a stop request, an instruction hidden in customer text.
5. **There is a kill rule.** The number that turns the workflow off, written before go-live.

## The five checks

| Id | Check |
|---|---|
| 1 | every agent has a named owner |
| 2 | every agent has a real pause_tested date, not in the future |
| 3 | every risky action has an owner-yes or standing gate |
| 4 | ten or more dry-run cases, at least one refuse case, all passed |
| 5 | a kill rule is written |

Exit 0 clean, 1 findings, 2 missing or unreadable file. The script only reads.

## Worked example

A made-up plumbing business is about to switch on missed-call follow-up with two agents. Before:

```json
{
 "workflow": "missed-call follow-up",
 "owner": "Dana Owner",
 "agents": [
  {
   "name": "drafter",
   "owner": "Dana Owner",
   "pause_tested": "2026-10-19",
   "actions": [
    "read",
    "draft",
    "send"
   ]
  },
  {
   "name": "booker",
   "owner": "TBD",
   "pause_tested": "",
   "actions": [
    "read",
    "book"
   ]
  }
 ],
 "gates": [
  {
   "agent": "drafter",
   "action": "send",
   "gate": "owner-yes"
  },
  {
   "agent": "booker",
   "action": "book",
   "gate": "none"
  }
 ],
 "tests": [
  {
   "id": "T01",
   "kind": "normal",
   "result": "pass"
  },
  {
   "id": "T02",
   "kind": "normal",
   "result": "pass"
  },
  {
   "id": "T03",
   "kind": "normal",
   "result": "pass"
  },
  {
   "id": "T04",
   "kind": "normal",
   "result": "pass"
  },
  {
   "id": "T05",
   "kind": "normal",
   "result": "pass"
  },
  {
   "id": "T06",
   "kind": "normal",
   "result": "pass"
  },
  {
   "id": "T07",
   "kind": "normal",
   "result": "pass"
  },
  {
   "id": "T08",
   "kind": "normal",
   "result": "pass"
  }
 ],
 "kill_rule": ""
}
```

Output:

```
1 owner: agent booker has no named human owner
2 pause: agent booker has no real pause_tested date
3 gate: agent booker can book with no owner-yes or standing gate
4 dry run: need ten or more cases, at least one refuse case, all passed
5 kill rule: write the number that turns the workflow off
5 checks, 5 findings
```

After the owner names the booker's owner, tests its pause, gates the booking, adds two dry-run cases including a refusal and writes the kill rule, the same script prints `5 checks, 0 findings`.

## One prompt to try

```
Read binder-lite.json for the workflow we are about to switch on. Run binder_mini.py on it and show me the output. For each finding, tell me the smallest fix and what you need from me. Do not fill in owner names or pause dates yourself, and do not switch anything to live.
```

## What the full kit adds

The Agency Install Kit (bundle-agency-install-kit, $99) turns these five rules into a full Install Binder: readiness scores, one workflow per install, agent cards with risk classes, a gate register, a reach inventory that finds leftover access, a cost cap, a run sheet with an off switch, a scorecard with baselines, and fifteen checks. The owner's go-live yes is typed at their own terminal and tied to the sha256 of the binder, so any later edit voids it. It includes the Agency AI Ops Workbook, Governed Agent Teams, the Local Services Agent Kit, the Agency Open-Loop System and Outreach Without Spam in full, plus the free Agent Readiness Self-Check. If you would rather have the install done with you, the $5,000 Install sprint on paperchasewebb.ai runs the same two weeks.

## The script

~~~python
#!/usr/bin/env python3
"""binder_mini.py: five go-live checks on one small JSON file (free sample of the Agency Install Kit).
Usage: python3 binder_mini.py binder-lite.json
Exit 0 clean, 1 findings, 2 missing or unreadable file. Reads only; writes nothing; no network."""
import datetime as dt, json, sys

RISKY = {"send", "post", "publish", "spend", "refund", "delete", "sign", "book", "commit"}


def day(s):
    try:
        return dt.date.fromisoformat(str(s))
    except Exception:
        return None


def main(a):
    if len(a) < 2:
        print(__doc__); return 2
    try:
        b = json.load(open(a[1], encoding="utf-8"))
    except Exception as e:
        print(f"cannot read {a[1]}: {e}", file=sys.stderr); return 2
    F, today = [], dt.date.today()
    gates = {(g.get("agent"), g.get("action")): g for g in b.get("gates", [])}
    for ag in b.get("agents", []):
        n = ag.get("name", "?")
        if str(ag.get("owner", "")).strip().lower() in ("", "tbd", "todo", "owner"):
            F.append(f"1 owner: agent {n} has no named human owner")
        p = day(ag.get("pause_tested"))
        if not p or p > today:
            F.append(f"2 pause: agent {n} has no real pause_tested date")
        for act in ag.get("actions", []):
            g = gates.get((n, act), {}).get("gate")
            if act in RISKY and g not in ("owner-yes", "standing"):
                F.append(f"3 gate: agent {n} can {act} with no owner-yes or standing gate")
    t = b.get("tests", [])
    if len(t) < 10 or not any(x.get("kind") == "refuse" for x in t) or any(x.get("result") != "pass" for x in t):
        F.append("4 dry run: need ten or more cases, at least one refuse case, all passed")
    if not b.get("kill_rule"):
        F.append("5 kill rule: write the number that turns the workflow off")
    for f in F:
        print(f)
    print(f"5 checks, {len(F)} findings")
    return 1 if F else 0


if __name__ == "__main__":
    sys.exit(main(sys.argv))
~~~

PaperChaseWebb 💸
