← back to pin list

Start ANCHOR constraint -- the customer's exact lead-in spot as a typed RULE (distance from a named corner), re-resolved on every plan; plus drag-handle magnets

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-17 — computed from the item itself, not typed.

THE RULE, NEVER A FROZEN POINT: per-feature override start_anchor = {anchor (a clicked corner, snapped to the contour's nearest true VERTEX), dist (inches walked along the true contour, arcs by arc length, mod perimeter), dir ('cw'/'ccw' as SEEN on screen -- emit._anchor_start reads the loop's own signed area so storage direction never flips the meaning), note (free text, e.g. 'customer requirement')}. Resolved in emit's override binding (the ONE seam every posting/planning surface runs through -- review, dragcheck, single post, nest post, part-list pack/post), so the .250 stays exactly .250 through re-heals, re-nests and re-packs. The rule OUTRANKS a plain start point when both ride in (the rule cannot go stale); the UI clears one when setting the other. Recorded in stats/tooling.json as overrides.start_anchor (part frame, 4-dec), overrides.start stays None, start.source = operator; tooling_doc CONSUMABLE grew start_anchor in the same commit, overrides_from shifts the anchor by origin, unconsumed() stays empty. Frame arithmetic wired at all four rotation/transform sites: _pl_build's orientation rotation, run_plpost's contour subset + _rot_ov, pl_post.assemble's per-placement world transform. Safety unchanged: every gate still judges the forced spot, findings fire yellow/red and ride into the NC -- warn never block. UI: feature drawer 'start constraint' row -- 'exact distance from a corner...' arms a canvas pick (snaps to the feature's nearest corner, Esc cancels), then typed distance + cw/ccw + optional note; the record row shows dist/dir/corner/note with the operator tag. DRAG MAGNETS (brick-18 extension, same go): the live drag handle now pulls to the feature's landmarks -- corners, midpoint + quarter points of each edge between corners; a smooth loop (circle) offers quadrants + 45s like the start-default magnet; ~10 px pull at any zoom, Alt slides free, landmarks drawn while the drag is live, snapped state shown as a dashed ring. Derived client-side from the plan's own sampled as-cut path (dragMagnets cache, reset on every re-plan). Verified: test_start_anchor.py 16 controls (resolution both directions, vertex snap, perimeter wrap, dir validation, record shape, tooling-doc round trip, anchor-outranks-start, rotated-frame identity, server _feats_from typing) + 11 neighbour suites green; live on dev synca2 fixture -- POST with the rule lands start.ran exactly [20.0, 0.25], drawer rows render, magnets 4 corners + 12 pts on the rect.