memory.md: pre-Phase-20 audit + 5-sprint cleanup session log
Marks bed-claim (LOW) and drag-paint (MED) bugs as resolved. Adds session entry covering 6 commits from today: critical-bug fan-out (save/load, sow, ingredient2, hauling, storyteller), A+B+C, D+E+F, drag-paint+gitignore, bed deconfliction, Sprint A cleanup. Five new patterns recorded — trust-but-verify, Job.target_node deconfliction, workbench.from_dict completion side-effects, ingredient2 inversion, delegation report. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
fd6f958344
commit
57e1f0f389
1 changed files with 9 additions and 2 deletions
11
memory.md
11
memory.md
|
|
@ -96,9 +96,9 @@ Reported from playtest. Triaged but not yet fixed. Plan: knock out as a bug-tria
|
|||
- [x] **[MED] Pawns render behind floor tiles.** Reported 2026-05-15, fixed 2026-05-15. Root cause: Floor entity anchored origin at tile-center (`tile.y*16+8`), same Y as Pawn — Y-sort tiebreak fell to scene-tree order, Floor (spawned later) drew over Pawn. Fix: moved Floor origin to top-of-tile (`tile.y*16`) so Floor.y < Pawn.y under Y-sort; _draw offsets compensate (rect spans y=0..TILE_SIZE_PX instead of -half..+half).
|
||||
|
||||
Older bugs noted in passing but never fixed:
|
||||
- [ ] **[LOW] Bed-claim failure for 2/3 pawns when beds are free** (logged 2026-05-11). `Bram bed claim failed at /root/Main/World/Bed — sleeping on floor` even when beds free. Doesn't gate progress; needs sleep-system audit.
|
||||
- [x] **[LOW] Bed-claim failure for 2/3 pawns when beds are free** (logged 2026-05-11, fixed 2026-05-16). Audit showed claim mechanism was already race-free; visible symptom was greedy nearest-neighbor convergence (3 pawns picking the same nearest bed). Fixed in commit `2f76ae1` by extending the existing `Job.is_target_taken_by_other` deconfliction (used by ConstructionProvider) to SleepProvider — `j.target_node = best_bed` at job proposal so other pawns skip the same bed.
|
||||
- [ ] **[LOW] Save mid-INTERACT/mid-BUILD restarts toil from 0 on load** (Phase 16 known acceptable gap). Walk toil round-trips; multi-step interact does not. Tolerable per Phase 20 tuning note.
|
||||
- [ ] **[MED] Drag-paint eaten by camera with paint tool active** (logged 2026-05-16). When a Designate/Build/Stockpile tool is active in BuildDrawer, the player should be able to click-and-drag to paint a rectangle of cells. Instead, camera_rig's drag-pan consumes the InputEventScreenDrag / MouseMotion and the paint stays single-cell. Contradicts the 2026-05-11 note that claimed drag-paint worked — that was selection drag-painting via Designation, not the camera-vs-paint priority case. Fix needs Selection or Designation to set `set_input_as_handled()` on drag events when a paint tool is active, or camera to skip pan when `Designation.active_tool != TOOL_NONE`.
|
||||
- [x] **[MED] Drag-paint eaten by camera with paint tool active** (logged 2026-05-16, fixed 2026-05-16). Camera_rig was last in `world.tscn` so Godot's reverse-tree `_unhandled_input` dispatch gave it first crack at drag events. Fixed in commit `cf43ef9`: camera_rig's drag-start and ScreenDrag handlers early-return when `World.designation_ctl.active_tool() != TOOL_NONE`.
|
||||
|
||||
## Open questions / TODOs
|
||||
|
||||
|
|
@ -323,6 +323,13 @@ Same scope as locked in `~/claude/ideas/rimlike/plan.md`. Realistic timeline 3
|
|||
- **Bug logged for Phase 20 polish — drag-paint eaten by camera (MED).** When a Designate/Build/Stockpile tool is active in BuildDrawer, drag-paint should rectangle-fill, but camera_rig's drag-pan consumes the drag instead. Contradicts the 2026-05-11 memory note (that was selection drag-paint, not camera-vs-paint priority). Fix shape: Selection or Designation marks drag events handled when a paint tool is active, or camera skips pan when `Designation.active_tool != TOOL_NONE`.
|
||||
- **Delegation report — whole-day Phase 17 closure + Phase 19 sprints.** Six `gdscript-refactor` (Sonnet) dispatches total across the two 3-way fan-outs. Opus handled all pre-write contracts, integration glue, MCP runtime verification, and the post-fan-out cross-check + small fix-ups (W→P keybind text in HelpModal, integration spot-checks, commits). No `quick-edit` (Haiku) dispatches today — every wedge was big enough to warrant Sonnet's reasoning.
|
||||
|
||||
- **Pre-Phase-20 audit + 5-sprint clean-up day.** Fan-out of 5 parallel `researcher` (Haiku) agents produced a code-review surfacing ~30 items across save/load gaps, mechanically-inert features, dead-ends, drift hazards, and Phase 20 tuning candidates. Synthesised into 4 critical-bug categories + cleanup follow-ups. Six commits land the response: `d9638a4` (6 critical bugs in parallel — save/load 4-tuple, sow, ingredient2, hauling fallback, smelter wired-but-not-checked, storyteller effects); `2afca16` (A+B+C — buff consumers, sick penalty, multi-count cremation); `cc6d60d` (D+E+F+stale comment — corpse_cremated null, dead Recipe.ingredient_count, save_system simplification + workbench from_dict missing `_complete()` side-effects); `cf43ef9` (drag-paint priority + gitignore); `2f76ae1` (bed deconfliction via existing Job.target_node); `fd6f958` (Sprint A cleanup — accessibility flags wired, InspectTooltip long-press, dead arrived_at_destination signal wired to DirtinessSystem, CraftingProvider ingredient race cached, RestProvider Phase-3 debris deleted, DIRTY_THRESHOLD extracted to DirtinessSystem).
|
||||
- **Pattern recorded — "trust-but-verify agent reports".** Two cross-agent contradictions surfaced during the critical-bug fan-out: (1) one researcher claimed Smelter/Millstone/Hearth weren't player-buildable; the gdscript-refactor agent dispatched to fix it verified they ALREADY are (build_drawer.gd:234-248, world.gd:767-772, strings, draws — all present), no code change needed. (2) save/load researcher claimed crop save was broken due to field-name mismatch (`crop_kind` vs `kind`); on direct verification the field names were correct, but the bug WAS real for a different reason — `Crop.from_dict` is static returning a Dict, and `save_system._spawn_crop` discarded the return value. Verifying conflicting agent claims against the actual code caught both before fan-out dispatch.
|
||||
- **Pattern recorded — "Job.target_node deconfliction is the standard mechanism".** ConstructionProvider already filtered build sites via `Job.is_target_taken_by_other`. Sprint extended it to: (a) SleepProvider (beds) and (b) CraftingProvider (per-job `ingredient_item` cache + `is_instance_valid` re-check at pickup). Any future scarce-resource provider should mirror this — set `j.target_node = X` on proposal, filter candidates by `Job.is_target_taken_by_other(X, pawn)`.
|
||||
- **Pattern recorded — "workbench.from_dict must call `_complete()`, not bare `_completed = true`".** The agent doing F (save_system._spawn_workbench cleanup) caught that workbench.from_dict was setting `_completed = true` directly — skipping side-effects: light source enabling, beauty register, designation clear. Any restored workbench would render but not emit light or contribute to room beauty. Fixed in commit cc6d60d. Same trap shape will recur for any entity whose completion has registered side-effects (Wall, Floor, Door, Bed) — `_completed = true` is never sufficient; always call the `_complete()` path.
|
||||
- **Pattern recorded — "ingredient2 inversion: primary is carried, secondary is buffered".** The two-trip craft refactor (commit d9638a4) settled on: `recipe.ingredient_type` = the carried (primary) ingredient, `recipe.ingredient2_type` = the buffered (secondary, may be multi-count) ingredient. For cremation this is corpse (carried) + 5 wood (buffered across multiple pickup/deposit trips). Workbench.deposited_inputs Dictionary holds the buffered count. JobRunner._tick_craft validates buffer at full count, consumes both at completion. Pawn carry slot stays single-stack. `Workbench._last_consumed_ingredient` transient field captures the carried item before queue_free so signal consumers (cremation_pyre.on_craft_complete → corpse_cremated) get a non-null ref.
|
||||
- **Delegation report — audit + 5-sprint day.** Five `researcher` (Haiku) for the initial audit fan-out. Across the five fix-sprints: 12 `gdscript-refactor` (Sonnet) dispatches, 1 `quick-edit` (Haiku) for the J+M mechanical batch. Opus handled all pre-write contracts, integration verification, the cross-agent conflict resolution, and all 6 commits. Tiered system fired naturally across both axes (audit + execution).
|
||||
|
||||
## External references
|
||||
|
||||
- **Forgejo repo:** https://git.rdx4.com/megaproxy/rimlike (private)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue