Skip to content
This repository was archived by the owner on Jun 14, 2026. It is now read-only.

Commit 2ea277b

Browse files
testclaude
authored andcommitted
Scope workflow path cascade to per-reusable filters
Previously a single `workflows` filter matched any change under `.github/workflows/**` or `.github/actions/**` and cascaded into every per-job gate, so editing pr.yml or any reusable triggered the full CI suite (rust integration tests, unit tests, type check, ...) even for additive changes. Wasted minutes; harder to review which checks actually mattered. Split the cascade: - `actions:` keeps the global fan-out (composite actions are shared infrastructure; any change can affect anything). - `workflows_<job>:` filters cascade only to their own reusable. - `pr.yml` no longer cascades; it's pure routing and its own gating determines what runs. Also drop the now-unused `workflows` boolean input from lint.yml, and the stale comment block in lint.yml's claude_plugin_validate job. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent b47303a commit 2ea277b

2 files changed

Lines changed: 50 additions & 39 deletions

File tree

.github/workflows/lint.yml

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,6 @@ on:
3939
description: Validate the Claude plugin marketplace and plugin manifests
4040
type: boolean
4141
default: false
42-
workflows:
43-
description: Reserved for orchestrator-wide gating
44-
type: boolean
45-
default: false
4642
workflow_dispatch:
4743
inputs:
4844
rust:
@@ -72,9 +68,6 @@ on:
7268
claude_plugin:
7369
type: boolean
7470
default: true
75-
workflows:
76-
type: boolean
77-
default: true
7871

7972
permissions:
8073
contents: read
@@ -236,10 +229,6 @@ jobs:
236229
- name: Checkout
237230
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
238231

239-
# The `claude` CLI is distributed as an npm package. The Brewfile cask
240-
# `claude-code@latest` is macOS-only, so install via npm on the Linux
241-
# runner. Pinned exact so a validator change cannot silently flip a
242-
# previously-green PR red.
243232
- name: Setup Node
244233
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
245234
with:

.github/workflows/pr.yml

