This skill should be used when the user says "am I ready to ship", "pre-flight check", "check before PR", "ready to merge", "pre-ship check", "can I ship this", "is this ready", or "run checks". Validates that code is in a shippable state by running git-check for branch and working tree validation, then verifying lint, build, and tests pass. Works standalone or as the first step in the ship-it orchestrator.
Readiness gate that validates code is in a shippable state. Combines git state validation (via git-check) with project-level build verification.
ship-it as its first step. Blocking findings halt the pipeline.Only applies when a task GID is in context. Skip when no task GID is available.
1a. Check context first — if a ✅ QA Verification comment was posted in this session, the gate passes. Skip to Step 2.
1b. Fetch task stories (via asana-api) and search for any comment containing ✅ QA Verification. A ❌ QA Verification — FAILED comment does not pass the gate.
1c. Determine task category — check conversation context for the task's Category field. If not in context, fetch the task details (via asana-api Fetch Task Details) to read the Category custom field.
Bug → BLOCKING. Report:
QA verification has not passed for this bug task. The fix must be verified via the QA skill before shipping.
This gate cannot be overridden. A bug fix without runtime verification evidence is not shippable.
Non-bug (Feature Request, Tech Debt, etc.) → ADVISORY. Report:
No QA verification found for this task. Visual verification with evidence upload is available.
Invoke git-check. If it returns blocking issues, stop and resolve them before continuing. Advisory warnings are presented to the user to decide whether to proceed.
Scan CI pipelines to infer test, build, and lint commands (see below), then confirm with the user before running.
When commands are missing, scan for CI pipeline files in this order:
.github/workflows/*.yml / .yaml — look for steps with run: containing test/build/lint keywords.circleci/config.yml — look for job stepsMakefile — look for targets named test, build, lint, checkpackage.json scripts — look for keys matching test, build, lintTaskfile.yml / justfile — look for matching tasksExtract the most specific matching command for each of test, build, lint. Then present inferred commands to the user for confirmation before running:
I found these commands from your CI pipeline — confirm or edit before I run them:
- lint:
yarn lint- build:
yarn build- test:
yarn testProceed with these? (You can skip any.)
If no commands can be inferred for a given check after scanning all sources, mark that check as SKIPPED (not configured) — not blocking.
Run in this order (cheapest first):
| # | Command | Severity | Notes |
|---|---|---|---|
| 1 | Lint (declared or inferred lint command) | ADVISORY | Warn but don't block |
| 2 | Build (declared or inferred build command) | BLOCKING | Stop if fails |
| 3 | Tests (declared or inferred test command) | BLOCKING | Ask before running (may be slow) |
Before running the test suite, ask:
The test suite may take a while. Run it now, or skip and mark as unchecked?
Combine findings from git-check and project commands into a single report:
BLOCKING
- Build failing: exit code 1
WARNINGS
- Lint errors on changed files
- Debug artifact: console.log found in src/utils/helper.ts (line 42)
PASSED
- Git checks passed
- Tests passing
Omit any section that has no findings. If everything passes:
PASSED
- All checks passed. Ready to ship.
Blocking findings — Stop and report. The user can override with explicit confirmation ("yes, ship anyway"), but make the risk clear.
Advisory warnings only — List them and ask: "These are non-blocking warnings. Continue anyway?"
All checks pass — Say so and proceed. No unnecessary friction.
Long-running commands — Ask before running test suites or builds that may take more than a few seconds. Let the user skip if they've already run them recently.
Error handling — Never silently skip a check. If a command fails unexpectedly (e.g., command not found), report the failure explicitly and note that the check could not be completed.