Handoff summary written 2026-04-22. Resumes the crew-movement milestone after the plan stage.
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.
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.main; no remote.~/.claude/projects/-Users-blikh-data-home-ftl-shape/memory/project_ftl_shape.md.Purely local. Go 1.26.2 at /opt/homebrew/Cellar/go/1.26.2/libexec. No remote work, no running background processes, no tmux.
None. Workflow is paused at "plan presented, awaiting approval". Resume with execute.
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.git -C /Users/blikh/data/home/ftl-shape diff docs/tasks/crew-movement.md → review the Plan section.git -C /Users/blikh/data/home/ftl-shape add docs/tasks/crew-movement.md && git commit -m "docs(crew-movement): plan".up:uexecute. The plan dispatches 3 phases: tiles + BFS (TDD) → crew struct + tick (TDD) → input & render integration.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.up:uverify → up:ureview.systems-power, combat, polish.model: "opus" only if dispatch errors with model-access failure. See step 4.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.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().text/v2 for labels while code uses ebitenutil.DebugPrintAt; sub-threshold, deferred as future polish. Crew labels will follow the same convention for consistency.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.