Files
urm03/persistent-memory.md
T
vh 4ae0876e34 feat: salvage-pickup loop — kill-fed charges, scrap drops, salvage-gated card levels
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.
2026-08-07 12:46:59 -07:00

3.6 KiB

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.