1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
name: Commit Message Lint
# One in-flight run per pull request (ci-ops 8.3.3): a superseded push cancels
# its predecessor instead of queueing a second lint behind it on the lane the
# repository resolves — which, on the farm, means one slot instead of many.
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
on:
pull_request:
types:
merge_group:
types:
# Fallback entry for the CNB lane (or an operator): dispatch this workflow on
# the pull request's head branch, so the single required check is served by
# the lane that can actually run. See the devtools callee for the lane rules.
workflow_dispatch:
inputs:
pr:
description: "Pull request number to lint"
required: true
type: string
permissions:
# A called workflow cannot grant itself a permission the caller withholds —
# the mismatch reads as startup_failure. The org default token permissions
# were tightened on 2026-10-02 and this caller was missed, so the single
# required check stopped reporting entirely. Grant exactly what the reusable
# lint declares and nothing more.
contents: read
pull-requests: read
jobs:
lint-commits:
uses: celestia-island/celestia-devtools/.github/workflows/commit-msg-lint.yml@master
with:
# Lane switch without touching this tree: the org variables resolve to the
# self-hosted fleet while the hosted lane is down (2026-09-24 account
# payments: a job sent there sits fifteen minutes with no runner before
# being cancelled, indistinguishable from "the check never reports").
runner: ${{ vars.LINT_RUNNER || '["ubuntu-latest"]' }}
lane: ${{ vars.LINT_LANE || 'hosted' }}
pr: ${{ inputs.pr }}