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 at once and exits non-zero when a gate is unmet, so a regression cannot merge. Ordinary builds never fail on target drift; a language that is behind is pending work, and you opt in to enforcement with --ship. The model is the kapi loop. You need 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 (draft, translated, approved) 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 too.
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​

One command sets two bars:

kapi check <files>kapi check --ship
Gatesthe files you namethe project
Measuresa checkset over their content; fails when a finding failscoverage against the recipe's ship_gates: plus the bound quality gates, across every target language
Needs a projectnoyes
Use itwhile content is being writtenbefore it ships

See Check content like tests for the file-level half.

Next​