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
queryProjections
| Interface | As | Where |
|---|---|---|
| MCP tool | majordomus_ci_timings | - |
| MCP resource | not exposed | - |
| HTTP | GET /api/v1/pull-requests/timings | Swagger |
| Command line | not 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
{}