forked from 1b-agent/opencadstudio-upstream
`view-detail` put 7826.9 of the first paper frame's 7832.8 ms in the grid overlay. The path is `grid_views` → `active_viewports` → `camera_for_viewport` → `model_space_extents`, whose fast path reads the already-built wire AABBs but is gated on `current_layout == "Model"` — correctly, because `wire_cache` holds the *current layout's* wires, which in a Layout are the paper sheet's. So a paper frame takes the fallback, which tessellates every model-space entity to read its key vertices. That fallback called `tessellate_one` per entity, and `tessellate_one` resolves the background, annotation scale and block cache from `&self` every time — including a `RefCell` borrow and a cache lookup for a block cache that is identical on all 186 455 calls. The walk was also serial, while the wire builder's own tessellation pass has been parallel for a while. Those inputs are now resolved once, by a `tessellation_context` that `tessellate_one` also uses so the two cannot drift, and the walk runs through rayon. The reduction is min/max/or, so parallel order does not change the result; the arguments to `tessellate_entity` are unchanged. This makes the fallback cheaper, not absent. Tessellating a million entities to obtain a bounding box is the wrong shape, and the structural fix — a model-space extent that does not depend on which layout is being viewed — needs the next measurement to size. Recorded in DEBUG_NOTES. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>