ci-cd · git:20260910.eee8645 · 2026-09-10 · sha256 774d17045be66e82

ci-cd git:20260910.eee8645A

Immutable. This exact content is served forever at /api/v1/blob/774d17045be66e82.

---
name: ci-cd
description: GitHub Actions, required checks, TestMu, OS matrix, and merge gates for Skill Doctor. Use when editing workflows, adding CI jobs, deciding what runs on every commit, or wiring crates/npm publish.
---

# CI/CD

Canonical policy: `TESTING.md`. Workflows must match it. If you change a required check, update `TESTING.md` in the same PR.

## Every commit / every PR (required, must stay fast)

Job names (branch protection should match these strings):

- `lint-and-unit` — fmt, clippy `-D warnings`, `cargo test --workspace --locked`, invariant grep
- `os-cli (ubuntu-latest)` / `(macos-latest)` / `(windows-latest)` — build CLI, `--help`, `version`, later: benign exit 0 and SD-02 exit 2
- `supply-chain` — `cargo deny`, gitleaks

Keep this path under ~8 minutes on cache hit. Use `Swatinem/rust-cache`. OS matrix `fail-fast: false`.

**Do not put on this path:** TestMu Kane, competitor benches, musl cross, `cargo publish`, `npm publish`, coverage fail gates during bootstrap.

## Not every commit

| Workflow | Trigger | Why |
|----------|---------|-----|
| `testmu.yml` | label `e2e`, nightly, `main`, `workflow_dispatch` | Kane/LambdaTest is slow, billed, AI-flaky |
| `bench.yml` | nightly + tags | Docker competitor pulls |
| `release.yml` | tags `v*` only | musl, SBOM, Sigstore, crates.io, npm |

## How an agent should add CI

1. New *product* behavior → add a unit/CLI test first. CI already runs `cargo test`.
2. New *tooling* (deny, gitleaks, a matrix OS) → add a job in `ci.yml` only if it belongs on every commit.
3. New *expensive* check → new workflow, non-required, document in `TESTING.md`.
4. Never store tokens in YAML. Use existing secrets: `NPM_TOKEN`, `CARGO_REGISTRY_TOKEN`, `LT_USERNAME`, `LT_ACCESS_KEY`.
5. Pin action versions; prefer SHA once v2 is tagged.
6. Do not add a fourth review bot. CodeRabbit / Greptile / Intelligence AI are PR comments, not required checks.

## Local commands agents must run before claiming CI will pass

```bash
cargo fmt --all --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace --locked
./scripts/prepublish-check.sh --fast
```

`--full` is the pre-tag gate (deny + publish dry-run). Never `cargo publish` / `npm publish` from a feature branch.

## Coverage

llvm-cov / tarpaulin is informational until a baseline exists. Do not `-D` fail PRs on coverage % during bootstrap.