Suggested model tier: Opus 4.x high
Context
Lumos regressed to a static radial gradient and #67 is already bisecting that across the artifact boundary. If animation has since returned, it may have returned via an expensive fallback — a per-frame recomposition of a Brush is dramatically hotter than a GPU shader. This recon determines whether the orb is a primary heat source independent of any Arc (isolation condition 1: Lumos animating, no Arc).
Depends on the socket-link/socket#1011 harness for the static-frame seam and ThermalProbe readout.
Objective
Quantify Phosphor's standalone render cost under condition 1 and classify the bottleneck as GPU-bound, CPU/recomposition-bound, or allocation-bound.
Steps (each verifiable)
1. Run condition 1. Capture a Metal System Trace + Core Animation FPS.
Validation: you have a frame-rate number and GPU utilization %. High FPS + high GPU → Phosphor implicated immediately.
2. Confirm the render path is hardware-accelerated (Skiko → Metal), not a software/CPU draw fallback.
Validation: Metal trace shows real GPU command buffers per frame.
3. Inspect the animation driver: paced by withInfiniteAnimationFrameNanos / display-link sync, or an uncapped loop / tight delay? On ProMotion an uncapped loop renders at 120Hz.
Validation: measured frame cadence matches an intentional cap, not a busy spin.
4. Check whether VoxelFrame DTOs are recomputed per frame and on which thread, and whether recomposition scope leaks beyond the draw surface (whole orb recomposing vs. isolated drawWithCache/Canvas).
Validation: allocation rate per frame in Instruments; recomposition counts scoped to the draw node only.
Expected outcome
Verdict — Phosphor is / isn't a primary culprit — with a GPU/CPU/allocation breakdown and the specific hot path if implicated. Findings feed #67's version-axis bisection.
Technical constraints
Compose Multiplatform + Skiko/Metal on iOS; VoxelFrame DTO contract from Phosphor; consumes the socket-link/socket#1011 static-frame Koin seam and ThermalProbe.
Out of scope
Fixing the renderer. The #67 regression root-cause (this recon may hand it evidence).
Suggested model tier: Opus 4.x high
Context
Lumos regressed to a static radial gradient and #67 is already bisecting that across the artifact boundary. If animation has since returned, it may have returned via an expensive fallback — a per-frame recomposition of a
Brushis dramatically hotter than a GPU shader. This recon determines whether the orb is a primary heat source independent of any Arc (isolation condition 1: Lumos animating, no Arc).Depends on the socket-link/socket#1011 harness for the static-frame seam and ThermalProbe readout.
Objective
Quantify Phosphor's standalone render cost under condition 1 and classify the bottleneck as GPU-bound, CPU/recomposition-bound, or allocation-bound.
Steps (each verifiable)
1. Run condition 1. Capture a Metal System Trace + Core Animation FPS.
Validation: you have a frame-rate number and GPU utilization %. High FPS + high GPU → Phosphor implicated immediately.
2. Confirm the render path is hardware-accelerated (Skiko → Metal), not a software/CPU draw fallback.
Validation: Metal trace shows real GPU command buffers per frame.
3. Inspect the animation driver: paced by
withInfiniteAnimationFrameNanos/ display-link sync, or an uncapped loop / tightdelay? On ProMotion an uncapped loop renders at 120Hz.Validation: measured frame cadence matches an intentional cap, not a busy spin.
4. Check whether VoxelFrame DTOs are recomputed per frame and on which thread, and whether recomposition scope leaks beyond the draw surface (whole orb recomposing vs. isolated
drawWithCache/Canvas).Validation: allocation rate per frame in Instruments; recomposition counts scoped to the draw node only.
Expected outcome
Verdict — Phosphor is / isn't a primary culprit — with a GPU/CPU/allocation breakdown and the specific hot path if implicated. Findings feed #67's version-axis bisection.
Technical constraints
Compose Multiplatform + Skiko/Metal on iOS; VoxelFrame DTO contract from Phosphor; consumes the socket-link/socket#1011 static-frame Koin seam and ThermalProbe.
Out of scope
Fixing the renderer. The #67 regression root-cause (this recon may hand it evidence).