Commit and push the complete current-branch snapshot, open a ready PR, babysit it, merge when clean, then create a fresh branch. Use when the user asks to ship, publish, or hand off local changes. GitHub Actions auto-deploys beta and the docs site through the prebuilt publisher; other production promotion is manual.
64
77%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Critical
Do not install without reviewing
Fix and improve this skill with Tessl
tessl review fix ./.agents/skills/ship/SKILL.mdShip the complete nonignored current-branch snapshot end-to-end: commit and
push it, open or update a ready PR, run /babysit-pr, merge when its normal
gates are satisfied, then run /new-branch after the merge lands.
/ship means all nonignored local changes on the current branch. The shared
checkout is the source of truth, so include concurrent-session changes in the
same branch snapshot. The checkpoint helper excludes learnings.md,
bridge/**, and data/**.
/ship ships the complete nonignored branch snapshot, not a hand-selected
subset of dirty paths. At the start of the flow, record the status and publish
all current local changes with the checkpoint helper. If another session adds a
path during the flow, include it in the next coherent snapshot; never revert,
stash, or overwrite it.
Invoking /ship is explicit authorization to merge this PR once the merge gates
below pass, unless the user says not to merge. Do not ask again just to merge a
clean PR. Do not stop after creating the PR; the default /ship outcome is a
merged PR and a fresh post-merge branch.
A worktree is a valid publishing checkout. When /ship is authorized from a
worktree, use that worktree's current branch and cwd for validation, commit,
push, and PR creation or update. Do not copy its changes into the shared
checkout; update the existing PR and do not create a second one.
corepack pnpm ship:pushThe helper stages and commits the complete nonignored snapshot, excluding
learnings.md, bridge/**, and data/**. Verify the push landed on the current
branch and read the remote sha back.
Treat these as an immediate call to it: /ship, "ship our latest local
changes", or "push up my local changes". Push the first coherent branch
snapshot before long validation so CI and review can start, then publish later
snapshots as local work arrives.
Merges to main trigger .github/workflows/deploy-beta-sites-prebuilt.yml,
which builds in GitHub Actions and uploads prebuilt artifacts to the independent
Netlify beta sites at beta.*.agent-native.com. Netlify Git-connected
auto-builds are disabled, so do not wait for Netlify build queues or
deploy-preview checks; verify the Actions run and its per-site smoke checks.
Production promotion is a separate manual operation for other production
sites. The normal /ship flow does not wait for or verify post-merge beta
deployment; use /ship-and-monitor to verify beta, the docs production lane,
and the release tail. The public docs site is the temporary exception:
matching main changes trigger .github/workflows/deploy-docs-production.yml,
which publishes www.agent-native.com from the exact commit and disables that
site's Git-connected Netlify builds. There is no beta docs site today. The
normal /ship flow must not imply an automatic production deploy for other
sites. Critical fixes that must reach other production sites need an explicit
manual promotion, followed by
/ship-and-monitor when the promotion and release tail need verification.
Use .github/workflows/deploy-production-sites-prebuilt.yml or the targeted
promote-netlify-deploy.yml workflow to promote a critical fix and let it
manage Netlify lock transitions. Do not manually remove or clear a Netlify lock
as a deployment step; clearing one is not the production promotion.
When /review-latest-feedback has run before /ship, its sweep is a required
ship input. Carry the sweep's start cursor, grouped reports, evidence links, and
disposition table into the PR or ship recap. The handoff remains cross-app and
cross-source: adding Design UI bugs to the eligible set must not drop
Analytics, Dispatch, Calendar, Slides, Content, GitHub, Sentry, or any other
previously identified candidate. Every actionable item must have an owning
source seam and focused verification, with one explicit disposition: fixed,
awaiting reporter clarification, already owned or duplicate, deferred or
informational, external or non-repo-owned, or unavailable/unverified.
Honor the feedback ownership and reaction gates from /review-latest-feedback:
👀 on a Slack parent. If the latest readable parent
already has an 👀 reaction from anyone, preserve that fact as an existing
investigation marker, but do not treat it as a disposition or suppression
signal. After classifying the parent, re-read the complete thread and, for
an actionable in-scope item, require a verified disposition from the
invoking Slack identity - Fixed, In progress, or Clarification
needed; an eye-only or stale eye-only item remains actionable for that
handoff check. For items
routed to Sid or Alice, or classified as external, duplicate, deferred, or
informational, honor that owning disposition and do not turn the eye into a
merge blocker. If the reaction state is unavailable, record the item as
unavailable/unverified and refresh the feedback thread instead of guessing.When deciding whether an awaiting clarification is already answered, treat the requested URL, error, screenshot, repro, run ID, or other evidence as present only when it is readable in the parent, a reply, or an accessible linked artifact. Keep a linked artifact that is present but inaccessible because of permissions, expiry, connector gaps, or another read failure separate from evidence that is absent. If that artifact is required to identify or verify the change, route the item back through the feedback workflow for a targeted request for access or a fresh/replacement link; do not suppress that request or ask again for contents already known to be in the inaccessible artifact. If the available evidence is enough without it, continue and record the limitation as unavailable/unverified in the ship ledger.
Before carrying any item forward from a prior handoff - fixed, in progress,
awaiting clarification, already owned or duplicate, deferred or informational,
external, or unavailable/unverified - always re-read the complete source thread
and current handoff and reconcile them for new replies, reactions, linked
evidence, resolution, or ownership signals. The handoff is a prior record, not
the source of truth. After that refresh, if
the invoking Slack identity, a legacy @agent-native message, or another
participant already supplied the needed details,
identified the cause, linked a fix, or said the issue is fixed, landed, or being
fixed, do not reopen it as a clarification request or ask for duplicate
information. Carry it as fixed pending verification, already owned, or in
progress, and verify or follow up on that existing work. Only preserve an
awaiting-clarification disposition when one specific reporter or product input
is still missing after that check. Any eventual reporter-facing clarification
must thank the person first and ask the question second; Clarification needed
is an internal state, not an opening line.
There may be only one unanswered clarification request per feedback thread. If
the existing handoff or complete source thread contains a question from this
workflow or @agent-native, re-read both and determine whether the exact
requested detail has been semantically answered or explicitly resolved anywhere
in the thread. A partial or unrelated reply does not clear the request. If it
remains unresolved, carry its timestamp forward as the sole pending request and
do not add another question. Once it is answered or resolved, re-read the
thread and try the fix first; ask one new question only for one specific,
non-repeating detail that still blocks the fix.
Do not ship a feedback fix that is only a wording-specific rule or that lacks the evidence needed to identify its owner. Re-run or refresh the feedback sweep when the branch changes after triage or when new comments, Slack replies, GitHub review comments, or Sentry findings arrive. Treat an unavailable connector as unavailable - never as “nothing matched” - and preserve that gap in the recap.
The ship report and PR description must keep source-tested, built, and merged
claims separate. A green test or PR does not prove that beta or production is
live; deployment monitoring belongs to /ship-now or /ship-and-monitor.
Before merging, /babysit-pr must re-check that every actionable feedback or
review item has a fix or a concise reply and that no new evidence has been left
without a disposition. Items routed to Sid or Alice remain outside this
workflow's ownership. External, duplicate, deferred, and informational items
also follow their recorded disposition rather than blocking this workflow. A
parent marked with 👀 is not thereby complete or non-actionable: preserve the
reaction without duplicating it, and for actionable in-scope items do not merge
while an eye-only or stale eye-only item lacks a verified disposition from the
invoking Slack identity.
A detached HEAD is a valid shipping context. Codex and platform-managed
worktrees may intentionally start detached, and /ship explicitly authorizes
creating a shipping branch in that worktree before committing or pushing. Do
not stop or ask for confirmation just because git branch --show-current is
empty.
If this worktree is detached:
git worktree list --porcelain and existing changes-* refs.changes-N branch (N at least 50) at the current HEAD in
this worktree, for example git switch -c changes-N. Never attach or switch
a branch that is checked out by another worktree, use main, overwrite an
existing ref, or move another worktree.This is the one pre-PR branch operation that /ship authorizes for a detached
worktree. Do not reset, rebase, stash, or force-push. If already on a named
branch, stay on it.
Stay in the current worktree and branch: if already on a named branch, never create, switch, rebase, reset, or stash before opening the PR. If the worktree is detached, follow the Worktree and branch setup section and create the shipping branch before opening the PR. This repo uses shared/platform-managed worktrees; ship the branch belonging to this worktree.
Check local changes: run git status --short and git diff --stat to
establish the branch snapshot. Multiple agents may have added work; include
those paths in the complete nonignored snapshot.
Then confirm the base is current, before validating or pushing anything. A
worktree can be created from a stale ref, and its local main ref is stale
too, so git log main..HEAD comes back empty and the branch reports itself
current while being weeks behind. The fetch is required: without it the
count reads a stale remote ref and returns 0, which is the same
confidently-wrong clean answer this check exists to catch.
git fetch origin main --quiet
git rev-list --count HEAD..origin/mainNon-zero means reapply the work onto current origin/main before pushing —
shipping from a stale base conflicts with or reverts whatever landed in the
gap. Measured 2026-08-18: four live Codex worktrees sat 1,144 commits behind
origin/main while reporting themselves clean from the inside.
Validate enough to avoid obvious breakage: run focused tests for the
changed area. Push the first safe slice before running pnpm run prep or
another long validation. Run prep when it is practical, but if prep is slow,
flaky, or contaminated by concurrent in-flight edits, do not stall shipment:
record the exact failure, keep pushing stable slices, and let GitHub Actions
be the validation gate that /babysit-pr monitors.
Publish the branch snapshot: run corepack pnpm ship:push to stage,
commit, and push all nonignored current-branch work. Never add
Co-Authored-By or other agent attribution.
The first successful push is the review handoff point: open or update the
ready PR immediately, before waiting on pnpm prep, a stability window, or
additional concurrent work. Later commits update that same PR and let CI
and review run in parallel with the rest of the ship workflow. Push each
later coherent branch snapshot as soon as it is available.
Open or update a ready PR immediately after the first push: use the
current branch. PRs are ready for review by default, not drafts. Do not put
codex, [codex], or similar agent labels in the title/body.
For every later safe slice, update this same PR immediately after pushing; do not create a second PR or wait for prep to finish before handing the slice to CI and review.
Babysit immediately: run /babysit-pr <number> and follow that skill’s
tick loop exactly. Treat babysit-pr as the source of truth for how to watch
the PR. Its Step 0 publishes the current nonignored branch snapshot, then
checks mergeability, every unaddressed review comment by reply state, and CI.
Keep going until the PR is either merged/closed or the user explicitly tells
you to stop.
Merge when allowed: because /ship includes merge authorization, merge
with gh pr merge <number> --squash --admin only after /babysit-pr’s merge
requirements are simultaneously true for 10 consecutive minutes:
clean working tree, no unpushed commits, GitHub Actions green, all review
comments addressed/replied, and mergeable.
Create the next branch after merge: after the PR is merged and origin/main
contains the merge commit, run /new-branch. Follow that skill’s preflight,
stash gate, branch naming, and stash-reporting rules. This is the only branch
movement in the ship flow.
Report: summarize the PR URL, merge result, new branch name, validation,
and any feedback/CI fixes handled. Do not claim post-merge beta or production
monitoring unless you ran /ship-now or /ship-and-monitor.
learnings.md or files in .gitignore./babysit-pr as the source of truth for CI/review monitoring cadence,
comment handling, local-file push discipline, and merge gates. Update
babysit-pr first if the watcher behavior changes./ship as complete after its merge and branch-rotation steps. Use
/ship-now or /ship-and-monitor for post-merge beta/release monitoring and
explicit manual production-promotion verification./new-branch as mandatory after a successful merge so the workspace is
ready for the next task on fresh main.bb282b1
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.