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.
77name : Dogfood Gate
8-
98on :
109 pull_request :
1110 branches : ['**']
1211 push :
1312 branches : [main, master]
14-
1513permissions :
1614 contents : read
17-
1815jobs :
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