Problem
#4636 added an optional detail key to the normalized degraded projection (server/services/imageTo3d/adapters.js) — a short line naming what is actually missing, rendered as distinct secondary text under the help prose. help says which remedy to run; detail says what is broken.
trellis2 uses it. pixal3dCuda still inlines the same information into its help sentence:
help: `Pixal3D is installed but ${incomplete.join(' and ')} did not build, so renders `
+ 'will fail in the mesh exporter. Repair install rebuilds the CUDA extensions; …',
So the card renders the culprit modules as a styled line for one target and as buried prose for the other, and the contract comment this branch wrote is only half-true across the registry.
Decision (chosen approach — do not re-litigate)
Split pixal3dCuda's describeInstallState the same way trellis2 does:
help keeps only the remedy — drop the ${incomplete.join(' and ')} interpolation from the sentence.
detail carries the module names. Reuse the existing formatter shape (Missing: o_voxel, flex_gemm) rather than inventing a second wording — extract it from trellis2.js's missingBakeModulesLabel into a shared helper if that reads cleaner than importing across lanes.
- Update
server/services/imageTo3d/adapters.degraded.test.js — the two assertions that currently do expect(state.fields.degraded.help).toContain('o_voxel') move to detail, and the exact-shape toEqual case gains the key.
Keep the NAF-fallback branch as-is: it has no module list to name.
Affected files
server/services/imageTo3d/adapters.js — pixal3dCuda.describeInstallState
server/services/imageTo3d/adapters.degraded.test.js — coverage
Related to #4636.
Problem
#4636 added an optional
detailkey to the normalizeddegradedprojection (server/services/imageTo3d/adapters.js) — a short line naming what is actually missing, rendered as distinct secondary text under the help prose.helpsays which remedy to run;detailsays what is broken.trellis2uses it.pixal3dCudastill inlines the same information into its help sentence:So the card renders the culprit modules as a styled line for one target and as buried prose for the other, and the contract comment this branch wrote is only half-true across the registry.
Decision (chosen approach — do not re-litigate)
Split
pixal3dCuda'sdescribeInstallStatethe same waytrellis2does:helpkeeps only the remedy — drop the${incomplete.join(' and ')}interpolation from the sentence.detailcarries the module names. Reuse the existing formatter shape (Missing: o_voxel, flex_gemm) rather than inventing a second wording — extract it fromtrellis2.js'smissingBakeModulesLabelinto a shared helper if that reads cleaner than importing across lanes.server/services/imageTo3d/adapters.degraded.test.js— the two assertions that currently doexpect(state.fields.degraded.help).toContain('o_voxel')move todetail, and the exact-shapetoEqualcase gains the key.Keep the NAF-fallback branch as-is: it has no module list to name.
Affected files
server/services/imageTo3d/adapters.js—pixal3dCuda.describeInstallStateserver/services/imageTo3d/adapters.degraded.test.js— coverageRelated to #4636.