kerfmaster pin list · UI / workflow decisions
recordStates what the code does today. Auditable against the code — this is the only type that can go stale.
Content last changed 2026-09-15 — computed from the item itself, not typed.
ENGINE = the TL-1016 grouper, split_parts.part_groups (an outer boundary owns every contour it contains) — nothing re-implemented.
SERVER POST /api/jobs/<id>/split: geometry is the job's CURRENT frame (fresh heal + replayed manual edits + intake rotation — the one seam every consumer shares); each group becomes its OWN job riding the normal upload pipeline (heal, QC, listed on the Jobs home, pickable in part lists). Children keep the as-drawn orientation translated to origin only (part frames stay the operator's call, bricks 34/35), are born units-PINNED (healed prims are inches by construction — the sketch/STEP lesson, no units nag), and carry split_from. A lone sliver under split_parts.DEBRIS never becomes a job — counted in the record, never silent. Refusal ladder = plain 400 in honest words, nothing saved: single part, already split (names the living children), part list. The parent gets an ANNOTATION only (job.split) — no stage record, nothing drops.
UI: Split into parts button on the Geometry tab's Intake section; after the split the children list right there with open buttons.
Proven: test_split_door.py 13 controls + app/verify_split.js 11 live Playwright checks over the public URL (units modal dismissed like an operator, fresh page per phase; scratch fixtures removed). Real run same day: 7497 → 9 parts, 7498 → 5 parts, all 14 healed + QC done.
Honest limits: grouping is containment on the healed geometry — parts that touch or overlap group as one; the parent stays a normal job (delete children to split again).
ADD-ALL-SPLIT-PARTS ROWS 2026-09-14 (Jordan: adding each component individually is the labor-intensive workflow we are trying to eliminate): the Part list tab offers an add-all-parts-from row naming each split file -- one click adds a draft row per split child (qty 1, natural part order, already-listed parts skipped never doubled, family option reads all-listed when complete). No per-part toolpath assignment exists to do: run_partnest already plans every referenced part from the list's machine x material (opening a part is only for overrides) -- stated on-screen beside the button. Client-only app.js, live on refresh; verify_plsplit.js 11 live Playwright checks (scratch list job; the real 7497/7498 children referenced read-only, draft rows never saved).