← back to pin list

Brick 28: toolpath-after-nest for part lists — lead/pierce envelopes reserved in the pack

kerfmaster pin list · The interface — recorded intent (build later)

recordStates what the code does today. Auditable against the code — this is the only type that can go stale.

Content last changed 2026-09-02 — computed from the item itself, not typed.

Built 2026-09-02 (Aristide 'go with what you have'). The governing ruling (def-true-vs-part-by-part-nesting, Jordan 2026-08-27): part-by-part nesting nests the geometry FIRST and establishes the toolpath AFTER. part_list_nest's own docstring already named the mechanism — pre-plan a lead per part so the pack can RESERVE pierce room ('lpts') — but run_partnest never passed them because no toolpath existed. Brick 28 closes the loop.

ENGINE pl_tool.py (docstring = the design record): lead_points(plan) samples every planned boundary's pierce point + lead segment into the point cloud the pack's slide and audit consume as lpts; judge(sheets, standoff) is the SHEET-WIDE surface the lone-part planner cannot be — every placed pierce measured for clear air against every NEIGHBOUR placement's true outline (yellow under the standoff), every lead checked for running into a neighbour's finished metal (red). Separate arithmetic from the pack's own refusing audit (the 3A76 lesson): a clean reserved pack judged clean is two arithmetics agreeing. A pierce beside its OWN part stays the per-part check's finding; sheets never interact. Findings say the operator's move in words — shorten or re-aim the lead and re-pack (the nest<->tooling loop; the operator-moves ruling — never an automatic shortening).

SERVER run_partnest: each DISTINCT referenced part is planned by the SAME engine Part review runs (rules.check_drag over the Rev2 tooling row — lead aim, scrap side, tabs, safety order; a blank cell refuses in the table's words); its lpts ride into the pack so the slide reserves the envelope and the pack audit holds lead-to-neighbour clearance at max(standoff, pair gap); the placed result is then judged sheet-wide. partnest.json carries toolpath: plans per part (pierce+lead_end per boundary, source frame), part_findings (apply to EVERY copy), sheet_findings. Stage flagged on any finding, warn never block; the stale rule comes free (an edited list drops the pack, toolpath with it).

UI: the Nest canvas draws every placement's dashed leads + pierce dots transformed by its own placement — what the pack reserved room for is what draws; the drawer's 'toolpath after nest' block shows per-part findings ('every copy'), the sheet-wide judge verdict, and the honest note. Proven: test_pl_tool.py 18 NEW controls (incl. 'reserving the lead envelope honestly costs sheet space' and 'reserved pack judges clean — two arithmetics agree') + verify_pltool.js 13 live checks over the public URL (envelope reserved with measured lead slack, judge clean, small-hole part flags the stage warn-never-block, stale rule, drawer + canvas, nav209 untouched); all 17 prior suites green.

Honest limits on-screen: posting the part-by-part sheet program is a later brick; the judge measures on sampled outlines (~0.05) — a flag surface, the pack audit stays the refusing gate; per-part overrides (Manual Sort, tab size, drag) not consumed on part-list plans yet — they arrive with the posting brick.