Skip to content

Commit bec6161

Browse files
ci(workflows): timeout-minutes on all jobs + fix two malformed workflows (#361)
## What Fixes the genuine, root-cause CI/CD workflow-hygiene problems across the **whole tree (383 workflow files)**, in response to the Hypatia scan's `workflow_audit` findings. ### 1. `missing_timeout_minutes` — fixed at root Added `timeout-minutes` to **every `runs-on` job** that lacked one, across all workflows in the repo and its embedded sub-projects. Jobs that *call a reusable workflow* (`uses:`) are correctly excluded — `timeout-minutes` is invalid on those. Values: 15–20m for fast policy jobs, 20–30m for build/test/analyze-heavy jobs. ### 2. Two genuinely malformed workflows — fixed Both were **invalid YAML** that GitHub could not parse (latent, since they don't run on PRs): - **`boj-build.yml`** — the `K9-SVC Validation` and `Contractile Check` steps were outdented to sequence items directly under `jobs:`. Removed them (redundant with the governance + hypatia workflows, and they referenced a non-canonical `lust` contractile — the canonical set is must/trust/dust/intend/adjust/bust), restoring the file to its one documented purpose: triggering the BoJ server. - **`changelog-reusable.yml`** — a multi-line `git commit -m "…"` body and a `gh pr create --body "…"` had continuation lines at column 0 inside a `run: |` block, terminating the block scalar early. Rewrote as multiple `-m` flags / a single-line body. ## Verification - All **383** workflow files parse cleanly (PyYAML); **0** `runs-on` jobs remain without `timeout-minutes`. - Diff is **workflow-files only** (+703 / −38; deletions = the two malformed-file fixes). ## Not changed (and why) - **`unpinned_action` findings are false positives.** Every `uses:` across all 383 files is pinned to a full 40-hex SHA (e.g. `actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd`). Hypatia's own rule treats a 40-hex SHA as pinned; it's truncating the SHA to `@de0f` in the report and mis-flagging correctly-pinned actions. Nothing to fix in-repo — this is a scanner-side bug worth raising upstream. - **One workflow carries an `AGPL-3.0-or-later` SPDX header** (repo is MPL-2.0). That's licence drift, which is **flag-only** per the manual-only licence guardrail — surfaced here, not edited. - The Hypatia scan is **advisory/non-gating**; CI was already green. This PR reduces the real finding count and removes two latent broken workflows. https://claude.ai/code/session_01AmPXB2dA2wCcabo8BXwS28 --- _Generated by [Claude Code](https://claude.ai/code/session_01AmPXB2dA2wCcabo8BXwS28)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 4236493 commit bec6161

313 files changed

Lines changed: 661 additions & 29 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/boj-build.yml

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ permissions:
1818
jobs:
1919
trigger-boj:
2020
runs-on: ubuntu-latest
21+
timeout-minutes: 10
2122
if: ${{ vars.BOJ_SERVER_URL != '' || secrets.BOJ_SERVER_URL != '' }}
2223
steps:
2324
- name: Checkout
@@ -46,32 +47,3 @@ jobs:
4647
-H "Content-Type: application/json" \
4748
--data "$payload" \
4849
|| echo "BoJ server unreachable - skipping (non-fatal)"
49-
50-
- name: K9-SVC Validation
51-
run: |
52-
echo "Running K9-SVC contractile validation..."
53-
if [ -f .machine_readable/contractiles/must/Mustfile.a2ml ]; then
54-
echo "✅ Mustfile found - running validation"
55-
# Placeholder for actual K9 validation
56-
echo "K9 validation would run here"
57-
else
58-
echo "❌ Mustfile not found"
59-
exit 1
60-
fi
61-
62-
- name: Contractile Check
63-
run: |
64-
echo "Checking contractile completeness..."
65-
contractiles=("must" "trust" "dust" "lust" "adjust" "intend")
66-
missing=0
67-
for c in "${contractiles[@]}"; do
68-
if [ ! -f ".machine_readable/contractiles/$c/${c^}file.a2ml" ]; then
69-
echo "❌ Missing: $c"
70-
missing=$((missing + 1))
71-
fi
72-
done
73-
if [ $missing -gt 0 ]; then
74-
echo "❌ $missing contractiles missing"
75-
exit 1
76-
fi
77-
echo "✅ All contractiles present"

0-ai-gatekeeper-protocol/.github/workflows/codeql.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ permissions: read-all
1515
jobs:
1616
analyze:
1717
runs-on: ubuntu-latest
18+
timeout-minutes: 30
1819
permissions:
1920
contents: read
2021
security-events: write

0-ai-gatekeeper-protocol/.github/workflows/hypatia-scan.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ jobs:
1717
scan:
1818
name: Hypatia Neurosymbolic Analysis
1919
runs-on: ubuntu-latest
20+
timeout-minutes: 20
2021

2122
steps:
2223
- name: Checkout repository

0-ai-gatekeeper-protocol/.github/workflows/instant-sync.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ permissions:
1414
jobs:
1515
dispatch:
1616
runs-on: ubuntu-latest
17+
timeout-minutes: 20
1718
steps:
1819
- name: Trigger Propagation
1920
uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v3

0-ai-gatekeeper-protocol/.github/workflows/jekyll-gh-pages.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ jobs:
2626
# Build job
2727
build:
2828
runs-on: ubuntu-latest
29+
timeout-minutes: 30
2930
steps:
3031
- name: Checkout
3132
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
@@ -45,6 +46,7 @@ jobs:
4546
name: github-pages
4647
url: ${{ steps.deployment.outputs.page_url }}
4748
runs-on: ubuntu-latest
49+
timeout-minutes: 30
4850
needs: build
4951
steps:
5052
- name: Deploy to GitHub Pages

0-ai-gatekeeper-protocol/.github/workflows/jekyll.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ jobs:
3131
# Build job
3232
build:
3333
runs-on: ubuntu-latest
34+
timeout-minutes: 30
3435
steps:
3536
- name: Checkout
3637
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
@@ -59,6 +60,7 @@ jobs:
5960
name: github-pages
6061
url: ${{ steps.deployment.outputs.page_url }}
6162
runs-on: ubuntu-latest
63+
timeout-minutes: 30
6264
needs: build
6365
steps:
6466
- name: Deploy to GitHub Pages

0-ai-gatekeeper-protocol/.github/workflows/mirror.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ permissions: read-all
1212
jobs:
1313
mirror-gitlab:
1414
runs-on: ubuntu-latest
15+
timeout-minutes: 20
1516
if: vars.GITLAB_MIRROR_ENABLED == 'true'
1617
steps:
1718
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4
@@ -30,6 +31,7 @@ jobs:
3031
3132
mirror-bitbucket:
3233
runs-on: ubuntu-latest
34+
timeout-minutes: 20
3335
if: vars.BITBUCKET_MIRROR_ENABLED == 'true'
3436
steps:
3537
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4
@@ -48,6 +50,7 @@ jobs:
4850
4951
mirror-codeberg:
5052
runs-on: ubuntu-latest
53+
timeout-minutes: 20
5154
if: vars.CODEBERG_MIRROR_ENABLED == 'true'
5255
steps:
5356
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4
@@ -66,6 +69,7 @@ jobs:
6669
6770
mirror-sourcehut:
6871
runs-on: ubuntu-latest
72+
timeout-minutes: 20
6973
if: vars.SOURCEHUT_MIRROR_ENABLED == 'true'
7074
steps:
7175
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4
@@ -84,6 +88,7 @@ jobs:
8488
8589
mirror-disroot:
8690
runs-on: ubuntu-latest
91+
timeout-minutes: 20
8792
if: vars.DISROOT_MIRROR_ENABLED == 'true'
8893
steps:
8994
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4
@@ -102,6 +107,7 @@ jobs:
102107
103108
mirror-gitea:
104109
runs-on: ubuntu-latest
110+
timeout-minutes: 20
105111
if: vars.GITEA_MIRROR_ENABLED == 'true'
106112
steps:
107113
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4
@@ -120,6 +126,7 @@ jobs:
120126
121127
mirror-radicle:
122128
runs-on: ubuntu-latest
129+
timeout-minutes: 20
123130
if: vars.RADICLE_MIRROR_ENABLED == 'true'
124131
steps:
125132
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4

0-ai-gatekeeper-protocol/.github/workflows/scorecard-enforcer.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ permissions: read-all
1414
jobs:
1515
scorecard:
1616
runs-on: ubuntu-latest
17+
timeout-minutes: 20
1718
permissions:
1819
security-events: write
1920
id-token: write # For OIDC
@@ -52,6 +53,7 @@ jobs:
5253
# Check specific high-priority items
5354
check-critical:
5455
runs-on: ubuntu-latest
56+
timeout-minutes: 20
5557
steps:
5658
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4
5759

0-ai-gatekeeper-protocol/.github/workflows/scorecard.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ permissions: read-all
1212
jobs:
1313
analysis:
1414
runs-on: ubuntu-latest
15+
timeout-minutes: 20
1516
permissions:
1617
security-events: write
1718
id-token: write

0-ai-gatekeeper-protocol/.github/workflows/secret-scanner.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ permissions: read-all
1212
jobs:
1313
trufflehog:
1414
runs-on: ubuntu-latest
15+
timeout-minutes: 20
1516
steps:
1617
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4
1718
with:
@@ -24,6 +25,7 @@ jobs:
2425

2526
gitleaks:
2627
runs-on: ubuntu-latest
28+
timeout-minutes: 20
2729
steps:
2830
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4
2931
with:
@@ -37,6 +39,7 @@ jobs:
3739
# Rust-specific: Check for hardcoded crypto values
3840
rust-secrets:
3941
runs-on: ubuntu-latest
42+
timeout-minutes: 20
4043
if: hashFiles('**/Cargo.toml') != ''
4144
steps:
4245
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v4

0 commit comments

Comments
 (0)