Skip to main content

Ship gates & CI

Goal: treat content quality like any other test. A ship gate is the project's release bar: coverage thresholds over the translation lifecycle plus the bound quality gates (voice, terminology, rule-based checks, staleness). kapi check --ship evaluates all of it in one shot and exits non-zero when a gate is unmet, so a regression never merges. Ordinary builds never fail on target drift; a language that is behind is pending work, and --ship is the explicit, opt-in enforcement point. The model is the kapi loop; this guide is the task. Needs a committed kapi project.

The project view shows each locale's standing against its gate continuously: the same derivation check --ship enforces:

  1. Read the gate cells. Each locale row shows coverage per lifecycle rung (translated, reviewed, signed-off) and whether the scope clears its gate.
  2. Close the gap. Bring up to date produces what a machine can; a gate cell opens the Review queue for what needs a person.
  3. Ship when green. When every scope clears its gate, the CI check below passes by construction.
ScreenshotPending capture

The coverage grid with per-locale ship-gate cells, one scope green, one pending with the unmet threshold named.

View scene script ↗

File checks vs project gates

Two bars, one command. A bare kapi check <files> gates the files you name: a checkset over their content, findings and a severity gate, no project needed; the test runner. kapi check --ship gates the project: coverage against the recipe's ship_gates: plus the bound quality gates, across every target language: the release bar. Use the first while content is being written, the second before it ships; see Check content like tests for the file-level half.

Next