integration.timings
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.
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.
- query
- experimental
- module integration
- #integration
- #pull-requests
- #ci
- #timings
Exposure
Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.
| surface | as |
|---|---|
| MCP | tool majordomus_ci_timings |
| HTTP | GET /api/v1/pull-requests/timings operationId integration.timings |
| command line | — |
Schemas
The canonical input and output, from the Rust types; the MCP tool schema and the OpenAPI parameters and responses are derived from these.
input · Empty
No properties: the capability takes no input.
JSON Schema
{
"additionalProperties": false,
"description": "No input.",
"title": "Empty",
"type": "object"
}output · IntegrationTimings
| property | type | required | description |
|---|---|---|---|
| observed | boolean | yes | Whether a forge observation is recorded in this checkout. |
| reason | string | null | no | Why there are no timings, when there are none. |
| timings | one of 2 | no | The timings measured from the observation, when there is one. |
JSON Schema
{
"$defs": {
"CheckTiming": {
"description": "How one check takes, across the open heads that ran it.",
"properties": {
"failed": {
"description": "Of those, how many failed.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"median_seconds": {
"description": "The median duration, in seconds.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"name": {
"description": "The check's name, as the forge reports it.",
"type": "string"
},
"p90_seconds": {
"description": "The 90th percentile duration (nearest rank), in seconds.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"passed": {
"description": "Of those, how many passed.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"runs": {
"description": "Runs that started and completed, so were measured.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"slowest_seconds": {
"description": "The longest run, in seconds.",
"format": "uint64",
"minimum": 0,
"type": "integer"
}
},
"required": [
"name",
"runs",
"passed",
"failed",
"median_seconds",
"p90_seconds",
"slowest_seconds"
],
"type": "object"
},
"CiTimings": {
"description": "CI timings over every open head the observation holds.",
"properties": {
"checks": {
"description": "Every check, the slowest median first.",
"items": {
"$ref": "#/$defs/CheckTiming"
},
"type": "array"
},
"heads": {
"description": "Every head with a measured check, the longest wall time first.",
"items": {
"$ref": "#/$defs/HeadTiming"
},
"type": "array"
},
"measured_runs": {
"description": "Check runs measured, across every check and head.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"observed_at": {
"description": "When the forge was observed, RFC 3339: the moment these timings describe.",
"type": "string"
},
"unmeasured_runs": {
"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.",
"format": "uint64",
"minimum": 0,
"type": "integer"
}
},
"required": [
"observed_at",
"measured_runs",
"unmeasured_runs",
"checks",
"heads"
],
"type": "object"
},
"HeadTiming": {
"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.",
"properties": {
"completed_at": {
"description": "When its last measured check completed, RFC 3339.",
"type": "string"
},
"failed": {
"description": "Whether any measured check on the head failed.",
"type": "boolean"
},
"head_sha": {
"description": "The head the checks ran on.",
"type": "string"
},
"number": {
"description": "The pull request.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"slowest_check": {
"description": "The measured check that took longest.",
"type": "string"
},
"slowest_seconds": {
"description": "How long it took, in seconds.",
"format": "uint64",
"minimum": 0,
"type": "integer"
},
"started_at": {
"description": "When its first measured check started, RFC 3339.",
"type": "string"
},
"wall_seconds": {
"description": "The wall time between them, in seconds: what a reader waited for CI on this head.",
"format": "uint64",
"minimum": 0,
"type": "integer"
}
},
"required": [
"number",
"head_sha",
"started_at",
"completed_at",
"wall_seconds",
"slowest_check",
"slowest_seconds",
"failed"
],
"type": "object"
}
},
"description": "How long CI takes on the open pull requests, or why it is not known.",
"properties": {
"observed": {
"description": "Whether a forge observation is recorded in this checkout.",
"type": "boolean"
},
"reason": {
"description": "Why there are no timings, when there are none.",
"type": [
"string",
"null"
]
},
"timings": {
"anyOf": [
{
"$ref": "#/$defs/CiTimings"
},
{
"type": "null"
}
],
"description": "The timings measured from the observation, when there is one."
}
},
"required": [
"observed"
],
"title": "IntegrationTimings",
"type": "object"
}Policies
- benchmark
- required — a target on every transport the exposure declares; the cases are the input type's
- cache
- disabled — every call runs the handler
Benchmark targets
Derived from the registry for this repository: one requirement per transport, and the cases the input type provides. The whole matrix is on the benchmarks page.