Geometer bridge-entry disposition

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.

Decision

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.

Inventory: Python polygon-kernel operations

OperationModuleKernel used Port-scope classificationGeometer 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

Re-entry conditions

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:

  1. map the promoted operation to an existing Geometer capability;
  2. consume Geometer's generated, versioned TypeSpec request/result projections once promoted upstream — pin contract version and test vectors, publish no private duplicate contract here;
  3. add a parity-registry bridge-entry record naming operation, owner, upstream contract/version, execution modes, vectors, and resource budget;
  4. cover process version/ABI negotiation, executable discovery, timeouts and cancellation, crash/exit/stderr mapping, request/result limits, and deterministic error translation in the adapter design;
  5. keep the adapter in a sibling optional crate, never 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.