~bigbes/game-prototype-ftl

ref: aff16d4fa0a7d226f4d8d6748802755f0b6c1cd2 game-prototype-ftl/docs/tasks/summary-crew-movement-resume.md -rw-r--r-- 3.8 KiB
aff16d4f — Eugene Blikh docs(systems-power): record approved plan 30 days ago

#summary-crew-movement-resume

Handoff summary written 2026-04-22. Resumes the crew-movement milestone after the plan stage.

#Goal

Building ftl-shape, an FTL-like game in Go + Ebitengine (virtual resolution 640×360 at a 1280×720 window) that compiles to native desktop and browser WASM. Vertical slice scope: one ship, one combat encounter, pixel-art placeholders.

#Current state

  • skeleton milestone complete and shipped through the full up: workflow (Design → Plan → Execute → Verify → Review). Merge-ready, no findings at confidence ≥80. Native and WASM both verified rendering the 5-room placeholder ship.
  • crew-movement milestone in progress: Design committed at aa11b70; Plan written but uncommitted in docs/tasks/crew-movement.md (git status: M). Waiting on user approval before up:uexecute.
  • 6 commits on main; no remote.
  • Project memory: ~/.claude/projects/-Users-blikh-data-home-ftl-shape/memory/project_ftl_shape.md.

#Infrastructure / Environment

Purely local. Go 1.26.2 at /opt/homebrew/Cellar/go/1.26.2/libexec. No remote work, no running background processes, no tmux.

#Active blocker

None. Workflow is paused at "plan presented, awaiting approval". Resume with execute.

#Key files

  • docs/tasks/skeleton.md — done; Design / Plan / Verify / Conclusion all filled.
  • docs/tasks/crew-movement.md — Design + Plan present; Plan uncommitted.
  • main.go, ship.go, render.go — current skeleton code.
  • Makefile — targets run, build, build-wasm, serve, play-web.
  • web/index.html, .gitignore — WASM shell and ignore rules.

#What to do next

  1. git -C /Users/blikh/data/home/ftl-shape diff docs/tasks/crew-movement.md → review the Plan section.
  2. On approval: git -C /Users/blikh/data/home/ftl-shape add docs/tasks/crew-movement.md && git commit -m "docs(crew-movement): plan".
  3. Invoke up:uexecute. The plan dispatches 3 phases: tiles + BFS (TDD) → crew struct + tick (TDD) → input & render integration.
  4. Model: let up:implementer and up:reviewer use their default (Sonnet 4.6 — what those agents are designed for). If dispatch errors with "model ... may not exist or you may not have access to it", fall back to model: "opus". That fallback worked every time this session after one transient Sonnet failure; Sonnet is still worth trying first.
  5. After execute: up:uverifyup:ureview.
  6. Remaining milestones designed but not yet started: systems-power, combat, polish.

#Gotchas

  • Subagent model: try Sonnet default first; fall back to model: "opus" only if dispatch errors with model-access failure. See step 4.
  • Go ≥1.24 moved wasm_exec.js to $(go env GOROOT)/lib/wasm/wasm_exec.js; the Makefile uses the new path. Older toolchains will fail loudly (acceptable per Design's fail-fast principle).
  • go build ./... from the repo root leaves a bare ./ftl-shape binary. .gitignore already covers it along with bin/, web/main.wasm, web/wasm_exec.js.
  • Crew-movement plan uses inpututil.IsMouseButtonJustPressed + ebiten.CursorPosition(). Ebitengine docs state CursorPosition returns logical (post-Layout) coords, so no manual window → virtual scaling should be needed. Flagged as a browser verify-time smoke in the plan's "Open questions / risks" section — if it misbehaves, scale via ebiten.WindowSize().
  • Reviewer noted during skeleton review that Design prose mentions text/v2 for labels while code uses ebitenutil.DebugPrintAt; sub-threshold, deferred as future polish. Crew labels will follow the same convention for consistency.
  • The skeleton Verify flow includes a live Chrome smoke via the mcp__chrome-devtools__* tools plus python3 -m http.server 8765 in web/. Same pattern works for verifying crew-movement's browser behaviour.