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-17 — computed from the item itself, not typed.
Built 2026-09-02 (Aristide 'Go'). 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 — so a part-list sheet posts in the PART-BY-PART form by construction: several unique shapes, no P9996/P9997 macros to drop, every placement's boundaries written in full.
ENGINE pl_post.py (docstring = the design record): zero drift on every cut — the whole sheet posts through ONE emit.write_gcode_macrob call per sheet (leads, scrap-side comp, Rev2 registers, slug tabs, micro-merge, chording, traverse routing = the same machinery every program runs); assemble() replicates every part's planned contour order into explicit per-feature sequence overrides — the brick-8 part-by-part mechanism — so each part FINISHES before the next (outer-last per part, never sheet-wide), placements in the pack's own fill order; ONE transform (pl_tool.world / split_parts.transform_prims — the pack's placement contract) so the posted copy is the placed copy. plans_match() = the stale gate: each part re-planned at post time must match the lean plan the pack reserved envelopes from at 4-decimal resolution — a part edited after the pack REFUSES to post in honest words (pack again; the nest↔tooling loop, never a silent drift between what was reserved and what posts).
Per-part overrides join part-list plans (the brick-28 recorded limit): each referenced job's own tooling document (Manual Sort, tab size, lead length, a dragged start) is consumed by run_partnest's plan AND the post — lead_length/tab_width replicate verbatim per copy, a forced start transforms with the placement, the operator's feature order rides the plan order itself.
DEFECT CAUGHT AND FIXED IN THE BUILD (the concentric tie, live-verify catch): emit's nearest-centroid override binding could not split a CENTRED hole from its own outer (identical centroids — the recorded brick-18 tie); a full-sequence set stacked both features on one boundary and the audit fired red cut-after-severed-outer on the copies. Fixed in emit: candidates tied within 5 thou of the nearest centroid re-rank by the near point's distance to the contour GEOMETRY and each feature claims its own twin — non-tied bindings byte-identical, all 18 prior suites green. Second catch: partnest.json already carries 'post' as its MATERIAL key; the attached program doc now rides as post_doc (two meanings, one name — caught when the stale-drop check read the material string as a living post).
SERVER: POST /api/jobs/<id>/commonlinepost-pattern route /plpost (plain-400 refusals in engine words); one O-number per sheet from the shop sequence, EVERY sheet keeping its number across re-posts AND re-packs (job record pl_onums; _drop_plpost on list edit + re-pack); absolute sheet coordinates with G52X0Y0 (each part's bridge margin rides in the coordinates — the cl_post convention); audit = nc_warn.audit_and_inject vs the PLACED geometry, the pack's sheet-wide + per-part findings riding in the NC as ruled callouts; per-sheet tooling doc + slug report beside every NC; plpost.json + downloads plpost*.nc. UI: sheet-program rows in the Nest drawer (O-number ran+source, parts, boundaries, warnings in file, NC/tooling/slugs downloads), Post/Re-post buttons.
Proven: test_pl_post.py 26 NEW controls (transform, forced order, override replication, refusals verbatim, end-to-end emit + parse-back part-contiguity and per-part outer-last, the concentric tie) + verify_plpost.js 14 live checks over the public URL (2-sheet pack = 2 programs distinct numbers, served bytes, numbers kept both ways, stale gate verbatim, callouts in file, nav209 untouched); all 18 prior suites green.
Honest limits: parts run in the pack's fill order — nest-level click-in-order for part lists is a later brick; a tooling edit on a referenced part does not auto-drop the pack (no reverse index) — the stale gate catches it at post time; part-list DELIVERY (versioned set, packet, part map) is a later brick.
Form superseded 2026-09-17 (pin pl-post-subcall, Jordan's GO): the sheet now posts as a MAIN with G52 + M98P sub-program callouts, one sub per distinct part x orientation -- the fully-expanded one-call absolute form is the legacy shape (delivered programs stand and still audit). assemble() remains the placed-frame builder the audit judges against.