ci-local-parity
Reproduce ai-repo PR checks locally with Poe and CI scripts, including per-package typecheck and coverage behavior. Use when validating changes before push or when user asks which local commands match
SKILL.md.claude/skills/ci-local-parity/SKILL.md
GitHubWhat I do
Run ai repository checks locally with the closest possible parity to PR CI:
- Map changed files to affected packages
- Run checks in CI order: format-check → lint → test → typecheck → coverage → depcheck
- Apply per-package behavior (strict vs baseline typecheck, test args, extras)
- Highlight checks that cannot be fully reproduced via Poe
When to use me
- User asks how to run CI checks locally in
ai - User wants the exact local commands before opening/updating a PR
- User asks about Poe tasks vs CI scripts and where they differ
Use instead
ci-fix— diagnosing an already-failed CI runruff— lint/format-only cleanup without CI parityuv— dependency/lockfile maintenance
Workflow
Step 0: Preconditions
Run from the repo root. Verify tooling:
uv --version
uv run poe --help
If uv is missing, stop and ask the user to install it.
Step 1: Determine target packages
git fetch origin main
git diff --name-only origin/main...HEAD
Map changed files to packages using the dir field in:
.github/actions/get-packages-matrix/package_configuration.json
→ See references/package-matrix.md for the full package list.
Step 2: Run baseline checks (CI order)
From inside each package directory:
uv run ruff format --check . # CI lint = format check + lint check
uv run poe lint
uv run poe test
uv run poe depcheck
poe formatwrites files — it is not equivalent to the CI lint step.
Step 3: Typecheck (strict vs baseline)
Determine mode from package_configuration.json flags:
- Strict (
typecheck_use_baseline: false,typecheck_require_zero_errors: true):uv run poe typecheck - Baseline (new errors vs
origin/mainonly):uv run poe ci-typecheck # fallback if task missing: bash "$(git rev-parse --show-toplevel)/.github/scripts/dev.sh" typecheck --dir .
→ See references/package-matrix.md for per-package mode.
Step 4: Coverage (diff-based)
uv run poe ci-coverage
# fallback if task missing:
bash "$(git rev-parse --show-toplevel)/.github/scripts/dev.sh" coverage --dir .
Full-package (non-diff) coverage:
uv run poe coverage
Step 5: Call out CI gaps
Some jobs are not reproducible via Poe. Note them explicitly; do not claim full parity.
→ See references/ci-gaps.md for the full list (min-deps, config-check, PR policy).
Quick recipes
Any package — closest PR-CI parity
cd <package_dir>
uv run ruff format --check .
uv run poe lint
uv run poe test
uv run poe depcheck
uv run poe ci-typecheck || bash "$(git rev-parse --show-toplevel)/.github/scripts/dev.sh" typecheck --dir .
uv run poe ci-coverage || bash "$(git rev-parse --show-toplevel)/.github/scripts/dev.sh" coverage --dir .
Strict packages: unique_toolkit, unique_sdk, unique_skill_tool
cd <package_dir>
uv run ruff format --check .
uv run poe lint
uv run poe test # sdk: add -- -m "not integration"
uv run poe depcheck
uv run poe typecheck
uv run poe ci-coverage || bash "$(git rev-parse --show-toplevel)/.github/scripts/dev.sh" coverage --dir .
Tips
- Always include
ruff format --check— CI lint is two commands, not one. - Check the matrix flags; don't assume strict or baseline mode.
- Prefer
ci-*Poe tasks for diff parity; fall back todev.shwhen absent. - Never claim full parity — deps/config/policy jobs require manual steps.
- Run from the repo root so script paths and git base refs resolve correctly.