{
  "bom_cost": {
    "bom_target_usd": 6000.0,
    "consequence": "Any Gate check that compares a BOM total against bom_target_usd stays blocked. That is correct: the input does not exist.",
    "manufacturing_target_unit_cost_usd": null,
    "route_to_close": "A distributor API or a quoted BOM. Until then the manifest publishes quantities and identities, which is what Stage 4 needs in order to price it, and no price.",
    "target_is_a_target_not_a_ceiling": "The IR field is bom_requirements.bom_target_usd. It is cited as a target because that is what it is named; treating it as a hard ceiling would invent a constraint the IR does not state. Compare class_requirements.max_takeoff_mass_kg, which IS a hard limit.",
    "total_usd": null,
    "why_no_total": "No unit price for any part in this design was obtained from a distributor feed with stock and quantity breaks. The cached documents are manufacturer datasheets and product pages; where those carry a price it is a retail single-unit price, which is not BOM cost - it excludes quantity breaks and includes retail margin, and for the module-level parts here (flight controller, ESCs, lidar, camera) the difference is large and runs in both directions. A total computed from them would be a number with a currency symbol and no meaning, and it would be compared against the 6000.0 target as though it meant something."
  },
  "catalogue_version": "1.0.0",
  "connector_coverage": {
    "board_side_connector_identified": 6,
    "board_side_identified_refs": [
      "J_DIAG",
      "J_FC_I2C",
      "J_KILL",
      "J_PACK",
      "J_SEL_AGL",
      "J_SEL_OA1"
    ],
    "connector_positions": 38,
    "consequence_for_stage_2c": "Every connector position needs a footprint, and a footprint follows from a specific MPN. Two of thirty-seven positions have one. This is the blocking half of the manifest.",
    "declared_connector_quantities": {
      "61300311121": 2,
      "61300811121": 1,
      "AS150U": 1,
      "SM02B-GHS-TB": 1,
      "SM04B-GHS-TB": 1
    },
    "harness_resolution": {
      "artifact": "design_package/electrical/harness_manifest.json",
      "artifact_sha256": "6e783350130b56d09187119c06b208659d66ae4332bd1110927cedbc3ea6aca1",
      "measurable": true,
      "parts_by_pin_count": {
        "2": [
          "AS150U",
          "SM02B-GHS-TB",
          "solder_termination"
        ],
        "3": [
          "61300311121"
        ],
        "4": [
          "SM04B-GHS-TB"
        ],
        "6": [
          "SM06B-GHS-TB"
        ],
        "8": [
          "61300811121",
          "SM08B-GHS-TB"
        ],
        "10": [
          "SM10B-GHS-TB"
        ]
      },
      "pin_counts_required": [
        2,
        3,
        4,
        6,
        8,
        10
      ],
      "pin_counts_resolved": [
        2,
        3,
        4,
        6,
        8,
        10
      ],
      "pin_counts_still_open": [],
      "positions_inspected": 38,
      "positions_without_a_part_or_a_termination": [],
      "reading": "The harness package publishes a board-side part or an explicit termination class for 38 of 38 positions it inspected, covering 6 pin counts. The catalogue entry itself is unchanged and cannot change while it is frozen, so this does not withdraw the finding - it moves where the answer lives.",
      "why_not": ""
    },
    "mating_device_identified_only": 32,
    "no_mpn_at_all": 0,
    "no_mpn_at_all_refs": [],
    "per_pin_count": [
      {
        "board_side_part_identified": 2,
        "covered_by_the_gh_mpn": false,
        "pin_count": "01x02",
        "positions": 9,
        "positions_without_a_board_side_part": 7
      },
      {
        "board_side_part_identified": 2,
        "covered_by_the_gh_mpn": false,
        "pin_count": "01x03",
        "positions": 8,
        "positions_without_a_board_side_part": 6
      },
      {
        "board_side_part_identified": 1,
        "covered_by_the_gh_mpn": true,
        "pin_count": "01x04",
        "positions": 10,
        "positions_without_a_board_side_part": 9
      },
      {
        "board_side_part_identified": 0,
        "covered_by_the_gh_mpn": false,
        "pin_count": "01x06",
        "positions": 7,
        "positions_without_a_board_side_part": 7
      },
      {
        "board_side_part_identified": 1,
        "covered_by_the_gh_mpn": false,
        "pin_count": "01x08",
        "positions": 2,
        "positions_without_a_board_side_part": 1
      },
      {
        "board_side_part_identified": 0,
        "covered_by_the_gh_mpn": false,
        "pin_count": "01x10",
        "positions": 2,
        "positions_without_a_board_side_part": 2
      }
    ],
    "pin_counts_required": [
      "01x02",
      "01x03",
      "01x04",
      "01x06",
      "01x08",
      "01x10"
    ],
    "pin_counts_the_gh_mpn_covers": [
      "01x04"
    ],
    "pin_counts_with_no_board_side_part": [
      "01x02",
      "01x03",
      "01x04",
      "01x06",
      "01x08",
      "01x10"
    ],
    "positions_by_pin_count": {
      "01x02": 9,
      "01x03": 8,
      "01x04": 10,
      "01x06": 7,
      "01x08": 2,
      "01x10": 2
    },
    "reading": "The schematic has 38 connector positions across 6 distinct pin counts. Exactly 6 carry a board-side connector MPN (J_DIAG, J_FC_I2C, J_KILL, J_PACK, J_SEL_AGL, J_SEL_OA1); 32 carry the MPN of the device that plugs in, which is not the same thing; and 0 carry nothing. The declared GH part number names only the 01x04 variants, so even where GH is the right family the specific part is unstated for every other pin count. Note also that seven of the eight 01x02 positions are ESC and camera power inlets carrying motor-class or payload current, not signal connectors - the AS150U covers the pack inlet only.",
    "signal_connector_mpn": "SM04B-GHS-TB",
    "what_mating_device_identified_only_means": "The position carries the MPN of the peripheral it connects to (ESC, camera, flight controller, GNSS, lidar), which identifies the harness counterpart and not the board-side connector. Stage 2C cannot derive a footprint from it."
  },
  "datasheet_cache_integrity": {
    "bodies_present": 110,
    "bodies_recorded_but_absent_from_disk": [],
    "fetch_failures_by_error_type": {
      "HTTPError": 27,
      "TimeoutError": 4,
      "URLError": 2
    },
    "hash_matches": 110,
    "hash_mismatches": [],
    "manifest_sha256": "02f864b8c951e2ad3efde22a4376f4f2cc27b10cf3addec9f7c2404db939a51a",
    "measurable": true,
    "method": "For every record in datasheet_records/manifest.json that names a cache_relpath, re-hash the file at that path and compare it to the recorded sha256. Records with ok:false are included, because a failed retrieval still cached a body and its hash is still an assertion about that body. Files in raw/ that no record names are listed as orphans.",
    "not_measured_is_not_the_same_as_clean": "33 of 143 records name no cached body at all, so there is nothing to compare for them. They are counted separately from the matches rather than folded into them.",
    "orphan_bodies_no_record_names": [
      "holybro_llms_index__llms.txt"
    ],
    "raw_dir_scanned_for_orphans": "design_package/electrical/datasheet_records/raw",
    "records_inspected": 143,
    "records_whose_fetch_returned_no_body": 33,
    "records_with_a_cached_body": 110
  },
  "datasheet_records": {
    "documents_cited": 33,
    "documents_that_do_not_resolve": [],
    "note": "A source_id appears here only if a spec of a catalogue part cites it. The index holds more documents than this; the ones not listed were retrieved during selection and are not load-bearing for any published number.",
    "records": [
      {
        "bytes": 73432,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/benewake_tf03__index.html",
        "cited_by_mpns": [
          "TF03-180"
        ],
        "doc_kind": "product_page",
        "final_url": "https://en.benewake.com/TF03/index.html",
        "http_status": 200,
        "manufacturer": "Benewake",
        "mpn": "TF03-180",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:31:32+00:00",
        "sha256": "26f9e1d2841c635e2a414e9e01b5033ac50619f8184c34324b425b0d9320bc2e",
        "source_id": "benewake_tf03"
      },
      {
        "bytes": 63669,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/benewake_tfminis__index.html",
        "cited_by_mpns": [
          "TFmini-S"
        ],
        "doc_kind": "product_page",
        "final_url": "https://en.benewake.com/TFminiS/index.html",
        "http_status": 200,
        "manufacturer": "Benewake",
        "mpn": "TFmini-S",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:31:32+00:00",
        "sha256": "6c1e645d2c38ff556747ea1fe1e3688b426d87f4f47549a62f1ab63d42ebd862",
        "source_id": "benewake_tfminis"
      },
      {
        "bytes": 182009,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/bourns_smlj__smlj.pdf",
        "cited_by_mpns": [
          "SMLJ13A",
          "SMLJ58A",
          "SMLJ6.0A"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.bourns.com/docs/product-datasheets/smlj.pdf",
        "http_status": 200,
        "manufacturer": "Bourns",
        "mpn": "SMLJ58A",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:46+00:00",
        "sha256": "98d2dc6eaf69663556983ab35cf3702913b100e1a3c12add0a096a3bf718da6d",
        "source_id": "bourns_smlj"
      },
      {
        "bytes": 292802,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/bourns_srp1265a__srp1265a.pdf",
        "cited_by_mpns": [
          "SRP1265A-220M",
          "SRP1265A-8R2M"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.bourns.com/docs/product-datasheets/srp1265a.pdf",
        "http_status": 200,
        "manufacturer": "Bourns",
        "mpn": "SRP1265A",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:45+00:00",
        "sha256": "30b470999b737a6350ce5b09a917a5f12090c2e0895a78ddc15285e3d44ec649",
        "source_id": "bourns_srp1265a"
      },
      {
        "bytes": 3828,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/holybro_6x_techspec_md__technical-specification.md",
        "cited_by_mpns": [
          "Pixhawk 6X (Standard Baseboard)"
        ],
        "doc_kind": "spec_table",
        "final_url": "https://docs.holybro.com/autopilot/pixhawk-6x/technical-specification.md",
        "http_status": 200,
        "manufacturer": "Holybro",
        "mpn": "Pixhawk 6X",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:31:48+00:00",
        "sha256": "d2b54c5696d868132d7a3c37a53a25cc112d2b723e971f5c1d86697c6f7a26ad",
        "source_id": "holybro_6x_techspec_md"
      },
      {
        "bytes": 2670,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/holybro_conn_wire_rating_md__connector-and-wire-rating.md",
        "cited_by_mpns": [
          "AS150U"
        ],
        "doc_kind": "spec_table",
        "final_url": "https://docs.holybro.com/power-module-and-pdb/power-module/connector-and-wire-rating.md",
        "http_status": 200,
        "manufacturer": "Holybro",
        "mpn": "Connector & Wire Rating",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:31:49+00:00",
        "sha256": "111060fb37c64f6a7881408c9ee2a413c7ccf216c622f793be30ee1417c295fe",
        "source_id": "holybro_conn_wire_rating_md"
      },
      {
        "bytes": 7324,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/holybro_pm_compare_md__power-module-comparison.md",
        "cited_by_mpns": [
          "PM08-CAN"
        ],
        "doc_kind": "spec_table",
        "final_url": "https://docs.holybro.com/power-module-and-pdb/power-module-comparison.md",
        "http_status": 200,
        "manufacturer": "Holybro",
        "mpn": "Power Module comparison",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:31:48+00:00",
        "sha256": "02db3652f282421b778394deb7436ae9e92eb6b8387f0d1299304b6286253784",
        "source_id": "holybro_pm_compare_md"
      },
      {
        "bytes": 3525,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/holybro_remoteid_spec_md__overview-and-spec.md",
        "cited_by_mpns": [
          "Remote ID Module (ArduRemoteID, ESP32-C3)"
        ],
        "doc_kind": "spec_table",
        "final_url": "https://docs.holybro.com/radio/remote-id/overview-and-spec.md",
        "http_status": 200,
        "manufacturer": "Holybro",
        "mpn": "Remote ID Module",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:31:49+00:00",
        "sha256": "c639f4a024d45787e98e03bff9d1e0784a21e1509417afb88bc9d9fa567799df",
        "source_id": "holybro_remoteid_spec_md"
      },
      {
        "bytes": 3619,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/holybro_zedf9p_pinout_md__pinout.md",
        "cited_by_mpns": [
          "H-RTK ZED-F9P (RM3100 Compass)"
        ],
        "doc_kind": "spec_table",
        "final_url": "https://docs.holybro.com/gps-and-rtk-system/zed-f9p-h-rtk-series/pinout.md",
        "http_status": 200,
        "manufacturer": "Holybro",
        "mpn": "H-RTK ZED-F9P (RM3100)",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:31:49+00:00",
        "sha256": "a4e5a10b496f206e5800f05730ef2c9d4e86aa4da0638667c1d4d3f00a19c678",
        "source_id": "holybro_zedf9p_pinout_md"
      },
      {
        "bytes": 12841,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/holybro_zedf9p_spec_md__specification.md",
        "cited_by_mpns": [
          "H-RTK ZED-F9P (RM3100 Compass)"
        ],
        "doc_kind": "spec_table",
        "final_url": "https://docs.holybro.com/gps-and-rtk-system/zed-f9p-h-rtk-series/specification.md",
        "http_status": 200,
        "manufacturer": "Holybro",
        "mpn": "H-RTK ZED-F9P (RM3100)",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:31:49+00:00",
        "sha256": "592672f56b7d8623a63c6e5762ff58d7a8b7fa8870320d5cef029c319d3b4015",
        "source_id": "holybro_zedf9p_spec_md"
      },
      {
        "bytes": 146619,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/jst_gh__eGH.pdf",
        "cited_by_mpns": [
          "SM02B-GHS-TB",
          "SM04B-GHS-TB"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.jst-mfg.com/product/pdf/eng/eGH.pdf",
        "http_status": 200,
        "manufacturer": "JST",
        "mpn": "GH series 1.25mm",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:30:08+00:00",
        "sha256": "b1dcb317b6b9a4fbbedd2dbf42c64c95306a252d23de8933b85fcf161240b722",
        "source_id": "jst_gh"
      },
      {
        "bytes": 54530,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/jst_gh_specs_en__index.php",
        "cited_by_mpns": [
          "SM02B-GHS-TB",
          "SM04B-GHS-TB"
        ],
        "doc_kind": "spec_table",
        "final_url": "https://www.jst-mfg.com/product/index.php?series=105&lang=en",
        "http_status": 200,
        "manufacturer": "JST",
        "mpn": "GH series 1.25mm",
        "resolves_now": true,
        "retrieved_utc": "2026-09-01T01:58:33+00:00",
        "sha256": "84f300afef468ca3f704dca7c672176eeb8b6401a9c68e5a1b460c03e2a17db8",
        "source_id": "jst_gh_specs_en"
      },
      {
        "bytes": 3316869,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/kemet_x7r__KEM_C1002_X7R_SMD.pdf",
        "cited_by_mpns": [
          "C0805C104K4RACTU",
          "C0805C105K4RACTU",
          "C0805C332K4RACTU",
          "C0805C474K4RACTU",
          "C1210C106K3RACTU",
          "C1210C225K1RACTU",
          "C1210C226K3RACTU"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://content.kemet.com/datasheets/KEM_C1002_X7R_SMD.pdf",
        "http_status": 200,
        "manufacturer": "KEMET",
        "mpn": "C-series X7R SMD",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:45+00:00",
        "sha256": "08ff1421c1b73de93a93bebee13957da3e53bb2753d5653f3b9d59948542af01",
        "source_id": "kemet_x7r"
      },
      {
        "bytes": 396293,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/lightware_sf45b__sf45-b-50-m.html",
        "cited_by_mpns": [
          "SF45/B"
        ],
        "doc_kind": "product_page",
        "final_url": "https://lightwarelidar.com/shop/sf45-b-50-m/",
        "http_status": 200,
        "manufacturer": "LightWare",
        "mpn": "SF45/B",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:31:40+00:00",
        "sha256": "fb5866ad2488a24b6c05e61faf0b691d7cb87d429405d0d58caddf9e7984692a",
        "source_id": "lightware_sf45b"
      },
      {
        "bytes": 639544,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/micasense_rededgep_brochure__REP-family-brochure-2025-DIGITAL.pdf",
        "cited_by_mpns": [
          "RedEdge-P"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://eaglenxt.com/wp-content/uploads/REP-family-brochure-2025-DIGITAL.pdf",
        "http_status": 200,
        "manufacturer": "AgEagle / MicaSense",
        "mpn": "RedEdge-P",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:31:50+00:00",
        "sha256": "170a851d05519fd71e2ed36e3084479f3e1106237220422eb1e0e5614b2357bf",
        "source_id": "micasense_rededgep_brochure"
      },
      {
        "bytes": 246975,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/pixhawk_ds009_conn__DS-009_20Pixhawk_20Connector_20Standard.pdf",
        "cited_by_mpns": [
          "SM04B-GHS-TB"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://raw.githubusercontent.com/pixhawk/Pixhawk-Standards/master/DS-009%20Pixhawk%20Connector%20Standard.pdf",
        "http_status": 200,
        "manufacturer": "Pixhawk (Dronecode)",
        "mpn": "DS-009 Pixhawk Connector Standard",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:40+00:00",
        "sha256": "dbc6b94e0367ef0700f3ae2ed5958fd00e8938435a12c7cf528a772ec1a5bbdb",
        "source_id": "pixhawk_ds009_conn"
      },
      {
        "bytes": 898570,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/rfd900x_ds__RFD900x_20DataSheet.pdf",
        "cited_by_mpns": [
          "RFD900x"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://files.rfdesign.com.au/Files/documents/RFD900x%20DataSheet.pdf",
        "http_status": 200,
        "manufacturer": "RFDesign",
        "mpn": "RFD900x",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:43+00:00",
        "sha256": "b1199aecac374ec23d21afee47275a3f0f5c75a3bef9849b4b5d525636b5f843",
        "source_id": "rfd900x_ds"
      },
      {
        "bytes": 805210,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/ti_csd19536ktt__csd19536ktt.pdf",
        "cited_by_mpns": [
          "CSD19536KTT"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.ti.com/lit/ds/symlink/csd19536ktt.pdf",
        "http_status": 200,
        "manufacturer": "Texas Instruments",
        "mpn": "CSD19536KTT",
        "resolves_now": true,
        "retrieved_utc": "2026-10-09T15:39:15+00:00",
        "sha256": "19e1a9660fac8577743f40acc2cdc791539afd5232bbc1fc350e15fec735d78d",
        "source_id": "ti_csd19536ktt"
      },
      {
        "bytes": 2473528,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/ti_ina228__ina228.pdf",
        "cited_by_mpns": [
          "INA228AIDGSR"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.ti.com/lit/ds/symlink/ina228.pdf",
        "http_status": 200,
        "manufacturer": "Texas Instruments",
        "mpn": "INA228",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:44+00:00",
        "sha256": "a138d39eeee04f8388426fed204c2f4012e75d36e95b60b0751ef003cd277447",
        "source_id": "ti_ina228"
      },
      {
        "bytes": 2202582,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/ti_lm5069__lm5069.pdf",
        "cited_by_mpns": [
          "LM5069MMX-2"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.ti.com/lit/ds/symlink/lm5069.pdf",
        "http_status": 200,
        "manufacturer": "Texas Instruments",
        "mpn": "LM5069",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:43+00:00",
        "sha256": "d60d8106a6e8113900ff8b9576dd959942fa7169742baf0beeb30684d4d64681",
        "source_id": "ti_lm5069"
      },
      {
        "bytes": 2657068,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/ti_lm74700__lm74700-q1.pdf",
        "cited_by_mpns": [
          "LM74700QDBVRQ1"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.ti.com/lit/ds/symlink/lm74700-q1.pdf",
        "http_status": 200,
        "manufacturer": "Texas Instruments",
        "mpn": "LM74700-Q1",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:44+00:00",
        "sha256": "e16b3a8c0023201fafa5825436f5f2dd6f885b92b84e65602b3f50d741c58b6f",
        "source_id": "ti_lm74700"
      },
      {
        "bytes": 2952017,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/ti_lm76003__lm76003.pdf",
        "cited_by_mpns": [
          "LM76003RNPT"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.ti.com/lit/ds/symlink/lm76003.pdf",
        "http_status": 200,
        "manufacturer": "Texas Instruments",
        "mpn": "LM76003",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:44+00:00",
        "sha256": "1ef4ab645f7e32029a52062d2d32b622f576f345b9038c72da19055b60a91040",
        "source_id": "ti_lm76003"
      },
      {
        "bytes": 3595987,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/ti_lm76005__lm76005.pdf",
        "cited_by_mpns": [
          "LM76005RNPR"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.ti.com/lit/ds/symlink/lm76005.pdf",
        "http_status": 200,
        "manufacturer": "Texas Instruments",
        "mpn": "LM76005",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:44+00:00",
        "sha256": "ec5c8cee26092760e5fd781d1d18e8c0e6855c54b423fee076fd1f0ff610bb8c",
        "source_id": "ti_lm76005"
      },
      {
        "bytes": 812033,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/ti_sn65hvd230__sn65hvd230.pdf",
        "cited_by_mpns": [
          "SN65HVD230D"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.ti.com/lit/ds/symlink/sn65hvd230.pdf",
        "http_status": 200,
        "manufacturer": "Texas Instruments",
        "mpn": "SN65HVD230",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:44+00:00",
        "sha256": "e98fc0c59168c035d7958111924dae7e21e46ab45bdfd6400aef048299d6d716",
        "source_id": "ti_sn65hvd230"
      },
      {
        "bytes": 2814278,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/ti_tmp1075__tmp1075.pdf",
        "cited_by_mpns": [
          "TMP1075DGKR"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.ti.com/lit/ds/symlink/tmp1075.pdf",
        "http_status": 200,
        "manufacturer": "Texas Instruments",
        "mpn": "TMP1075",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:44+00:00",
        "sha256": "d4725e9e97f52d0a59e70358d55aee1fb5a177df04aa65cb737f5b362ecae5c0",
        "source_id": "ti_tmp1075"
      },
      {
        "bytes": 4249190,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/ti_tps2596__tps2596.pdf",
        "cited_by_mpns": [
          "TPS259621DDA"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.ti.com/lit/ds/symlink/tps2596.pdf",
        "http_status": 200,
        "manufacturer": "Texas Instruments",
        "mpn": "TPS2596",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T14:04:20+00:00",
        "sha256": "66f6bae4494f7bfe7dfdc314e508f0291d9ca1e87265cca9b6fdfeaa5cb19fe9",
        "source_id": "ti_tps2596"
      },
      {
        "bytes": 220988,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/tmotor_alpha60a12s__alpha-60a-12s-esc.html",
        "cited_by_mpns": [
          "ALPHA 60A 12S V1.2"
        ],
        "doc_kind": "product_page",
        "final_url": "https://store.tmotor.com/product/alpha-60a-12s-esc.html",
        "http_status": 200,
        "manufacturer": "T-MOTOR",
        "mpn": "ALPHA 60A 12S V1.2",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:33+00:00",
        "sha256": "76ff991273d53f6ccf57eed4891650e52b89385d9408631008d625f1d0d8833b",
        "source_id": "tmotor_alpha60a12s"
      },
      {
        "bytes": 214285,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/tmotor_mn5008__mn5008-kv170-motor-antigravity-type.html",
        "cited_by_mpns": [
          "MN5008 KV170"
        ],
        "doc_kind": "product_page",
        "final_url": "https://store.tmotor.com/product/mn5008-kv170-motor-antigravity-type.html",
        "http_status": 200,
        "manufacturer": "T-MOTOR",
        "mpn": "MN5008 KV170",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:29+00:00",
        "sha256": "49226f5c36bc3bffb0a6eedb79e5e6b4b69d62adf928b949eddbbb96a64fea6f",
        "source_id": "tmotor_mn5008"
      },
      {
        "bytes": 198686,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/tmotor_p18x61__polish-carbon-fiber-18x6_1-prop.html",
        "cited_by_mpns": [
          "P18*6.1 CF Polish"
        ],
        "doc_kind": "product_page",
        "final_url": "https://store.tmotor.com/product/polish-carbon-fiber-18x6_1-prop.html",
        "http_status": 200,
        "manufacturer": "T-MOTOR",
        "mpn": "P18*6.1 CF Polish",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T16:19:35+00:00",
        "sha256": "a67f0795dc1c35b6a9a060b46a390160985667bcc24368c0010837af0677704e",
        "source_id": "tmotor_p18x61"
      },
      {
        "bytes": 150402,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/vishay_crcw__dcrcwe3.pdf",
        "cited_by_mpns": [
          "CRCW080510K0FKEA",
          "CRCW0805110KFKEA",
          "CRCW080527K4FKEA",
          "CRCW08052K67FKEA",
          "CRCW080542K2FKEA",
          "CRCW0805453RFKEA",
          "CRCW080549K9FKEA",
          "CRCW08054K75FKEA",
          "CRCW080576K8FKEA",
          "CRCW0805909RFKEA",
          "CRCW080595K3FKEA"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.vishay.com/docs/20035/dcrcwe3.pdf",
        "http_status": 200,
        "manufacturer": "Vishay",
        "mpn": "CRCW e3 series",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:45+00:00",
        "sha256": "c8e3b8a11f72e25f7a5c94d10c4fd1f037c4ad0fd8b47776dd70d4c654107892",
        "source_id": "vishay_crcw"
      },
      {
        "bytes": 142434,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/vishay_wsl__wsl.pdf",
        "cited_by_mpns": [
          "WSL2512R0200FEA"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.vishay.com/docs/30100/wsl.pdf",
        "http_status": 200,
        "manufacturer": "Vishay",
        "mpn": "WSL2512",
        "resolves_now": true,
        "retrieved_utc": "2026-08-31T13:28:45+00:00",
        "sha256": "24d9f25b0059c529c0b803e8e2fa6e10fe4629db2550445f269400d2e547612a",
        "source_id": "vishay_wsl"
      },
      {
        "bytes": 383793,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/wurth_61300311121__61300311121.pdf",
        "cited_by_mpns": [
          "61300311121"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.we-online.com/components/products/datasheet/61300311121.pdf",
        "http_status": 200,
        "manufacturer": "Wuerth Elektronik",
        "mpn": "61300311121",
        "resolves_now": true,
        "retrieved_utc": "2026-09-01T02:09:52+00:00",
        "sha256": "d8a8e70731d06c6a1b0685f3c24e2fc7b481dbbe1d25ffa9edfe14b89fb5eb8e",
        "source_id": "wurth_61300311121"
      },
      {
        "bytes": 383764,
        "cache_relpath": "design_package/electrical/datasheet_records/raw/wurth_61300811121__61300811121.pdf",
        "cited_by_mpns": [
          "61300811121"
        ],
        "doc_kind": "datasheet",
        "final_url": "https://www.we-online.com/components/products/datasheet/61300811121.pdf",
        "http_status": 200,
        "manufacturer": "Wuerth Elektronik",
        "mpn": "61300811121",
        "resolves_now": true,
        "retrieved_utc": "2026-09-01T02:09:52+00:00",
        "sha256": "ac2b7013c4444914967474bbe451283f87704df4f7229497e7eb98a746e36b4b",
        "source_id": "wurth_61300811121"
      }
    ],
    "stable_identity_field": "sha256",
    "timestamp_bearing_fields": [
      "retrieved_utc"
    ]
  },
  "findings": [
    {
      "action": "remove U_CAN from catalogue.COMPONENTS at the next unfreeze",
      "consequence": "Stage 4 would order a transceiver with nowhere to go, and a reader comparing the catalogue to the schematic would reasonably conclude the schematic is missing a part. Fixing it means deleting the entry from catalogue.py, which is frozen for Stage 2D's gate evidence - so it is reported, and the manifest classifies it explicitly rather than letting it read as an omission.",
      "detail": "Both CAN nets run FC-side connector to peripheral-side connector and touch no transceiver on this board, measured from the emitted netlist. The Pixhawk 6X's grounded can_bus_count = 2 puts its transceivers on-module and the DroneCAN peripherals carry their own, so the bus already has its two driven ends. The part is correctly absent from the schematic and incorrectly present in the catalogue.",
      "id": "STAGE2B-BOM-001",
      "severity": "MEDIUM",
      "title": "SN65HVD230D is in the BOM with quantity 1 and has no schematic position, and should not have one"
    },
    {
      "action": "Either make catalogue part_id a single identifier and carry the range in a separate designator field, or document (manufacturer, MPN) as the join key. Not fixable here: catalogue.py is frozen.",
      "consequence": "A false 'missing part' report is worse than no report, because it sends someone to add a part that is already there. Any downstream consumer that joins on part_id will reproduce the error.",
      "detail": "catalogue part_ids are human-readable ranges - 'U_EF1..U_EF4', 'M1..M6', 'Q_RP1, Q_RP2, Q_HS', 'PROP1..PROP6' - while netlist part_ids are singular ('U_EF1', 'Q_RP', 'Q_HS', 'J_BATT'). Joining on part_id reports the AS150U pack connector and the CSD19536KCS pass FET as unplaced when the schematic places one and three of them respectively. This manifest joins on (manufacturer, MPN).",
      "id": "STAGE2B-BOM-002",
      "severity": "MEDIUM",
      "title": "catalogue part_id and netlist part_id are not the same namespace, so the obvious join is wrong"
    },
    {
      "action": "At the next catalogue unfreeze, fold the harness package's per-pin-count part numbers into catalogue.SIGNAL_CONNECTOR. Do not restructure catalogue.py for this while it is frozen.",
      "blocking": false,
      "consequence": "Stage 2C can derive a footprint for every position from design_package/electrical/harness_manifest.json. Stage 2D reads catalogue.py, which is frozen and still incomplete, so any Stage 2D check that counts board-side connector MPNs will keep reporting two.",
      "detail": "The schematic has 38 connector positions across 6 distinct pin counts. Exactly 6 carry a board-side connector MPN (J_DIAG, J_FC_I2C, J_KILL, J_PACK, J_SEL_AGL, J_SEL_OA1); 32 carry the MPN of the device that plugs in, which is not the same thing; and 0 carry nothing. The declared GH part number names only the 01x04 variants, so even where GH is the right family the specific part is unstated for every other pin count. Note also that seven of the eight 01x02 positions are ESC and camera power inlets carrying motor-class or payload current, not signal connectors - the AS150U covers the pack inlet only. The harness package publishes a board-side part or an explicit termination class for 38 of 38 positions it inspected, covering 6 pin counts. The catalogue entry itself is unchanged and cannot change while it is frozen, so this does not withdraw the finding - it moves where the answer lives. The residual defect is a disagreement between two of this stage's own artifacts: catalogue.py names two GH variants and the harness manifest names a part or an explicit termination for every position. A consumer that reads the catalogue will still conclude the parts are unstated. That is why this is MEDIUM rather than RESOLVED - the blocking consequence for Stage 2C is gone, the inconsistency is not.",
      "harness_resolution": {
        "artifact": "design_package/electrical/harness_manifest.json",
        "artifact_sha256": "6e783350130b56d09187119c06b208659d66ae4332bd1110927cedbc3ea6aca1",
        "measurable": true,
        "parts_by_pin_count": {
          "2": [
            "AS150U",
            "SM02B-GHS-TB",
            "solder_termination"
          ],
          "3": [
            "61300311121"
          ],
          "4": [
            "SM04B-GHS-TB"
          ],
          "6": [
            "SM06B-GHS-TB"
          ],
          "8": [
            "61300811121",
            "SM08B-GHS-TB"
          ],
          "10": [
            "SM10B-GHS-TB"
          ]
        },
        "pin_counts_required": [
          2,
          3,
          4,
          6,
          8,
          10
        ],
        "pin_counts_resolved": [
          2,
          3,
          4,
          6,
          8,
          10
        ],
        "pin_counts_still_open": [],
        "positions_inspected": 38,
        "positions_without_a_part_or_a_termination": [],
        "reading": "The harness package publishes a board-side part or an explicit termination class for 38 of 38 positions it inspected, covering 6 pin counts. The catalogue entry itself is unchanged and cannot change while it is frozen, so this does not withdraw the finding - it moves where the answer lives.",
        "why_not": ""
      },
      "id": "STAGE2B-BOM-003",
      "severity": "MEDIUM",
      "severity_computed_from": "harness package covers every required pin count and every position -> MEDIUM (consequence closed, catalogue inconsistency remains); anything still open -> HIGH",
      "title": "38 connector positions, 6 with a board-side connector MPN in the frozen catalogue, 32 carrying only the mating device's MPN, and 6 of 6 required pin counts with no board-side part in the catalogue - closed for Stage 2C by the harness package, still open in the frozen catalogue"
    },
    {
      "action": "Place the sensor on the I2C bus, or withdraw the observation claim. Reported rather than decided because it changes the netlist, and the netlist is Gate 7 evidence.",
      "consequence": "For the TMP1075DGKR specifically the gap is substantive: its own catalogue role says the 50 degC ambient in the IR envelope means converter derating 'has to be observed rather than assumed', and there is no temperature sensor in the schematic to observe it with. Either the sensor is placed or the derating claim needs restating - the manifest cannot choose.",
      "detail": "Parts: TMP1075DGKR (declared quantity 1, catalogue id U_TEMP). The exemption table is declared, so this list is what fell through it rather than what a catch-all absorbed.",
      "id": "STAGE2B-BOM-004",
      "severity": "MEDIUM",
      "title": "1 catalogue part(s) are neither placed nor exempted"
    },
    {
      "consequence": "A BOM built from declared_quantity under-orders passives by an order of magnitude. Use placed_count.",
      "detail": "Rows: LM5069MMX-2: declared 1, placed 2; SMLJ58A: declared 1, placed 2; ALPHA 60A 12S V1.2: declared 6, placed 12; Pixhawk 6X (Standard Baseboard): declared 1, placed 8; RedEdge-P: declared 1, placed 2. Most of these are generic positions where one catalogue entry stands for a family (C_GEN, R_GEN) or where a module's connectors are attributed to the module. The placement count is the authority for a BOM quantity; declared_quantity is a per-type declaration and is not.",
      "id": "STAGE2B-BOM-005",
      "severity": "LOW",
      "title": "declared_quantity disagrees with placement for 5 part type(s)"
    },
    {
      "action": "Delete the P18*6.1 entry from catalogue.UNGROUNDABLE at the next unfreeze. Not editable now.",
      "consequence": "The stale entry states two false things. It says the part could not be grounded, and it says a different part was 'selected instead' - so a reader learns that the design uses the propeller it does not use, and that it gave up an efficiency it in fact took. propulsion_feasibility.json is correct and current: the P18*6.1 is selected on a shared T-MOTOR 12S dynamometer sweep and the P17*5.8 is the rejected candidate. The drift is in the blocker list only, and it is the direction that overstates the design's limitations rather than understating them.",
      "detail": "The blocker says this part could not be grounded, and the catalogue it is declared in now carries it as 'PROP1..PROP6' with 7 verified specs. The blocker is stale.",
      "how_it_was_found": "Mechanically, by re-testing each blocker's premise against the catalogue instead of copying the blocker text into the manifest. A manifest that restated the list would have republished the false claim under a new hash.",
      "id": "STAGE2B-BOM-006",
      "severity": "MEDIUM",
      "title": "a blocker in catalogue.UNGROUNDABLE is contradicted by the catalogue it is declared in"
    },
    {
      "consequence": "A requirement-coverage check against communication_protocols will not find ethernet satisfied. The full bus analysis, including CAN termination and the I2C address question on four identical TFmini-S heads, belongs in bus_budget.json and is not duplicated here.",
      "detail": "electronics_requirements.communication_protocols includes 'ethernet' and the Pixhawk 6X's grounded ethernet_port_count is 1, but no net of any kind in the emitted netlist is Ethernet and no FC-side connector breaks the port out. Conversely the schematic uses CAN and I2C, neither of which the IR lists - which is not itself a defect, because DroneCAN is how Pixhawk-class peripherals attach and the IR list reads as a capability set rather than an exhaustive bus inventory. The asymmetry is the point: an unlisted bus that exists is a documentation question, and a listed bus that does not exist is a coverage gap.",
      "id": "STAGE2B-BOM-008",
      "severity": "LOW",
      "title": "the schematic breaks out no Ethernet port, and the IR lists ethernet as a required communication protocol"
    },
    {
      "action": "Re-acquire the drifted source ids so the record and the bytes are written by the same run (python -m anubis.stage2b.components.acquire --only <id>), and leave orphan bodies in place - an unexplained file in an evidence directory is evidence, and deleting it destroys the only trace of it.",
      "blocking": false,
      "cache_integrity": {
        "bodies_present": 110,
        "bodies_recorded_but_absent_from_disk": [],
        "fetch_failures_by_error_type": {
          "HTTPError": 27,
          "TimeoutError": 4,
          "URLError": 2
        },
        "hash_matches": 110,
        "hash_mismatches": [],
        "manifest_sha256": "02f864b8c951e2ad3efde22a4376f4f2cc27b10cf3addec9f7c2404db939a51a",
        "measurable": true,
        "method": "For every record in datasheet_records/manifest.json that names a cache_relpath, re-hash the file at that path and compare it to the recorded sha256. Records with ok:false are included, because a failed retrieval still cached a body and its hash is still an assertion about that body. Files in raw/ that no record names are listed as orphans.",
        "not_measured_is_not_the_same_as_clean": "33 of 143 records name no cached body at all, so there is nothing to compare for them. They are counted separately from the matches rather than folded into them.",
        "orphan_bodies_no_record_names": [
          "holybro_llms_index__llms.txt"
        ],
        "raw_dir_scanned_for_orphans": "design_package/electrical/datasheet_records/raw",
        "records_inspected": 143,
        "records_whose_fetch_returned_no_body": 33,
        "records_with_a_cached_body": 110
      },
      "consequence": "A recorded sha256 that is not the hash of the file beside it makes the ledger's central claim false for that record. Where the record is cited by a published spec the number itself loses its provenance; where it is not, the ledger is still wrong and the next citation added against that source inherits the error.",
      "detail": "{\"mismatches\": [], \"orphans\": [\"holybro_llms_index__llms.txt\"], \"absent\": []} acquire.acquire writes each body at fetch time and writes the manifest once at the end of the run, so an interrupted run leaves bytes no record describes; a later --only run then merges the older record back in. That is the mechanism by which a recorded hash can predate the bytes next to it.",
      "id": "STAGE2B-BOM-009",
      "severity": "LOW",
      "severity_computed_from": "orphan bodies only -> LOW",
      "title": "datasheet cache integrity: 143 ledger records, 110 of which name a cached body; 110 bodies hash to their recorded sha256, 0 do not, 0 are recorded but absent from disk, and 1 file(s) in raw/ are named by no record"
    }
  ],
  "frozen_ir_sha256": "57c7b14bed120a03d54df506078b8cd26a87b0757c8874b4b0455344085cdede",
  "grounding_audit": {
    "components_checked": 50,
    "doc_text_version": "1.2.0",
    "failures": [],
    "grounding_version": "1.0.0",
    "method": "For every spec of every catalogue part, resolve its source_id to a cached file, re-verify the file's sha256 against the index, and confirm the exact quoted text is still present in the extracted document text. No fuzzy matching.",
    "specs_checked": 347,
    "ungrounded_specs": 0
  },
  "manifest_version": "1.0.0",
  "netlist_version": "1.0.0",
  "no_gate_authority": "This manifest reports identities, quantities and provenance. It computes no verdict and sets no status.",
  "placements": {
    "join_key": "(manufacturer, mpn) case-folded",
    "placed_mpns_absent_from_the_catalogue": [],
    "placed_positions_with_an_mpn": 120,
    "positions_with_no_mpn": 0,
    "rows": [
      {
        "catalogue_part_id": "J_PACK",
        "category": "connector",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "01_power_input"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector:Conn_01x02_Pin",
        "manufacturer": "AMASS",
        "mpn": "AS150U",
        "netlist_part_ids": [
          "J_BATT"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "Land pattern is the largest solder-wire footprint KiCad ships (6 sqmm); the pack lead is 8 AWG = 8.37 sqmm, so Stage 2C must widen it."
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_PACK"
        ],
        "spec_count": 4,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_RP",
        "category": "protection",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "01_power_input"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Power_Management:LM74700",
        "manufacturer": "Texas Instruments",
        "mpn": "LM74700QDBVRQ1",
        "netlist_part_ids": [
          "U_RP"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "U_RP"
        ],
        "spec_count": 2,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "Q_RP1, Q_RP2, Q_HS, Q_MK1, Q_MK2",
        "category": "protection",
        "declared_quantity": 5,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "Conduction losses and the resulting bus voltage drop are computed from typical 25 degC resistance and are therefore optimistic; the harness check records this direction explicitly.",
            "gap_type": "TYPICAL_ONLY_ON_RETRIEVABLE_PAGE",
            "key": "rds_on_maximum_over_temperature"
          }
        ],
        "groups": [
          "01_power_input",
          "01b_motor_interrupt",
          "03_hotswap"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "anubis_parts:CSD19536KTT",
        "manufacturer": "Texas Instruments",
        "mpn": "CSD19536KTT",
        "netlist_part_ids": [
          "Q_HS",
          "Q_MK",
          "Q_RP"
        ],
        "placed_count": 5,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "Q_HS",
          "Q_MK1",
          "Q_MK2",
          "Q_RP1",
          "Q_RP2"
        ],
        "spec_count": 10,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_HS, U_MK",
        "category": "protection",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "Coordination is stated in terms of the two published sense thresholds and the 4 V timer threshold, not as a time-current curve overlay.",
            "gap_type": "CURVE_ONLY_ON_RETRIEVABLE_PAGE",
            "key": "overcurrent_trip_time_curve"
          }
        ],
        "groups": [
          "01b_motor_interrupt",
          "03_hotswap"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Power_Management:LM5069MM-2",
        "manufacturer": "Texas Instruments",
        "mpn": "LM5069MMX-2",
        "netlist_part_ids": [
          "U_HS",
          "U_MK"
        ],
        "placed_count": 2,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": false,
        "reference_designators": [
          "U_HS",
          "U_MK"
        ],
        "spec_count": 31,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "D_TVS, D_TVS_M",
        "category": "protection",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "01_power_input",
          "01b_motor_interrupt"
        ],
        "kicad_footprint": "Diode_SMD:D_SMC",
        "kicad_symbol": "Device:D_Zener",
        "manufacturer": "Bourns",
        "mpn": "SMLJ58A",
        "netlist_part_ids": [
          "D_TVS"
        ],
        "placed_count": 2,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": false,
        "reference_designators": [
          "D_TVS",
          "D_TVS_M"
        ],
        "spec_count": 4,
        "substitution_note": "KiCad 10 ships no unidirectional-TVS symbol: Device:D_TVS names its pins A1 and A2, which asserts a BIDIRECTIONAL device, and the SMLJ58A/SMLJ6.0A/SMLJ13A are unidirectional (the bidirectional siblings are the -CA suffixes). Device:D_Zener is used instead because a unidirectional TVS is electrically a clamping zener and its K/A pins preserve the polarity in the netlist."
      },
      {
        "catalogue_part_id": "D_TVS5",
        "category": "protection",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "This TVS is specified as a surge-energy limiter only. A sustained regulator high-side failure is NOT clamped below the autopilot's absolute maximum by any part in this design; the residual risk is recorded in the protection coordination rather than being papered over with a clamp that cannot do the job.",
            "gap_type": "NO_QUALIFYING_PART_IN_RANGE",
            "key": "abs_max_protection_of_5v_loads"
          }
        ],
        "groups": [
          "04_rail_5v"
        ],
        "kicad_footprint": "Diode_SMD:D_SMC",
        "kicad_symbol": "Device:D_Zener",
        "manufacturer": "Bourns",
        "mpn": "SMLJ6.0A",
        "netlist_part_ids": [
          "D_TVS5"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "D_TVS5"
        ],
        "spec_count": 4,
        "substitution_note": "KiCad 10 ships no unidirectional-TVS symbol: Device:D_TVS names its pins A1 and A2, which asserts a BIDIRECTIONAL device, and the SMLJ58A/SMLJ6.0A/SMLJ13A are unidirectional (the bidirectional siblings are the -CA suffixes). Device:D_Zener is used instead because a unidirectional TVS is electrically a clamping zener and its K/A pins preserve the polarity in the netlist."
      },
      {
        "catalogue_part_id": "D_TVS12",
        "category": "protection",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "At full 8/20 us peak pulse current the eFuse inputs see up to 21.5 V, 2.5 V over their rated maximum. Recorded as a residual risk with the energy bound stated, not claimed as compliant.",
            "gap_type": "NO_QUALIFYING_PART_IN_RANGE",
            "key": "clamp_above_efuse_abs_max"
          }
        ],
        "groups": [
          "05_rail_12v"
        ],
        "kicad_footprint": "Diode_SMD:D_SMC",
        "kicad_symbol": "Device:D_Zener",
        "manufacturer": "Bourns",
        "mpn": "SMLJ13A",
        "netlist_part_ids": [
          "D_TVS12"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "D_TVS12"
        ],
        "spec_count": 6,
        "substitution_note": "KiCad 10 ships no unidirectional-TVS symbol: Device:D_TVS names its pins A1 and A2, which asserts a BIDIRECTIONAL device, and the SMLJ58A/SMLJ6.0A/SMLJ13A are unidirectional (the bidirectional siblings are the -CA suffixes). Device:D_Zener is used instead because a unidirectional TVS is electrically a clamping zener and its K/A pins preserve the polarity in the netlist."
      },
      {
        "catalogue_part_id": "R_SH",
        "category": "passive",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "The resistance and power rating used in the protection coordination are the legend value and the model rating. Procurement must confirm the exact ordering code is stocked.",
            "gap_type": "PARAMETRIC_TABLE_NOT_ATTRIBUTABLE",
            "key": "per_mpn_datasheet_row"
          },
          {
            "consequence": "The part is instantiated as a two-terminal Device:R on the R_2512_6332Metric land. Kelvin sensing is therefore a LAYOUT obligation - the INA228 sense traces must land on the resistor pads inboard of the power current path - and is passed to Stage 2C as a layout constraint rather than being represented as extra schematic pins.",
            "gap_type": "NOT_A_PROPERTY_OF_THIS_PART",
            "key": "four_terminal_kelvin_construction"
          }
        ],
        "groups": [
          "03_hotswap"
        ],
        "kicad_footprint": "Resistor_SMD:R_2512_6332Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay Dale",
        "mpn": "WSL2512R0200FEA",
        "netlist_part_ids": [
          "R_SH"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "Kelvin sensing is a LAYOUT obligation: the INA228 sense traces must land on the pads inboard of the power path. The WSL2512 is a two-terminal part."
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_SH"
        ],
        "spec_count": 5,
        "substitution_note": "An earlier draft of this catalogue named WSL2726L1000FEA. That model does not exist: Vishay's WSL datasheet lists exactly WSL0603, WSL0805, WSL1206, WSL2010, WSL2512 and WSL2816, and no 2726 size. The part was replaced with a WSL2512 whose resistance code is constructed from the manufacturer's own published part-numbering legend and whose value lies inside the published range for that model. This also settled the topology: a chip shunt cannot carry the 69 A motor bus (0.5 mOhm, the smallest WSL2512 value, would dissipate 2.4 W against a 1.0 W rating), so bus current is measured by the PM08-CAN's own 200 A/376 A sensing and the shunt sits on the ~1 A avionics feed where it is in range."
      },
      {
        "catalogue_part_id": "U_IMON",
        "category": "sensor",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "07_monitoring"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Sensor_Energy:INA228",
        "manufacturer": "Texas Instruments",
        "mpn": "INA228AIDGSR",
        "netlist_part_ids": [
          "U_IMON"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "U_IMON"
        ],
        "spec_count": 6,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_PM",
        "category": "sensor",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "07_monitoring"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x06",
        "manufacturer": "Holybro",
        "mpn": "PM08-CAN",
        "netlist_part_ids": [
          "U_PM"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_PM"
        ],
        "spec_count": 6,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_5V",
        "category": "power_conversion",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "04_rail_5v"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Regulator_Switching:LM76005",
        "manufacturer": "Texas Instruments",
        "mpn": "LM76005RNPR",
        "netlist_part_ids": [
          "U_5V"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "The exposed pad is the only thermal path; the ThermalVias land is chosen deliberately and its vias must not be removed in layout."
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "U_5V"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_12V",
        "category": "power_conversion",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "05_rail_12v"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Regulator_Switching:LM76003",
        "manufacturer": "Texas Instruments",
        "mpn": "LM76003RNPT",
        "netlist_part_ids": [
          "U_12V"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "Same ThermalVias land as U_5V, for the same reason."
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "U_12V"
        ],
        "spec_count": 8,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_EF1..U_EF4",
        "category": "protection",
        "declared_quantity": 4,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "CdVdt is set to exactly 3300 pF - one of the two capacitances TI characterises in the Switching Characteristics table - so the resulting slew rate is a published measurement rather than an interpolation.",
            "gap_type": "EQUATION_RENDERED_AS_IMAGE",
            "key": "cdvdt_to_slew_rate_equation"
          }
        ],
        "groups": [
          "06_branch_protection"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Power_Management:TPS2596xx",
        "manufacturer": "Texas Instruments",
        "mpn": "TPS259621DDA",
        "netlist_part_ids": [
          "U_EF1..U_EF4"
        ],
        "placed_count": 4,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "U_EF1",
          "U_EF2",
          "U_EF3",
          "U_EF4"
        ],
        "spec_count": 23,
        "substitution_note": "TPS2596 was selected over the otherwise-equivalent TPS2595 specifically because KiCad 10's Power_Management library ships a TPS2596xx symbol and no TPS2595xx symbol. Choosing the part whose symbol exists avoids asserting a cross-part-number pin equivalence that no datasheet states."
      },
      {
        "catalogue_part_id": "L_5V",
        "category": "passive",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "Neither inductor position is assigned an installed KiCad footprint. Substituting the 12.0 mm land would be a plausible-looking part that is 0.5 mm smaller than the component in both axes, so the land is passed to Stage 2C as a footprint to generate from the datasheet drawing.",
            "gap_type": "LAND_PATTERN_ONLY_AS_DRAWING",
            "key": "recommended_land_pattern_dimensions"
          }
        ],
        "groups": [
          "04_rail_5v"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Device:L",
        "manufacturer": "Bourns",
        "mpn": "SRP1265A-8R2M",
        "netlist_part_ids": [
          "L_5V"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "Land: the Bourns SRP1265A Recommended Layout (14.2 mm overall, 8.0 mm between pads, 5.0 mm pad height) realised by KiCad's TMPC1265 land, which Stage 2C measured as identical in every dimension; Stage 2C re-verifies the assigned land against the Bourns drawing on every run and the component height is the Bourns 6.2 mm."
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "L_5V"
        ],
        "spec_count": 8,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "L_12V",
        "category": "passive",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "Neither inductor position is assigned an installed KiCad footprint. Substituting the 12.0 mm land would be a plausible-looking part that is 0.5 mm smaller than the component in both axes, so the land is passed to Stage 2C as a footprint to generate from the datasheet drawing.",
            "gap_type": "LAND_PATTERN_ONLY_AS_DRAWING",
            "key": "recommended_land_pattern_dimensions"
          }
        ],
        "groups": [
          "05_rail_12v"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Device:L",
        "manufacturer": "Bourns",
        "mpn": "SRP1265A-220M",
        "netlist_part_ids": [
          "L_12V"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "Same SRP1265A land as L_5V: the Bourns Recommended Layout realised by KiCad's TMPC1265 land, dimensionally verified by Stage 2C."
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "L_12V"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "C_GEN:0.1u@16V",
        "category": "passive",
        "declared_quantity": 4,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "01_power_input",
          "01b_motor_interrupt",
          "03_hotswap",
          "07_monitoring"
        ],
        "kicad_footprint": "Capacitor_SMD:C_0805_2012Metric",
        "kicad_symbol": "Device:C",
        "manufacturer": "KEMET",
        "mpn": "C0805C104K4RACTU",
        "netlist_part_ids": [
          "C_GEN"
        ],
        "placed_count": 4,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "X7R, rated >= 16 VDC",
          "X7R, rated >= 16 VDC (the pin is referenced to ANODE, not to GND)",
          "ordering code C0805C104K4RACTU: 16 VDC rating (catalogue voltage code 4) against the 16 VDC minimum stated here"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "C_TMK",
          "C_TMR",
          "C_VCAP",
          "C_VS"
        ],
        "spec_count": 4,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "C_GEN:1u@16V",
        "category": "passive",
        "declared_quantity": 2,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "04_rail_5v",
          "05_rail_12v"
        ],
        "kicad_footprint": "Capacitor_SMD:C_0805_2012Metric",
        "kicad_symbol": "Device:C",
        "manufacturer": "KEMET",
        "mpn": "C0805C105K4RACTU",
        "netlist_part_ids": [
          "C_GEN"
        ],
        "placed_count": 2,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "X7R, rated >= 16 VDC",
          "ordering code C0805C105K4RACTU: 16 VDC rating (catalogue voltage code 4) against the 16 VDC minimum stated here"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "C_VCC12",
          "C_VCC5"
        ],
        "spec_count": 4,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "C_GEN:3300p@16V",
        "category": "passive",
        "declared_quantity": 4,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "06_branch_protection"
        ],
        "kicad_footprint": "Capacitor_SMD:C_0805_2012Metric",
        "kicad_symbol": "Device:C",
        "manufacturer": "KEMET",
        "mpn": "C0805C332K4RACTU",
        "netlist_part_ids": [
          "C_GEN"
        ],
        "placed_count": 4,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "X7R, rated >= 16 VDC (datasheet minimum for this pin is 4 V)",
          "ordering code C0805C332K4RACTU: 16 VDC rating (catalogue voltage code 4) against the 16 VDC minimum stated here"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "C_DV1",
          "C_DV2",
          "C_DV3",
          "C_DV4"
        ],
        "spec_count": 4,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "C_GEN:0.47u@16V",
        "category": "passive",
        "declared_quantity": 2,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "04_rail_5v",
          "05_rail_12v"
        ],
        "kicad_footprint": "Capacitor_SMD:C_0805_2012Metric",
        "kicad_symbol": "Device:C",
        "manufacturer": "KEMET",
        "mpn": "C0805C474K4RACTU",
        "netlist_part_ids": [
          "C_GEN"
        ],
        "placed_count": 2,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "X7R, rated >= 16 VDC",
          "ordering code C0805C474K4RACTU: 16 VDC rating (catalogue voltage code 4) against the 16 VDC minimum stated here"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "C_BOOT12",
          "C_BOOT5"
        ],
        "spec_count": 4,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "C_GEN:10u@25V",
        "category": "passive",
        "declared_quantity": 4,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "06_branch_protection"
        ],
        "kicad_footprint": "Capacitor_SMD:C_1210_3225Metric",
        "kicad_symbol": "Device:C",
        "manufacturer": "KEMET",
        "mpn": "C1210C106K3RACTU",
        "netlist_part_ids": [
          "C_GEN"
        ],
        "placed_count": 4,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "X7R, rated >= 25 VDC",
          "ordering code C1210C106K3RACTU: 25 VDC rating (catalogue voltage code 3) against the 25 VDC minimum stated here"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "C_EF1",
          "C_EF2",
          "C_EF3",
          "C_EF4"
        ],
        "spec_count": 5,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "C_GEN:2.2u@100V",
        "category": "passive",
        "declared_quantity": 8,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "01_power_input",
          "03_hotswap"
        ],
        "kicad_footprint": "Capacitor_SMD:C_1210_3225Metric",
        "kicad_symbol": "Device:C",
        "manufacturer": "KEMET",
        "mpn": "C1210C225K1RACTU",
        "netlist_part_ids": [
          "C_GEN"
        ],
        "placed_count": 8,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "X7R, rated >= 100 VDC",
          "X7R, rated >= 100 VDC (bus reaches 50.4 V and rings against harness inductance)",
          "ordering code C1210C225K1RACTU: 100 VDC rating (catalogue voltage code 1) against the 100 VDC minimum stated here"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "C_BUS1",
          "C_BUS2",
          "C_BUS3",
          "C_BUS4",
          "C_IN1",
          "C_IN2",
          "C_SYS1",
          "C_SYS2"
        ],
        "spec_count": 5,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "C_GEN:22u@25V",
        "category": "passive",
        "declared_quantity": 6,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "04_rail_5v",
          "05_rail_12v"
        ],
        "kicad_footprint": "Capacitor_SMD:C_1210_3225Metric",
        "kicad_symbol": "Device:C",
        "manufacturer": "KEMET",
        "mpn": "C1210C226K3RACTU",
        "netlist_part_ids": [
          "C_GEN"
        ],
        "placed_count": 6,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "X7R, rated >= 25 VDC",
          "ordering code C1210C226K3RACTU: 25 VDC rating (catalogue voltage code 3) against the 25 VDC minimum stated here"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "C_O121",
          "C_O122",
          "C_O123",
          "C_O51",
          "C_O52",
          "C_O53"
        ],
        "spec_count": 5,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:10k",
        "category": "passive",
        "declared_quantity": 15,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "01b_motor_interrupt",
          "03_hotswap",
          "04_rail_5v",
          "05_rail_12v",
          "06_branch_protection"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW080510K0FKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 15,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_ENB1",
          "R_ENB2",
          "R_ENB3",
          "R_ENB4",
          "R_FBB12",
          "R_FBB5",
          "R_FLT1",
          "R_FLT2",
          "R_FLT3",
          "R_FLT4",
          "R_MKEN",
          "R_MKKILL",
          "R_PG12",
          "R_PG5",
          "R_PGD"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:110k",
        "category": "passive",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "05_rail_12v"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW0805110KFKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_FBT12"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:27k4",
        "category": "passive",
        "declared_quantity": 2,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "06_branch_protection"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW080527K4FKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 2,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_ENT1",
          "R_ENT2"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:2k67",
        "category": "passive",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "03_hotswap"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW08052K67FKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_UV2"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:42k2",
        "category": "passive",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "04_rail_5v"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW080542K2FKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_FBT5"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:453R",
        "category": "passive",
        "declared_quantity": 3,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "06_branch_protection"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW0805453RFKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 3,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_ILM1",
          "R_ILM2",
          "R_ILM3"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:49k9",
        "category": "passive",
        "declared_quantity": 2,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "01b_motor_interrupt",
          "03_hotswap"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW080549K9FKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 2,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_PWR",
          "R_PWRMK"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:4k75",
        "category": "passive",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "03_hotswap"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW08054K75FKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_OV1"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:76k8",
        "category": "passive",
        "declared_quantity": 2,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "06_branch_protection"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW080576K8FKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 2,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_ENT3",
          "R_ENT4"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:909R",
        "category": "passive",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "06_branch_protection"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW0805909RFKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_ILM4"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "R_GEN:95k3",
        "category": "passive",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "03_hotswap"
        ],
        "kicad_footprint": "Resistor_SMD:R_0805_2012Metric",
        "kicad_symbol": "Device:R",
        "manufacturer": "Vishay",
        "mpn": "CRCW080595K3FKEA",
        "netlist_part_ids": [
          "R_GEN"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "1 % thick film, E96 value as stated"
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "R_UV1"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_TEMP",
        "category": "sensor",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [],
        "kicad_footprint": "",
        "kicad_symbol": "Sensor_Temperature:TMP1075DGK",
        "manufacturer": "Texas Instruments",
        "mpn": "TMP1075DGKR",
        "netlist_part_ids": [],
        "placed_count": 0,
        "placement_note": "This part is in the catalogue with a quantity, is not placed in the schematic, and is not in the declared exemption table. Either it should be placed or its declaration is wrong; the manifest cannot decide which, so it reports the contradiction.",
        "placement_status": "NOT_PLACED_UNRESOLVED",
        "procurement_requirements": [],
        "quantity_matches_placement": null,
        "reference_designators": [],
        "spec_count": 1,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "ESC1..ESC6",
        "category": "actuator",
        "declared_quantity": 6,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "ESC protection is not credited with any coordination margin in protection_coordination.json. It is recorded as a defence-in-depth layer only, and upstream protection is sized without relying on it.",
            "gap_type": "PROTECTION_THRESHOLD_UNPUBLISHED",
            "key": "esc_overcurrent_trip_threshold"
          }
        ],
        "groups": [
          "02_esc_drive"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x03",
        "manufacturer": "T-MOTOR",
        "mpn": "ALPHA 60A 12S V1.2",
        "netlist_part_ids": [
          "ESC1..ESC6"
        ],
        "placed_count": 12,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": false,
        "reference_designators": [
          "J_ESC1_P",
          "J_ESC1_S",
          "J_ESC2_P",
          "J_ESC2_S",
          "J_ESC3_P",
          "J_ESC3_S",
          "J_ESC4_P",
          "J_ESC4_S",
          "J_ESC5_P",
          "J_ESC5_S",
          "J_ESC6_P",
          "J_ESC6_S"
        ],
        "spec_count": 13,
        "substitution_note": "The MN5008 KV170 page names 'FLAME 60A 12S' as the recommended ESC, but no retrievable T-MOTOR document for that part exists (both candidate product URLs return HTTP 404 - see the FLAME_60A_12S_UNGROUNDABLE blocker). ALPHA 60A 12S V1.2 is substituted: same manufacturer, same 60 A continuous class, and its documented 18-50.4 V 12S input window covers the pack's 39.6-50.4 V operating range. The substitution is recorded rather than the FLAME part number being carried forward with invented specifications."
      },
      {
        "catalogue_part_id": "M1..M6",
        "category": "actuator",
        "declared_quantity": 6,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "No I^2R loss is computed from this figure anywhere in the design. Motor and ESC losses enter only through the measured bench Power(W) column, which is ESC DC input power and therefore already contains them.",
            "gap_type": "CURRENT_OR_IMPEDANCE_CONVENTION_UNSTATED",
            "key": "phase_resistance_convention"
          }
        ],
        "groups": [],
        "kicad_footprint": "",
        "kicad_symbol": "Motor:Motor_DC",
        "manufacturer": "T-MOTOR",
        "mpn": "MN5008 KV170",
        "netlist_part_ids": [],
        "placed_count": 0,
        "placement_note": "The motors are driven from the ESC modules' own three-phase outputs. The ESC is a module, not a discrete half-bridge on this board, so the phase wiring is harness and never becomes a board net - which is why the schematic places six ESCs and no motors. The motors are BOM and harness items; connector_pinout.csv carries the phase terminations.",
        "placement_status": "OFF_BOARD_ELECTROMECHANICAL",
        "procurement_requirements": [],
        "quantity_matches_placement": null,
        "reference_designators": [],
        "spec_count": 9,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "PROP1..PROP6",
        "category": "auxiliary",
        "declared_quantity": 6,
        "derived_count": 0,
        "gaps": [],
        "groups": [],
        "kicad_footprint": "",
        "kicad_symbol": "",
        "manufacturer": "T-MOTOR",
        "mpn": "P18*6.1 CF Polish",
        "netlist_part_ids": [],
        "placed_count": 0,
        "placement_note": "A propeller has no electrical net. It is in the catalogue because its grounded blade mass, thrust limit and temperature range are consumed by the propulsion feasibility model and by Stage 2A's mass budget. It belongs in the BOM and not in the schematic, and the manifest carries it for exactly that reason.",
        "placement_status": "NOT_AN_ELECTRICAL_PART",
        "procurement_requirements": [],
        "quantity_matches_placement": null,
        "reference_designators": [],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_FC",
        "category": "compute",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "The power budget does not invent an FC current. It budgets the published port current limit (1.5 A on Telem1 plus 1.5 A combined on all other ports) as the worst-case avionics branch draw, which is an upper bound the manufacturer does guarantee, and labels it as a bound rather than a measurement.",
            "gap_type": "LOAD_CURRENT_UNPUBLISHED",
            "key": "fc_quiescent_current"
          }
        ],
        "groups": [
          "02_esc_drive",
          "07_monitoring",
          "08_gnss_rtk",
          "09_comms",
          "10_perception",
          "11_payload",
          "12_autopilot_power"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x10",
        "manufacturer": "Holybro",
        "mpn": "Pixhawk 6X (Standard Baseboard)",
        "netlist_part_ids": [
          "U_FC"
        ],
        "placed_count": 8,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": false,
        "reference_designators": [
          "J_FC_AUX",
          "J_FC_CAN1",
          "J_FC_CAN2",
          "J_FC_GPS1",
          "J_FC_PWM",
          "J_FC_PWR1",
          "J_FC_TELEM1",
          "J_FC_TELEM2"
        ],
        "spec_count": 13,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_GNSS",
        "category": "sensor",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "08_gnss_rtk"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x10",
        "manufacturer": "Holybro",
        "mpn": "H-RTK ZED-F9P (RM3100 Compass)",
        "netlist_part_ids": [
          "U_GNSS"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_GNSS"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_TELEM",
        "category": "communication",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "The 5 V rail and its protection are sized on the quotable ~1 A transmit peak, which is the worst case; no receive-mode figure is asserted, and the energy budget carries the transmit peak continuously rather than assuming a favourable duty cycle.",
            "gap_type": "LOAD_CURRENT_UNPUBLISHED",
            "key": "receive_mode_current"
          }
        ],
        "groups": [
          "09_comms"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x06",
        "manufacturer": "RFDesign",
        "mpn": "RFD900x",
        "netlist_part_ids": [
          "U_TELEM"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_TELEM"
        ],
        "spec_count": 6,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_RID",
        "category": "communication",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "The module is placed behind a TPS2595 eFuse whose current limit is set from the Pixhawk connector standard's per-port allowance rather than from an assumed module current, so the branch is bounded by a grounded number. Its draw is carried in the power budget as an explicit unquantified item, not as a fabricated milliamp figure.",
            "gap_type": "LOAD_CURRENT_UNPUBLISHED",
            "key": "remote_id_supply_current"
          }
        ],
        "groups": [
          "09_comms"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x04",
        "manufacturer": "Holybro",
        "mpn": "Remote ID Module (ArduRemoteID, ESP32-C3)",
        "netlist_part_ids": [
          "U_RID"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_RID"
        ],
        "spec_count": 8,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_CAN",
        "category": "communication",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [],
        "kicad_footprint": "",
        "kicad_symbol": "Interface_CAN_LIN:SN65HVD230",
        "manufacturer": "Texas Instruments",
        "mpn": "SN65HVD230D",
        "netlist_part_ids": [],
        "placed_count": 0,
        "placement_note": "Measured from the netlist, not assumed: both CAN nets run from an FC-side connector to peripheral-side connectors and touch no transceiver on this board. The Pixhawk 6X's grounded can_bus_count = 2 means its transceivers are on-module, and the DroneCAN peripherals carry their own. A discrete transceiver here would be a THIRD node's driver on a bus that already has its two ends, which is worse than redundant. The correct action is to remove it from the BOM - see STAGE2B-BOM-001.",
        "placement_status": "SUPERSEDED_BY_INTEGRATED_TRANSCEIVERS",
        "procurement_requirements": [],
        "quantity_matches_placement": null,
        "reference_designators": [],
        "spec_count": 2,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "J_GH",
        "category": "connector",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "Connector adequacy is NOT claimed for the JST GH ports. The harness manifest instead states the worst-case current on each GH contact so the unproven margin is visible: the largest is 1.0 A on the P5V_RADIO contact of J_TELEM, from the RFD900x transmit peak. The commonly quoted 1 A/contact GH figure is deliberately NOT cited, because it cannot be verified in the cached bytes.",
            "gap_type": "PDF_FONT_ENCODING_DESTROYS_DIGITS",
            "key": "per_contact_current_and_voltage_rating"
          }
        ],
        "groups": [
          "07_monitoring"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x06",
        "manufacturer": "JST",
        "mpn": "SM04B-GHS-TB",
        "netlist_part_ids": [
          "J_GH"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "Same physical bus as the four TFmini-S sensors; the 1.5 kOhm autopilot pull-ups drive six devices on this segment."
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_FC_I2C"
        ],
        "spec_count": 4,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "J_GH2",
        "category": "connector",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "Connector adequacy is NOT claimed for the JST GH ports. The harness manifest instead states the worst-case current on each GH contact so the unproven margin is visible: the largest is 1.0 A on the P5V_RADIO contact of J_TELEM, from the RFD900x transmit peak. The commonly quoted 1 A/contact GH figure is deliberately NOT cited, because it cannot be verified in the cached bytes.",
            "gap_type": "PDF_FONT_ENCODING_DESTROYS_DIGITS",
            "key": "per_contact_current_and_voltage_rating"
          }
        ],
        "groups": [
          "01b_motor_interrupt"
        ],
        "kicad_footprint": "Connector_JST:JST_GH_SM02B-GHS-TB_1x02-1MP_P1.25mm_Horizontal",
        "kicad_symbol": "Connector_Generic:Conn_01x02",
        "manufacturer": "JST",
        "mpn": "SM02B-GHS-TB",
        "netlist_part_ids": [
          "J_GH2"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_KILL"
        ],
        "spec_count": 2,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "J_HDR3",
        "category": "connector",
        "declared_quantity": 2,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "10_perception"
        ],
        "kicad_footprint": "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical",
        "kicad_symbol": "Connector_Generic:Conn_01x03",
        "manufacturer": "Wuerth Elektronik",
        "mpn": "61300311121",
        "netlist_part_ids": [
          "J_HDR3"
        ],
        "placed_count": 2,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "WR-PHD 2.54 mm 1x03 THT header, rated current IR 3 A (cached datasheet). The shunt is Wuerth 60900213421 (WR-PHD jumper), shipped UNFITTED and not a placed part.",
          "WR-PHD 2.54 mm 1x03 THT header, rated current IR 3 A (cached datasheet); shunt Wuerth 60900213421, shipped UNFITTED."
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_SEL_AGL",
          "J_SEL_OA1"
        ],
        "spec_count": 4,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "J_HDR8",
        "category": "connector",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [],
        "groups": [
          "07_monitoring"
        ],
        "kicad_footprint": "Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical",
        "kicad_symbol": "Connector_Generic:Conn_01x08",
        "manufacturer": "Wuerth Elektronik",
        "mpn": "61300811121",
        "netlist_part_ids": [
          "J_HDR8"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "WR-PHD 2.54 mm 1x08 THT header, rated current IR 3 A (cached datasheet); a Stage 2B ground-test header, not the DS-009 autopilot debug port."
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_DIAG"
        ],
        "spec_count": 3,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_AGL",
        "category": "sensor",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "No supply voltage, current, power or mass is asserted for this part. It is wired to the 12 V payload rail behind a TPS2595 eFuse whose 2.7-18 V window is grounded, and it is carried in the power budget as an explicit unquantified item. Reported as a typed blocker: a rail choice cannot be validated against a specification that has not been read.",
            "gap_type": "SUPPLY_VOLTAGE_UNPUBLISHED",
            "key": "supply_voltage_and_current"
          }
        ],
        "groups": [
          "10_perception"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x04",
        "manufacturer": "Benewake",
        "mpn": "TF03-180",
        "netlist_part_ids": [
          "U_AGL"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_AGL"
        ],
        "spec_count": 6,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_OA1",
        "category": "sensor",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "Same treatment as the TF03: fed through a grounded eFuse, reported as a typed blocker, and no supply current invented for the power budget.",
            "gap_type": "SUPPLY_VOLTAGE_UNPUBLISHED",
            "key": "supply_voltage_and_current"
          },
          {
            "consequence": "Stage 2B provides the electrical interfaces for the full suite (this scanner plus four fixed TFmini-S heads) and raises the coverage proof as a cross-domain item, because sensor placement and field-of-view overlap are airframe geometry and belong to Stage 2A.",
            "gap_type": "COVERAGE_IS_A_GEOMETRY_QUESTION",
            "key": "omnidirectional_coverage_proof"
          }
        ],
        "groups": [
          "10_perception"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x04",
        "manufacturer": "LightWare LiDAR",
        "mpn": "SF45/B",
        "netlist_part_ids": [
          "U_OA1"
        ],
        "placed_count": 1,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_OA1"
        ],
        "spec_count": 7,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_OA2..U_OA5",
        "category": "sensor",
        "declared_quantity": 4,
        "derived_count": 1,
        "gaps": [
          {
            "consequence": "A 5 V supply is recorded as a DerivedSpec with its expression rather than as a manufacturer figure. Unlike the SF45/B and the TF03-180 - for which no electrical figure at all is published, and which therefore get unfitted supply-select links - these four heads ARE wired to the 5 V branch P5V_PERCEPTION, because two bounds from one manufacturer sentence divide to exactly 5.0 V and no other standard rail is consistent with that pair. The power budget uses the published 0.7 W, which is independent of the rail, so the derived voltage affects only which branch the connector lands on.",
            "gap_type": "SUPPLY_VOLTAGE_UNPUBLISHED",
            "key": "supply_voltage"
          },
          {
            "consequence": "No ingress rating is claimed for these four heads. The agricultural dust/spray exposure argument therefore rests only on the TF03, whose IP67 rating is quoted together with its model designation.",
            "gap_type": "RATING_NOT_ON_RETRIEVABLE_PAGE",
            "key": "ingress_protection"
          }
        ],
        "groups": [
          "10_perception"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x04",
        "manufacturer": "Benewake",
        "mpn": "TFmini-S",
        "netlist_part_ids": [
          "U_OA2..U_OA5"
        ],
        "placed_count": 4,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [
          "Four identical devices share one I2C segment, so each needs a distinct address; the address-configuration procedure is not on the retrievable Benewake page."
        ],
        "quantity_matches_placement": true,
        "reference_designators": [
          "J_OA2",
          "J_OA3",
          "J_OA4",
          "J_OA5"
        ],
        "spec_count": 8,
        "substitution_note": ""
      },
      {
        "catalogue_part_id": "U_CAM",
        "category": "sensor",
        "declared_quantity": 1,
        "derived_count": 0,
        "gaps": [
          {
            "consequence": "Single-head power (7.0 W average, 10.0 W peak) and mass (0.363 kg) are taken from mission_requirements.camera_reference in the frozen IR and cited to the IR. The brochure is used for the electrically binding facts that are variant-independent: the 7.0-25.2 V input window, the GPIO trigger/PPS functions and the thermal envelope.",
            "gap_type": "VARIANT_DATASHEET_UNAVAILABLE",
            "key": "single_head_power_and_mass"
          },
          {
            "consequence": "Raised as a cross-domain defect. It is a payload capability limit, not an electrical sizing input, and Stage 2B does not silently narrow the IR envelope to make it disappear.",
            "gap_type": "CROSS_DOMAIN_ENVELOPE_CONFLICT",
            "key": "payload_thermal_envelope_vs_ir"
          }
        ],
        "groups": [
          "11_payload"
        ],
        "kicad_footprint": "",
        "kicad_symbol": "Connector_Generic:Conn_01x08",
        "manufacturer": "AgEagle / MicaSense",
        "mpn": "RedEdge-P",
        "netlist_part_ids": [
          "U_CAM"
        ],
        "placed_count": 2,
        "placement_note": "",
        "placement_status": "PLACED",
        "procurement_requirements": [],
        "quantity_matches_placement": false,
        "reference_designators": [
          "J_CAM_IO",
          "J_CAM_PWR"
        ],
        "spec_count": 8,
        "substitution_note": ""
      }
    ],
    "untagged_positions": [],
    "why_not_part_id": "catalogue part_ids are human-readable ranges ('U_EF1..U_EF4', 'M1..M6', 'Q_RP1, Q_RP2, Q_HS') and netlist part_ids are singular, so a part_id join reports AS150U and CSD19536KCS as unplaced when the schematic places both. See STAGE2B-BOM-002."
  },
  "purpose": "Stage 2C needs a part identity and a footprint per placed position; Stage 4 needs a quantity. This manifest joins the grounded catalogue to the emitted netlist and reports where the two do not describe the same board.",
  "schema": "anubis.stage2b.component_manifest/1",
  "stage": "stage2b_electrical",
  "totals": {
    "catalogue_parts": 50,
    "nets": 86,
    "parts_exempt_from_placement": 3,
    "parts_not_placed_unresolved": 1,
    "parts_placed": 46,
    "placed_positions": 120,
    "positions_with_an_mpn": 120,
    "positions_with_no_mpn": 0
  },
  "ungroundable_recheck": {
    "blockers_contradicted_by_the_catalogue": 1,
    "blockers_declared": 4,
    "blockers_whose_premise_still_holds": 3,
    "method": "Normalise each blocker's MPN and each catalogue MPN, then test whether the part the blocker calls ungroundable is now a grounded catalogue part. This is a necessary condition, not a sufficient one: a blocker whose premise still holds here may have been resolved in some other way that this test cannot see.",
    "rows": [
      {
        "blocker_type": "COMPONENT_DATASHEET_UNAVAILABLE",
        "mpn": "T-MOTOR FLAME 60A 12S",
        "premise_still_holds": true,
        "wanted_for": "the ESC named in the MN5008 KV170 'ESC Recommendation' field"
      },
      {
        "blocker_type": "COMPONENT_DATASHEET_UNAVAILABLE",
        "contradicted_by": {
          "catalogue_part_id": "PROP1..PROP6",
          "grounded_spec_count": 7,
          "mpn": "P18*6.1 CF Polish",
          "source_ids": [
            "tmotor_p18x61"
          ],
          "spec_keys": [
            "model",
            "blade_mass_kg",
            "thrust_limit_kgf",
            "ambient_temp_range",
            "optimum_rpm_range",
            "blade_count",
            "material"
          ]
        },
        "mpn": "T-MOTOR P18*6.1 CF",
        "premise_still_holds": false,
        "reading": "The blocker says this part could not be grounded, and the catalogue it is declared in now carries it as 'PROP1..PROP6' with 7 verified specs. The blocker is stale.",
        "wanted_for": "a more efficient propeller: its bench row gives 233.7 W per rotor at the 12.2 kg hover point against 250.0 W for the P17*5.8"
      },
      {
        "blocker_type": "FUSE_DATASHEET_UNAVAILABLE",
        "mpn": "melting fuse with a published I2t / time-current curve (Littelfuse 298 MEGA, KLKD, Eaton ANL, Schurter)",
        "premise_still_holds": true,
        "wanted_for": "classical main-bus fuse/breaker coordination"
      },
      {
        "blocker_type": "WIRE_RESISTANCE_DATA_UNAVAILABLE",
        "mpn": "conductor resistance per unit length for the selected wire (TE/Raychem SPEC 44 slash sheets, Alpha Wire, LAPP)",
        "premise_still_holds": true,
        "wanted_for": "the R_hot term of the SRS 6.11 voltage-drop calculation"
      }
    ]
  }
}
