diff --git a/README.md b/README.md index 3f754e6..c14556e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Kapi Action -A GitHub Action that runs [kapi](https://github.com/neokapi/neokapi) commands — converge translations, gate content quality, plan cost — and delivers the results — as a commit, a pull request, or a report on the PR that caused the work. +A GitHub Action that runs [kapi](https://github.com/neokapi/neokapi) commands — catch up translations, gate content quality, plan cost — and delivers the results — as a commit, a pull request, or a report on the PR that caused the work. ## Prerequisites @@ -10,7 +10,7 @@ This action requires the `kapi` CLI to be installed. Use [`neokapi/setup-kapi@v1 ### Bring translations up to date -`kapi up` is the convergence verb, and the Action's default. In a server-connected project — a recipe with a `server:` block — it pushes, converges on the Bowrain server (org keys, shared TM, team review), and pulls the produced targets back. With no server it runs the same loop locally. +`kapi up` runs the kapi loop, and is the Action's default. In a server-connected project — a recipe with a `server:` block — it pushes, catches up on the Bowrain server (org keys, shared TM, team review), and pulls the produced targets back. With no server it runs the same loop locally. ```yaml name: Translations @@ -35,12 +35,12 @@ jobs: ### Outcomes -A convergence run ends in one of three states, and the Action treats them differently: +A `kapi up` run ends in one of three states, and the Action treats them differently: | Run state | What it means | What the Action does | |---|---|---| -| **converged** | Every gated scope cleared its ship gate | Delivers the produced translations | -| **parked** | Work remains that the loop could not carry to the gate (a failing check, an unreachable gate) | Delivers what *did* converge, and annotates the run with the parked locales. This is normal pending work, not a failure | +| **converged** | Every gated scope cleared its ship gate — the project is up to date | Delivers the produced translations | +| **parked** | Work remains that the loop could not carry to the gate (a failing check, an unreachable gate) | Delivers what it *did* catch up, and annotates the run with the parked locales. This is normal pending work, not a failure | | **failed / canceled** | The run broke (a provider outage, a server error, a cancel) | `kapi up` exits non-zero, the step fails, **nothing is delivered** | Parked is the interesting one: partial progress is real progress, so the default is to deliver it and warn rather than throw it away. To block instead: @@ -51,7 +51,7 @@ Parked is the interesting one: partial progress is real progress, so the default fail-on-parked: "true" ``` -### How convergence works +### How the loop works `kapi up` treats the recipe as the desired state — the languages the project targets, and the ship gates that define *shippable* — and reconciles the content toward it. Each pass, for every language behind its gate: @@ -68,7 +68,7 @@ flowchart LR TM["1 · reuse
TM exact matches"] --> AI["2 · translate
AI + terminology"] --> CK["3 · check
placeholders · terms · tags"] end U --> PASS - CK -->|every gate clear| CV["converged
PR with translations"] + CK -->|every gate met| CV["up to date
PR with translations"] CK -->|needs a person| PK["parked
the review queue"] PK --> RV["review & approve
recorded in .kapi-state.json"] RV -.->|next run sees it| U @@ -76,7 +76,7 @@ flowchart LR **Parked work is the review queue, not an error.** What the machine couldn't decide waits for a person: review the wording, approve or fix it, and the decision is recorded — in the committed `.kapi-state.json` state store, or on the connected server. Approvals raise the `reviewed` coverage the ship gate measures, so the next run and the next gate see them. `kapi check --ship` (see [Gate pull requests](#gate-pull-requests-on-content-quality)) is what enforces the bar at release time. -The convergence report (outcome, passes, parked locales) is always written to the job summary. Under the hood the Action runs `kapi up --json`, an NDJSON stream — one convergence event per line, closed by a single `{"type":"result", ...}` record. That record is the contract; the events are the log. It becomes the `outcome`, `passes`, and `parked-locales` outputs. +The kapi up report (outcome, passes, parked locales) is always written to the job summary. Under the hood the Action runs `kapi up --json`, an NDJSON stream — one convergence event per line, closed by a single `{"type":"result", ...}` record. That record is the contract; the events are the log. It becomes the `outcome`, `passes`, and `parked-locales` outputs. ### Deliver as a pull request @@ -93,11 +93,11 @@ steps: create-pull-request: "true" ``` -The created PR carries the convergence report in its description. `pr-title`, `pr-labels`, `pr-base`, and `branch-prefix` tune it; labels are applied best-effort (a label that doesn't exist in the repo never fails the run). The PR URL lands in the `pull-request-url` output. +The created PR carries the kapi up report in its description. `pr-title`, `pr-labels`, `pr-base`, and `branch-prefix` tune it; labels are applied best-effort (a label that doesn't exist in the repo never fails the run). The PR URL lands in the `pull-request-url` output. ### Plan mode: the cost of a change, on its PR -`plan: "true"` dry-runs the convergence loop — pending work, TM leverage, and a token estimate, with no writes and no provider calls (so it needs no API keys). With `pr-comment: "true"` on a pull-request event, the plan lands as one sticky comment that re-runs update in place: +`plan: "true"` dry-runs the kapi loop — pending work, TM leverage, and a token estimate, with no writes and no provider calls (so it needs no API keys). With `pr-comment: "true"` on a pull-request event, the plan lands as one sticky comment that re-runs update in place: ```yaml name: Translation plan @@ -153,7 +153,7 @@ Ordinary builds never fail on target-language drift — a locale that is behind ### Run any other kapi command -`command` takes any kapi subcommand — the Action stays a general runner. The convergence outputs are only populated for `up`. +`command` takes any kapi subcommand — the Action stays a general runner. The loop outputs (`outcome`, `passes`, `parked-locales`) are only populated for `up`. ```yaml - uses: neokapi/kapi-action@v1 @@ -169,7 +169,7 @@ This runs `kapi run -p myproject.kapi translate`. ### Caching -Convergence is incremental via the project's `.kapi/cache` (block store, extractions), which is gitignored and therefore rebuilt on every fresh runner. Restore it across runs to skip re-extraction: +The loop runs incrementally via the project's `.kapi/cache` (block store, extractions), which is gitignored and therefore rebuilt on every fresh runner. Restore it across runs to skip re-extraction: ```yaml - uses: actions/cache@v5 @@ -179,7 +179,7 @@ Convergence is incremental via the project's `.kapi/cache` (block store, extract restore-keys: kapi-cache- ``` -Server-connected projects don't need this — the convergence state lives on the server. +Server-connected projects don't need this — the project state lives on the server. ## Inputs diff --git a/action.yml b/action.yml index a350f3c..a8c7b3c 100644 --- a/action.yml +++ b/action.yml @@ -1,5 +1,5 @@ name: "Kapi Run" -description: "Run kapi commands — converge translations, gate content quality, plan cost — and deliver the results as a commit or pull request" +description: "Run kapi commands — catch up translations, gate content quality, plan cost — and deliver the results as a commit or pull request" branding: icon: "refresh-cw" color: "blue" @@ -28,7 +28,7 @@ inputs: description: >- With `command: up`, fail the workflow when the run parks (work remains that the loop could not carry to the ship gate). Parked is normal pending work, - not a broken run, so the default is to commit what did converge and + not a broken run, so the default is to commit what it caught up and annotate the rest. required: false default: "false" @@ -65,7 +65,7 @@ inputs: pr-comment: description: >- On pull-request events, post one sticky comment with the report (plan, - convergence outcome, or gate result) that re-runs update in place. + `kapi up` outcome, or gate result) that re-runs update in place. Needs `permissions: pull-requests: write`. required: false default: "false" @@ -212,8 +212,8 @@ runs: exit 0 fi - # `kapi up` is the convergence verb: in a server-connected project it - # pushes, converges on the Bowrain server, and pulls the produced targets + # `kapi up` runs the kapi loop: in a server-connected project it + # pushes, catches up on the Bowrain server, and pulls the produced targets # back; with no server it runs the same loop locally. Under --json it is # an NDJSON stream — one convergence event per line, closed by a single # {"type":"result", ...} record. That record is the CI contract; the @@ -271,7 +271,7 @@ runs: } >> "$GITHUB_OUTPUT" { - echo "## kapi up — convergence report" + echo "## kapi up report" echo echo "| | |" echo "|---|---|" @@ -282,7 +282,7 @@ runs: echo "Run ${OUTCOME} after ${PASSES} pass(es)." if [ "$OUTCOME" = "parked" ]; then - # Parked is pending work, not a broken run: what did converge is real + # Parked is pending work, not a broken run: what it caught up is real # progress and still gets committed below. echo "::warning::Translations parked${PARKED:+ for: ${PARKED}} — work remains that the loop could not carry to the ship gate." if [ "$FAIL_ON_PARKED" = "true" ]; then @@ -382,7 +382,7 @@ runs: echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" BODY=" - ## kapi up — convergence report + ## kapi up report | | | |---|---| @@ -447,7 +447,7 @@ runs: ${HEAD}" elif [ -n "$OUTCOME" ]; then BODY="${MARKER} - ## kapi up — convergence report + ## kapi up report | | | |---|---|