A stale/incomplete Godot import cache made preload() of the sprite
textures fail at COMPILE time, killing the actor scripts entirely —
no movement, no draw, near-black screen (reported on the Mac editor
after pull). Switching preload -> runtime load() degrades a missing
texture to an invisible sprite instead of a dead script; movement and
logic always survive. Committed state was verified sound via fresh
clone (imports + main scene + smoke all clean); this hardens against
the cross-machine cache-lag failure mode. Smoke 3/3 green.
Operator asked for placeholder sprites for playtest feel. Actors now
render the hand-authored pixel maps (tools/aseprite/maps -> assets/
sprites_ph, committed) via code-created Sprite2D — no scene texture
UIDs to hand-author. Dynamic feedback preserved: grunt/burster heat
tint + hit flash drive sprite.modulate, heat-aura ring stays a _draw
overlay; salvage fade drives modulate.a. Arena floor/walls, HUD, and
FX stay primitives. CLAUDE.md greybox-art note updated (was 'no
sprites'); real art (watercolor scenery + pixel sprites) still later.
Smoke gate 3/3 green on nh3-dev headless 4.7.1.
Per canon decisions 2026-08-07 (advisor CONCEPT.md f12cb15, falsifier
response): charges now generate on kills (kills_per_charge, chemistry
chain kills feed the hand; per-hit generation removed). Kills drop
scrap as physical pickups (amber diamond, magnet radius 70, drift to
mech, 20s fade; grunt 1 / burster 3) — collection is the positioning
reward gradient. Cumulative collected scrap gates card levels 1-3
(thresholds 12/30; per-level radius x1.25/x1.5 and power x1.15/x1.5 —
HEAT L3 hits one-cast detonation threshold). HUD: level notches under
slots + scrap counter. Salvage spawn is call_deferred: death can fire
inside a physics signal flush where Area2D setup is blocked.
Smoke gate: charge accrual now kill-fed, salvage drop + collection +
level gating phases added, heat-target selection made retry-tolerant.
4/4 green on nh3-dev headless 4.7.1.
Hand (CanvasLayer, PROCESS_MODE_ALWAYS): Space toggles the hand, Q/E
play slot 1/2, charges accrue from auto-fire hits (4 hits/charge, cap
5). KINETIC card: radial shockwave shove + light damage. HEAT card:
paints heat status in a radius; heat accumulates, glows, detonates at
threshold (damage only, no knockback — tag purity). Freeze/dilate is
an exposed knob: [ and ] step dilation 0.0-0.3 live.
Freeze uses SceneTree.paused, not Engine.time_scale = 0: probed on
4.7 headless — time_scale 0 still steps physics with delta 0, so
delta-independent logic (heat thresholds, contact callbacks) kept
firing while nominally frozen. Dilation > 0 uses time_scale slow-mo.
Hand._exit_tree restores pause + time_scale so hull-zero reloads can
never strand a frozen world.
Smoke gate extended: charge accrual from build hits, pause-on-open at
knob 0, HEAT x2 spend + threshold, detonation on release. 3/3 green
on nh3-dev headless 4.7.1.