summaryrefslogtreecommitdiff
path: root/docs/superpowers
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2026-08-25 09:46:42 +0700
committerGitHub <[email protected]>2026-08-25 09:46:42 +0700
commitda255b1d2db10b8f31332a779b2a526f579acee1 (patch)
tree154c8b8b9cf48f4a111edd385b8df7cc6919f3b8 /docs/superpowers
parentaa0f4a40b59012e6ab421949c153088ca4984df4 (diff)
ci: an empty selection must build nothing, plus selector follow-ups (#3845)
ci: an empty selection must build nothing, plus selector follow-ups A PR whose build axis legitimately selected nothing rebuilt everything. build.yml reads .build.families twice - as a |-joined regex, and implicitly as "is anything selected" - but tested only -z "$FAMILY_REGEX", which an empty list and a charset-rejected one both satisfy while meaning opposite things. ci_set_matrix had already returned the correct all-empty matrix; the fall-open branch discarded it. #3842 and #3840 each spent 74 cmake legs on it. Branch on the two cases instead, rename FAM_* to FAMILY_*, and cover the block with a test that extracts it from build.yml and executes it - it had no test at all, which is how this shipped through two merges. Follow-ups to the same machinery: glob.escape the repo root at five sites, so a checkout path containing [ or * stops failing closed; drop the ci-full label, read after the matrix was already computed and so never functional; delete 13 mcu:MKL25ZXX / mcu:SAME5X skip tokens matching no board; carry the rule table in the module docstring, guarded against drift; and pin six selection behaviours a mutation pass proved untested. Cut the selector's cost 1.8x (26.0s -> 14.6s) with 0 divergences over 260 paths, and stop scoping the membrowse upload by the PR example filter.
Diffstat (limited to 'docs/superpowers')
-rw-r--r--docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md13
1 files changed, 13 insertions, 0 deletions
diff --git a/docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md b/docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md
index b10f5b4ae..524568aeb 100644
--- a/docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md
+++ b/docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md
@@ -146,6 +146,19 @@ the existing `test_hil_util.BottomLayer` structural tests.
Fail-open survives where it belongs: an *unclassified* path or any exception widens to `ALL` on
every axis.
+### A class no example enables selects nothing
+
+`src/class/bth` is the live instance: no example's `tusb_config.h` sets `CFG_TUD_BTH`, so
+rules 8-10 resolve to no examples and a bth-only PR builds nothing and runs nothing. That is
+the empty-means-empty ruling applied to classes, and it is deliberate — nothing compiles the
+file, so nothing can validate it, and the master-push build is the net.
+
+Worth stating plainly because the exposure changed: GHA used to rebuild everything for such
+a PR by accident, through the empty-`families` bug in `build.yml`. With that fixed, both
+providers now correctly build nothing, so `tud_bt_*` can be broken by a green PR.
+`TestClassesWithNoEnablingExample` pins the set to `{bth}` so a second class cannot enter
+this state unnoticed.
+
### Why `hw/mcu/**` is rule 7 and not "full"
`hw/mcu` is overwhelmingly dependency territory — `tools/get_deps.py` has 87 entries under it,