kerfmaster pin list ยท UI / workflow decisions
rulingA decision by Aristide or Jordan. True because it was decided; it can be superseded, but it cannot be stale.
Content last changed 2026-09-18 โ computed from the item itself, not typed.
His five answers, recorded verbatim in substance:
The hierarchy is the one the data already carries: sheet > part > feature-with-its-children (containment -- the split door's own part_groups grouper: an outer owns what it contains, the A owns its counter) > single contour. Sits beside pl-nest-hand-editor -- the drill-down's part level on the nest IS that editor's drag; one gesture system, never two.
Commissioned, no code yet -- build real, iterate in their hands (the grouped-upload-tray precedent). Multi-session build expected: (a) isolation mode + dim + breadcrumb + move/rotate/delete on the Geometry tab, (b) the same on nest canvases, (c) the identical-shapes confirm modal + this-one-only variant fork.
SESSION 1 BUILT 2026-09-15 (Aristide 'go'): isolation mode on the Geometry tab, live. ENGINE heal_edit: move_chain / rotate_chain -- TRUE geometry edits, point-addressed like delete (0.25 reach, a replay whose chain left the geometry skips in the refusal's own words), arc radii rigid under rotation; the report row carries BOTH fidelity exemptions (removed_prims = the old spot's dead ink, added_prims = the moved copy) so the honest measure holds; refusal ladder verbatim (zero move / zero rotation / junk numbers / out of reach). SERVER: the fidelity measure treats moved ink as dead by DECLARATION -- a circle moved by less than its own diameter crosses its old spot, and the no-counterpart test (drop_duplicates' kept-twin guard) read the near-band overlap as a false-looking FAIL; the moved output copy is itself exempt, so the unconditional source-side exemption can never orphan an output point (caught by control 7, fixed same commit). GET /api/jobs/<id>/isogroups = the drill structure, read-only by construction (dragcheck pattern): chains + smallest-enclosing containment parent (the plate owns the A, the A owns its counter -- the split door's own idea), computed on the same edited prims every stage consumes; part-list refuses in honest words. UI (Geometry tab): double-click drills part > feature-with-children > single contour (clicking the A's counter at part level isolates the whole A first -- the Illustrator ladder; the part outer itself goes straight to contour); everything outside the level dims (source layer 0.12, healed 0.15), breadcrumb bar names the levels and clicks back out, Escape / double-click empty steps out one; DRAG moves the isolated set as one unit (draft under the cursor, the drop records one move_chain per chain through the standing /healedits door), typed-angle Rotate about the set's own centre, Delete key = recorded delete per chain; every edit lands on the Heal/QC panel's recorded list, removable per row, standing stale rule (downstream drops, O-numbers kept); isolation RE-ANCHORS by point after the re-heal (the moved level stays isolated at its new spot). Honest limit ON the bar: edits apply to this one only -- the apply-to-all-identical modal is session (c). Proven: test_isoedit.py 18 NEW engine controls + test_isoserver.py 17 NEW server e2e controls + app/verify_iso.js 15 live real-mouse Playwright checks over the public URL (scratch fixtures removed); neighbour suites green (healedit 70 / healadd 13 / healedit_noop 8 / split_door 13 / sketch 21 / dragcheck 15). Sessions (b) nest canvases + (c) identical-shapes modal/variant fork remain.
SESSION (b) BUILT 2026-09-15 (Aristide 'Go for 2'): the drill-down lands on the NEST canvases, merged with pl-nest-hand-editor as ONE gesture system -- on the part-list nest, double-click isolates a placement (dim + breadcrumb + Escape) and the part level IS the hand editor's drag (move/cross-sheet/Alt-copy/Delete/typed-angle rotate, Apply saves judged warn-never-block through the new /plhand door); double-click the isolated copy again drills into the part's own job, where the session-(a) geometry isolation continues -- the full ladder sheet > part > feature > contour across two screens, the back chip returning. On the TRUE nest, double-click a placement enters the standing manual-nest-editor with that placement selected in single-part mode (its own Apply/Escape language). Details + proof on pin pl-nest-hand-editor. Session (c) remains: the apply-to-all-identical confirm modal + this-one-only variant fork on a nest.
SESSION (c1) BUILT 2026-09-15 (Aristide 'Go'): the APPLY-TO-ALL-IDENTICAL confirm modal, edit-first-then-confirm per answer 1. GET /isogroups now carries per-chain congruence group ids via emit._congruence_sig -- the ONE identical-features arithmetic (brick-20's grouper), translation/rotation-invariant at the 0.001 standard, so the modal and the tooling panel's twin groups can never disagree (a 45-rotated square groups with its axis twin; mirrored copies group with their mirror, the standing recorded limit). After a move / typed-angle rotate / Delete on an isolated feature or contour whose shape has twins (feature level matches the parent's sig AND the children's sig multiset -- two identical rings twin, a ring and a lone circle do not), the modal opens naming the count: All N identical fans the edit -- one point-addressed op per twin through the standing /healedits door, each copy its own recorded row removable in the Heal/QC panel; a fanned rotation turns each twin about its OWN centre (the brick-20 centroid-relative rule), moves share the delta, deletes take every twin. This one only = the session-(a) behavior; Escape answers this-one-only; a UNIQUE shape edits with NO modal (never a nag). Proven: test_isoident.py 12 NEW server controls + verify_isoident.js 9 live real-mouse checks over the public URL (modal words verbatim, all-3 fan lands every copy, one-only leaves twins standing, Escape-declined delete, no-modal-on-unique, fresh-page replay; fixture removed); neighbours green (isoserver 17 / isoedit 18 / healedit 70 / healadd 13 / healedit_noop 8 / sketch 21 / split_door 13) and verify_iso 15 re-run green. SESSION (c2) BUILT 2026-09-15 (Aristide 'Go'; the LAST session -- the whole commissioned ruling is now live): THIS-ONE-ONLY ON A NEST = the variant-part fork. POST /api/jobs/<listid>/plvariant {sheet, index, edits}: the referenced part FORKS into a VARIANT JOB -- source.dxf copied with the original's saved edit list + the new ops (units statement, rotation force, tooling overrides, customer/group filing all ride; split markers stay behind), pipeline run, strict edit pre-validation on the original's current frame so a refused edit answers in heal_edit's own words with NOTHING created (plain-400 ladder: not a part list / no pack / bad address / malformed edits). The variant rides the part list as a QTY-0 ROW -- Jordan's own 'listed but excluded' semantics -- so every consumer that rebuilds from rows (_pl_build: plhand, plspread, re-pack) knows the part while a re-pack places no uninvited copies; the ONE placement repoints (x/y/rot AND its sequence slot unchanged -- a clicked order survives, proven), asked 0 recorded beside filled 1, bridge band carried; the layout re-judges (judge_pairs larger-governs + the sheet-wide lead judge) warn never block; posted sheet programs drop with every O-number kept, deliveries mark replanned; a re-pack STOWS the variant layout under hand_saved with its variants record -- never silent; the drawer names every fork (VARIANT parts block). CLIENT: the placement drill (session b) stashes the placement address on the back chip; after a move/rotate/Delete in the part job (twin fan resolved first), a part placed N>1 times asks 'all N placements / Only this placement (variant part)' -- Escape = all (forking is never the accidental outcome); the fork navigates to the variant so the edit stays on screen, back chip intact; a dirty hand draft carries no address (edits then reach every copy, stated in code). Proven: test_plvariant.py 23 NEW controls (refusal ladder verbatim + nothing-created byte-check, repoint exact, geometry differs by exactly the edit, posted NC cuts the variant at its placement, second fork, numbers kept, sequence survives, re-pack stow) + verify_plvariant.js live real-mouse checks over the public URL; neighbours green (plhand 25 / pl_seq 27 / pl_spread 32 / pl_post 26 / pl_deliver 27 / pl_consolidate 13 / isoserver 17 / isoident 12). Honest limits: the fork rides the ISOLATION gestures (a Heal/QC-panel edit in a part job still edits the part itself -- every placement); the variant is a full job (set its qty on the list to cut more of it); mirrored-twin grouping limit stands.
EXCEL ENTRY ON THE BAR FIELDS (Jordan, 2026-09-18 -- 'once I click on a field to modify it, it should already highlight the text, so I can just type in the new values'; built same turn): the isolation bar's inputs (the drilled circle's diameter box, the rotate field) join the standing Excel-style entry seam (Jordan's 2026-09-06 sketch-labels ruling): clicking the field selects its whole seeded value so typing replaces it outright -- the one focusin handler now covers the bar's fields beside every unit input, the same one-mouseup suppression keeps the selection the click just made. The right-click prompt path already pre-selects its seeded text (browser behavior), so the bar was the gap. Client-only (app.js); verify_setsize.js grows two checks (click selects the whole value, typing replaces with no backspacing) -- 13/13.