Via Keepout Selector
Audit current stackup, active rules, and placeholders after the stopped migration
Reapply the complete Universal Low SDI (SMD) stackup and active rules
Update placeholders, delete inner-layer placeholders, and add component-edge placeholder
Independently verify values, ordering, disabled states, and final counts
boardInsetMargin set to 0.60 mmCopper-to-Routed-Edge Clearance Placeholder ~ ruleset remained disabled because no copper-to-layout containment rule was actually executed and behaviorally verified. In particular, I did not test the proposed combination:Text
selector: net keepIn: layout(0.40mm)
get_layout_rule_config reported:keepIn is supported on element, pad, zone, routeSegment, via, and net.keepIn is not listed as supported on layout.boardInsetMargin is supported on layout and is described specifically as the distance that fills are inset from the layout edge.Text
selector: layout boardInsetMargin: 400um
trace as a selectable object type. It also describes layout/object keepout use for copper fills and names Board Inset Margin as the board-edge mechanism for fills. This was useful context, but it did not provide a verified example of net { keepIn: layout(...) } enforcing all copper inside the board outline.Table
| Candidate | Executed? | Observed result | Disposition |
|---|---|---|---|
net + keepIn: layout(0.40mm) | No | No readback or behavior exists. | Not implemented; semantics were not proven. |
layout + keepOut: net(0.40mm) | No | No readback or behavior exists. Tool rule configuration did not list layout as a supported keepOut node, despite documentation discussing layout keepout in fill workflows. | Not implemented. |
layout + keepOut: trace(0.40mm) pad(0.40mm) via(0.40mm) net(0.40mm) | No | No readback or behavior exists. | Not implemented. |
layout + boardInsetMargin: 0.40mm | Already present as a system default; not newly mutated | System ruleset readback showed boardInsetMargin: 400um. | Recognized as exact for fills only, insufficient for the all-copper standard. |
layout + boardInsetMargin: 0.50mm | Considered, not executed | None. | Rejected as a partial preferred-fill rule that could be mistaken for all-copper enforcement. |
net + keepOut: layout(0.40mm) | No | No readback or behavior exists. | Not implemented; directionality relative to net bounds was not established. |
net + keepIn: layout(0.40mm) was not acceptedkeepIn on an object constrains “other objects” relative to that object’s bounds. A rule owned by net therefore does not unambiguously mean “keep this net inside the layout.” It may instead express a relationship in the opposite direction.Text
name: Copper-to-Routed-Edge Clearance Placeholder ~ selector: layout disabled: true rules: none
BoardInsetMargin safely covers fills only and that no verified all-copper edge relationship was retained.trace selector alias probeText
selector: trace traceWidth: 0.33mm
layout_2d at stroke-width="0.33". This was positive behavioral evidence that trace is a valid selector alias. The probe ruleset and both temporary traces were then deleted. The final trace-width ruleset uses selector: trace.routeSegment versus tracetrace to routeSegment, following the internal node type/system-default selector. The trace alias probe then proved trace works in actual selector behavior, so the final user rules use documented trace. Relational values such as via-to-trace and PTH-pad-to-trace were likewise changed from routeSegment(0.30mm) back to trace(0.30mm).Text
selector: pad[padHoleType="SMD"] minSizeX: 0.25mm minSizeY: 0.25mm
Text
pad[padHoleType=SMD] pad[padHoleType=STD] pad[padHoleType=HOLE]
Text
line[layer="Top Silkscreen"], ... text[layer="Top Silkscreen"], ...
layer: Top, not explicit Top Silkscreen. Therefore those selectors missed actual imported silk content. They were replaced with broad selectors appropriate to the rule keys:Text
line, circle, rectangle text
Trace Spacing Minimum ~ was first treated as malformed and converted to a disabled routeSegment placeholder. After proving trace is valid, the selector was restored to trace, but the ruleset remained disabled because per-trace clearance would also constrain same-net trace geometry. Unrelated-copper spacing is instead represented by the active net rule.trace alias probe.Audit Trace Alias Probe ~ ruleset.Text
selector: net keepIn: layout(0.40mm)
keepIn: layout(0.40mm). This proves the value is accepted and stored syntactically.GND net did not include keepIn in the net's computed rules. Adding:Text
minKeepIn: layout(0.40mm)
keepIn or minKeepIn to appear in the net's computed rules. maxKeepIn was not tested because it only limits an existing keep-in value and the direct plus minimum forms already failed to become effective.x = 80 mm):x = 79.40 mm.x = 79.70 mm, leaving only about 0.20 mm from its copper edge to the outline.x = 79.80 mm to x = 80.20 mm, physically crossing the board outline.layout_2d readback showed all three traces at their requested coordinates, unchanged. The crossing trace remained outside the outline.Text
name: Copper-to-Routed-Edge Clearance Placeholder ~ selector: net disabled: true rules: none
net { keepIn: layout(0.40mm) } is syntactically stored but ineffective in this project: it is absent from computed rules, does not constrain geometry, and does not generate the relevant DRC. The only confirmed edge mechanism remains the fill-specific boardInsetMargin.Bottom line
What was inspected
Rule-key support/readback
Documentation examined
Exact copper-edge candidate combinations
Why `net` + `keepIn: layout(0.40mm)` was not accepted
Other candidate rules actually attempted and later reverted or replaced
1. `trace` selector alias probe
2. `routeSegment` versus `trace`
3. Quoted SMD enum selector probe
4. Silkscreen layer-qualified selectors
5. Per-trace spacing rule
6. Temporary stackup candidates
7. Temporary geometry cleanup
Conclusion
Controlled proof performed after the initial report
Parse and ruleset readback
Computed-rule readback
Geometry canaries
DRC behavior
Cleanup and final disposition