Status: proposal. This document resolves the conditional Geometer
bridge-entry gate (plan step geometer-bridge-entry, strategy
section 7.6) by explicit deferral. It records the required
inventory of Python polygon-kernel operations, maps each to its port-scope
classification, and states the concrete conditions that reopen the gate as
a promotion.
No bridge is implemented now. No currently promoted native operation
requires a generalized planar boolean/offset/cleanup/triangulation kernel.
The one geometry workload closed during the render-cache work — text
glyph hole fracture and Clipper2-compatible simplification — was
delivered as the small tested native module
src/rs/kicad-monkey-core/src/text_topology.rs, which is the
outcome section 7.6 explicitly allows when no boolean kernel is needed.
The parity registry records the deferral as surface
geometry.planar_kernel_bridge with disposition
deferred_geometer_service; the native release claims no parity
for a generic planar kernel surface.
| Operation | Module | Kernel used | Port-scope classification | Geometer capability if promoted |
|---|---|---|---|---|
| Zone refill: boolean add/subtract/intersect/xor, inflate/deflate, morphological opening for minimum-width enforcement, thermal reliefs, clearance holes | kicad_zone_filler.py, kicad_zone_utils.py |
pyclipr (Clipper2 binding; optional import, not a
declared dependency, and no repo consumer or test imports either
module) |
Zone refill/recalculation: deferred — the port consumes
authored filled_polygon records
(zone_filled_polygon_to_op) |
Batch boolean + offset; the main workload that would justify the bridge if refill is ever promoted |
Knockout text from render caches (compound polygon: margin
rectangle plus glyph contours under evenodd) |
kicad_pcb_to_ir.py
_apply_knockout_to_text_op |
None — bbox arithmetic and contour coalescing only | Promoted plotter-IR path | None |
| Synthetic knockout for text boxes without a render cache: union of stroke-segment polygons, simplify, border-rectangle round-join buffer | kicad_pcb_to_ir.py
_apply_synthetic_knockout_to_text_box_op |
Shapely unary_union/buffer/simplify
behind a guarded import (returns the op unchanged without Shapely) |
Fallback path; native disposition decided at
phase5-plotter-ir entry |
Union + offset (small, bounded input) |
| Custom pad acceptance rings: per-ring width buffer, anchor-shape union, solder-mask margin inflate | kicad_ir_to_svg.py _custom_pad_rings,
_custom_pad_cli_rings, _custom_pad_anchor_geometry |
Shapely buffer/unary_union behind guarded
imports with ring fallbacks |
SVG acceptance-rendering path; native disposition decided at
phase5-plotter-ir entry |
Union + offset (small, bounded input) |
| Convex-hull footprint filters and related helpers | kicad_filter_footprint.py |
Shapely | Python-only/deferred per the port-scope table | Not applicable |
| Text glyph hole fracture and Clipper2-compatible simplify for render caches | kicad_render_cache.py |
None — ported natively
(text_topology.rs, closed under
render-cache-parity with full repo-corpus closure pinned
by rack L3_021) |
Promoted and closed | None |
| Mesh loading, STEP handling, debug viewers | Trimesh-based helpers | Trimesh | Python-only/deferred per the port-scope table | Not applicable |
The gate reopens as a promotion when a promoted operation actually needs
a generic kernel — the expected candidates are the two Shapely
touchpoints above if phase5-plotter-ir promotes them, or zone
refill if it is ever reclassified. Promotion then follows section 7.6 in
full before any bridge work:
kicad-monkey-core, with board/net/render policy in the
caller.Small bounded KiCad-specific geometry (curve tessellation, shape conversion, the existing text topology module) remains in focused native modules and does not constitute kernel promotion.