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

integration.timings

How long CI takes

What it is

How long CI takes on the open pull requests, measured from the recorded forge observation: for every check, how many of its runs started and completed, how many passed and failed, and its median, 90th percentile (nearest rank) and longest duration in seconds, the slowest median first; for every open head with a measured check, the wall time from its first check's start to its last check's completion and the check that took longest, the longest wait first; and how many runs could not be measured (still running, queued, or recorded before starts were read), which are counted and never measured as zero. A read: it asks the forge for nothing; `majordomus prs refresh` records the observation. `observed: false` with the reason when this checkout has recorded none.

Descriptor

Canonical id
integration.timings
Module
integration
Kind
query
Stability
experimental
Provenance
declared
Source
apps/majordomus-cli/src/capability/builtin/integration.rs
Cache
disabled
Benchmark
required
Tags
integrationpull-requestscitimings

Run

query
A query. It reads and changes nothing.

This capability takes no input.

GET /api/v1/pull-requests/timings

Projections

InterfaceAsWhere
MCP toolmajordomus_ci_timings-
MCP resourcenot exposed-
HTTPGET /api/v1/pull-requests/timingsSwagger
Command linenot exposed-

Schemas

Input · Empty
{
  "type": "object",
  "additionalProperties": false,
  "description": "No input.",
  "title": "Empty"
}
Output · IntegrationTimings
{
  "type": "object",
  "properties": {
    "observed": {
      "type": "boolean",
      "description": "Whether a forge observation is recorded in this checkout."
    },
    "reason": {
      "type": [
        "string",
        "null"
      ],
      "description": "Why there are no timings, when there are none."
    },
    "timings": {
      "anyOf": [
        {
          "$ref": "#/$defs/CiTimings"
        },
        {
          "type": "null"
        }
      ],
      "description": "The timings measured from the observation, when there is one."
    }
  },
  "required": [
    "observed"
  ],
  "description": "How long CI takes on the open pull requests, or why it is not known.",
  "title": "IntegrationTimings",
  "$defs": {
    "CiTimings": {
      "type": "object",
      "properties": {
        "observed_at": {
          "type": "string",
          "description": "When the forge was observed, RFC 3339: the moment these timings describe."
        },
        "measured_runs": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "Check runs measured, across every check and head."
        },
        "unmeasured_runs": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "Check runs the observation holds without both a start and a completion: running,\nqueued, or recorded before starts were read. Counted, never measured as zero."
        },
        "checks": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/CheckTiming"
          },
          "description": "Every check, the slowest median first."
        },
        "heads": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/HeadTiming"
          },
          "description": "Every head with a measured check, the longest wall time first."
        }
      },
      "required": [
        "observed_at",
        "measured_runs",
        "unmeasured_runs",
        "checks",
        "heads"
      ],
      "description": "CI timings over every open head the observation holds."
    },
    "CheckTiming": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "The check's name, as the forge reports it."
        },
        "runs": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "Runs that started and completed, so were measured."
        },
        "passed": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "Of those, how many passed."
        },
        "failed": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "Of those, how many failed."
        },
        "median_seconds": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "The median duration, in seconds."
        },
        "p90_seconds": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "The 90th percentile duration (nearest rank), in seconds."
        },
        "slowest_seconds": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "The longest run, in seconds."
        }
      },
      "required": [
        "name",
        "runs",
        "passed",
        "failed",
        "median_seconds",
        "p90_seconds",
        "slowest_seconds"
      ],
      "description": "How one check takes, across the open heads that ran it."
    },
    "HeadTiming": {
      "type": "object",
      "properties": {
        "number": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "The pull request."
        },
        "head_sha": {
          "type": "string",
          "description": "The head the checks ran on."
        },
        "started_at": {
          "type": "string",
          "description": "When its first measured check started, RFC 3339."
        },
        "completed_at": {
          "type": "string",
          "description": "When its last measured check completed, RFC 3339."
        },
        "wall_seconds": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "The wall time between them, in seconds: what a reader waited for CI on this head."
        },
        "slowest_check": {
          "type": "string",
          "description": "The measured check that took longest."
        },
        "slowest_seconds": {
          "type": "integer",
          "format": "uint64",
          "minimum": 0,
          "description": "How long it took, in seconds."
        },
        "failed": {
          "type": "boolean",
          "description": "Whether any measured check on the head failed."
        }
      },
      "required": [
        "number",
        "head_sha",
        "started_at",
        "completed_at",
        "wall_seconds",
        "slowest_check",
        "slowest_seconds",
        "failed"
      ],
      "description": "How long CI took on one open pull request's head: from its first check's start to its last\ncheck's completion, and the check that took longest."
    }
  }
}

Examples

These are the capability's own benchmark cases: the same inputs the benchmark runs and the OpenAPI document shows.

default
{}