CI validation gates#
Time defines two stable CI checks:
ci/general-validationfrom theGate / General checksworkflow in.github/workflows/gate_general_checks.yml.ci/qnx-validationfrom theGate / QNX buildsworkflow in.github/workflows/gate_qnx_builds.yml.
The central repository policy is intended to use these aggregate checks as its CI requirements. ECA, reviews, and merge-queue rules are separate protections. The check names are the stable interface; Time owns their internal dependency graphs. The general gate combines multiple reusable workflows, while the QNX gate aggregates jobs within the existing QNX workflow.
General checks#
The Gate / General checks workflow runs for pull_request and
merge_group: checks_requested. It blocks on:
x86_64 Linux and ARM64 Linux builds of
//score/...and//examples/....Component tests using
test --config=x86_64-linux //score/....LLVM code coverage, including the existing 85% threshold.
Documentation verification and build.
All-language formatting.
Copyright validation.
Bzlmod lockfile and tidy checks.
It calls the existing Linux, component-test, coverage, formatting, copyright, and bzlmod producers. Documentation uses the existing pinned shared workflows. The existing documentation/quality-pack publication workflow remains separate.
The aggregate result job always runs after its dependencies. Every dependency must succeed; a failure, cancellation, or unexpected skip fails the aggregate.
QNX builds#
The Gate / QNX builds workflow runs for pull_request_target and
merge_group: checks_requested. It also retains its workflow_call entry
point for cache warm-up.
On merge_group, the shared QNX producer builds both x86_64-qnx and
arm64-qnx for //score/... //examples/.... The matrix runs both
architectures even if one fails. The existing QNX merge queue result job
succeeds only when both queue builds succeed.
On pull_request_target, the queue builds intentionally skip and
QNX merge queue result reports success. Advisory PR builds remain
independent, so neither the queue result nor the aggregate waits for fork-QNX
environment approval.
The ci/qnx-validation job uses always() and depends only on
QNX merge queue result. It requires that result to succeed and rejects
failure, cancellation, or skip. It runs only for pull_request_target and
merge_group, not for cache warm-up calls on push or
workflow_dispatch. The aggregate job itself does not check out PR code and
has no token permissions. The QNX gate covers builds, not QNX tests.
Aggregate contents#
Required CI check |
Blocking validation |
|---|---|
|
Both Linux architecture builds |
|
x86_64 Linux component tests |
|
LLVM code coverage and its 85% threshold |
|
Documentation verification and build |
|
All-language formatting |
|
Copyright, bzlmod lockfile, and bzlmod tidy checks |
|
Both QNX architecture builds on the merge-group revision |
Other non-required checks retain their existing policy and ownership.
Reusable workflow isolation#
The existing validation workflows also serve their direct PR, push, and
merge-group triggers. Their workflow_call entry points let the general gate
reuse those implementations rather than duplicate build/test logic.
GitHub evaluates a called workflow’s github.workflow as the caller’s
workflow name. Each reusable producer therefore adds a distinct suffix to its
concurrency group; without it, cancel-in-progress could make a called
workflow cancel its caller or a sibling producer for the same ref.
The QNX workflow owns both its build jobs and aggregate result. Its reusable entry point is used by cache maintenance, not by a second aggregate workflow. This keeps a single queue-build matrix and preserves the existing build/result check names and cache settings.