---
title: "Cancel runs from CI, commit-message titles, test-based project metrics"
description: "The new `currents run cancel` command ends an in-progress run from any CI provider with the record key the job already holds. Projects set to \"Commit Message\" now get commit-message run titles even when the run has a pull request, and the Projects Summary can report per-test totals instead of run counts."
canonical: "https://currents.dev/changelog/cancel-runs-from-ci-with-a-record-key"
updated: "2026-07-26"
---

# Cancel runs from CI, commit-message titles, test-based project metrics

2026-07-26, New (tracks: cli, platform)

The new `currents run cancel` command ends an in-progress run from any CI provider with the record key the job already holds. Projects set to "Commit Message" now get commit-message run titles even when the run has a pull request, and the Projects Summary can report per-test totals instead of run counts.

---


A CI job that gets cancelled — manually, or superseded by a newer commit — leaves its Currents groups incomplete, so the run stays in progress until the project's inactivity timeout. `currents run cancel` ends it with the record key the job already reports results with, on any CI provider. Alongside it, run titles now honor a project's "Commit Message" setting on runs that have a pull request, and the Projects Summary can count tests rather than runs.

<Accordion.Root className="AccordionRoot" type="multiple">

<Accordion.Item className="AccordionItem" value="cli">
  <Accordion.AccordionTrigger className="font-bold">CLI</Accordion.AccordionTrigger>
  <Accordion.AccordionContent>

- **Cancel a run with a record key.** `currents run cancel` ends a run in progress using the record key the CI job already reports with, so there is no API key to store and the command works on any provider. It ships in `@currents/cmd` 2.x. On GitHub Actions, run it on the cancellation path:

  ```yaml
  - if: ${{ cancelled() }}
    run: npx --package @currents/cmd@2 currents run cancel
  ```

- **Identify the run by id or by CI build id.** Pass `--run-id` (the last segment of the run URL) or `--ci-build-id` (the value the run was recorded under); `--run-id` wins when both are given. Credentials come from `--key` and `--project-id`, or from `CURRENTS_RECORD_KEY` and `CURRENTS_PROJECT_ID`. To cancel from CI, set `CURRENTS_CI_BUILD_ID` on the job, so the reporting step and the cancel step look for the same run.

- **Safe to call on every cancelled job.** A job cancelled before it recorded anything reports `No run to cancel` and exits successfully, so a cleanup step never fails a build that created no run, and cancelling an already cancelled run succeeds rather than erroring — every job in a matrix can call it.

- **Scoped to the key, and unaffected by plan limits.** A record key only cancels runs in its own organization and project. Cancellation keeps working for an organization that is over its limits, which is one of the reasons a run gets abandoned in the first place.

- **Cancelled runs are attributed to CI.** The run shows as cancelled in the dashboard, marked machine-initiated with `CI` as the actor, so it is distinguishable from a person cancelling it from the UI. See [Cancelling Runs](https://docs.currents.dev/dashboard/runs/cancel-run) and the [`currents run cancel`](https://docs.currents.dev/resources/reporters/currents-cmd/currents-cancel) reference.

</Accordion.AccordionContent>
</Accordion.Item>

<Accordion.Item className="AccordionItem" value="platform">
  <Accordion.AccordionTrigger className="font-bold">Platform</Accordion.AccordionTrigger>
  <Accordion.AccordionContent>

- **Commit-message run titles now apply to runs with a pull request.** Projects set to "Commit Message" under [Project Settings](https://docs.currents.dev/dashboard/projects/project-settings) → Run Title Source still showed the pull request title whenever a run had a pull request attached, because the setting was applied when the run was recorded but ignored when the title was read back. Runs recorded from now on use it everywhere the title appears — the runs feed, run details, the browser tab, and Slack notifications.

- **Merge commits fall back to the pull request title.** "Commit Message" takes the first line of the commit message, but a merge commit whose first line is just a SHA falls back to the pull request title rather than showing the SHA. "Auto Mode" is unchanged: pull request title first.

- **Existing runs keep their titles.** Runs recorded before this release are not retitled, so historical runs read exactly as they did before.

</Accordion.AccordionContent>
</Accordion.Item>

<Accordion.Item className="AccordionItem" value="dashboard">
  <Accordion.AccordionTrigger className="font-bold">Dashboard</Accordion.AccordionTrigger>
  <Accordion.AccordionContent>

- **Count tests instead of runs on the [Projects Summary](https://docs.currents.dev/dashboard/projects/projects-summary-view).** The Customize menu has a new Metrics section with a Runs / Tests choice. On the Tests basis every project preview reports per-test totals over the selected window: the success rate becomes the test pass rate, Passed and Failed count tests, the third tile changes from Incomplete runs to Total tests, and the trend chart and sparkline plot test volume. Duration and Last run are unchanged.

- **Useful for projects that record one run a day.** Run counts collapse to 0 or 1 on low-frequency projects and hide how many tests are actually failing; the Tests basis surfaces that. The choice is per viewer, applies to both the Cards and List views, and switching does not refetch.

- **Run Summary metric cards remember their basis.** In the new Run Summary (opt in from the banner on any run), the Customize metrics menu chooses between "Overall tests" and "Reported tests", and that choice is now stored per project instead of resetting on every visit. A URL carrying `metric_basis` still wins, so a shared link renders the same for everyone.

</Accordion.AccordionContent>
</Accordion.Item>

</Accordion.Root>

