Exec-proof: never break in front of an executive again
This skill exists because the RAPP installer broke live, in front of an executive, on Windows, three separate times. Root cause each time: the flow was only ever tested on Kody's Mac, where everything is pre-installed, pre-authenticated, and already running. The test that matters is the one that simulates the exec's machine, not this one.
The iron rule
Test the documented command, copied verbatim from where the user will read it — the README, the landing page, the slide. Never test the command from memory or from the repo checkout; the exec doesn't have the repo. If the docs say curl -fsSL https://.../install.sh | bash, fetch THAT URL and run THAT pipe.
Step 1 — Enumerate the advertised paths
Scrape the actual user-facing surfaces (landing page, README, deck notes) for every install/run command shown. For each, note the claimed platform. Known live example of the failure class: the rapp-installer page advertises install.ps1 / iex for Windows while that URL 404s — a doc-vs-artifact mismatch invisible from a working machine.
Step 2 — Verify artifacts exist before verifying they work
For every URL in an advertised command: curl -fsSL -o /dev/null -w "%{http_code}" it. A 404 here is an instant NO-GO for that platform — report it before doing anything else.
Step 3 — Clean-environment run (the platform you're on)
Simulate a fresh user, not a fresh universe:
- Run in a scratch HOME:
env -i HOME=$(mktemp -d) PATH=/usr/bin:/bin:/usr/local/bin bash -c '<documented command>'— this exposes dependencies on your dotfiles, your~/.local/bin, your cached auth tokens, your already-running servers. - If Docker is available, a bare
ubuntuordebiancontainer is the gold standard for the curl-pipe path. - Verify the END STATE the demo needs, not just installer exit 0: server answers on its port, page loads, agent responds. Check the port is handled when something already listens on it ("Address already in use" on 7071 was one of the live failures — the installer must either kill/reuse or pick a port, not stack-trace).
Step 4 — Windows audit (when the demo machine is Windows and you're not)
You can't execute PowerShell here, so audit statically — these are the recurring killers:
- Is there a real PowerShell one-liner (
iwr ... | iex) and does its URL return 200?| bashdoes not exist in PowerShell; a bash-only installer plus a Windows exec is a guaranteed live failure. - Scan any .ps1/.cmd for:
python3(Windows haspy/python), hardcoded/Users/or~paths,chmod, CRLF-sensitive heredocs,gh/git/curlassumed present, execution-policy blocks (needs-ExecutionPolicy Bypassin the one-liner). - If no Windows path exists at all, the verdict is NO-GO for Windows demos and the report says exactly what to build.
Step 5 — The re-run test
Run the documented command a SECOND time immediately. Execs retry when something looks stuck. Re-running must be idempotent: no port conflict, no "already exists" crash, no duplicate server.
Step 6 — Report: GO / NO-GO per platform
macOS : GO — verbatim command verified in clean HOME, server up, re-run idempotent
Windows : NO-GO — install.ps1 404s; page advertises it. Fix: publish install.ps1 or remove the claim.
Every NO-GO gets the exact failing command, the exact output, and the one-line fix. If everything passes, say GO plainly — no hedging. If anything is unverifiable from this machine, it is listed as UNVERIFIED, never assumed GO — that assumption is how the exec incident happened.
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as exec_proof_agent.py and embedded as the fenced Python below (sha256 81409f41759abdbf…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to exec_proof_agent.py first:
python3 exec_proof_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 exec_proof_agent.py # or on stdin
python3 exec_proof_agent.py --tool # emit the JSON tool contract
Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns steps, execute those steps in order exactly as returned; if it returns instructions, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent.
"""ExecProof -- Pre-demo smoke test — verify the install/demo path works on a machine that is NOT this one, exactly as a first-time user would run it, before anyone runs it live. Use before demos, customer sessions, or offsites; whenever the user says "exec proof this", "will this work on their machine", "smoke test the install", "demo tomorrow", or after any live-demo failure ("it broke in front of..."). The deliverable is a GO / NO-GO verdict with evidence, per platform.
Generated by the rapp skill from exec-proof. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""
import json
import re
import sys
try:
from agents.basic_agent import BasicAgent
except ImportError: # running OUTSIDE the brainstem -- stay executable anyway.
class BasicAgent: # noqa: D101 - minimal stand-in, same contract
def __init__(self, name=None, metadata=None):
if name:
self.name = name
if metadata:
self.metadata = metadata
def perform(self, **kwargs):
return "Not implemented."
def system_context(self):
return None
def to_tool(self):
return {"type": "function", "function": {
"name": self.name,
"description": self.metadata.get("description", ""),
"parameters": self.metadata.get("parameters", {})}}
# The procedural layer, verbatim from the source capability. The brainstem
# returns this to the model, so the skill's instructions still drive behaviour
# -- now behind a typed, deterministic tool contract.
INSTRUCTIONS = '# Exec-proof: never break in front of an executive again\n\nThis skill exists because the RAPP installer broke live, in front of an executive, on Windows, three separate times. Root cause each time: the flow was only ever tested on Kody's Mac, where everything is pre-installed, pre-authenticated, and already running. The test that matters is the one that simulates the exec's machine, not this one.\n\n## The iron rule\n\n**Test the documented command, copied verbatim from where the user will read it** — the README, the landing page, the slide. Never test the command from memory or from the repo checkout; the exec doesn't have the repo. If the docs say `curl -fsSL https://.../install.sh | bash`, fetch THAT URL and run THAT pipe.\n\n## Step 1 — Enumerate the advertised paths\n\nScrape the actual user-facing surfaces (landing page, README, deck notes) for every install/run command shown. For each, note the claimed platform. Known live example of the failure class: the rapp-installer page advertises `install.ps1` / `iex` for Windows while that URL 404s — a doc-vs-artifact mismatch invisible from a working machine.\n\n## Step 2 — Verify artifacts exist before verifying they work\n\nFor every URL in an advertised command: `curl -fsSL -o /dev/null -w "%{http_code}"` it. A 404 here is an instant NO-GO for that platform — report it before doing anything else.\n\n## Step 3 — Clean-environment run (the platform you're on)\n\nSimulate a fresh user, not a fresh universe:\n- Run in a scratch HOME: `env -i HOME=$(mktemp -d) PATH=/usr/bin:/bin:/usr/local/bin bash -c '<documented command>'` — this exposes dependencies on your dotfiles, your `~/.local/bin`, your cached auth tokens, your already-running servers.\n- If Docker is available, a bare `ubuntu` or `debian` container is the gold standard for the curl-pipe path.\n- Verify the END STATE the demo needs, not just installer exit 0: server answers on its port, page loads, agent responds. Check the port is handled when something already listens on it ("Address already in use" on 7071 was one of the live failures — the installer must either kill/reuse or pick a port, not stack-trace).\n\n## Step 4 — Windows audit (when the demo machine is Windows and you're not)\n\nYou can't execute PowerShell here, so audit statically — these are the recurring killers:\n- Is there a real PowerShell one-liner (`iwr ... | iex`) and does its URL return 200? `| bash` does not exist in PowerShell; a bash-only installer plus a Windows exec is a guaranteed live failure.\n- Scan any .ps1/.cmd for: `python3` (Windows has `py`/`python`), hardcoded `/Users/` or `~` paths, `chmod`, CRLF-sensitive heredocs, `gh`/`git`/`curl` assumed present, execution-policy blocks (needs `-ExecutionPolicy Bypass` in the one-liner).\n- If no Windows path exists at all, the verdict is NO-GO for Windows demos and the report says exactly what to build.\n\n## Step 5 — The re-run test\n\nRun the documented command a SECOND time immediately. Execs retry when something looks stuck. Re-running must be idempotent: no port conflict, no "already exists" crash, no duplicate server.\n\n## Step 6 — Report: GO / NO-GO per platform\n\n```\nmacOS : GO — verbatim command verified in clean HOME, server up, re-run idempotent\nWindows : NO-GO — install.ps1 404s; page advertises it. Fix: publish install.ps1 or remove the claim.\n```\nEvery NO-GO gets the exact failing command, the exact output, and the one-line fix. If everything passes, say GO plainly — no hedging. If anything is unverifiable from this machine, it is listed as UNVERIFIED, never assumed GO — that assumption is how the exec incident happened.'
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = [
{
"cmd": "curl -fsSL https://.../install.sh | bash",
"line": 7
},
{
"cmd": "curl -fsSL -o /dev/null -w \"%{http_code}\"",
"line": 15
},
{
"cmd": "python3",
"line": 28
},
{
"cmd": "python",
"line": 28
},
{
"cmd": "git",
"line": 28
},
{
"cmd": "curl",
"line": 28
}
]
class ExecProofAgent(BasicAgent):
def __init__(self):
self.name = 'ExecProof'
self.metadata = {
"name": "ExecProof",
"description": "Pre-demo smoke test \u2014 verify the install/demo path works on a machine that is NOT this one, exactly as a first-time user would run it, before anyone runs it live. Use before demos, customer sessions, or offsites; whenever the user says \"exec proof this\", \"will this work on their machine\", \"smoke test the install\", \"demo tomorrow\", or after any live-demo failure (\"it broke in front of...\"). The deliverable is a GO / NO-GO verdict with evidence, per platform.",
"parameters": {
"properties": {},
"required": [],
"type": "object"
}
}
super().__init__(name=self.name, metadata=self.metadata)
def perform(self, **kwargs): # toaster:generated-perform
missing = [k for k in self.metadata["parameters"].get("required", [])
if k not in kwargs]
if missing:
return json.dumps({"status": "error",
"missing_required": missing}, indent=2)
resolved, unresolved = [], set()
for step in STEPS:
cmd = step["cmd"]
for key, value in kwargs.items():
for token in ("<" + key.replace("_", "-") + ">",
"<" + key + ">",
"{{" + key + "}}",
"$" + key.upper()):
cmd = cmd.replace(token, str(value))
for leftover in re.findall(r"<[a-zA-Z][a-zA-Z0-9 _.-]{1,40}>", cmd):
unresolved.add(leftover)
resolved.append(cmd)
return json.dumps({"status": "ok",
"steps": resolved,
"unresolved_placeholders": sorted(unresolved),
"note": "Resolved deterministically by the agent; "
"run in order. Nothing was executed here."},
indent=2)
if __name__ == "__main__":
# Standalone entry point: the deterministic layer runs with NO brainstem,
# no framework, no install. This is what lets a "simple SKILL.md" platform
# keep real determinism -- the host model shells out to this file instead
# of improvising the procedure in prose.
# echo '{"arg": "value"}' | python3 exec_proof_agent.py
# python3 exec_proof_agent.py '{"arg": "value"}'
# python3 exec_proof_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(ExecProofAgent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(ExecProofAgent().perform(**json.loads(_raw)))
# rci-capsule:v1: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