# 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:uverify` → `up: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.