)]}'
{
  "commit": "03a329eeda09e073d7de9be84df55d65392e4013",
  "tree": "b59db5c7ecb4dc5c9f1e87d35634c9fc58a3d462",
  "parents": [
    "fd70160a2f5fd23de1abfbaefb6399746a90b588"
  ],
  "author": {
    "name": "hathach",
    "email": "thach@tinyusb.org",
    "time": "Fri Aug 21 22:17:51 2026 +0700"
  },
  "committer": {
    "name": "hathach",
    "email": "thach@tinyusb.org",
    "time": "Fri Aug 21 22:17:51 2026 +0700"
  },
  "message": "ci_select: classify the 254 files that were reaching rule 17\n\nRule 17 (unclassified -\u003e full on both axes) is the fail-open net for paths nobody\nanticipated, and it must stay that way: a wrong `full` costs runner minutes and is\nvisible in the run, a wrong `empty` costs a merged regression and is invisible.\nBut nothing in the tree should REACH it, and 254 tracked files did.\n\nThe cost was real. PR #3842 changed a skill, a README and .gitignore; .gitignore\nmatched no rule, so both axes went full and 74 cmake legs span up runners to do\ncheckout + toolchain + get_deps before skipping the build, plus the whole 30-board\nrig. Three changes, none of which touch rule 17 itself:\n\n1. _META_RE - repo metadata and tooling no Build step reads: .gitignore,\n   .gitattributes, .clang-format, .codespellrc, .pre-commit-config.yaml,\n   .readthedocs.yaml, .PVS-Studio/, .idea/, sonar-project.properties, the\n   packaging manifests, CMakePresets, udev rules, test/{fuzz,unit-test} (their own\n   jobs build those), the non-build .github/ files, and the tools/*.py scripts no\n   build invokes. Deliberately NOT included, and still full: .circleci/**,\n   .github/workflows/build*.yml, .github/actions/**, .github/scripts/**. The line\n   is \"does a Build step read this\", not \"is it source\".\n\n2. Rules 15 and 16 now match what they already claimed. Row 15 names\n   examples/\u003crole\u003e/CMakeLists.txt and the regex never had it; row 16 says\n   tools/build*.py but anchored tools/build\\.py$. Both got the right answer only\n   because rule 17 caught them on the way past. Also names their siblings -\n   family_support.mk, family_rules.mk, src/CMakeLists.txt, src/tinyusb.mk - and\n   .circleci/**, which generates the whole CircleCI matrix and was in no row at all.\n\n3. src/typec/** gets row 12b. It is listed unconditionally by both build systems\n   but its body is `#if CFG_TUC_ENABLED`, which only examples/typec/power_delivery\n   sets - the same shape as the class rule, so the same answer: the examples that\n   enable it (stm32g4 and stm32u5 after the buildability prune), and nothing on the\n   rig, which runs no typec test. It was force-fulling 82 families and all 30 boards.\n\nTestNoTrackedFileIsUnclassified walks every tracked file and asserts none reaches\nrule 17, on both axes - 254 -\u003e 0. Verified it fails when a new unclassified path\nappears. That turns 17 into what it should be: unreachable for anything in the\ntree, so it fires only for genuinely new shapes, and the author is told to write\nthe row rather than letting the fall-through pick an answer for them.\n\ntest_full_paths used sonar-project.properties as its stand-in for \"unclassified\";\nthat is now metadata, so the case moved to the new\ntest_repo_metadata_is_not_a_build_input, with test_the_build_machinery_is_still_full\npinning the other side of the line.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8f77dc50a68ecb9cb154d64534e727f19d4f2bf7",
      "old_mode": 33188,
      "old_path": "docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md",
      "new_id": "b10f5b4ae5143eddbea3e7e2a453659b91e081eb",
      "new_mode": 33188,
      "new_path": "docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md"
    },
    {
      "type": "modify",
      "old_id": "8f18415315b032ce3825103a37dcefdab138520c",
      "old_mode": 33188,
      "old_path": "test/hil/test/test_ci_select.py",
      "new_id": "66b20b2e41ad20024b1ef0fb8f306883be95384d",
      "new_mode": 33188,
      "new_path": "test/hil/test/test_ci_select.py"
    },
    {
      "type": "modify",
      "old_id": "ced3bbbc0fe56ce811e7fa27da713b0e26c5c68f",
      "old_mode": 33261,
      "old_path": "tools/ci_select.py",
      "new_id": "cf5a0da5b0caf9a8ecab8d9e0880f4646837e272",
      "new_mode": 33261,
      "new_path": "tools/ci_select.py"
    }
  ]
}