Lines changed: 50 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,29 @@ jobs:
2626
api: ${{ steps.filter.outputs.api }}
2727
embedding: ${{ steps.filter.outputs.embedding }}
2828
docker: ${{ steps.filter.outputs.docker }}
29-
workflows: ${{ steps.filter.outputs.workflows }}
29+
actions: ${{ steps.filter.outputs.actions }}
30+
workflows_lint: ${{ steps.filter.outputs.workflows_lint }}
31+
workflows_type_check: ${{ steps.filter.outputs.workflows_type_check }}
32+
workflows_unit_test: ${{ steps.filter.outputs.workflows_unit_test }}
33+
workflows_integration_test: ${{ steps.filter.outputs.workflows_integration_test }}
34+
workflows_security_audit: ${{ steps.filter.outputs.workflows_security_audit }}
35+
workflows_lhci: ${{ steps.filter.outputs.workflows_lhci }}
36+
workflows_docker_build: ${{ steps.filter.outputs.workflows_docker_build }}
37+
workflows_e2e_test: ${{ steps.filter.outputs.workflows_e2e_test }}
3038
terraform: ${{ steps.filter.outputs.terraform }}
3139
shell: ${{ steps.filter.outputs.shell }}
3240
markdown: ${{ steps.filter.outputs.markdown }}
3341
openapi: ${{ steps.filter.outputs.openapi }}
3442
astro: ${{ steps.filter.outputs.astro }}
3543
claude_plugin: ${{ steps.filter.outputs.claude_plugin }}
36-
lint_needed: ${{ steps.filter.outputs.rust == 'true' || steps.filter.outputs.ts == 'true' || steps.filter.outputs.shell == 'true' || steps.filter.outputs.markdown == 'true' || steps.filter.outputs.terraform == 'true' || steps.filter.outputs.astro == 'true' || steps.filter.outputs.openapi == 'true' || steps.filter.outputs.claude_plugin == 'true' || steps.filter.outputs.workflows == 'true' }}
37-
type_check_needed: ${{ steps.filter.outputs.ts == 'true' || steps.filter.outputs.workflows == 'true' }}
38-
unit_test_needed: ${{ steps.filter.outputs.rust == 'true' || steps.filter.outputs.ts == 'true' || steps.filter.outputs.shell == 'true' || steps.filter.outputs.workflows == 'true' }}
39-
integration_test_needed: ${{ steps.filter.outputs.rust == 'true' || steps.filter.outputs.workflows == 'true' }}
40-
security_audit_needed: ${{ steps.filter.outputs.rust == 'true' || steps.filter.outputs.ts == 'true' || steps.filter.outputs.docker == 'true' || steps.filter.outputs.workflows == 'true' }}
41-
lhci_needed: ${{ steps.filter.outputs.landing == 'true' || steps.filter.outputs.workflows == 'true' }}
42-
docker_build_needed: ${{ (steps.filter.outputs.rust == 'true' || steps.filter.outputs.ts == 'true' || steps.filter.outputs.docker == 'true') && github.event.pull_request.head.repo.full_name == github.repository }}
43-
e2e_test_needed: ${{ (steps.filter.outputs.rust == 'true' || steps.filter.outputs.ts == 'true' || steps.filter.outputs.docker == 'true') && github.event.pull_request.head.repo.full_name == github.repository }}
44+
lint_needed: ${{ steps.filter.outputs.rust == 'true' || steps.filter.outputs.ts == 'true' || steps.filter.outputs.shell == 'true' || steps.filter.outputs.markdown == 'true' || steps.filter.outputs.terraform == 'true' || steps.filter.outputs.astro == 'true' || steps.filter.outputs.openapi == 'true' || steps.filter.outputs.claude_plugin == 'true' || steps.filter.outputs.actions == 'true' || steps.filter.outputs.workflows_lint == 'true' }}
45+
type_check_needed: ${{ steps.filter.outputs.ts == 'true' || steps.filter.outputs.actions == 'true' || steps.filter.outputs.workflows_type_check == 'true' }}
46+
unit_test_needed: ${{ steps.filter.outputs.rust == 'true' || steps.filter.outputs.ts == 'true' || steps.filter.outputs.shell == 'true' || steps.filter.outputs.actions == 'true' || steps.filter.outputs.workflows_unit_test == 'true' }}
47+
integration_test_needed: ${{ steps.filter.outputs.rust == 'true' || steps.filter.outputs.actions == 'true' || steps.filter.outputs.workflows_integration_test == 'true' }}
48+
security_audit_needed: ${{ steps.filter.outputs.rust == 'true' || steps.filter.outputs.ts == 'true' || steps.filter.outputs.docker == 'true' || steps.filter.outputs.actions == 'true' || steps.filter.outputs.workflows_security_audit == 'true' }}
49+
lhci_needed: ${{ steps.filter.outputs.landing == 'true' || steps.filter.outputs.actions == 'true' || steps.filter.outputs.workflows_lhci == 'true' }}
50+
docker_build_needed: ${{ (steps.filter.outputs.rust == 'true' || steps.filter.outputs.ts == 'true' || steps.filter.outputs.docker == 'true' || steps.filter.outputs.actions == 'true' || steps.filter.outputs.workflows_docker_build == 'true') && github.event.pull_request.head.repo.full_name == github.repository }}
51+
e2e_test_needed: ${{ (steps.filter.outputs.rust == 'true' || steps.filter.outputs.ts == 'true' || steps.filter.outputs.docker == 'true' || steps.filter.outputs.actions == 'true' || steps.filter.outputs.workflows_e2e_test == 'true') && github.event.pull_request.head.repo.full_name == github.repository }}
4452
steps:
4553
- name: Checkout
4654
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -83,9 +91,24 @@ jobs:
8391
- 'docker-compose.yml'
8492
- 'apps/*/Dockerfile'
8593
- 'infra/docker/**/!(*.md|*.mdx)'
86-
workflows:
87-
- '.github/workflows/**/!(*.md|*.mdx)'
94+
actions:
8895
- '.github/actions/**/!(*.md|*.mdx)'
96+
workflows_lint:
97+
- '.github/workflows/lint.yml'
98+
workflows_type_check:
99+
- '.github/workflows/type_check.yml'
100+
workflows_unit_test:
101+
- '.github/workflows/unit_test.yml'
102+
workflows_integration_test:
103+
- '.github/workflows/integration_test.yml'
104+
workflows_security_audit:
105+
- '.github/workflows/security_audit.yml'
106+
workflows_lhci:
107+
- '.github/workflows/lhci.yml'
108+
workflows_docker_build:
109+
- '.github/workflows/docker_build.yml'
110+
workflows_e2e_test:
111+
- '.github/workflows/e2e_test.yml'
89112
terraform:
90113
- 'terraform/**'
91114
- '**/*.tf'
@@ -109,51 +132,50 @@ jobs:
109132
if: needs.prepare.outputs.lint_needed == 'true'
110133
uses: ./.github/workflows/lint.yml
111134
with:
112-
rust: ${{ needs.prepare.outputs.rust == 'true' || needs.prepare.outputs.workflows == 'true' }}
113-
ts: ${{ needs.prepare.outputs.ts == 'true' || needs.prepare.outputs.workflows == 'true' }}
114-
shell: ${{ needs.prepare.outputs.shell == 'true' || needs.prepare.outputs.workflows == 'true' }}
115-
markdown: ${{ needs.prepare.outputs.markdown == 'true' || needs.prepare.outputs.workflows == 'true' }}
116-
terraform: ${{ needs.prepare.outputs.terraform == 'true' || needs.prepare.outputs.workflows == 'true' }}
117-
astro: ${{ needs.prepare.outputs.astro == 'true' || needs.prepare.outputs.workflows == 'true' }}
118-
openapi: ${{ needs.prepare.outputs.openapi == 'true' || needs.prepare.outputs.workflows == 'true' }}
119-
claude_plugin: ${{ needs.prepare.outputs.claude_plugin == 'true' || needs.prepare.outputs.workflows == 'true' }}
120-
workflows: ${{ needs.prepare.outputs.workflows == 'true' }}
135+
rust: ${{ needs.prepare.outputs.rust == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_lint == 'true' }}
136+
ts: ${{ needs.prepare.outputs.ts == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_lint == 'true' }}
137+
shell: ${{ needs.prepare.outputs.shell == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_lint == 'true' }}
138+
markdown: ${{ needs.prepare.outputs.markdown == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_lint == 'true' }}
139+
terraform: ${{ needs.prepare.outputs.terraform == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_lint == 'true' }}
140+
astro: ${{ needs.prepare.outputs.astro == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_lint == 'true' }}
141+
openapi: ${{ needs.prepare.outputs.openapi == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_lint == 'true' }}
142+
claude_plugin: ${{ needs.prepare.outputs.claude_plugin == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_lint == 'true' }}
121143
secrets: inherit
122144

