skills/golem-powers/deploy-verify/SKILL.md
Use after any infra PR merges or any claim that a daemon, app, CLI, or MCP server is now deployed. Enforces a 4-step post-merge verification sequence: process replacement, `launchctl print`, build-stamp match, and an end-to-end live probe before declaring the deploy done. Triggers on: PR merged, deployed, shipped, launch agent, daemon restart, MCP server deploy, post-merge check.
npx skillsauth add etanhey/golems deploy-verifyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A merged PR is not a deployed system. Verify the runtime, or do not claim the deploy is done.
Infra PRs include:
This skill composes directly with:
/never-fabricate/post-merge-deploy-check/post-merge-deploy-check proves merged-PR metadata, registry state, bundle provenance, and canonical-path/process drift. This skill is the agent-side workflow that decides when to run that script, what additional runtime checks must be collected, and when "done" is still unverified.
After an infra PR merges, do not claim deployed until all four verification steps pass.
Required sequence:
launchctl print statusIf any step fails, the verdict is NOT DEPLOYED. Fix the deploy or open a fix PR. Do not narrate success.
Before running the sequence, classify the PR:
no_deploy_required: docs, skill-only, or other artifact-free changesdeploy_bearing: LaunchAgent, daemon, CLI, MCP server, app bundle, socket service, or anything that changes live runtime behaviorIf the PR is no_deploy_required, say so explicitly and stop.
If it is deploy_bearing, continue through all four steps.
Goal: prove the old runtime exited and a fresh runtime is now the one serving requests.
Required evidence:
Acceptable checks:
pgrep -alf <process-pattern>ps -p <pid> -o pid=,ppid=,etime=,command=Failure examples:
*-DEV-* app bundleGoal: prove launchd knows about the correct service state.
Required evidence:
launchctl print gui/$(id -u)/<service-label> or equivalent for the relevant domainProgram or ProgramArguments point at the canonical artifact, not stale pathsFailure examples:
Could not find serviceGoal: prove the artifact serving requests was built from the merged mainline commit.
Required evidence:
Info.plist provenance fields such as GitCommit, BuildTimeUTC, and expected bundle metadata--version, version.json, or equivalent commit/build stampRequired action:
/post-merge-deploy-check when the component is in the canonical deploy registryWhat /post-merge-deploy-check covers:
GitCommit matches the registryFailure examples:
Goal: prove the runtime actually serves post-merge behavior, not just the right metadata.
Use the narrowest real probe that exercises the changed path:
The probe must hit the changed behavior, not just process liveness.
Failure examples:
Example inputs:
Action:
deploy_bearingTASK_DONEDo not treat this as deployment proof.
Action:
launchctl printUntil those exist, the status is UNVERIFIED DEPLOY CLAIM.
/post-merge-deploy-check passes but the live probe failsVerdict:
NOT DEPLOYEDReason:
Verdict:
DRIFTED OR NON-CANONICAL DEPLOYReason:
When reporting verification, use this structure:
Deploy verification for <repo>#<pr>:
- Step 1 Process replacement: PASS|FAIL — <evidence>
- Step 2 LaunchAgent status: PASS|FAIL — <evidence>
- Step 3 Build-stamp match: PASS|FAIL — <evidence>
- Step 4 End-to-end probe: PASS|FAIL — <evidence>
- Verdict: DEPLOYED | NOT DEPLOYED | NO DEPLOY REQUIRED
If any evidence is missing, say UNVERIFIED and keep the verdict negative.
Never answer "done" or "deployed" from GitHub merge state alone.
TASK_DONE, collab notes, and "restarted locally" claims are not verification. /never-fabricate applies in full.
Passing /post-merge-deploy-check is not enough without the end-to-end probe.
A running PID or loaded LaunchAgent is not enough without build-stamp evidence.
Do not close the pane, remove the worktree, or report success until all required steps pass.
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| "PR merged, so deploy is done" | GitHub state is not runtime state | Run all four verification steps |
| "worker said restarted" | Worker self-report is not proof | Collect process, launchctl, stamp, and probe evidence |
| "PID exists, looks good" | Liveness does not prove the right build or behavior | Check stamp and probe |
| "build stamp matches, so done" | Provenance does not prove serving behavior | Run the live probe |
| "probe works, close pane" | Probe without canonical provenance can hide drift | Run /post-merge-deploy-check and record the receipt |
Recommended commands include:
pgrep -alf '<pattern>'
launchctl print gui/$(id -u)/<service-label>
python3 ~/Gits/orchestrator/scripts/post-merge-deploy-check.py <repo> <pr-number>
<canonical-binary> --version
<real socket, MCP, or endpoint probe>
Use the canonical deploy registry when available. If the component is not registered yet, say so explicitly and still complete the process, launchctl, build-stamp, and live-probe checks with whatever local evidence is available.
tools
The human-eval UX contract for Phoenix views: turn-by-turn scrollable replay (not a scorecard), hide-but-copyable IDs, collapsed thinking, identity chips, tool filters, tiny frozen starter datasets, mark-wrong-in-thread, mobile-first. Use when: building or reviewing ANY Phoenix/eval view, annotation UI, session replay, or human-grading surface. Triggers: phoenix view, eval UI, annotation view, session replay, human eval UX, grading interface. NOT for: Phoenix data pipelines/ingest (capture scripts have their own specs).
tools
macOS systems specialist — AppKit NSPanel architecture, launchd services, socket activation, MCP bridge resilience, syspolicyd, and high-frequency SwiftUI dashboards. Use when building menu-bar apps, LaunchAgents, debugging syspolicyd/Gatekeeper/TCC, resilient UDS/MCP bridges, or SwiftUI dashboards at 10Hz+.
development
Bulk LLM-judging protocol for fleet-dispatched verdict runs (KG cluster, eval harness). Use when: dispatching or running judge workers (J1/J2/RT), planning bulk-apply from verdict JSONL, or triaging evidence_degraded outputs. Triggers: judge fleet, bulk judge, R3 verdicts, kg-judge, RT gate, evidence_degraded. NOT for: single-item code review, Phoenix view UX (use phoenix-human-view), or non-judge eval pipelines.
development
Quiet-down protocol for sprint close: when the fleet wraps, delete ALL polling crons and monitors, send ONE final dashboard + ONE message, then go SILENT. Use when: fleet wraps, all workers done, overnight queue exhausted, sprint close, Etan asleep/away with nothing approved left. Triggers: fleet wrap, wrap the fleet, stand down, going quiet, sprint close. NOT for: mid-sprint monitoring (keep your loops), spawning a successor (use /session-handoff first).