diff --git a/packages/core/src/schema/nodes/roof-segment-trim.test.ts b/packages/core/src/schema/nodes/roof-segment-trim.test.ts index d35de190c..ad2923107 100644 --- a/packages/core/src/schema/nodes/roof-segment-trim.test.ts +++ b/packages/core/src/schema/nodes/roof-segment-trim.test.ts @@ -32,6 +32,15 @@ describe('roof segment trim', () => { }) }) + // Scene loading casts migrated roof-segments instead of zod-parsing them, so a + // segment saved before `trim` existed reaches renderers with the field absent. + test('tolerates a segment carrying no trim at all', () => { + const trim = normalizeRoofSegmentTrim({ width: 8, depth: 6 }) + + expect(trim.left).toBe(0) + expect(trim.backRightZ).toBe(0) + }) + test('normalizes impossible side totals without inverting the footprint', () => { const trim = normalizeRoofSegmentTrim({ width: 4, diff --git a/packages/nodes/src/ridge-vent/renderer.tsx b/packages/nodes/src/ridge-vent/renderer.tsx index 635917034..8398ae830 100644 --- a/packages/nodes/src/ridge-vent/renderer.tsx +++ b/packages/nodes/src/ridge-vent/renderer.tsx @@ -4,6 +4,7 @@ import { type AnyNodeId, getEffectiveRoofSurfaceMaterial, getEffectiveSegmentSurfaceMaterial, + normalizeRoofSegmentTrim, type RidgeVentNode, type RoofNode, type RoofSegmentNode, @@ -29,7 +30,7 @@ import { buildRidgeVentGeometry } from './geometry' function ridgeVentSegmentGeometryKey(segment: RoofSegmentNode | undefined): string { if (!segment) return 'none' - const trim = segment.trim + const trim = normalizeRoofSegmentTrim(segment) return [ segment.roofType, segment.width,