)]}'
{
  "commit": "fad6bd546fa6cb1b5fab82121cf5db436a3c38bb",
  "tree": "64989f9544c8a881ba128f1d3170fedf596c40ce",
  "parents": [
    "88c7f0b812ad516adc670bf67627911021f0951e"
  ],
  "author": {
    "name": "Ha Thach",
    "email": "thach@tinyusb.org",
    "time": "Thu Sep 17 18:34:47 2026 +0700"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Sep 17 18:34:47 2026 +0700"
  },
  "message": "hw/bsp/family.json: what each board\u0027s default configure compiles (#3927)\n\nfamily.json: catalog what each board\u0027s default configure compiles\n\nhw/bsp/family.json records per cmake board its MCU, the defines\ntusb_mcu.h tests, the family\u0027s MCUs, MAX3421_HOST, the drivers under\nsrc/portable/ and the example roles it built; null for the two Make-only\npic32mz boards. family_support.cmake emits the facts, tools/build.py\njoins them with the compile database after a default configure,\ntools/family_json.py checks, fixes (pre-commit) and refreshes (release\nsweep) the catalog.\n\nThe build skill\u0027s check_build.py selects one board per changed driver\nfrom the rows instead of scraping family.cmake and tusb_mcu.h, which\nguessed wrong for two-IP families and MAX3421; a candidate must satisfy\nthe driver\u0027s guard both ways (no negated option on, no required option\noff) and a port counts as covered only when its translation unit keeps\nlines after preprocessing.\n\nnrf, stm32l4 and stm32u5 family files now compile only the USB driver\nthe MCU_VARIANT has, the way tusb_mcu.h selects it.\n\nEvidence: 237 rows across 82 families, Espressif under ESP-IDF 5.5.3\nbyte-identical to ci.lan; catalog, skill, ci_select tests and pre-commit\npass; builds on nrf52840dk, nrf54h20dk, stm32l412nucleo, stm32l476disco,\nstm32u545nucleo, stm32u575nucleo. hil-tinyusb passed on 82bf35e1e; the\ntwo later commits touch no firmware",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "4fb7da94dab66a3ce45f374c56006fcc851074fc",
      "old_mode": 33188,
      "old_path": ".claude/skills/build/SKILL.md",
      "new_id": "fb16dffd92b18dee8424ed4d427c6c6198b9521c",
      "new_mode": 33188,
      "new_path": ".claude/skills/build/SKILL.md"
    },
    {
      "type": "modify",
      "old_id": "6cf61586df72c7030666fa176f0a04f2111c369f",
      "old_mode": 33261,
      "old_path": ".claude/skills/build/scripts/check_build.py",
      "new_id": "66dad8a4118b76ce850057d9a87b2650d5456ca9",
      "new_mode": 33261,
      "new_path": ".claude/skills/build/scripts/check_build.py"
    },
    {
      "type": "modify",
      "old_id": "c8141c58d846fe37eba0df8cdf0a33d15a09d627",
      "old_mode": 33188,
      "old_path": ".claude/skills/make-release/SKILL.md",
      "new_id": "002b2186fba2146d463248f68e8452a688b969bf",
      "new_mode": 33188,
      "new_path": ".claude/skills/make-release/SKILL.md"
    },
    {
      "type": "modify",
      "old_id": "fa857818f93cc9c4e2d3683c0acac305c1471fe0",
      "old_mode": 33261,
      "old_path": ".claude/skills/make-release/scripts/release.py",
      "new_id": "8177ecc07998dc11c4ef33a38d70d4607dabf95d",
      "new_mode": 33261,
      "new_path": ".claude/skills/make-release/scripts/release.py"
    },
    {
      "type": "modify",
      "old_id": "89efc2b5549c1d373974f864e3c96df0336f098c",
      "old_mode": 33188,
      "old_path": ".claude/test/test_build.py",
      "new_id": "33a8b1d4020639339bd842560eb26081c44e6ce5",
      "new_mode": 33188,
      "new_path": ".claude/test/test_build.py"
    },
    {
      "type": "modify",
      "old_id": "ca2ba48b1f62ae76646dd42ef8a696181c6785c5",
      "old_mode": 33188,
      "old_path": ".claude/test/test_release.py",
      "new_id": "d5d32f145735bfcf360dd3600df07f04dc62188a",
      "new_mode": 33188,
      "new_path": ".claude/test/test_release.py"
    },
    {
      "type": "modify",
      "old_id": "0ab10bf597742ae80e12c8d680869e7589b1c061",
      "old_mode": 33188,
      "old_path": ".pre-commit-config.yaml",
      "new_id": "f324cc562be8a26bbf2d551407be5a090083ef2d",
      "new_mode": 33188,
      "new_path": ".pre-commit-config.yaml"
    },
    {
      "type": "modify",
      "old_id": "888dfb8dcdd8fa25d3fa6c6dc04f1fd6d44ea7e1",
      "old_mode": 33188,
      "old_path": "docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md",
      "new_id": "c63839257da1e88e3a26adae57c613879639052b",
      "new_mode": 33188,
      "new_path": "docs/superpowers/specs/2026-08-19-ci-build-family-filter-design.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e2ce8eb413ee557eff8e039bd3aa66e0ab2ad50c",
      "new_mode": 33188,
      "new_path": "hw/bsp/family.json"
    },
    {
      "type": "modify",
      "old_id": "0247f837ffabdff2f0ec73530dd767c763ea4c12",
      "old_mode": 33188,
      "old_path": "hw/bsp/family_support.cmake",
      "new_id": "77acddaff3bfcb7e6fa2c5ef6f8046d2b31d874b",
      "new_mode": 33188,
      "new_path": "hw/bsp/family_support.cmake"
    },
    {
      "type": "modify",
      "old_id": "fba5e6e693d2b3718b386d8e012d220b193c35f2",
      "old_mode": 33188,
      "old_path": "hw/bsp/nrf/family.cmake",
      "new_id": "9f89bf897aa3ddd354af986a2a1f81ed7e257016",
      "new_mode": 33188,
      "new_path": "hw/bsp/nrf/family.cmake"
    },
    {
      "type": "modify",
      "old_id": "b1659d47a8f26e423472c9100af8fd790a40b22f",
      "old_mode": 33188,
      "old_path": "hw/bsp/stm32l4/family.cmake",
      "new_id": "c48c465e44d1d8d0f6f59f76a717b3cff2df6ca1",
      "new_mode": 33188,
      "new_path": "hw/bsp/stm32l4/family.cmake"
    },
    {
      "type": "modify",
      "old_id": "c580892b83b95f48daf4116e220a343ae6809103",
      "old_mode": 33188,
      "old_path": "hw/bsp/stm32u5/family.cmake",
      "new_id": "5887b342118955bc543af2b2131cef159be36173",
      "new_mode": 33188,
      "new_path": "hw/bsp/stm32u5/family.cmake"
    },
    {
      "type": "modify",
      "old_id": "78fd59ba402b77890c0213a850289234347f1f65",
      "old_mode": 33188,
      "old_path": "test/hil/test/test_ci_select.py",
      "new_id": "65315db5f3ab1b08861207c953557e2d2592e243",
      "new_mode": 33188,
      "new_path": "test/hil/test/test_ci_select.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "259f65594086a4050d8d1619e5cb24d42508ffe9",
      "new_mode": 33188,
      "new_path": "test/hil/test/test_family_json.py"
    },
    {
      "type": "modify",
      "old_id": "2c7865ceba5b862810d050fb2e29f5892b576336",
      "old_mode": 33188,
      "old_path": "test/hil/test/test_hil_util.py",
      "new_id": "910ea35a522ca452fdac0e877834f25cdfa28555",
      "new_mode": 33188,
      "new_path": "test/hil/test/test_hil_util.py"
    },
    {
      "type": "modify",
      "old_id": "aa8868cb824d797695666fa1571c1b8a6e6f724a",
      "old_mode": 33261,
      "old_path": "tools/build.py",
      "new_id": "5df6dc1e2d05ffa2aa6bca1068c75748ea0d6c06",
      "new_mode": 33261,
      "new_path": "tools/build.py"
    },
    {
      "type": "modify",
      "old_id": "d476fe5ab346f593899185bc563c5a1a9c3ede59",
      "old_mode": 33261,
      "old_path": "tools/build_utils.py",
      "new_id": "6579c607591b1f8e43ae5b78e20005cc04124a2e",
      "new_mode": 33261,
      "new_path": "tools/build_utils.py"
    },
    {
      "type": "modify",
      "old_id": "a78f9d8f4c792e79ec69eadf4ccf09b54deeb0c9",
      "old_mode": 33261,
      "old_path": "tools/ci_select.py",
      "new_id": "0b2f792ad181a756020d4d2c767423b50872741c",
      "new_mode": 33261,
      "new_path": "tools/ci_select.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "3876000d8726ba46c19f65d9b4d6f936b0241bb2",
      "new_mode": 33188,
      "new_path": "tools/family_json.py"
    }
  ]
}
