Skip to content

I3933 — Every master run's coverage and CI cost join a derived series that the site and the Cockpit draw

Keep one row per master run of the coverage totals (lines, functions, regions per crate) and the CI cost (each job's queued and run minutes, each gate's verdict) as a derived series published with the site's data, and draw it as trend graphs on the site and in the Cockpit.

BLOCKED wave 2 · p1 · implementation profile · runs alone

Part of measurements-are-tracked-over-time — Coverage and CI cost are kept, exported and drawn over time, from the one measurement each has.

Blocked. This issue cannot start until I3932 is done. The status is derived from that, not declared.

Objective

Keep one row per master run of the coverage totals (lines, functions, regions per crate) and the CI cost (each job's queued and run minutes, each gate's verdict) as a derived series published with the site's data, and draw it as trend graphs on the site and in the Cockpit.

Why

Nothing kept either quantity past 14 days, so a slow regression — a job that grows a minute a week, a crate whose coverage drifts down within the floor, a gate whose pass rate falls — is seen only by a person reading runs. On 2026-10-22 the suite's deal record was 12 days stale and cost tens of minutes per run before anyone measured it.

Current state

The coverage job keeps rust-coverage's --summary-json of its one measurement as the coverage-summary artifact for 90 days on every run that is not a pull request's; `scripts/pages trends` reads master's last completed validate runs from the forge at publish time (their jobs' queued and run seconds, and each run's own summary, or coverage null once it has expired) into site/data/trends.json, a gitignored deployment input like evidence.json; /trends/ draws coverage and CI cost per run with the site's chart component and lists each job's median. The Cockpit does not draw the series yet, and no case compares a run's series figures with ci-timings.

Desired state

Every master run's coverage totals and CI cost are a series read from the runs themselves at each publication, with no state carried between publications and no ref read; the site and the Cockpit draw it, and its figures are the gate's and ci-timings' for the same run.

Scope

  • .github/workflows/validate.yml
  • .github/workflows/pages.yml
  • .gitignore
  • scripts/pages
  • site/content-src/trends.md
  • site/content/trends.md
  • site/templates/trends.html
  • site/data/nav.toml
  • apps/majordomus-cli/src/ui
  • test/cases/3933_the_trends_are_read_from_the_runs_themselves.sh
  • .ai/repo/project/issues/I3933.yaml
  • .ai/repo/project/milestones/measurements-are-tracked-over-time.yaml

Out of scope

  • A store outside the repository's own publication
  • The homepage's proof figure (I3916, I3917)

Dependencies

Acceptance criteria

  • A master run's coverage totals and CI cost are in the series with no command run by a person
  • The series' figures equal the gate's and ci-timings' for the same run, shown by a case
  • The site and the Cockpit draw the series

Validation

  • bin/majordomus plan validate

Evidence required

  • suite

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Risk

Derived data must not read refs (it reads the run's own artifacts), and the pages path is shared with the homepage work; coordinate with its owner before touching scripts/pages.

Timeline

started
—
verified
—
completed
—

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I3933.yaml. Read it back with majordomus plan show I3933.

Searches the titles and descriptions of every page this site publishes.