Ship
Operating rules
- Review the whole branch diff —
git diff origin/<default>...HEAD— never just the working tree; the work may span many commits, pushes, and sessions. - Gates fix, don't just report. Each gate applies its fixes, re-runs the repo's verification gate (tests/lint/typecheck), and commits — one commit per gate.
- Tests passing ≠ feature working. The verify gate drives the change end-to-end in the running app; green tests alone never satisfy it.
- Keep the evidence. The verify and design gates' observed results
(outputs, before/after, screenshots) become the PR body's
## Verification. - Don't churn. One fix pass per gate (repo-gate breakage from that
pass included). Anything unfixable or needing a decision →
AskUserQuestion. - Stage by path, never blanket. No
git add -A/git add .. A file you don't recognize (another agent's edit, scratch output, secrets) is never committed silently — ask. - Never merge here. Merge policy is
babysit-pr's per-PR question.
Steps
-
Orient.
- Preflight:
gh auth status— fail here, not after three gates. - Resolve the default branch (
gh repo view --json defaultBranchRef --jq .defaultBranchRef.name), thengit fetch origin <default>. - On the default branch with shippable changes → create a feature branch first (short kebab-case).
- Establish scope:
git status+git log origin/<default>..HEADgit diff origin/<default>...HEAD. Empty diff and clean tree → nothing to ship; stop and say so.
- Triage anything uncommitted now: this work's changes → commit, so the gates review committed state; unrelated or unrecognized files → leave out and ask.
- Note the repo's verification gate (e.g.
bun run verify,npm test).
- Preflight:
-
Simplify gate. Run the
simplifyskill over the branch diff. Fixes → commit. -
Verify gate. Run the
verifyskill: drive the change end-to-end in the running app. Then sweep edge cases — pick what applies, record each checked item with its observed result:- empty / zero / null / missing inputs
- boundary values (limits, off-by-one, max sizes)
- error paths: bad input, dependency down, timeout — fail clean or corrupt state? state after a mid-operation failure?
- repeat / concurrent invocation — idempotent? racy?
- reliability: retries, timeouts set, errors observable; migrations safe to roll back Fixes → re-verify the broken case → commit.
-
Design gate — only if the branch diff touched UI (
--name-onlyagainst*.tsx*.jsx*.vue*.svelte*.css*.scss,components/,pages/,views/,templates/). No hits → skip, say so. Hits → run theimpeccableskill on the changed surfaces; capture after-screenshots (and before, when still obtainable) for the PR body. Fixes → commit. -
Push the branch (
-uif no upstream). Nothing should remain uncommitted by now; if something does, triage it as at orient. -
Open the PR. Body per the
write-pr-descriptionskill, with## Verificationbuilt from the gate evidence.gh pr create— or, if a PR was already open for the branch,gh pr edit <PR> --bodyto refresh it (the gates still ran; their fixes already pushed). If shipping involved work the diff does not show — dispatched workflow runs, backfills/migrations, DB writes, changes in external systems — surface it on the PR via thepr-work-logskill. -
Run the
babysit-prskill to the end — rebases, CI to green, review threads, Slack, the merge question. Ship is done when babysit closes out: PR merged or deliberately held.