| Bins shimmer on coplanar tops while orbiting | z-offset/sort lost in useBinsToRender.ts, or new mesh at an existing z | Keep z-primary, (x-y)-secondary sort + per-index bump; for overlay lines use polygonOffset as designer BinMesh.tsx does |
| GPU memory climbs during drag/resize until crash | Geometry path without disposal | Copy prevGeometryRef pattern from MergedBinMeshes.tsx; dispose merge inputs after mergeGeometries |
| Designer/baseplate preview updates only when orbited | frameloop="demand" and no invalidate() | const { invalidate } = useThree(); call in an effect keyed on the changing value (~6 examples in designer BinMesh.tsx) |
| New element rotated 90°, floating, or 42x wrong size | Y-up assumption or mm/grid-unit mix | Isometric scene: Z-up grid units, z = heightUnits * (7/42); never reuse designer mm constants |
| Camera resets on expand, or black canvas after refactor | Canvas remounted — moved in JSX across corner/expanded modes | Single Canvas location; switch via wrapper className 'contents' vs 'fixed inset-0 ...' (IsometricPreview.tsx ~line 448) |
| Every edit replays the drop animation on all bins | Mutation regenerated bin IDs | Preserve IDs across edits; regeneration acceptable only on import/switch (<20% overlap suppresses) |
| Scene color wrong in one theme | Single-theme hardcode or CSS var | Both palettes in THREE_COLORS, read via useThreeColors() |
| Designer glow breaks after toggling multi-color | Reused <mesh> lets R3F reset material to a memoized default | Keep distinct key="multi-color" / key="single-color" on the mesh variants (BinMesh.tsx) |
| Undone designer edit shows a mesh that doesn't match params | Params mutated outside history; undo restores cached mesh without regeneration (restoreHistoryEntry in src/features/bin-designer/store/helpers.ts leaves epoch unchanged on cache hit) | Route param changes through the history mechanism so epoch bumps on cache miss |
| Live status text crashes React under page translators | translate="no" removed from PreviewCanvas.tsx container | Keep it when restructuring the wrapper |