skill
PCB Design Rules
Public Made by Adomby adom
Canonical PCB fab design rules (DRC) for every popular vendor: one JSON record per vendor, process and layer count, with generated Fusion/EAGLE .dru and .edru, KiCad .kicad_dru plus board-setup JSON, Altium .RUL exports, and a human comparison table. Every number cites the vendor's own capabilities page and the date it was read.
← Commit history
Specify 3rdPartyFab reference/value sizes and face-aware mechanical silkscreen policy
6 files changed
+150−6
SKILL.md+8@@ -62,3 +62,11 @@ The page.json `discovery_triggers` registry entry reads: ## 3rdPartyFab copper selection Use **1 oz finished surface copper** as standard. **2 oz finished surface copper is available on request**; make that request explicit in the build specification. Read `docs/3rdpartyfab-finished-copper.md` and the record's `finishedCopper` metadata. Do not interpret these surface weights as barrel plating or inner-layer specifications, and do not reuse 1 oz trace/spacing limits for 2 oz without confirmation.++## 3rdPartyFab silkscreen authoring++Read `silkscreenPolicy` in the current vendor record (also carried by the KiCad board-setup JSON). Component names/reference designators are **0.8 mm** high; component values are **0.3 mm** high. Both are required, grouped beside their component, on the fitted face. Preserve electrical values; do not silently omit, shrink or scatter labels to make a placement check pass. Report unresolved placement explicitly.++Label mechanical holes with the screw thread size and specified length. Put bracket boundaries on the mounting face; put head/washer clearance and tool-access marks on their respective faces. These marks are documentation, not substitutes for copper/component keepouts. Check actual body, pad/mask, hole, edge, text and leader geometry on both faces, and assembled visibility. Mirror bottom lettering correctly. Never use filled drill symbols as printable artwork: disable drill marks when exporting silkscreen textures (`kicad-cli pcb export svg --drill-shape-opt 0`).++These sizes are the user's authoring policy, not a verified minimum printing capability. Do not invent fabrication stroke or spacing limits where the canonical record still says null.
docs/3rdpartyfab-silkscreen.mdadded+8@@ -0,0 +1,8 @@+# 3rdPartyFab silkscreen authoring policy+++Read `silkscreenPolicy` in the current vendor record (also carried by the KiCad board-setup JSON). Component names/reference designators are **0.8 mm** high; component values are **0.3 mm** high. Both are required, grouped beside their component, on the fitted face. Preserve electrical values; do not silently omit, shrink or scatter labels to make a placement check pass. Report unresolved placement explicitly.++Label mechanical holes with the screw thread size and specified length. Put bracket boundaries on the mounting face; put head/washer clearance and tool-access marks on their respective faces. These marks are documentation, not substitutes for copper/component keepouts. Check actual body, pad/mask, hole, edge, text and leader geometry on both faces, and assembled visibility. Mirror bottom lettering correctly. Never use filled drill symbols as printable artwork: disable drill marks when exporting silkscreen textures (`kicad-cli pcb export svg --drill-shape-opt 0`).++These sizes are the user's authoring policy, not a verified minimum printing capability. Do not invent fabrication stroke or spacing limits where the canonical record still says null.
kicad/adom-3rdpartyfab-2L.board-setup.json+34−3@@ -13,8 +13,7 @@ "annularRingViaMm": 0.1, "annularRingPadMm": 0.18, "silkMinLineWidthMm": null,- "maskExpansionMm": 0.038,- "silkMinTextHeightMm": 0.5+ "maskExpansionMm": 0.038 }, "notes": "Apply as Board Setup, Constraints. The matching .kicad_dru file carries the same limits as custom rules; the two are redundant on purpose so both the GUI constraints and kicad-cli DRC enforce them.", "sources": [@@ -28,5 +27,37 @@ "dateRead": "2026-10-12", "kind": "user-confirmed-capability" }- ]+ ],+ "silkscreenPolicy": {+ "schemaVersion": 1,+ "kind": "user-requested-authoring-policy",+ "source": {+ "date": "2026-10-15",+ "description": "User requested 0.8 mm component names, 0.3 mm values, screw sizes, bracket edges and screw clearances on appropriate faces"+ },+ "referenceHeightMm": 0.8,+ "valueHeightMm": 0.3,+ "referenceRequired": true,+ "valueRequired": true,+ "referenceMeaning": "reference designator, e.g. Q1, R12, J9",+ "preserveElectricalValue": true,+ "groupReferenceAndValue": true,+ "allowSilentOmissionOrShrinking": false,+ "mechanical": {+ "screwSizeRequired": true,+ "screwLengthWhenSpecified": true,+ "bracketOutlineOnMountingFace": true,+ "headWasherClearanceOnBearingFace": true,+ "toolAccessOutlineOnAccessFace": true,+ "avoidHolesMaskOpeningsAndFittedBodies": true+ },+ "validation": [+ "native text dimensions",+ "whole-board reference/value inventory",+ "both-face mask, body, hole, outline and text collision review",+ "assembled visibility and association",+ "silkscreen GLB export with drill markers disabled"+ ],+ "manufacturingLimitStatus": "Authoring requirement only; does not establish minimum printable stroke, spacing or legibility. Existing unknown silkLineWidth/silkToCopper remain null."+ } }
kicad/adom-3rdpartyfab-4L.board-setup.json+34−3@@ -13,8 +13,7 @@ "annularRingViaMm": 0.1, "annularRingPadMm": 0.18, "silkMinLineWidthMm": null,- "maskExpansionMm": 0.038,- "silkMinTextHeightMm": 0.5+ "maskExpansionMm": 0.038 }, "notes": "Apply as Board Setup, Constraints. The matching .kicad_dru file carries the same limits as custom rules; the two are redundant on purpose so both the GUI constraints and kicad-cli DRC enforce them.", "sources": [@@ -28,5 +27,37 @@ "dateRead": "2026-10-12", "kind": "user-confirmed-capability" }- ]+ ],+ "silkscreenPolicy": {+ "schemaVersion": 1,+ "kind": "user-requested-authoring-policy",+ "source": {+ "date": "2026-10-15",+ "description": "User requested 0.8 mm component names, 0.3 mm values, screw sizes, bracket edges and screw clearances on appropriate faces"+ },+ "referenceHeightMm": 0.8,+ "valueHeightMm": 0.3,+ "referenceRequired": true,+ "valueRequired": true,+ "referenceMeaning": "reference designator, e.g. Q1, R12, J9",+ "preserveElectricalValue": true,+ "groupReferenceAndValue": true,+ "allowSilentOmissionOrShrinking": false,+ "mechanical": {+ "screwSizeRequired": true,+ "screwLengthWhenSpecified": true,+ "bracketOutlineOnMountingFace": true,+ "headWasherClearanceOnBearingFace": true,+ "toolAccessOutlineOnAccessFace": true,+ "avoidHolesMaskOpeningsAndFittedBodies": true+ },+ "validation": [+ "native text dimensions",+ "whole-board reference/value inventory",+ "both-face mask, body, hole, outline and text collision review",+ "assembled visibility and association",+ "silkscreen GLB export with drill markers disabled"+ ],+ "manufacturingLimitStatus": "Authoring requirement only; does not establish minimum printable stroke, spacing or legibility. Existing unknown silkLineWidth/silkToCopper remain null."+ } }
rules/records/adom-3rdpartyfab.json+64@@ -94,6 +94,38 @@ "minimumBarrelPlatingMm": null, "confirmedBy": "John Lauer", "confirmedOn": "2026-10-12"+ },+ "silkscreenPolicy": {+ "schemaVersion": 1,+ "kind": "user-requested-authoring-policy",+ "source": {+ "date": "2026-10-15",+ "description": "User requested 0.8 mm component names, 0.3 mm values, screw sizes, bracket edges and screw clearances on appropriate faces"+ },+ "referenceHeightMm": 0.8,+ "valueHeightMm": 0.3,+ "referenceRequired": true,+ "valueRequired": true,+ "referenceMeaning": "reference designator, e.g. Q1, R12, J9",+ "preserveElectricalValue": true,+ "groupReferenceAndValue": true,+ "allowSilentOmissionOrShrinking": false,+ "mechanical": {+ "screwSizeRequired": true,+ "screwLengthWhenSpecified": true,+ "bracketOutlineOnMountingFace": true,+ "headWasherClearanceOnBearingFace": true,+ "toolAccessOutlineOnAccessFace": true,+ "avoidHolesMaskOpeningsAndFittedBodies": true+ },+ "validation": [+ "native text dimensions",+ "whole-board reference/value inventory",+ "both-face mask, body, hole, outline and text collision review",+ "assembled visibility and association",+ "silkscreen GLB export with drill markers disabled"+ ],+ "manufacturingLimitStatus": "Authoring requirement only; does not establish minimum printable stroke, spacing or legibility. Existing unknown silkLineWidth/silkToCopper remain null." } }, {@@ -187,6 +219,38 @@ "minimumBarrelPlatingMm": null, "confirmedBy": "John Lauer", "confirmedOn": "2026-10-12"+ },+ "silkscreenPolicy": {+ "schemaVersion": 1,+ "kind": "user-requested-authoring-policy",+ "source": {+ "date": "2026-10-15",+ "description": "User requested 0.8 mm component names, 0.3 mm values, screw sizes, bracket edges and screw clearances on appropriate faces"+ },+ "referenceHeightMm": 0.8,+ "valueHeightMm": 0.3,+ "referenceRequired": true,+ "valueRequired": true,+ "referenceMeaning": "reference designator, e.g. Q1, R12, J9",+ "preserveElectricalValue": true,+ "groupReferenceAndValue": true,+ "allowSilentOmissionOrShrinking": false,+ "mechanical": {+ "screwSizeRequired": true,+ "screwLengthWhenSpecified": true,+ "bracketOutlineOnMountingFace": true,+ "headWasherClearanceOnBearingFace": true,+ "toolAccessOutlineOnAccessFace": true,+ "avoidHolesMaskOpeningsAndFittedBodies": true+ },+ "validation": [+ "native text dimensions",+ "whole-board reference/value inventory",+ "both-face mask, body, hole, outline and text collision review",+ "assembled visibility and association",+ "silkscreen GLB export with drill markers disabled"+ ],+ "manufacturingLimitStatus": "Authoring requirement only; does not establish minimum printable stroke, spacing or legibility. Existing unknown silkLineWidth/silkToCopper remain null." } } ]
tools/generate.py+2@@ -441,6 +441,8 @@ def gen_kicad_board_setup(vendor, rec): "notes": "Apply as Board Setup, Constraints. The matching .kicad_dru file carries the same limits as custom rules; the two are redundant on purpose so both the GUI constraints and kicad-cli DRC enforce them.", "sources": rec.get("sources", []), }+ if rec.get("silkscreenPolicy"):+ setup["silkscreenPolicy"] = rec["silkscreenPolicy"] return json.dumps(setup, indent=2) + "\n"