Kickoff
openwpm/OpenWPM
A skill your agent uses to launch a background Claude agent in tmux (or docker/podman) to implement a feature end-to-end.
Worktree-side implementation orchestrator for an OpenSpec change.
$ npx skills add BlackBeltTechnology/pi-agent-dashboard --skill ship-it -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install BlackBeltTechnology/pi-agent-dashboard ship-it --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/BlackBeltTechnology/pi-agent-dashboard.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.pi/skills/ship-it .claude/skills/ship-it && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ship-it" agent skill from https://github.com/BlackBeltTechnology/pi-agent-dashboard/tree/develop/.pi/skills/ship-it into .claude/skills/ship-it/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-it", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/BlackBeltTechnology/pi-agent-dashboard/tree/develop/.pi/skills/ship-itType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add BlackBeltTechnology/pi-agent-dashboard --skill ship-it -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install BlackBeltTechnology/pi-agent-dashboard ship-it --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/BlackBeltTechnology/pi-agent-dashboard.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.pi/skills/ship-it .agents/skills/ship-it && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ship-it" agent skill from https://github.com/BlackBeltTechnology/pi-agent-dashboard/tree/develop/.pi/skills/ship-it into .agents/skills/ship-it/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-it", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add BlackBeltTechnology/pi-agent-dashboard --skill ship-it -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install BlackBeltTechnology/pi-agent-dashboard ship-it --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/BlackBeltTechnology/pi-agent-dashboard.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.pi/skills/ship-it .cursor/skills/ship-it && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ship-it" agent skill from https://github.com/BlackBeltTechnology/pi-agent-dashboard/tree/develop/.pi/skills/ship-it into .cursor/skills/ship-it/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-it", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/BlackBeltTechnology/pi-agent-dashboard.git --path .pi/skills/ship-it--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add BlackBeltTechnology/pi-agent-dashboard --skill ship-it -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install BlackBeltTechnology/pi-agent-dashboard ship-it --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/BlackBeltTechnology/pi-agent-dashboard.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.pi/skills/ship-it .gemini/skills/ship-it && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ship-it" agent skill from https://github.com/BlackBeltTechnology/pi-agent-dashboard/tree/develop/.pi/skills/ship-it into .gemini/skills/ship-it/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-it", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install BlackBeltTechnology/pi-agent-dashboard ship-itInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add BlackBeltTechnology/pi-agent-dashboard --skill ship-it -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/BlackBeltTechnology/pi-agent-dashboard.git skills-src && mkdir -p .github/skills && cp -r skills-src/.pi/skills/ship-it .github/skills/ship-it && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ship-it" agent skill from https://github.com/BlackBeltTechnology/pi-agent-dashboard/tree/develop/.pi/skills/ship-it into .github/skills/ship-it/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-it", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add BlackBeltTechnology/pi-agent-dashboard --skill ship-it -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install BlackBeltTechnology/pi-agent-dashboard ship-it --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/BlackBeltTechnology/pi-agent-dashboard.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.pi/skills/ship-it .opencode/skills/ship-it && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ship-it" agent skill from https://github.com/BlackBeltTechnology/pi-agent-dashboard/tree/develop/.pi/skills/ship-it into .opencode/skills/ship-it/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ship-it", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ship-itWorktree-side implementation orchestrator for an OpenSpec change.
Ship It is an agent skill from BlackBeltTechnology/pi-agent-dashboard. Worktree-side implementation orchestrator for an OpenSpec change. Idempotent: gates automated scenarios on filesystem reality, owns the red-test fix loop, runs the docker harness with always-teardown, then drives ship-change inline. Escape hatch writes SHIPITBLOCKED.md. Runnable headless. Triggers: "ship it", "build and ship this change", "run ship-it", "implement + test + land in the worktree".
Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 15 other files, including scripts (for example `scripts/__tests__/fix-ledger.test.ts`, `scripts/__tests__/review-cli.test.ts` and `scripts/__tests__/review-gate.test.ts`).
It sits in DevOps & Cloud, covering Git worktrees and Containers. It works with Docker. The repository describes itself as: Real-time web dashboard for pi coding-agent sessions. Multi-session view, live chat mirroring, integrated terminal, diff viewer, pi-flows execution, and mobile-first remote… The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 86e8e4d. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 12 files in scripts/ (TypeScript), which the agent can run.
Shell commands in SKILL.md call:
gitnodejqnpmpnpmnpxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, npm, pnpm and npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ship It loads about 5.4k tokens when it runs. Until then it costs about 102 tokens; SKILL.md has 2,678 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from BlackBeltTechnology/pi-agent-dashboard at commit 86e8e4d, republished under its MIT licence (© BlackBeltTechnology). 2,678 words, ~5,359 tokens.
.claude/skills/ship-it/SKILL.md (or your agent's skills folder). This skill also uses 13 other files; get the full folder from GitHub.Orchestrates the implementation phase of an OpenSpec change inside its git
worktree. Twin of plan-proposal (which runs the planning phase on develop).
Composes existing skills — openspec-apply-change, the docker harness, and
ship-change — and adds the wiring they lack. Runnable headless.
flowchart LR
P["plan-proposal (develop)"] -->|"boundary: spawn worktree"| S
subgraph Worktree ["IMPLEMENTATION — worktree (this skill)"]
S["ship-it"] --> A["apply"] --> M["merge develop (2.5)"] --> T["docker-harness test"] --> E["enforcers (4.4)"] --> R["local review (4.5)"] --> C["ship-change"]
end
S -.->|"reverse: SHIP_IT_BLOCKED.md on design issue"| PPure decision logic lives in this skill's own scripts/ directory and is
unit-tested (.pi/skills/ship-it is a vitest project):
scripts/manifest.ts (parseManifest, deferDecision, filesystemRealityCheck),
scripts/no-weakening.ts (assertNoWeakening),
scripts/review-gate.ts (reviewRoundDecision, parseReviewReply,
resolveReviewer, classifyFindings, REVIEW_TIMEOUT_MS),
scripts/fix-ledger.ts (validateFixLedger), scripts/review-state.ts
(deriveReviewState), and scripts/review-prompt.ts (buildReviewPrompt + the
step-4.5 CLI).
.worktrees/os-<change>, branch
os/<change>). Resolve the change name from the worktree dir basename.docker available (the e2e harness); openspec CLI resolves from the parent
repo root when inside a worktree (per AGENTS.md).<change> (worktree implementation phase)."openspec status, but gate on filesystem reality (idempotent)Entry gate — a previous hand-back. If
openspec/changes/<change>/SHIP_IT_BLOCKED.md already exists, a previous
invocation handed the change to a human. A run is interactive exactly when
the ask_user tool is available; otherwise it is headless.
SHIP_IT_BLOCKED.md. No fix loop, no
review round, no ship-change step.ask_user resume / abort. On
abort, stop without changes. On resume, create this invocation's run dir
(step 4.5), copy SHIP_IT_BLOCKED.md into it (evidence kept), then remove
the file from the change dir.Removing the file, or answering resume, is the human decision that starts a
new review budget — re-invoking ship-it alone never does.
Read openspec status --change <change> --json for orientation only. Do not
trust the tasks.md checkbox as proof an automated scenario is done — a
hand-checked or prior-partial - [x] can lie.
Parse test-plan.md (parseManifest). For each automated row, resolve its
folded test file and run filesystemRealityCheck: a scenario is satisfied only
when its test file exists AND passes in the harness (step 3). Any automated
row whose test file is absent → NOT done → author it (step 2) regardless of the
checkbox. This makes re-invocation genuinely idempotent: fresh run and re-run
reach the same all-green end state.
kb-first, even as an executor. You know which files the tasks name, so your
reflex is grep/cat/Read on them directly. The docs-first gate still applies:
before you grep/rg for a symbol, Read a file to learn its purpose, or chase
an import, run kb_search / kb agents <path> / kb_neighbors FIRST. Knowing
the file does not exempt you — kb the symbol/file, then edit.
If non-manual-only tasks remain (real code + the test files the fold tasked),
run openspec-apply-change for the change. apply writes code and marks tasks.
apply has no "copy from exemplar" capability of its own. For each folded test
task, resolve the harness-exemplar pointer (the nearest existing spec of that
category named in the task) and inject its path into the task context you hand
apply — or author the spec yourself in the fix loop (step 4). Bare
"author X.spec.ts" with no exemplar is forbidden.
develop — merge before the harness (primary integration point)The harness (step 3) is the strongest gate on the ship-it path, so integration
must sit upstream of it: the harness must validate the merged tree T1, not
the pre-merge tree T0. Merge origin/develop — the remote ref, never local
develop (checked out in the parent repo → worktree branch-collision pitfall):
git fetch origin develop
git merge --no-edit origin/developIdempotent: up-to-date → "Already up to date", no merge commit, safe to always
run. Merge, not rebase — step 9 squash-merges anyway, so rebase's linear
history is moot while its force-push is a documented ship-change footgun.
Conflict → abort + STOP. On an unresolved conflict, git merge --abort,
report, and do not enter the harness — never run the gate on a half-merged
tree. Resolve trivial conflicts with ship-change's existing recipes (AGENTS.md
union-keep; pnpm-lock.yaml → git checkout --theirs +
pnpm install --lockfile-only), then re-run the merge. A conflict you cannot
resolve mechanically → escape hatch (step 5).
Obtain the harness and its port from docker/test-up.sh (allocator on first run,
reuser on re-up — do NOT add port code). Read the derived port from
.pi-test-harness.json (dashboardPort) — never hardcode :18000.
Wrap the whole run so teardown ALWAYS happens (red test, abort, or a partial
test-up.sh start):
cleanup() { docker/test-down.sh || true; }
trap cleanup EXIT
docker/test-up.sh -d --build # allocates + records .pi-test-harness.json
port=$(jq -r '.dashboardPort' .pi-test-harness.json) # jq is present in the harness env
# run the relevant suite against $port:
PW_E2E_USE_RUNNING=1 npm run test:e2e # L3; or the L1/L2 suite for other levelstest-down.sh is safe against a partially-created compose project (compose down -v + best-effort rm). Isolation is no longer silent, though: a second
worktree's harness saturates the daemon (two 4 GiB limits on an 8 GB VM), so
test-up.sh refuses when (n+1) × MEM_LIMIT >= MemTotal — n = other running
pi-dash-test-* projects, MEM_LIMIT default 4g — naming them and the
arithmetic, and warns (once) when the limits fit but a peer is up, because a red
run is then not attributable. Free the peer with its own test-down.sh, or set
PI_HARNESS_ALLOW_OVERSUBSCRIBE=1. The harness emits no committed whole-run
timeout (#450): bound a local run with --global-timeout, never a config edit.
apply marks - [ ] → - [x] and never revisits a checked task, so re-invoking
apply on a red-but-checked test no-ops. On a red test, ship-it drives the
fix itself — edit the code or the test, re-run the harness. Never re-invoke
apply on an already-checked task.
Bound the loop by progress-making cycles, not a fixed count:
No-weakening guardrail (mechanical, enforced every cycle): before accepting a
change to a test file, run assertNoWeakening on its diff
(git diff -- <test-file>). If it reports ok:false (added .only/skip,
deleted assertion, or a strong→permissive matcher swap), REJECT the change —
you may not reach green by degrading the test. Fix the code instead.
Run the enforcers from the worktree root. Each is already the sole owner of its rule; this step only invokes them:
node scripts/check-conventions.mjs --base origin/develop
node scripts/dox-byte-gate.mjs
node scripts/i18n-lint.mjs --strict # --strict, else it exits 0 regardless
node scripts/i18n-parity.mjs
node scripts/knip-config.mjs # knip.json still roots every manifest entry
node scripts/knip-ratchet.mjs # per-class dead-code ratchet (~8s)
node scripts/knip-ratchet.mjs --check-baseline-diff origin/develop # ceiling not raisedThe knip pair is the preventive half of the dead-code oracle: the nightly
job runs after merge and can only report. Order matters — knip-config.mjs
first, because an unrooted graph reports live files as dead, and a ratchet over
that number gates noise (measured: unrooted 723 findings / 90 unused files vs
rooted 437 / 10). Fix a ratchet failure by deleting the dead code; raising a
baseline is rejected by the third command — which must stay wired, or "never
raise the ceiling" is aspirational: the plain ratchet passes happily against a
raised number. It also rejects a DELETED class, the cheaper bypass.
They are placed here, after the harness and before the review, because they are deterministic, offline and near-instant: a mechanically-failing tree must never spend a model call. A non-zero exit routes to the step-4 fix loop; step 4.5 does not run.
--base is mandatory for gating: without it the touched set is undefined and
the Discipline-Skills and Mermaid rules report without gating. The touched set
unions the committed diff with the working tree, so fixes still uncommitted in
the fix loop are inspected.
These do NOT move into quality:changed. That script is the dev-loop oracle and
has no automated caller; the ship gate is here.
Runs on every invocation. There is no triviality escape: no diff-size, path,
or changed-file-count condition skips it. A run is interactive exactly when
the ask_user tool is available in the session; otherwise it is headless.
CLI below is npx tsx .pi/skills/ship-it/scripts/review-prompt.ts. Records
live in this invocation's run dir, created once with
RUN=$(CLI --new-run --change <change>) →
$(git rev-parse --git-dir)/ship-it/<change>/<run-id>/ (per worktree, never
committed, <run-id> = invocation start timestamp):
review-r<N>.md (well-formed reply of round N), review-r<N>.attempt-<k>.md
(malformed attempt), fix-ledger-r<N>.json (answers review-r<N>.md),
ledger-failures.log (written by the CLI), approvals.log (one line per human
"one more round" answer — written only right after an ask_user answer).
resolveReviewer from scripts/review-gate.ts.
@review is REQUIRED. Unconfigured → hard fail naming update_roles / the
dashboard Roles panel. There is deliberately no fallback to the session
default model: that model is the author, so falling back turns the gate into
self-review. Interactive runs may offer the bootstrap prompt; a headless run
fails.CLI --state "$RUN" → round,
approvedExtraRounds, malformedRetries, ledgerFailures. Feed exactly
those values (plus interactive and the last round's blocking ids) to
reviewRoundDecision. Never supply a counter from memory; never relabel a
round as round 1 of a new budget.git status --short, then stage the
change's own paths explicitly and commit exactly that list with
git commit -- <paths> (a bare git commit takes everything in the index),
so files already staged before this step stay out; unrelated local edits
(e.g. a worktree-local .pi/settings.json) stay unstaged and never enter
the change. Record the commit as the round's sha.CLI --change <change> --round 1. Round N ≥ 2 (a verification round):
CLI --change <change> --round N --prior "$RUN/review-r<N-1>.md" --ledger "$RUN/fix-ledger-r<N-1>.json" --since <round N-1 sha>.
Pass its stdout to the reviewer verbatim — no added framing, summary, or
claim about the fixes; keep its header line. The generated prompt carries the
review-code rubric, the diff range git diff origin/develop...HEAD
(three-dot, so the step-2.5 merge is not attributed to this change), every
intent artifact present (proposal.md, tasks.md, design.md, delta specs,
test-plan.md), and the defect-class sweep. Known limitation: a verification
round carries each prior B finding up to its first unindented paragraph
(indented continuations are kept) — the price of keeping the prior reply
bounded (#E24); the prompt asks the reviewer to indent continuations.Agent call with model: "@review"
and subagent_type: "CodeReviewer" (the definition in
.pi/agents/CodeReviewer.md disables context inheritance; no other agent
type may be used here). Never an in-context self-review, never the
CodeRabbit CLI (that is ship-change's remote gate, later and different).REVIEW_TIMEOUT_MS (300s). A timeout is neither a pass
nor a blocking finding — it is a checkpoint failure.parseReviewReply. Well-formed → save it as
$RUN/review-r<N>.md. Malformed (empty, no or duplicate
BLOCKING_COUNT/VERDICT line, or self-contradictory) → save it as
$RUN/review-r<N>.attempt-<k>.md; it is never a pass and never a round.
Retry once: re-invoke the same round; a second malformed reply halts like
a timeout. A missing sweep table is noted in the round record and the step
report, not a failure.issue(blocking) (B<n> ids) re-enters the fix
loop. Everything else is reported and shipped.B id (the review-code fix protocol): reproducing
test first (or a ≥20-char reason no automated test can observe it) →
smallest fix → sibling sweep of the same pattern across the change → re-read
the fix hunk against the finding's defect class. After each review fix,
re-run the harness (step 3) and the step-4.4 enforcers before anything
else; a failure re-enters the fix loop first.$RUN/fix-ledger-r<N>.json, one entry per B id — { id, test: {path} | {untestable}, siblings: {searched, sites}, fixedIn }, no status field, no
verdict language. Then
CLI --validate-ledger --prior "$RUN/review-r<N>.md" --ledger "$RUN/fix-ledger-r<N>.json".
Non-zero → complete the listed entries (each failure is recorded; the third
for a round routes as unsatisfiable). An entry the fix loop cannot complete
→ unsatisfiable. No verification round while validation fails.reviewRoundDecision. The base cap is two rounds —
review, fix, re-review. This is a hard numeric cap, NOT step 4's
no-progress rule, because a reviewer can emit a fresh finding every round
and each fix changes the worktree, so a no-progress bound would never fire.review → next round (step 3).proceed → step 6.ask (interactive, cap reached) → one ask_user select naming the
remaining B ids: one more verification round / hand back to
planning. One more → append one line to $RUN/approvals.log and record
the answer in the round file, then run exactly one verification round.
Hand back → escape hatch. If the ask_user call fails, treat the run as
headless and take the escape hatch.escape → the boundary-reverse (step-5) escape hatch.assertNoWeakening still governs every test edit a review fix makes. A
finding that can only be satisfied by weakening a test is unsatisfiable →
escape hatch (step 5), naming both the finding and the guardrail. The
guardrail is never relaxed to reach green.Every escape decision carries a reason; write it into SHIP_IT_BLOCKED.md
together with the run dir path.
The worktree boundary is not one-way. Trigger the reverse path when ANY of:
apply reports a design issue (NL prose — implementation reveals the design is
wrong), ORescape (including a human choosing
hand back at the cap).Then, do NOT headlessly rewrite proposal.md/design.md:
openspec/changes/<change>/SHIP_IT_BLOCKED.md naming the failing
scenario / design gap and what was tried.plan-proposal /
doubt-driven-review on develop.Once every automated scenario is green (harness-verified), ship. Execute
ship-change's procedure inline (not as a black-box subagent) so you keep
step-level control for the teardown ordering below.
Defer rule (deferDecision, manifest-aware):
test-plan.md exists → a leftover - [ ] is deferrable only if it maps to a
manual-only manifest row (inline (test-plan: manual-only) or a
(test-plan #<id>) reference resolved against the manifest). Any other leftover
= real work = STOP (return to step 2, or the escape hatch).test-plan.md absent (legacy change) → ship-change's current keyword defer
applies unchanged.Archive+sync gate before the destructive steps (load-bearing): do not let
ship-change merge the PR, delete the branch, or remove the worktree while the
proposal is not archived and specs are not synced. ship-change step 8.5 is that
hard gate — driving ship-change inline, hold at step 8.5 until the change is
archived (source dir moved to openspec/changes/archive/, move committed) and
specs synced. Failed/skipped archive → STOP (return to step 2 or the escape hatch),
never proceed to steps 9/10.
Teardown-before-removal ordering (load-bearing): the harness MUST be torn down
(test-down.sh, already wired via the step-3 trap) before ship-change step
10 removes the worktree. A leaked container makes the worktree "busy" and stalls
removal. Run the harness teardown, then let ship-change archive → commit → PR →
CI → CodeRabbit → (archive+sync gate) → squash-merge → remove worktree.
- [x] is never proof; the
test file must exist and pass in the harness.apply on a checked task.assertNoWeakening rejects it.@review is
required; never fall back to the session default model (that is self-review).ask_user, recorded in approvals.log) adds a round — exactly
+1 round per human approval. The orchestrator never renews its own
budget: no self-reset, no "fresh two-round budget", no relabelled round.
Headless runs and hand-backs take the boundary-reverse (step-5) escape hatch.review-prompt.ts output, passed
verbatim to subagent_type: "CodeReviewer"; never hand-written, never
carrying the author's conclusions.SHIP_IT_BLOCKED.md at entry stops the run — headless exits non-zero;
interactive asks resume/abort.develop before the harness (step 2.5) — the strong gate validates
the integrated tree T1; merge origin/develop (remote ref), never rebase.
Conflict → abort + STOP, never enter the harness on a half-merged tree.ship-change step 8.5 (archive+sync gate) until it passes; failed archive → STOP.:18000 — read dashboardPort from .pi-test-harness.json.openspec-apply-change · docker/test-up.sh + lib-ports.sh + test-down.sh ·
review-code (its rubric is what the step-4.5 reviewer applies) ·
ship-change (driven inline, manifest-aware defer). Handoff back to
plan-proposal via SHIP_IT_BLOCKED.md.
© BlackBeltTechnology, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 13 other files (scripts) in .pi/skills/ship-it of BlackBeltTechnology/pi-agent-dashboard.
Open the folder on GitHubat commit 86e8e4d
Ship It next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ship It this skillBlackBeltTechnology/pi-agent-dashboard | 315 | — | ~5.4k | Automated safety check: Pass | MIT | |
| Kickoffopenwpm/OpenWPM | 1.4k | — | ~781 | Automated safety check: Pass | Custom licence | |
| Wp Playgroundbonny/WordPress-Simple-History | 317 | — | ~1k | Automated safety check: Notes | None | |
| Build Px4 macOSPX4/PX4-Autopilot | 13k | — | ~1.1k | Automated safety check: Pass | BSD-3-Clause | |
| Checkopenwpm/OpenWPM | 1.4k | — | ~1.5k | Automated safety check: Pass | Custom licence | |
| Devcontainer Devstacklok/toolhive-studio | 170 | — | ~3.8k | Automated safety check: Notes | Apache-2.0 |
openwpm/OpenWPM
A skill your agent uses to launch a background Claude agent in tmux (or docker/podman) to implement a feature end-to-end.
bonny/WordPress-Simple-History
A skill your agent uses for quick local testing with WordPress Playground CLI.
PX4/PX4-Autopilot
Build PX4 board firmware on macOS in the px4-dev Docker container, including git worktrees, and stage commit-labeled artifacts without flashing hardware.
openwpm/OpenWPM
A skill your agent uses to check on background feature agents launched via /kickoff — running in tmux sessions or docker/podman containers.
stacklok/toolhive-studio
Spin up and interact with ToolHive Studio's containerized dev environment (Xvfb + noVNC + DinD).
alinaqi/maggy
Multi-agent orchestration with container-isolated workspaces — each agent session runs in its own Docker container with independent git branches
BlackBeltTechnology/pi-agent-dashboard
Browser automation via the agent-browser CLI. An agent skill from BlackBeltTechnology/pi-agent-dashboard.
BlackBeltTechnology/pi-agent-dashboard
Diagnose failed GitHub Actions runs for pi-agent-dashboard: the 11-file workflow taxonomy, affected-test selection, the release pipeline, known failure modes, and how to read gh run logs and…
BlackBeltTechnology/pi-agent-dashboard
Diagnose problems in the running pi-agent-dashboard system: server.log, /api/health, bridge WebSocket connectivity, vitest triage, known-issue FAQ entries.
BlackBeltTechnology/pi-agent-dashboard
Disciplined implementation in pi-agent-dashboard: the rebuild matrix (extension→reload, server→restart, client→build+restart, openspec-apply→full rebuild) plus the project's code discipline rules.
BlackBeltTechnology/pi-agent-dashboard
Monitor and control the pi-dashboard server. An agent skill from BlackBeltTechnology/pi-agent-dashboard.
BlackBeltTechnology/pi-agent-dashboard
Turn a pi session into a Markdown "how-we-did-it" collaboration guideline: reads the session's JSONL transcript and synthesizes a reusable playbook of which prompts worked, what had to be steered…
Works with
Categories
Worktree-side implementation orchestrator for an OpenSpec change. Ship It is an agent skill from BlackBeltTechnology/pi-agent-dashboard. Worktree-side implementation orchestrator for an OpenSpec change.
Ship It fits situations like: tasks that involve Git worktrees; tasks that involve Containers.
Run `npx skills add BlackBeltTechnology/pi-agent-dashboard --skill ship-it -a claude-code`. Or copy the skill folder (.pi/skills/ship-it in BlackBeltTechnology/pi-agent-dashboard) into .claude/skills/ship-it in your project. Claude Code loads it when a task matches its description.
Run `npx skills add BlackBeltTechnology/pi-agent-dashboard --skill ship-it -a codex`. Or copy the skill folder (.pi/skills/ship-it in BlackBeltTechnology/pi-agent-dashboard) into .agents/skills/ship-it in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add BlackBeltTechnology/pi-agent-dashboard --skill ship-it -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ship-it, .gemini/skills/ship-it, .github/skills/ship-it and .opencode/skills/ship-it in your project.
Going by SKILL.md and its folder, Ship It needs TypeScript for the scripts in its folder and the command-line tools its instructions call (git, node, jq, npm, pnpm and npx). Our summary lists: Node.js; Docker.
SKILL.md contains no URLs. Its commands use git, npm and npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Ship It is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.4k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ship It: Kickoff (openwpm/OpenWPM, 1.4k stars), Wp Playground (bonny/WordPress-Simple-History, 317 stars), Build Px4 macOS (PX4/PX4-Autopilot, 13k stars) and Check (openwpm/OpenWPM, 1.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
BlackBeltTechnology (a GitHub organization) maintains it in BlackBeltTechnology/pi-agent-dashboard, which has 315 GitHub stars. The repository holds 66 skills in this directory. The repository was last updated on October 8, 2026.
Source: BlackBeltTechnology/pi-agent-dashboard on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.