DESIGN.md line 165's signature decision gets its verb. One hold, the whole
sail, at a cleat you can reach from the grass — because the corner taking the
$180 carport is bracket work and the ladder is a luxury a 5.9-second window
does not have. That is the mechanic, not a limitation: the ladder is for
repairs, the knife is for the seconds you actually have.
X and not a third hold-E target (interact.nearest picks by DISTANCE, and the
one input a player must never misfire is the irreversible one). A hold and not
a press, so the decision has a length and a gust can take it off you. And it
never writes player.busy: interact.js owns that state, and a second writer is
how a player gets stranded in a lock nothing releases.
The panel is the other half, and it is five sprints overdue. interact.step()
has always returned {target, progress, label, usable} "for hud.js to draw the
prompt + radial" — and nothing ever drew it. Every sentence this lane wrote
for the player's hands ("out of reach — needs the ladder", "push the water off
(169 kg)", "hands full") has never reached a player. Same disease as setFabric:
the code was right, the wire was missing, and no assert could see it because
the gap was on the glass. It lives in knife.js rather than player.js because
player.js statically imports GLTFLoader, so the suite has never been able to
reach it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>