Skip to content

Commit 69bd834

Browse files
security: standardize secret scanning on TruffleHog (#33)
Standardizing on TruffleHog.
2 parents 151a096 + 7047617 commit 69bd834

116 files changed

Lines changed: 1991 additions & 1864 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.

.claude/CLAUDE.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
<!--
2+
SPDX-License-Identifier: MPL-2.0
3+
Copyright (c) Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
4+
-->
15
# Formatrix Docs - Claude Code Instructions
26

37
## Project Overview

.github/CODEOWNERS

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# SPDX-License-Identifier: MPL-2.0
2+
# CODEOWNERS - Define code review assignments for GitHub
3+
# See: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
4+
5+
# Default: sole maintainer for all files
6+
* @hyperpolymath
7+
8+
# Security-sensitive files require explicit ownership
9+
SECURITY.md @hyperpolymath
10+
.github/workflows/ @hyperpolymath
11+
.machine_readable/ @hyperpolymath
12+
contractiles/ @hyperpolymath
13+
14+
# License files
15+
LICENSE @hyperpolymath
16+
LICENSES/ @hyperpolymath
17+
18+
# Configuration
19+
.gitignore @hyperpolymath
20+
.github/ @hyperpolymath
21+
22+
# Documentation
23+
README* @hyperpolymath
24+
CONTRIBUTING* @hyperpolymath
25+
CODE_OF_CONDUCT* @hyperpolymath
26+
GOVERNANCE* @hyperpolymath
27+
MAINTAINERS* @hyperpolymath
28+
CHANGELOG* @hyperpolymath
29+
ROADMAP* @hyperpolymath
30+
31+
# Build and CI
32+
Justfile @hyperpolymath
33+
Makefile @hyperpolymath
34+
*.sh @hyperpolymath

.github/copilot/coding-agent.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
mcp_servers:
2+
boj-server:
3+
command: npx
4+
args: ["-y", "@hyperpolymath/boj-server@latest"]
5+
env:
6+
BOJ_URL: http://localhost:7700

.github/workflows/boj-build.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# // Copyright (c) Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
12
# SPDX-License-Identifier: MPL-2.0
23
name: BoJ Server Build Trigger
34
on:
@@ -7,6 +8,7 @@ on:
78
jobs:
89
trigger-boj:
910
runs-on: ubuntu-latest
11+
timeout-minutes: 15
1012
steps:
1113
- name: Checkout
1214
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

.github/workflows/casket-pages.yml

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,34 @@
1+
# // Copyright (c) Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
12
# SPDX-License-Identifier: MPL-2.0-or-later
23
name: GitHub Pages
3-
44
on:
55
push:
66
branches: [main]
77
workflow_dispatch:
8-
98
permissions:
109
contents: read
1110
pages: write
1211
id-token: write
13-
1412
concurrency:
1513
group: "pages"
1614
cancel-in-progress: false
17-
1815
jobs:
1916
build:
2017
runs-on: ubuntu-latest
18+
timeout-minutes: 15
2119
steps:
2220
- name: Checkout
2321
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4
24-
2522
- name: Checkout casket-ssg
2623
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4
2724
with:
2825
repository: hyperpolymath/casket-ssg
2926
path: .casket-ssg
30-
3127
- name: Setup GHCup
3228
uses: haskell-actions/setup@f9150cb1d140e9a9271700670baa38991e6fa25c # v2
3329
with:
3430
ghc-version: '9.8.2'
3531
cabal-version: '3.10'
36-
3732
- name: Cache Cabal
3833
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
3934
with:
@@ -42,11 +37,9 @@ jobs:
4237
~/.cabal/store
4338
.casket-ssg/dist-newstyle
4439
key: ${{ runner.os }}-casket-${{ hashFiles('.casket-ssg/casket-ssg.cabal') }}
45-
4640
- name: Build casket-ssg
4741
working-directory: .casket-ssg
4842
run: cabal build
49-
5043
- name: Build site
5144
run: |
5245
mkdir -p site _site
@@ -77,20 +70,18 @@ jobs:
7770
fi
7871
fi
7972
cd .casket-ssg && cabal run casket-ssg -- build ../site ../_site
80-
8173
- name: Setup Pages
8274
uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5
83-
8475
- name: Upload artifact
8576
uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0
8677
with:
8778
path: '_site'
88-
8979
deploy:
9080
environment:
9181
name: github-pages
9282
url: ${{ steps.deployment.outputs.page_url }}
9383
runs-on: ubuntu-latest
84+
timeout-minutes: 15
9485
needs: build
9586
steps:
9687
- name: Deploy to GitHub Pages

.github/workflows/cflite_batch.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# // Copyright (c) Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
12
# SPDX-License-Identifier: MPL-2.0
23
name: ClusterFuzzLite Batch
34
on:
@@ -8,6 +9,7 @@ permissions:
89
jobs:
910
BatchFuzzing:
1011
runs-on: ubuntu-latest
12+
timeout-minutes: 15
1113
strategy:
1214
fail-fast: false
1315
matrix:

.github/workflows/cflite_pr.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# // Copyright (c) Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
12
# SPDX-License-Identifier: MPL-2.0
23
name: ClusterFuzzLite PR
34
on:
@@ -9,6 +10,7 @@ permissions:
910
jobs:
1011
PR:
1112
runs-on: ubuntu-latest
13+
timeout-minutes: 15
1214
strategy:
1315
fail-fast: false
1416
matrix:

.github/workflows/codeql.yml

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,26 @@
1-
# SPDX-License-Identifier: PMPL-1.0
1+
# // Copyright (c) Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk>
2+
# SPDX-License-Identifier: MPL-2.0
23
name: CodeQL Security Analysis
3-
44
on:
55
push:
66
branches: [main, master]
77
pull_request:
88
branches: [main, master]
99
schedule:
1010
- cron: '0 6 * * 1'
11-
1211
# Estate guardrail: cancel superseded runs so re-pushes / rebased PR
1312
# updates do not pile up queued runs against the shared account-wide
1413
# Actions concurrency pool. Applied only to read-only check workflows
1514
# (no publish/mutation), so cancelling a superseded run is always safe.
1615
concurrency:
1716
group: ${{ github.workflow }}-${{ github.ref }}
1817
cancel-in-progress: true
19-
2018
permissions:
2119
contents: read
22-
2320
jobs:
2421
analyze:
2522
runs-on: ubuntu-latest
23+
timeout-minutes: 15
2624
permissions:
2725
contents: read
2826
security-events: write
@@ -32,17 +30,14 @@ jobs:
3230
include:
3331
- language: javascript-typescript
3432
build-mode: none
35-
3633
steps:
3734
- name: Checkout
3835
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
39-
4036
- name: Initialize CodeQL
4137
uses: github/codeql-action/init@c6f931105cb2c34c8f901cc885ba1e2e259cf745 # v3
4238
with:
4339
languages: ${{ matrix.language }}
4440
build-mode: ${{ matrix.build-mode }}
45-
4641
- name: Perform CodeQL Analysis
4742
uses: github/codeql-action/analyze@c6f931105cb2c34c8f901cc885ba1e2e259cf745 # v3
4843
with:

.github/workflows/dogfood-gate.yml

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,24 @@
55
# Validates that the repo uses hyperpolymath's own formats and tools.
66
# Companion to static-analysis-gate.yml (security) — this is for format compliance.
77
name: Dogfood Gate
8-
98
on:
109
pull_request:
1110
branches: ['**']
1211
push:
1312
branches: [main, master]
14-
1513
permissions:
1614
contents: read
17-
1815
jobs:
1916
# ---------------------------------------------------------------------------
2017
# Job 1: A2ML manifest validation
2118
# ---------------------------------------------------------------------------
2219
a2ml-validate:
2320
name: Validate A2ML manifests
2421
runs-on: ubuntu-latest
25-
22+
timeout-minutes: 15
2623
steps:
2724
- name: Checkout repository
2825
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
29-
3026
- name: Check for A2ML files
3127
id: detect
3228
run: |
@@ -35,14 +31,12 @@ jobs:
3531
if [ "$COUNT" -eq 0 ]; then
3632
echo "::warning::No .a2ml manifest files found. Every RSR repo should have 0-AI-MANIFEST.a2ml"
3733
fi
38-
3934
- name: Validate A2ML manifests
4035
if: steps.detect.outputs.count > 0
4136
uses: hyperpolymath/a2ml-validate-action@6bff6ec134fc977e86d25166a5c522ddea5c1e78 # main
4237
with:
4338
path: '.'
4439
strict: 'false'
45-
4640
- name: Write summary
4741
run: |
4842
A2ML_COUNT="${{ steps.detect.outputs.count }}"
@@ -59,18 +53,16 @@ jobs:
5953
echo "" >> "$GITHUB_STEP_SUMMARY"
6054
echo "Scanned **${A2ML_COUNT}** .a2ml file(s). See step output for details." >> "$GITHUB_STEP_SUMMARY"
6155
fi
62-
6356
# ---------------------------------------------------------------------------
6457
# Job 2: K9 contract validation
6558
# ---------------------------------------------------------------------------
6659
k9-validate:
6760
name: Validate K9 contracts
6861
runs-on: ubuntu-latest
69-
62+
timeout-minutes: 15
7063
steps:
7164
- name: Checkout repository
7265
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
73-
7466
- name: Check for K9 files
7567
id: detect
7668
run: |
@@ -83,14 +75,12 @@ jobs:
8375
if [ "$COUNT" -eq 0 ] && [ "$CONFIG_COUNT" -gt 0 ]; then
8476
echo "::warning::Found $CONFIG_COUNT config files but no K9 contracts. Run k9iser to generate contracts."
8577
fi
86-
8778
- name: Validate K9 contracts
8879
if: steps.detect.outputs.k9_count > 0
8980
uses: hyperpolymath/k9-validate-action@2d96f43c538964b097d159ed3a56ba5b5ceca227 # main
9081
with:
9182
path: '.'
9283
strict: 'false'
93-
9484
- name: Write summary
9585
run: |
9686
K9_COUNT="${{ steps.detect.outputs.k9_count }}"
@@ -108,18 +98,16 @@ jobs:
10898
echo "" >> "$GITHUB_STEP_SUMMARY"
10999
echo "Validated **${K9_COUNT}** K9 contract(s) against **${CFG_COUNT}** config file(s)." >> "$GITHUB_STEP_SUMMARY"
110100
fi
111-
112101
# ---------------------------------------------------------------------------
113102
# Job 3: Empty-linter — invisible character detection
114103
# ---------------------------------------------------------------------------
115104
empty-lint:
116105
name: Empty-linter (invisible characters)
117106
runs-on: ubuntu-latest
118-
107+
timeout-minutes: 15
119108
steps:
120109
- name: Checkout repository
121110
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
122-
123111
- name: Scan for invisible characters
124112
id: lint
125113
run: |
@@ -153,7 +141,6 @@ jobs:
153141
REL_PATH="${filepath#$GITHUB_WORKSPACE/}"
154142
echo "::warning file=${REL_PATH}::Invisible Unicode characters detected (zero-width space, BOM, NBSP, etc.)"
155143
done < /tmp/empty-lint-results.txt
156-
157144
- name: Write summary
158145
run: |
159146
if [ "${{ steps.lint.outputs.ready }}" = "true" ]; then
@@ -172,18 +159,16 @@ jobs:
172159
echo "" >> "$GITHUB_STEP_SUMMARY"
173160
echo "Skipped: empty-linter not available." >> "$GITHUB_STEP_SUMMARY"
174161
fi
175-
176162
# ---------------------------------------------------------------------------
177163
# Job 4: Groove manifest check (for repos that should expose services)
178164
# ---------------------------------------------------------------------------
179165
groove-check:
180166
name: Groove manifest check
181167
runs-on: ubuntu-latest
182-
168+
timeout-minutes: 15
183169
steps:
184170
- name: Checkout repository
185171
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
186-
187172
- name: Check for Groove manifest
188173
id: groove
189174
run: |
@@ -220,7 +205,6 @@ jobs:
220205
if [ "$HAS_SERVER" = "true" ] && [ "$HAS_MANIFEST" = "false" ] && [ "$HAS_GROOVE_CODE" = "false" ]; then
221206
echo "::warning::This repo has server code but no Groove endpoint. Add .well-known/groove/manifest.json for service discovery."
222207
fi
223-
224208
- name: Write summary
225209
run: |
226210
echo "## Groove Protocol Check" >> "$GITHUB_STEP_SUMMARY"
@@ -230,20 +214,18 @@ jobs:
230214
echo "| Static manifest (.well-known/groove/manifest.json) | ${{ steps.groove.outputs.has_manifest }} |" >> "$GITHUB_STEP_SUMMARY"
231215
echo "| Groove endpoint in code | ${{ steps.groove.outputs.has_groove_code }} |" >> "$GITHUB_STEP_SUMMARY"
232216
echo "| Has HTTP server code | ${{ steps.groove.outputs.has_server }} |" >> "$GITHUB_STEP_SUMMARY"
233-
234217
# ---------------------------------------------------------------------------
235218
# Job 5: Dogfooding summary
236219
# ---------------------------------------------------------------------------
237220
dogfood-summary:
238221
name: Dogfooding compliance summary
239222
runs-on: ubuntu-latest
223+
timeout-minutes: 15
240224
needs: [a2ml-validate, k9-validate, empty-lint, groove-check]
241225
if: always()
242-
243226
steps:
244227
- name: Checkout repository
245228
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
246-
247229
- name: Generate dogfooding scorecard
248230
run: |
249231
SCORE=0
@@ -306,4 +288,3 @@ jobs:
306288
*Generated by the [Dogfood Gate](https://github.com/hyperpolymath/rsr-template-repo) workflow.*
307289
*Dogfooding is guinea pig fooding — we test our tools on ourselves.*
308290
EOF
309-

0 commit comments

Comments
 (0)