123145
type_check:
124146
needs: prepare
125147
if: needs.prepare.outputs.type_check_needed == 'true'
126148
uses: ./.github/workflows/type_check.yml
127149
with:
128-
ts: ${{ needs.prepare.outputs.ts == 'true' || needs.prepare.outputs.workflows == 'true' }}
150+
ts: ${{ needs.prepare.outputs.ts == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_type_check == 'true' }}
129151
secrets: inherit
130152

131153
unit_test:
132154
needs: prepare
133155
if: needs.prepare.outputs.unit_test_needed == 'true'
134156
uses: ./.github/workflows/unit_test.yml
135157
with:
136-
rust: ${{ needs.prepare.outputs.rust == 'true' || needs.prepare.outputs.workflows == 'true' }}
137-
ts: ${{ needs.prepare.outputs.ts == 'true' || needs.prepare.outputs.workflows == 'true' }}
138-
shell: ${{ needs.prepare.outputs.shell == 'true' || needs.prepare.outputs.workflows == 'true' }}
158+
rust: ${{ needs.prepare.outputs.rust == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_unit_test == 'true' }}
159+
ts: ${{ needs.prepare.outputs.ts == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_unit_test == 'true' }}
160+
shell: ${{ needs.prepare.outputs.shell == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_unit_test == 'true' }}
139161
secrets: inherit
140162

141163
integration_test:
142164
needs: prepare
143165
if: needs.prepare.outputs.integration_test_needed == 'true'
144166
uses: ./.github/workflows/integration_test.yml
145167
with:
146-
rust: ${{ needs.prepare.outputs.rust == 'true' || needs.prepare.outputs.workflows == 'true' }}
168+
rust: ${{ needs.prepare.outputs.rust == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_integration_test == 'true' }}
147169
secrets: inherit
148170

149171
security_audit:
150172
needs: prepare
151173
if: needs.prepare.outputs.security_audit_needed == 'true'
152174
uses: ./.github/workflows/security_audit.yml
153175
with:
154-
rust: ${{ needs.prepare.outputs.rust == 'true' || needs.prepare.outputs.workflows == 'true' }}
155-
ts: ${{ needs.prepare.outputs.ts == 'true' || needs.prepare.outputs.workflows == 'true' }}
156-
docker: ${{ needs.prepare.outputs.docker == 'true' || needs.prepare.outputs.workflows == 'true' }}
176+
rust: ${{ needs.prepare.outputs.rust == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_security_audit == 'true' }}
177+
ts: ${{ needs.prepare.outputs.ts == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_security_audit == 'true' }}
178+
docker: ${{ needs.prepare.outputs.docker == 'true' || needs.prepare.outputs.actions == 'true' || needs.prepare.outputs.workflows_security_audit == 'true' }}
157179
secrets: inherit
158180

159181
lhci:

0 commit comments

Comments
 (0)