← back to pin list

Part-list <-> part-detail tooling SYNC -- Jordan's a/b/c go BUILT (2026-09-17): pack hands its plan to the child, child edits stale-flag the list, nest preview draws the true cut path; in-place envelope refresh 2026-09-18 -- the stale gate's remedy keeps the layout; refresh redraw fix 2026-09-19 -- the canvas caches rebuild on refresh, so the sheet draws the refreshed toolpath; auto nest update 2026-09-20 -- the stale layout updates itself on arrival, the operator is only stopped by a real decision

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

RULED AND BUILT same day (Jordan: 'a. Yes. b. Sounds good. c. Perfect. Go.'). (a) THE PACK HANDS ITS PLAN TO THE PART'S OWN JOB: run_review's finisher extracted into server._finish_review (tooling doc + source-frame review payload + stage record + derived-stage drops -- ONE finisher, the two doors cannot drift); the pack door's _pl_build(persist=) calls it per referenced part with the 0-deg plan, so opening a packed part shows EXACTLY the tooling the list packed with (material x machine from the LIST, the part's own overrides consumed and round-tripped). review.packed_from records provenance {list job, name, when}; the detail drawer states it and says an edit here flags the list. skip-if-same guard: an unchanged part is left untouched -- a plain re-pack never churns the children (substance compared: material/machine/plan/contours/findings). (b) STALE-FLAG + ONE-CLICK RE-PACK: the pack records tooling_fp per referenced part -- sha1 over the part's CONSUMABLE overrides (tooling_doc.overrides_from, floats at the 4-decimal ruled floor), exactly what rides into the plan, so exactly the stale signal; every partnest GET computes stale_parts LIVE (server._pl_stale_parts); the Nest drawer shows the flagged banner naming the parts with Pack again right on it (same honesty as the deliver tab's stale notice); plpost's plans_match refusal unchanged as the final gate. Old packs with no fingerprint honestly report nothing. (c) TRUE CUT PATH IN THE NEST PREVIEW: _pl_build's plan rows now carry segs -- the as-cut true-arc path (emit's plan_samples segs, TAB GAPS INCLUDED) rotated back to the part's base frame per orientation (server._rot_segs: points via _rot_pts, arc angles shifted, sweep direction untouched), so the placement transform that places the geometry places the toolpath; app.js plToolPath builds one Path2D per ref x orientation, stroked in the --toolpath role per placement, geometry line THINNED under it (0.7px vs 1.3) so a tab gap reads as a break; dashed leads + pierce dots ride on top; old packs without segs fall back to leads-only, stated in the drawer. plans_match stays on pierce/lead_end so pre-segs packs still post. VERIFIED: test_pl_sync.py 23 controls (handover, provenance, no-churn re-pack, segs per orientation, live stale flag, honest post refusal, re-pack consumes the edit, old-pack compatibility both ways); pl_post/pl_deliver/pl_spread/pl_seq/plhand/pl_subcall/partrotate/plan_display/dragcheck/start_defaults/warns/split_door suites green; live on dev: packed list -> child opens planned with packed_from note, child lead edit -> banner 'TOOLING CHANGED SINCE THIS PACK' on the list, zoomed canvas shows the 0.030 tab gap as a break at the lead landing. The undo cross-job scope question (pin global-undo) is STILL OPEN -- not answered by this go. IN-PLACE ENVELOPE REFRESH BUILT 2026-09-18 (Jordan: 'I did exactly as you asked and it undid my overrides from the Nest tab. Does this seem like a good workflow?' -- the one-click Pack-again-and-post destroyed his hand-tuned layout; Aristide: 'I see the issue, and it is a real one. But it is a logic issue, and you can resolve it. You understand the desired outcome. if you don't have questions, go ahead and fix.'): the stale gate's remedy no longer costs the operator's layout. NEW POST /api/jobs//plrefresh -- every placement stays exactly where the operator put it (hand layouts, spread work and sequence clicks live on the pack and survive untouched); each referenced part re-planned by the SAME engine the pack ran (_pl_build: current tooling overrides, start defaults, per orientation, ruling-a persist to the child jobs), fresh lead/pierce envelopes re-reserved at the placed positions, clearances re-checked by the pack's OWN refusing audit (pln._audit, separate arithmetic, the 3A76 lesson) plus the sheet-wide lead judge (warn never block). WHAT MOVED IS MEASURED: the refresh record names every drifted part in plans_match's own words ('bnd 6 pierce moved 0.1073 since the pack reserved its envelope') -- the deploy-skew forensics the prod-post-loss incident did by hand now ride the door itself. Clean = toolpath doc + tooling fingerprints update in place, the stale banner clears, posting proceeds; a clearance miss REFUSES naming the exact colliding placement (pln._audit's words), nothing saved -- the fix is one nudge in the hand editor, with the full re-pack the explicit second choice, never the default. Posted programs drop only when a plan actually drifted, every sheet keeping its O-number; a clean refresh is ONE undo step (UNDO_DOORS plrefresh, byte-restore inverse, never heavy). CLIENT: the Nest stale banner leads with 'Refresh envelopes' (Pack again / Pack again and post demoted to plain second choices); the plpost stale refusal's words offer the refresh first and the Post-tab banner carries one-click 'Refresh envelopes and post' (typed O-number captured first, layout and O-numbers kept) with Pack-again-and-post beside it; plrefresh has its own persistent refusal banner on both tabs with honest nothing-changed wording. VERIFIED: NEW app/verify_plrefresh.js 16/16 on scratch (sequence + placements byte-identical across refresh, drift named in plans_match's words, O-number kept across refresh-and-post, collision refuses naming the placement with fingerprints untouched, undo step present); verify_refusal 16/16, pltabs 18/18, plseq 15/15, undo 17/17 fresh scratch, plsel 17/17, test_pl_sync 23 green; dev engine restarted. WHY BND 6 MOVED (Jordan's open question, measured in git): no engine commit since the incident-night re-pack changes pierce placement (global-undo journaling, byte-identical nc-audit perf pass, pierce sub-NUMBER wiring, set_diameter/set_radius ops) -- a 0.1073 drift means the refused pack predates the start-anchor/start-defaults deploys (a Ctrl+Z restore brings back the OLD pack by design, refusal expected and stated); the refresh record now names the measured move per part on the job itself, so the next such drift is read off the drawer, not out of forensics.