watch-run — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited watch-run (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
.skills/watch-run/scripts/watch_run.sh <out-dir> [listen-port primary-port shadow-port]
Defaults: ports 8788 (tee/listen) 8790 (primary) 8791 (shadow) — the .skills/paired defaults. Pass the run's --out dir as the first arg.
Launch the run in the background first (e.g. .skills/scripts/run_paired.sh … --out runs/paired-haiku-L1), then attach this under the Monitor tool with persistent: true (a 75-min run exceeds Monitor's 60-min non-persistent timeout). The watcher exits on its own at COMPLETE/DEAD/WATCH-END, which ends the Monitor cleanly; TaskStop it early if you abort the run.
Monitor(persistent=true,
command=".skills/watch-run/scripts/watch_run.sh runs/paired-haiku-L1 8788 8790 8791")ALIVE a0=.. a5=.. — first turns observed; the run came up.ERROR(+n) … :: <last matching line> — n new error-signature lines inproxy.primary.log / proxy.shadow.log / tee.log (overload, 429, EADDRINUSE/ECONN*, → 4xx/5xx, Traceback, force-exit, [error], …).
STALL … — no new SHADOW turn for 12 min but a proxy is still listening(warned once; the conversation is wedged, processes alive).
DEAD … — no new SHADOW turn for 12 min AND no proxy listening → the runcrashed; exits 1.
COMPLETE a0=.. a5=.. (+Nm) — report.md present (analyzer finished);exits 0.
WATCH-END — ~95-min wall-clock backstop tripped; exits 2.On a paired run the PRIMARY arm (A5 stack) fires keep-alive pings during idle gaps, each appended to instance.A5.ndjson. So A5's line count rises even when no real turn happens — tracking it for staleness would hide a stalled conversation behind ping traffic. The SHADOW (A0) is --passthrough with keep-alive off, so its line count == real-turn count: the honest liveness signal. ALIVE still fires on either arm (proxies-up signal); only stall/crash detection keys on A0.
Both are env vars (soft default + knob), so tune them per profile without editing the script — pass them on the Monitor command line:
STALL_SEC=2400 .skills/watch-run/scripts/watch_run.sh runs/paired-haiku-L2 8788 8790 8791STALL_SEC (env, default 720s ≈ 12 min) — raise for L2+ where long gaps arenormal: STALL_SEC=2400 for L2 (up-to-30-min gaps), ~6000 for L3 (90-min). Set it above the profile's max gap + response slack. Too-low only emits a STALL warning; it never causes a false DEAD (that requires no proxy listening), so erring high is safe.
HARD_MAX_SEC (env, default 5700s ≈ 95 min) — raise for runs capped longerthan 75 min.
The error-signature pipeline misfired twice in production — a startup crash (grep -c's print-0-and-exit-1 double-counted into 0\n0: syntax error) and a false ERROR on a healthy .429Z keep-alive ping (a bare 429 matched the timestamp's milliseconds). Both are fixed and the detection now lives in one tested function reachable via a hidden entry point:
.skills/watch-run/scripts/watch_run.sh --errcount <logfile> # prints the error count for one file
test/watch_run.test.js pins the must-NOT-cry-wolf cases (the .429Z ping, the → 404 [no-route] probe, a 4-digit → 4096 count) and the must-NOT-go-blind cases (→ 529, → 5xx, EADDRINUSE, Traceback, [error]). After touching ERRRE/IGNORE, run npm test -- watch_run.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.