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-01 — computed from the item itself, not typed.
Built 2026-09-01 (Aristide 'd' — brick D of the approved execution plan). Jordan's Add-Toolpath walkthrough (2026-08-28) names identical-feature propagation, 'even if they were nested already': mode ALL = manipulate ONE feature and 'the rest all followed suit'; mode SINGLE FEATURE = today's per-contour edit.
Engine — the ONE source of 'identical': every contour record in stats["contours"] now carries identical = the ids of its congruent twins, computed by emit._congruence_sig from the contour's own prims: invariant under translation and rotation (multiset of line lengths / arc radius+sweep, plus enclosed area, at 0.001 in — the real-work healing standard; emit's 4-decimal format would split twins on healing scatter), and a closed single-centre all-arc contour signatures as a CIRCLE on radius+area alone, so two identical holes healed with different arc splits still group. Record only — grouping changes no move and no byte of NC; it rides through tooling_doc into the review payload, so every lens reads the same groups and none re-derives congruence its own way.
UI — one channel: the contour panel shows 'identical features: N more' (engine-sourced) and, only when twins exist, an 'apply edits to: this feature / all N identical' toggle. EVERY override edit — tab size, lead length, start (typed, pick-on-canvas AND the brick-18 drag-handle drop), set or clear — runs through one function ovApply: in ALL mode the edit fans out to the recorded twins, each getting ITS OWN override entry bound to its own centroid (source:operator per feature), so the round trip stays per-feature and a nested post replicates the propagated set per placement exactly like any override — 'even if they were nested already' falls out of the architecture. A start propagates CENTROID-RELATIVE: every twin's forced start lands at the same spot on its own contour. The live drag judge builds its dragcheck set through the same ovApply, so the colour under the cursor is judged on exactly what the drop will record. Sequence never propagates — an order index cannot be shared; ALL mode states that limit on-screen.
Honest limits: congruence is judged on the prim multiset + area at 1-thou resolution — mirrored copies group with their mirror (same bag, same area) and a pathological equal-bag/equal-area pair would too; real parts don't produce one by accident, and the operator sees exactly which contours the group names before applying. Twin ids renumber with the cut order (they are ids, not identity — centroids are the identity key). Propagation applies at edit time to the features that exist then — it is not a standing subscription.
Proven: test_tooling_doc 31→37 controls (circles group across arc splits; squares group under translation; odd sizes and the outer stand alone; the fanned edit posts per-feature source:operator with outsiders untouched; grouping survives the override round trip judged by centroid) + app/verify_propagate.js live over the public URL (11 checks, real mouse, scratch sketch job — nav209 untouched): SINGLE touches one, ALL touches the group, start propagates to the same relative spot on every twin, clear clears the group, dragcheck parity byte-identical with the propagated set active. All twelve suites green.