Problem
A degraded TRELLIS.2 texture bake is reported through two lanes that write the same verify stage, and they disagree about which remedy to name on a host that has only the Command Line Tools active:
server/services/imageTo3d/adapters.js — describeInstallState substitutes textureBake.help with toolchain.hint ("install Xcode…") when toolchain.blocker is set, and sets repairable: false. The card and the route's already-installed short-circuit both read that.
server/services/imageTo3d/trellis2.js — the install's own verify hook always emits bake.help, i.e. TRELLIS2_FALLBACK_BAKE_HELP, which says "Repair install fetches the missing build dependencies and rebuilds the Metal backends".
So on a blocker host, finishing an install prints advice that Repair provably cannot honor — the very same state for which the card correctly hides the Repair button. The user is told to run a fix the UI has already decided not to offer.
This predates #4636; that issue fixed only the module-name half of the parity (both lanes now name the culprit modules through appendMissingBakeModules).
Decision (chosen approach — do not re-litigate)
Make the install's verify hook resolve the remedy the same way the adapter does, rather than duplicating the branch:
- In
installTrellis2's verify, when bake.quality === 'fallback', probe the toolchain (probeMetalToolchain, already injectable-adjacent in this module) and prefer toolchain.hint over bake.help when toolchain.blocker is set — mirroring adapters.js.
- Better still if it reads cleanly: extract that "which remedy applies" decision into one exported helper in
trellis2.js and have adapters.js call it too, so the branch exists once. appendMissingBakeModules is the precedent for a shared formatter across both lanes.
- Keep
TRELLIS2_FALLBACK_BAKE_HELP byte-identical — tests assert on it as a stable constant.
- Keep the probe injectable so the suite never touches the host toolchain (the existing
probeBake option is the pattern).
Acceptance criteria
Affected files
server/services/imageTo3d/trellis2.js
server/services/imageTo3d/adapters.js
server/services/imageTo3d/trellis2.test.js, server/services/imageTo3d/adapters.degraded.test.js
Related to #4636.
Problem
A degraded TRELLIS.2 texture bake is reported through two lanes that write the same
verifystage, and they disagree about which remedy to name on a host that has only the Command Line Tools active:server/services/imageTo3d/adapters.js—describeInstallStatesubstitutestextureBake.helpwithtoolchain.hint("install Xcode…") whentoolchain.blockeris set, and setsrepairable: false. The card and the route's already-installed short-circuit both read that.server/services/imageTo3d/trellis2.js— the install's ownverifyhook always emitsbake.help, i.e.TRELLIS2_FALLBACK_BAKE_HELP, which says "Repair install fetches the missing build dependencies and rebuilds the Metal backends".So on a blocker host, finishing an install prints advice that Repair provably cannot honor — the very same state for which the card correctly hides the Repair button. The user is told to run a fix the UI has already decided not to offer.
This predates #4636; that issue fixed only the module-name half of the parity (both lanes now name the culprit modules through
appendMissingBakeModules).Decision (chosen approach — do not re-litigate)
Make the install's
verifyhook resolve the remedy the same way the adapter does, rather than duplicating the branch:installTrellis2'sverify, whenbake.quality === 'fallback', probe the toolchain (probeMetalToolchain, already injectable-adjacent in this module) and prefertoolchain.hintoverbake.helpwhentoolchain.blockeris set — mirroringadapters.js.trellis2.jsand haveadapters.jscall it too, so the branch exists once.appendMissingBakeModulesis the precedent for a shared formatter across both lanes.TRELLIS2_FALLBACK_BAKE_HELPbyte-identical — tests assert on it as a stable constant.probeBakeoption is the pattern).Acceptance criteria
blockerhost, the install'sverifyframe names the Xcode remedy, not "Repair install fetches…".metal) orunknownbake.Affected files
server/services/imageTo3d/trellis2.jsserver/services/imageTo3d/adapters.jsserver/services/imageTo3d/trellis2.test.js,server/services/imageTo3d/adapters.degraded.test.jsRelated to #4636.