Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

I2472

How long CI takes is measured, from when each run started to when it completed, and the CI/CD screen draws it

Where it stands

devtask.issue
Readiness
complete completion is recorded and every required evidence token is present
Status
DONE
Can start
not now
Milestone
Milestone status
ACTIVE
Wave
4
Waiting on
none
Holds back
none
Behind it in all
0
Evidence
2 of 2
A move writes the repository: it stamps one field of this issue's record and appends one event to the ledger, and a commit will carry both.
The same moves from a terminal

majordomus plan start I2472

majordomus plan verify I2472

majordomus plan done I2472

What it is

Objective
Record when each check run on an open pull request's head started, beside when it completed, and answer how long CI takes from that record with a typed capability (integration.timings): per check its measured runs, failures, median, 90th percentile and longest duration; per open head its wall time and slowest check; and how many runs could not be measured. The CI/CD screen of majordomus ui draws it in place of the panel that said no capability records CI timings.
Why
The owner asked on 2026-10-11 to implement every view of the UI screenshots (pack v3 M08; reference 07-ci-cd shows build times and throughput). d3's CI/CD screen (I2462) says no capability records per-run CI timings, and none did: the forge observation kept when a check completed but not when it started, although the GitHub CLI's rollup answers both. CI time is the latency the integration lane waits on for every pull request, and nothing measured it.
Now
A check observation holds its name, state, kind, app and completion time. The CI/CD screen's build-timings panel says nothing is measured.
Wanted
The forge observation records started_at for every check run (empty for a status context or a run that has not started; an observation recorded before is read with it empty, so the schema stays 4). integration.timings (GET /api/v1/pull-requests/timings, MCP majordomus_ci_timings) measures, from the recorded observation and without asking the forge, every check's runs with a start and an end: passed, failed, median and 90th percentile (nearest rank) and longest seconds, the slowest median first; every open head's wall time from its first check's start to its last check's completion and its slowest check, the longest wait first; and how many runs it could not measure, which are counted and never measured as zero. The CI/CD screen draws each check's median as a bar against the slowest with its numbers beside it, and the ten longest waits each leading to its pull request on the PR Drain; without an observation it says nothing is measured.
Done when
unknown: the record declares no `completion`
Risk
unknown: the record declares no `risk`

Acceptance

  • check_of records startedAt as started_at, and an observation without it still reads
  • integration.timings answers each check's measured runs, failures, median, 90th percentile and longest seconds, and each open head's wall time and slowest check, from the recorded observation alone
  • a run without a start or an end, and a status context, is counted as unmeasured and never measured as zero
  • the CI/CD screen draws the timings, and a head leads to its pull request; without an observation it says nothing is measured
Validation
cargo test --lib integration::timingscargo test --lib ui::test/run.sh 1077_ci_timings_are_measured
Evidence required
integration_timings_unit_testsci_timings_case_1077
Evidence present
integration_timings_unit_testsci_timings_case_1077

Scope

Touches
apps/majordomus-cli/src/integration/model.rsapps/majordomus-cli/src/integration/forge.rsapps/majordomus-cli/src/integration/timings.rsapps/majordomus-cli/src/integration/mod.rsapps/majordomus-cli/src/capability/builtin/integration.rsapps/majordomus-cli/src/ui/timings.rsapps/majordomus-cli/src/ui/delivery.rsapps/majordomus-cli/src/ui/mod.rs.ai/repo/project/issues/I2472.yamldocs/MAJORDOMUS_UI.mdtest/cases/1077_ci_timings_are_measured.sh
Not
unknown: the record declares no `non_scope`
Depends on
Priority
p1
Profile
implementation
Parallel safe
false
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-10-11
Updated
2026-10-12T11:03:32Z
Started
2026-10-12T11:03:04Z
Verified
2026-10-12T11:03:13Z
Completed
2026-10-12T11:03:32Z

Synchronisation

Adapter
scripts/github-sync
Repository
unknown: the derived plan's header carries no repository
External issue
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it
State there
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it

Findings

Nothing is wrong with these records.