# Persistent memory — urm03 (U R M03) _Last updated: 2026-08-07_ > **Always check for `/tmp/m03-dev-handoff.md`** — if it exists and its > `Written:` stamp is under an hour old, read it (it carries the in-flight > handoff from the previous session), then delete it. Older than an hour: > stale — delete it unread. ## Repo purpose Implementation repo for **U R M03** (Godot 4.7.1): the strategy-forward mech auto-battler rogue-lite. Design canon lives in the advisor repo (see CLAUDE.md); this repo builds what canon ratifies. Current mission is the greybox falsifier (ROADMAP.md v1) that tests the design's three core bets. ## Current state / in-flight _As of 2026-08-07 (post-falsifier):_ - **Greybox build complete AND falsifier verdicts rendered** (ROADMAP v1 target met through capability 6). Verdicts: bet 2 (card-freeze rhythm) CONFIRMED; bet 1 (positioning) shaky → salvage-pickup loop adopted and built; bet 3 (chemistry) inconclusive → in-card randomness parked to belt stage. - **Post-falsifier loop built**: charges generate on kills; kills drop scrap pickups (magnet radius, fade); collected scrap gates card levels 1→3 (thresholds + per-level radius/power scaling, HEAT L3 reaches one-cast threshold). Smoke gate green 4/4. - Canon amendments landed in the advisor repo at `f12cb15` (**local-only — that repo has NO git remote**): Freeze charge ratified, kill-charges + salvage-gated levels decided, randomness parked. - Everything is knobs; operator says "everything needs tuning" — no tuning pass done yet. v1.0 cut not yet made (operator sign-off needed; ROADMAP v1 target arguably met). ## Recent decisions - `[2026-08-06]` Greybox discipline: direct implementation + headless smoke gate; contract/heid ceremony skipped — falsifier code's real review is the operator playtest. - `[2026-08-07]` Freeze charge meter adopted as the card-time variant for playtest (banded ladder, A/B vs unlimited toggle on M); canon ratification deferred pending playtest verdict — tracked at commit `73f84e7` + advisor repo CONCEPT.md § Open questions #0. → `persistent-memory.d/2026-08-07-freeze-meter-variant.md` - `[2026-08-07]` Detonations are symmetric — they damage enemies AND the mech in radius: one grammar on both sides; heat play prices standing close (`1976149`). - `[2026-08-06]` Placeholder tag hues: KINETIC pale steel-blue, HEAT orange — canon assigns no tag colors yet (naming/color pass parked post-greybox). - `[2026-08-07]` Falsifier verdicts + resulting design decisions live in advisor-repo CONCEPT.md (§ loop stack amendments, decisions-log rows, open-question #0 closure) at `f12cb15` — design rationale is NOT duplicated here; that log owns it. ## Tried and abandoned - `[2026-08-07]` `Engine.time_scale = 0` as the freeze — fake: physics still steps with delta 0 on 4.7 (probed headless), so delta-independent logic (heat thresholds, contact callbacks) kept firing while "frozen". Freeze = `SceneTree.paused` + hand on `PROCESS_MODE_ALWAYS`; `time_scale` only for dilation > 0 (`c340b7b`). - `[2026-08-07]` Committing new scripts without their `.uid` sidecars — the Mac editor generated its own untracked copies and the next `git pull` refused to merge over them. Import headless before committing so `.uid` files ride the same commit as their scripts. - `[2026-08-07]` Spawning physics nodes (Area2D) directly inside a physics signal flush (projectile `body_entered` → death → spawn) — Godot blocks collision setup mid-flush. Spawn via `add_child.call_deferred()` from any death/hit signal path.