I think I found the problem.
This works except on 12.6.4
let mdlVertexDescriptor = MDLVertexDescriptor()
mdlVertexDescriptor.vertexAttributes[0].name = MDLVertexAttributePosition
mdlVertexDescriptor.vertexAttributes[0].format = .float3
mdlVertexDescriptor.vertexAttributes[0].offset = 0
mdlVertexDescriptor.vertexAttributes[0].bufferIndex = 0
mdlVertexDescriptor.vertexAttributes[1].name = MDLVertexAttributeNormal
mdlVertexDescriptor.vertexAttributes[1].format = .float3
mdlVertexDescriptor.vertexAttributes[1].offset = 12
mdlVertexDescriptor.vertexAttributes[1].bufferIndex = 0
mdlVertexDescriptor.bufferLayouts[0].stride = 24
vertexDescriptor = MTKMetalVertexDescriptorFromModelIO(mdlVertexDescriptor)!
This works everywhere
let mdlVertexDescriptor = MDLVertexDescriptor()
mdlVertexDescriptor.vertexAttributes[0].name = MDLVertexAttributePosition
mdlVertexDescriptor.vertexAttributes[0].format = .float3
mdlVertexDescriptor.vertexAttributes[0].offset = 0
mdlVertexDescriptor.vertexAttributes[0].bufferIndex = 0
mdlVertexDescriptor.vertexAttributes[1].name = MDLVertexAttributeNormal
mdlVertexDescriptor.vertexAttributes[1].format = .float3
mdlVertexDescriptor.vertexAttributes[1].offset = 16
mdlVertexDescriptor.vertexAttributes[1].bufferIndex = 0
mdlVertexDescriptor.bufferLayouts[0].stride = 32
vertexDescriptor = MTKMetalVertexDescriptorFromModelIO(mdlVertexDescriptor)!
Seems related to: https://forums.kodeco.com/t/chapter-5-starter-project-stride-number-when-setting-normals/60781/8