← back to pin list9. Auto-close threshold
kerfmaster pin list · UI / workflow decisions
questionmixeddeferred d14Unresolved, waiting on Aristide or Jordan.
Content last changed 2026-08-02 — computed from the item itself, not typed.
Contract — QC stage
This contract is unresolved — the gate below is the thing waiting on an answer.
takes topology
makes healed-geometry
fails if A gap snapped shut that a human should have seen; a gap flagged that every file has.
Contract last changed 2026-08-06 — computed, not typed. Dated separately from the text above, so neither date can speak for the other.
1 open question blocks this pin
- Q16 Snap gaps at or under 0.5 thou, flag from there to 60 thou -- are those the right numbers, and should the snap stay silent?
Aristide, Jordan — The pin is the question.
⚠ Known defects
This item's subject has a known defect in the code. Source: cadmaster/defects.json → cadmaster/KNOWN_DEFECTS.md, not this page — the text below is generated from the register so the two can never disagree.
- D14 — The DXF parser reads BLOCK-definition geometry at block-local coordinates, ignores the INSERT that places it, and reports nothing skipped (DEFERRED)
dxf_io.parse walks the whole group-code stream and dispatches on six entity types -- POLYLINE, LWPOLYLINE, LINE, ARC, CIRCLE, SPLINE (dxf_io.py:113-244). It does not track SECTION, so a LINE sitting in the BLOCKS section is picked up exactly as if it were in ENTITIES, at its block-local coordinates. The INSERT that positions, scales and rotates that block is not an entity it knows, so it falls through the loop's trailing `i += 1` and is discarded. Every other entity type does the same: ELLIPSE, HATCH, SOLID, TEXT, MTEXT, DIMENSION, LEADER, 3DFACE, POINT, ATTRIB. There is no count of what was skipped and no warning.
Cost today: None measurable on any file cut so far -- every DXF we hold uses LWPOLYLINE only. The exposure is entirely on files we have not yet been given, which is precisely what the input survey exists to find out.
Verified: 2026-08-04. Probe written and run (cadmaster/probe_entities.py). CONTROL: the novi customer file parses unchanged at 91 polylines / 0 lines / 0 arcs / 0 circles / 0 splines, so this is a gap in coverage, not a regression. Entity list read off the code's own branches, not assumed. NOT YET RAISED WITH ARISTIDE OR JORDAN, and no fix attempted -- the phase rule says define first, and the first question is which of these entity types actually arrive from their customers, which only they can answer. DEFERRED by Jordan 2026-08-04, in his words: "Write it down as out of scope for now, but let's revisit this as part of our beta testing once the interface has been written." So this is closed to work and open on the record -- nobody should now go and fix it, and it must not be re-raised from the numbers. The revisit trigger is beta testing with real customer files arriving through an interface, which is also the only way to learn which of these entity types actually turn up. Written up for a reader on pin 14f, including a plainer explanation of the block/INSERT example, which Jordan reported was not clear the first time.
Customer contours often don’t quite meet — endpoints leave a tiny gap. cadmaster has to decide: silently snap it shut, or flag it for a human.
The rule
- Below the threshold — snap the endpoints together automatically (it’s noise / rounding).
- Above it — flag for review; a big gap might be a real missing segment, not slop.
What actually ships today
This is not waiting to be built. It is decided in code, and at far tighter numbers than the proposal this pin used to carry. On every heal, in this order:
dxf_io.stitch_open_polylines() joins polyline fragments whose ends are within 1.0e-4″ (0.1 thou) — dxf_io.py:321, called unconditionally from heal.py:691.heal.close_micro_gaps() inserts a connector line across any remaining gap up to 5.0e-4″ (0.5 thou) — heal.py:634, threshold EPS_DROP at heal.py:456, called unconditionally from heal.py:867.qc.GAP_FLAG = 0.060 (60 thou) is the flag side: two loose ends closer than that are reported as an open contour and circled on the board. QC never modifies geometry.
So the bracket actually in force is snap at or under 0.5 thou, flag from 0.5 thou to 60 thou. The proposal previously pinned here was ~1–10 thou; it was never what shipped.
Still open
- Are those the right numbers? They were chosen in code, not ruled on. The argument for 0.5 thou is that it sits well inside the 1 thou fit target.
- The snap is silent. Nothing tells the operator how many fragments were stitched or how many gaps were closed. The closed points are kept only so they can be excluded from jog measurement (
meta["micro_pts"], set at heal.py:867, used at build_board.py:58). Reporting it is QC step 2/3's job, and that is not built. - Whether the threshold should scale with the detected tolerance or stay a fixed constant. Every value overridable per item 11.