diff --git a/CLAUDE.md b/CLAUDE.md index 37d3292..6e97a8b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,6 +4,25 @@ Godot 4 game project. Science-fiction rogue-lite: strategy-forward mech auto-battler with a light action layer and a nurturing base-builder meta. +## Persistent memory + +`persistent-memory.md` at the repo root captures durable intent and +supporting evidence (goals, decisions, foot-gun warnings, in-flight +state) across context resets. Read it at session start; treat it as +one input alongside this CLAUDE.md and the auto-memory system, not +as the single source of truth. + +It is a lean **index**: the dated log sections keep each over-threshold +entry's full body in `persistent-memory.d/.md`. Pull a detail +file only when its index line is relevant to your work — never +bulk-read `persistent-memory.d/`. + +When you commit, include any pending `persistent-memory.md` and +`persistent-memory.d/` updates in the same commit (stage them +alongside whatever else is being committed). Never leave them as a +floating uncommitted change while shipping other work — durable memory +that lags the code defeats its own purpose. + ## Design canon (read before designing anything) The design documents are canonical and live in the advisor repo, diff --git a/persistent-memory.d/2026-08-07-freeze-meter-variant.md b/persistent-memory.d/2026-08-07-freeze-meter-variant.md new file mode 100644 index 0000000..d56e4a3 --- /dev/null +++ b/persistent-memory.d/2026-08-07-freeze-meter-variant.md @@ -0,0 +1,58 @@ +# 2026-08-07 — Freeze charge meter adopted as the card-time playtest variant + +**Status: playtest variant, NOT canon.** Ratification into the advisor +repo's CONCEPT.md is deferred until the operator's falsification-playtest +verdict — tracked at commit `73f84e7` (whose message records the pending +state) and the advisor repo's CONCEPT.md § Open questions #0 (the greybox +work tracker). + +## The mechanic + +A "Freeze" charge (meter) grows while the hand is closed, drains while +open. Its level maps to bands, best to worst: + +- **FROZEN** (level ≥ 45%): true pause (`SceneTree.paused`). +- **THAW** (≥ 18%): slow-mo ramping back to full speed as it drains, on + an acceleration curve (`thaw_curve` 2.2 — hangs slow, then rushes). +- **REALTIME** (≥ 10%): hand open, world at full speed. +- **UNAVAILABLE** (below): the hand will not open at all; a drained-open + hand force-closes. + +Opening with a full meter buys the whole ladder (~1.65s freeze → ~0.8s +thaw → ~0.5s realtime at defaults: cap 3.0s, drain 1.0/s, regen 0.4/s). +Closing the hand spools time back up over `release_thaw_s` (0.5s) instead +of snapping. All rates/bands are `@export` knobs; M flips live to the +original unlimited-toggle variant for A/B. + +## Why (KB-grounded pressure test, 2026-08-07) + +- **Kills a latent dominant strategy**: unlimited freeze made "open the + hand as a free tactical pause" always-optimal (Schell: rework rules so + a dominant strategy stops being dominant; aligns with CONCEPT.md's + anti-dominant-strategy posture). The empty-meter lockout also closes + the Space-spam refreeze exploit found during the pressure test. +- **Tension cycle**: freeze→thaw→realtime is Schell's + rising-tension-then-release loop in miniature, inside every hand-open. +- **Temporal triangularity**: play one card early (safe) vs chain deeper + into the thaw (greedy) — stacks with belt-depth pricing post-greybox. +- **Difficulty/accessibility axis**: meter size / regen / thaw length are + one-scalar difficulty knobs that never touch enemy content — can't + collide with the invincibility laws. Generous-to-infinite freeze is the + accessibility floor. +- **Honesty note**: the KB surfaced nothing directly on decision timers / + time pressure (retrieval miss) — grounding is flow/tension/triangularity/ + dominant-strategy material, adjacent but not a direct verdict. + +## Canon tension to watch in playtest + +"Attention is spent ON cards, not during them" (pillar 1, gentlest action +skill): a tight freeze window would turn the hand into a reflex test. The +generous default + continuous thaw (never a cliff) is the mitigation; the +ramp prices dithering and deep chains, not basic use. + +## Evidence chain + +Pressure test + operator "A for now" directive: session 2026-08-07. +Implementation: `73f84e7` (meter + bands), `3d2410c` (release ramp + +thaw curve). Operator early verdict: "that DOES feel very good", "ramp +feels good too… starting to feel game-like". diff --git a/persistent-memory.md b/persistent-memory.md new file mode 100644 index 0000000..184ccf6 --- /dev/null +++ b/persistent-memory.md @@ -0,0 +1,74 @@ +# 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. + +## Tools and conventions + +- Smoke gate: `~/bin/godot --headless --path . res://tests/smoke.tscn` + (exit 0 pass / 1 fail; run 3x to catch flakes). After adding new + scenes/assets, import first: `~/bin/godot --headless --import --path .` +- New GDScript files: run the headless import BEFORE committing so + Godot's `.uid` sidecars land in the SAME commit as their scripts (see + Tried and abandoned, 2026-08-07). + +## Current state / in-flight + +_As of 2026-08-07:_ + +- **Greybox build COMPLETE** at `1976149`, pushed to gitea (vh/urm03) — + all five build capabilities live: arena + positioning-only piloting, + auto-fire KINETIC weapon, cards + Freeze-charge meter + thaw/release + ramps, KINETIC+HEAT chemistry row with authorship-loud feedback stack + (hitstop + hues meeting + `_ph` sting), grunt swarm + self-heating + burster. Headless smoke gate green 3/3. +- **Awaiting the falsification playtest** (ROADMAP capability 6): + operator verdicts on the three bets — positioning↔build interaction, + card-freeze rhythm, chemistry delight. Early signal on bet 2 is + positive: freeze meter + release ramp "feels very good" / "starting to + feel game-like" (operator, 2026-08-07). Tuning everywhere still open. +- Operator hit a pull conflict on the Mac (untracked `.uid` files vs + `1976149`) — fix being applied this session; an operator-surfaced + issue is expected next. +- After verdicts: draft the CONCEPT.md canon entries in the advisor repo + (freeze-meter ratification + whatever else the playtest settles). + +## 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). + +## 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.