Skip to content

ci: path-filter per-board builds + nightly safety-net sweep (#835)#836

Merged
zackees merged 1 commit into
mainfrom
feat/issue-835-ci-path-filter
Jun 29, 2026
Merged

ci: path-filter per-board builds + nightly safety-net sweep (#835)#836
zackees merged 1 commit into
mainfrom
feat/issue-835-ci-path-filter

Conversation

@zackees

@zackees zackees commented Jun 29, 2026

Copy link
Copy Markdown
Member

Closes #835.

Summary

Relieves CI back-pressure: the 79 build-<board>.yml workflows no longer fire on every push/PR. Each one now has a paths: allowlist covering (a) its own test sketch, (b) its family code in crates/fbuild-build/src/<family>/**, and (c) a conservative common-path list. A new nightly-platforms.yml runs everything once a day with a guard that skips quiet days.

What changed

  • ci/board_families.json — single source of truth: per-board metadata + family → crate-path mapping.
  • ci/ci_common_paths.txt — paths whose changes force-run every board (compiler/linker, pipeline/, shared crates, Cargo.lock, etc.).
  • ci/render_workflows.py — renders the on: block of every build-<board>.yml (between sentinel comments) and the entire nightly-platforms.yml. --check mode exits 1 on drift.
  • .github/workflows/build-*.yml (79 files) — on: blocks regenerated. Each gains workflow_call: {} so nightly can re-use them, and a paths: allowlist on push + pull_request.
  • .github/workflows/nightly-platforms.yml (new) — cron 0 9 * * * UTC (~01:00 PST winter / 02:00 PDT summer) + workflow_dispatch with a force input. A guard job runs git log --since='24 hours ago' HEAD and short-circuits the fan-out when there are no recent commits.
  • .github/workflows/ci-workflow-drift.yml (new) — runs render_workflows.py --check on every PR.
  • docs/DEVELOPMENT.md + ci/README.md — documents the trigger contract and how to opt back in.

Acceptance criteria

  • PR touching only crates/fbuild-build/src/nxplpc/** triggers all LPC builds and nothing else (verified by nxplpc/** + generic_arm/** appearing in every build-lpc*.yml and no non-LPC board).
  • PR touching only tests/platform/esp32dev/** triggers build-esp32dev.yml only.
  • PR touching any common-code path (e.g. crates/fbuild-cli/**, crates/fbuild-build/src/compiler.rs) triggers all 79 boards via ci/ci_common_paths.txt.
  • PRs touching only docs / non-CI paths trigger no platform builds.
  • nightly-platforms.yml runs cron-scheduled, guard-skips quiet days.
  • Single SOT (ci/board_families.json + ci/ci_common_paths.txt); ci-workflow-drift.yml fails on drift.
  • check-{ubuntu,macos,windows}.yml, crate-gate.yml, dylint.yml, fmt.yml, msrv.yml, loc-gate.yml, lint-subprocess.yml, docs.yml unchanged.
  • release-auto.yml unchanged.
  • Documented in docs/DEVELOPMENT.md ("CI: per-board build triggers").

Test plan

  • uv run --no-project python ci/render_workflows.py — re-renders cleanly, zero changes on second run (idempotent).
  • uv run --no-project python ci/render_workflows.py --check — exit 0 on the committed tree.
  • yaml.safe_load parses nightly-platforms.yml, ci-workflow-drift.yml, and a sampled subset of the rendered build-*.yml files (lpc804, esp32dev, uno, teensy41, stm32h747xi) cleanly.
  • CI on this PR exercises the drift gate end-to-end. Confirm the small set of always-on workflows (check-*, fmt, dylint, crate-gate, loc-gate, lint-subprocess, ci-workflow-drift) all run; platform builds only run if a common-path file is in the diff (this PR touches ci/render_workflows.py and ci/board_families.json, which are in the common list, so the safety net will fire this PR's builds and validate the rewritten triggers).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a nightly platform-wide build sweep with an optional manual force run.
    • Enabled reusable workflow support for board builds.
  • Chores

    • Refined CI triggers so board builds run only when relevant files change.
    • Added workflow drift checks and updated CI documentation for build behavior.

The 79 build-<board>.yml workflows previously fired on every push/PR
to main, producing heavy back-pressure for changes that touch a single
crate or unrelated code. This change biases per-board builds toward
NOT running:

  * Each build-<board>.yml `on:` block now has a `paths:` allowlist
    covering the board's own test sketch, its family code (e.g. all
    LPC boards include `crates/fbuild-build/src/{nxplpc,generic_arm}/**`),
    and a conservative list of common-code paths whose changes still
    force every board to build (safety net).
  * The `on:` blocks and a new `nightly-platforms.yml` are rendered
    from two SOT files (`ci/board_families.json`,
    `ci/ci_common_paths.txt`) by `ci/render_workflows.py`. A new
    `ci-workflow-drift.yml` runs the renderer with `--check` on every
    PR to enforce no drift.
  * `nightly-platforms.yml` runs all 79 builds at 09:00 UTC daily
    (~01:00 PST winter / 02:00 PDT summer). A `guard` job exits
    cleanly when no commits landed in the last 24h, so quiet days
    cost nothing. `workflow_dispatch` exposes a `force` input to
    bypass the guard for manual reruns.

Per-board workflows now also expose `workflow_call: {}` so the
nightly fan-out can re-use them.

Documented in docs/DEVELOPMENT.md ("CI: per-board build triggers").

Closes #835

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds a Python renderer (ci/render_workflows.py) driven by ci/board_families.json and ci/ci_common_paths.txt that generates path-filtered on: trigger blocks for all 79 per-board build-*.yml workflows. Also adds nightly-platforms.yml (daily fan-out with a commit-guard) and ci-workflow-drift.yml (enforces rendered output matches source of truth).

Changes

CI Path-Filter + Nightly Platform Sweep

Layer / File(s) Summary
Source-of-truth inputs
ci/board_families.json, ci/ci_common_paths.txt, ci/README.md
board_families.json maps family identifiers to crate-path globs and each board to its workflow/test/env/firmware metadata. ci_common_paths.txt lists paths that force-trigger all platform builds. README contents list is updated to reference both files plus the renderer.
Renderer script
ci/render_workflows.py
New CLI tool that loads board/family/common-path inputs, renders path-filtered on: YAML blocks with sentinel markers, rewrites each build-*.yml in place, generates nightly-platforms.yml, and exits non-zero under --check when any file would change.
Drift enforcement workflow
.github/workflows/ci-workflow-drift.yml
New workflow that installs uv and runs ci/render_workflows.py --check on every push/PR to main, failing if any rendered workflow has drifted from source of truth.
Nightly scheduled fan-out
.github/workflows/nightly-platforms.yml
New workflow with a daily cron trigger and a guard job that skips when no commits occurred in the last 24 hours (overridable via force: true dispatch input); all per-board jobs are gated on the guard output.
All 79 rendered build-*.yml workflows
.github/workflows/build-*.yml
Every per-board workflow gains workflow_call and paths-filtered push/pull_request triggers generated by the renderer. A subset (attiny88, atmega8, leonardo, samd21, tinystm, teensylc, uno, build-uno) also receives explicit jobs.build wiring to template_build.yml.
Development docs
docs/DEVELOPMENT.md
Adds a CI section covering path-filter behavior, nightly sweep, source-of-truth files, how to update board/family/common paths, drift checking, and mechanisms for forcing builds.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • FastLED/fbuild#225: Introduced the nRF52840 board workflows (build-supermini_nrf52840.yml, build-nice_nano_nrf52840.yml, build-nrfmicro_nrf52840.yml) whose on: triggers are now expanded by this PR.
  • FastLED/fbuild#280: Previously modified on: trigger blocks in build-*.yml workflows (adding workflow_dispatch), the same code region this PR rewrites with rendered path-filtered blocks.

Poem

🐇 Ninety files were changed, but I typed not one!
A renderer script does all the tedious fun.
board_families.json holds the master plan,
ci_common_paths.txt catches what it can.
Nightly sweeps the boards while I sleep in my hole —
Path filters keep CI under control! 🌙

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main CI path-filter and nightly sweep changes, and it references the linked issue.
Linked Issues check ✅ Passed The PR implements path-filtered per-board workflows, a daily guarded nightly fan-out, shared source-of-truth files, drift checks, and docs as requested.
Out of Scope Changes check ✅ Passed The changes stay focused on CI workflow generation, nightly safety net, drift checking, and documentation with no obvious unrelated scope creep.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/issue-835-ci-path-filter

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci-workflow-drift.yml:
- Around line 23-26: The workflow uses an invalid checkout action version and is
missing the recommended security settings. Update the `actions/checkout` step in
the CI workflow to a valid stable release, add `persist-credentials: false` to
that step, and add a restrictive workflow-level `permissions` block limited to
`contents: read` since `Verify rendered workflows match SOT` only needs read
access.

In @.github/workflows/nightly-platforms.yml:
- Around line 21-48: The nightly-platforms workflow is using the default broad
GitHub token permissions; add a restrictive permissions block so the guard job
and reusable-workflow calls only have the access they need. Update the top-level
workflow configuration in nightly-platforms.yml (near the guard job definition)
to set contents: read, or apply the same restriction per job if needed, since
the workflow only checks out code and triggers reusable workflows.

In `@ci/board_families.json`:
- Around line 59-60: The alias entries in board_families are still causing
duplicate fan-out for the same board. Update the generation logic and/or the
affected board_families entries so only one canonical workflow is included in
automatic push/PR/nightly triggers, and keep alias workflow files out of the
fan-out path; use the existing workflow, workflow_name, test_dir, env_name, and
family fields to identify the duplicate Nano Every-style entries and apply the
same deduplication to the other listed aliases.

In `@ci/render_workflows.py`:
- Around line 247-254: The drift check in render_workflows.py only regenerates
the workflow on: section, so changes in the declared board metadata can still
drift unnoticed. Update the rendering flow around the board loop and
render_on_block/rewrite logic to also render or verify the jobs.build.with block
from the same board_families metadata, covering workflow_name, test_dir,
env_name, and firmware_ext. Make sure the check path compares the generated
jobs.build.with values against the existing workflow content so --check catches
mismatches, not just on: block changes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4e13be23-38cf-43df-b85b-5815dc512129

📥 Commits

Reviewing files that changed from the base of the PR and between 3b22be9 and 54fcaa4.

📒 Files selected for processing (86)
  • .github/workflows/build-apollo3_red.yml
  • .github/workflows/build-apollo3_thing_explorable.yml
  • .github/workflows/build-atmega8.yml
  • .github/workflows/build-atmega8a.yml
  • .github/workflows/build-attiny1604.yml
  • .github/workflows/build-attiny1616.yml
  • .github/workflows/build-attiny4313.yml
  • .github/workflows/build-attiny85.yml
  • .github/workflows/build-attiny88.yml
  • .github/workflows/build-blackpill.yml
  • .github/workflows/build-bluepill.yml
  • .github/workflows/build-ch32l103.yml
  • .github/workflows/build-ch32v003.yml
  • .github/workflows/build-ch32v006.yml
  • .github/workflows/build-ch32v103.yml
  • .github/workflows/build-ch32v203.yml
  • .github/workflows/build-ch32v208.yml
  • .github/workflows/build-ch32v303.yml
  • .github/workflows/build-ch32v307.yml
  • .github/workflows/build-ch32x035.yml
  • .github/workflows/build-due.yml
  • .github/workflows/build-esp32c2.yml
  • .github/workflows/build-esp32c3.yml
  • .github/workflows/build-esp32c5.yml
  • .github/workflows/build-esp32c6.yml
  • .github/workflows/build-esp32dev.yml
  • .github/workflows/build-esp32h2.yml
  • .github/workflows/build-esp32p4.yml
  • .github/workflows/build-esp32s2.yml
  • .github/workflows/build-esp32s3.yml
  • .github/workflows/build-esp8266.yml
  • .github/workflows/build-giga-r1.yml
  • .github/workflows/build-leonardo.yml
  • .github/workflows/build-lpc804.yml
  • .github/workflows/build-lpc845.yml
  • .github/workflows/build-lpc845brk.yml
  • .github/workflows/build-lpcxpresso804.yml
  • .github/workflows/build-lpcxpresso845max.yml
  • .github/workflows/build-matrix_portal_m4.yml
  • .github/workflows/build-mgm240.yml
  • .github/workflows/build-nano-every.yml
  • .github/workflows/build-nano_every.yml
  • .github/workflows/build-nice_nano_nrf52840.yml
  • .github/workflows/build-nrf52840-sense.yml
  • .github/workflows/build-nrf52840_dk.yml
  • .github/workflows/build-nrfmicro_nrf52840.yml
  • .github/workflows/build-nucleo-f429zi.yml
  • .github/workflows/build-nucleo-f439zi.yml
  • .github/workflows/build-nucleo_f429zi.yml
  • .github/workflows/build-nucleo_f439zi.yml
  • .github/workflows/build-qtpy_m0.yml
  • .github/workflows/build-rp2040.yml
  • .github/workflows/build-rp2350.yml
  • .github/workflows/build-rpipico.yml
  • .github/workflows/build-rpipico2.yml
  • .github/workflows/build-sam3x8e_due.yml
  • .github/workflows/build-samd21.yml
  • .github/workflows/build-samd21_zero.yml
  • .github/workflows/build-samd51j.yml
  • .github/workflows/build-samd51p.yml
  • .github/workflows/build-stm32f103c8.yml
  • .github/workflows/build-stm32f103cb.yml
  • .github/workflows/build-stm32f103tb.yml
  • .github/workflows/build-stm32f411ce.yml
  • .github/workflows/build-stm32h747xi.yml
  • .github/workflows/build-supermini_nrf52840.yml
  • .github/workflows/build-teensy30.yml
  • .github/workflows/build-teensy31.yml
  • .github/workflows/build-teensy32.yml
  • .github/workflows/build-teensy35.yml
  • .github/workflows/build-teensy36.yml
  • .github/workflows/build-teensy40.yml
  • .github/workflows/build-teensy41.yml
  • .github/workflows/build-teensylc.yml
  • .github/workflows/build-thingplusmatter.yml
  • .github/workflows/build-tinystm.yml
  • .github/workflows/build-uno-r4-wifi.yml
  • .github/workflows/build-uno.yml
  • .github/workflows/build-uno_r4_wifi.yml
  • .github/workflows/ci-workflow-drift.yml
  • .github/workflows/nightly-platforms.yml
  • ci/README.md
  • ci/board_families.json
  • ci/ci_common_paths.txt
  • ci/render_workflows.py
  • docs/DEVELOPMENT.md

Comment on lines +23 to +26
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v3
- name: Verify rendered workflows match SOT
run: uv run --no-project python ci/render_workflows.py --check

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🔴 Critical | ⚡ Quick win

Fix actions/checkout@v6 — v6 does not exist.

actions/checkout@v6 will fail at runtime; the latest stable release is v4. Also address the zizmor warnings:

  • Add persist-credentials: false to actions/checkout.
  • Add a restrictive permissions: block (this workflow only needs contents: read).
     steps:
-      - uses: actions/checkout@v6
+      - uses: actions/checkout@v4
+        with:
+          persist-credentials: false
       - uses: astral-sh/setup-uv@v3
       - name: Verify rendered workflows match SOT
         run: uv run --no-project python ci/render_workflows.py --check
+
+permissions:
+  contents: read
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v3
- name: Verify rendered workflows match SOT
run: uv run --no-project python ci/render_workflows.py --check
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: astral-sh/setup-uv@v3
- name: Verify rendered workflows match SOT
run: uv run --no-project python ci/render_workflows.py --check
permissions:
contents: read
🧰 Tools
🪛 zizmor (1.26.1)

[warning] 23-23: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci-workflow-drift.yml around lines 23 - 26, The workflow
uses an invalid checkout action version and is missing the recommended security
settings. Update the `actions/checkout` step in the CI workflow to a valid
stable release, add `persist-credentials: false` to that step, and add a
restrictive workflow-level `permissions` block limited to `contents: read` since
`Verify rendered workflows match SOT` only needs read access.

Source: Linters/SAST tools

Comment on lines +21 to +48
guard:
name: Guard (skip on quiet days)
runs-on: ubuntu-latest
outputs:
should_run: ${{ steps.check.outputs.should_run }}
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- id: check
env:
FORCE: ${{ inputs.force }}
run: |
if [ "$FORCE" = "true" ]; then
echo "force=true -- running nightly sweep regardless of commit activity"
echo "should_run=true" >> "$GITHUB_OUTPUT"
exit 0
fi
# Scheduled runs check out the default branch's HEAD; on
# workflow_dispatch from a feature branch this checks that
# branch instead, which is the right behavior for manual runs.
if [ -z "$(git log --since='24 hours ago' --oneline HEAD)" ]; then
echo "No commits in the last 24h -- skipping nightly platform sweep"
echo "should_run=false" >> "$GITHUB_OUTPUT"
else
echo "Recent commits found -- running full nightly sweep"
echo "should_run=true" >> "$GITHUB_OUTPUT"
fi

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Add restrictive permissions: block.

The workflow and all reusable-workflow jobs run with default broad permissions. Add permissions: contents: read at workflow level, or restrict per-job as appropriate. Since this workflow only needs to checkout and call reusable workflows, contents: read is sufficient.

permissions:
  contents: read
🧰 Tools
🪛 zizmor (1.26.1)

[warning] 27-29: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 21-48: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block

(excessive-permissions)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/nightly-platforms.yml around lines 21 - 48, The
nightly-platforms workflow is using the default broad GitHub token permissions;
add a restrictive permissions block so the guard job and reusable-workflow calls
only have the access they need. Update the top-level workflow configuration in
nightly-platforms.yml (near the guard job definition) to set contents: read, or
apply the same restriction per job if needed, since the workflow only checks out
code and triggers reusable workflows.

Source: Linters/SAST tools

Comment thread ci/board_families.json
Comment on lines +59 to +60
{ "workflow": "build-nano-every.yml", "workflow_name": "Arduino Nano Every", "test_dir": "tests/platform/nano_every", "env_name": "nano_every", "firmware_ext": "hex", "family": "avr" },
{ "workflow": "build-nano_every.yml", "workflow_name": "Arduino Nano Every", "test_dir": "tests/platform/nano_every", "env_name": "nano_every", "firmware_ext": "hex", "family": "avr" },

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚀 Performance & Scalability | 🟠 Major | 🏗️ Heavy lift

These alias entries still fan out the same board twice.

Each pair shares the same test_dir, env_name, firmware_ext, and family, so one sketch/family/common-path change will enqueue both workflows and the nightly sweep will call both. That preserves redundant CI load on the exact paths this PR is trying to decongest. Please canonicalize one auto-triggered workflow per board, or keep alias workflow files out of the generated push/PR/nightly fan-out.

Also applies to: 65-68, 95-97

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ci/board_families.json` around lines 59 - 60, The alias entries in
board_families are still causing duplicate fan-out for the same board. Update
the generation logic and/or the affected board_families entries so only one
canonical workflow is included in automatic push/PR/nightly triggers, and keep
alias workflow files out of the fan-out path; use the existing workflow,
workflow_name, test_dir, env_name, and family fields to identify the duplicate
Nano Every-style entries and apply the same deduplication to the other listed
aliases.

Comment thread ci/render_workflows.py
Comment on lines +247 to +254
for board in boards:
path = WORKFLOWS_DIR / board["workflow"]
old = path.read_text(encoding="utf-8")
new_on = render_on_block(board, families, common_paths)
new = rewrite(old, new_on)
write_if_changed(path, new, args.check, drift, updated)

write_if_changed(NIGHTLY_PATH, render_nightly(boards), args.check, drift, updated)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift

The drift gate only enforces half of the declared SOT.

This loop regenerates on: blocks only. ci/board_families.json already carries workflow_name, test_dir, env_name, and firmware_ext, but Line 97 there already disagrees with .github/workflows/build-uno_r4_wifi.yml Line 121 on workflow_name. The same silent drift can happen for test-dir, env-name, and firmware-ext without --check noticing. If these fields are part of the SOT, render or at least verify the jobs.build.with block from the same metadata.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ci/render_workflows.py` around lines 247 - 254, The drift check in
render_workflows.py only regenerates the workflow on: section, so changes in the
declared board metadata can still drift unnoticed. Update the rendering flow
around the board loop and render_on_block/rewrite logic to also render or verify
the jobs.build.with block from the same board_families metadata, covering
workflow_name, test_dir, env_name, and firmware_ext. Make sure the check path
compares the generated jobs.build.with values against the existing workflow
content so --check catches mismatches, not just on: block changes.

@zackees zackees merged commit ca72d3f into main Jun 29, 2026
53 of 93 checks passed
zackees added a commit that referenced this pull request Jun 29, 2026
Audit found 10 workflows missing a manual-trigger entry. Adds
`workflow_dispatch: {}` to:

  - add-to-project.yml (manual re-add of a missed issue/PR)
  - check-macos.yml, check-ubuntu.yml, check-windows.yml
  - docs.yml, dylint.yml, fmt.yml, lint-subprocess.yml,
    msrv.yml, validate-boards.yml

Reusable-workflow templates (template_build.yml,
template_native_build.yml) are intentionally left without
workflow_dispatch -- they take required inputs from the caller
and have no sensible standalone defaults.

Every other workflow under .github/workflows/ already declared
either workflow_dispatch (per-board build-*.yml after #836,
nightly-platforms.yml, ci-workflow-drift.yml, release-auto.yml,
update-data.yml, hw-ci.yml, etc.) or workflow_call (templates).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@fastled-project-sync fastled-project-sync Bot moved this to Triage in FastLED Tracker Jun 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Triage

Development

Successfully merging this pull request may close these issues.

ci: path-filter platform builds + once-daily nightly to relieve CI back-pressure (79 workflows run every commit)

1 participant