6 agents × 2 rounds examining 9 content layers. Produced D-032
through D-039, THE FRIEND NPC pattern, converged tag taxonomy,
and Sova Transit District setting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
validate_movement now checks both terrain walkability AND tile
occupancy. Builds a spatial index of occupied tiles from stationary
entities, then resolves movers in order — first valid claim wins.
Same spatial pattern needed for D-026 simulation tiers (30-80 active
NPCs) and future pathfinding occupied-tile awareness.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add diagonal PlayerAction variants (MoveNortheast, MoveNorthwest,
MoveSoutheast, MoveSouthwest) and TilePosition::all_neighbors()
returning all 8 surrounding tiles. Genre-expected for immersive sim.
Establishes the movement pattern before pathfinding is built on top.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- decode_snapshot() reports dropped entities via push_error and returns
decode_errors count so callers can detect partial data (D-010
information boundary compliance)
- receive_bytes() warns when overwriting unconsumed snapshot, documents
latest-wins semantics
- Rename misleading test to test_encode_produces_nonempty_bytes
- Fix tick rate comment: 10 ticks/game-minute per D-031
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Hoshe critical fixes:
- _action_enum_to_wire uses InputMapper.Action constants instead of
fragile integer literals; OPEN_MENU explicitly handled as client-only
- Remove int() coercion on tick/entity_id — use direct assignment since
GDScript int is signed 64-bit (safe for realistic tick values)
- Check encode result before buffering in send_input() — reject empty
bytes instead of corrupting the outbound stream
- Test snapshot now uses Protocol format {tick, entities} instead of
legacy schema; GameState updated to derive player position from
entity data; main.gd and world_renderer.gd updated accordingly
Hoshe warnings:
- 5 negative tests added (truncated bytes, wrong type, missing fields,
empty bytes, encode validation) — 20/20 tests pass
- receive_bytes signal is emitted at consume time in poll_snapshot by
design (documented in code)
Tyre suggestions:
- Remove duplicated root-level fixtures — single source of truth in
client/tests/fixtures/msgpack/
- gen_fixtures.rs writes directly to client/ directory
- Add `make fixtures` target for regeneration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace .lock().unwrap() with .expect("mutex poisoned") in LocalBridge
for clearer panic messages. Document 16MB MAX_MESSAGE_SIZE rationale
in framing.rs with entity count sizing analysis.
Addresses Hoshe PR review suggestions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All three sprint briefings now include tea CLI PR creation example
with required --login and --repo flags to avoid TTY prompts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Nine-layer analysis from global (art direction) to specific (audio).
Identifies gaps in content tickets for Mellanie, Paula, and Araminta.
Structured as 2-round workshop with 6 participants to produce missing
tickets, dependency chain, and content team work plan.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
SimBridge now encodes player inputs via Protocol.encode_player_input()
and exposes receive_bytes()/drain_outbound() for the transport layer.
Test mode still works unchanged. Transport (ticket #79) will call
these methods to complete the IPC pipeline.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Protocol.gd decodes ObserverSnapshot and PlayerInput from Rust's
rmp_serde wire format, and encodes PlayerInput for sending to server.
Handles rmp_serde enum encoding: unit variants as bare strings,
data variants as single-element maps.
8 fixture-based tests verify decode of Rust-generated fixtures,
GDScript encode/decode roundtrips, and cross-language compatibility.
All 15 tests pass (3 suites).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Install Godot4MessagePack (pure GDScript) for MessagePack encode/decode.
Add Rust fixture generator (gen_fixtures.rs) that produces canonical
.msgpack files using rmp_serde::to_vec_named for cross-language testing.
Fixtures cover: snapshots (empty, one NPC, multi-entity with all
EntityKind variants) and player inputs (unit + data enum variants).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
TilePosition component with discrete grid coordinates, flat-storage
WalkabilityMap resource with O(1) can_move_to() lookup, MoveIntent
component and validate_movement system. Movement validated against
walkability map each tick, blocking all NPC and player movement
through unwalkable tiles. 11 unit tests + 1 integration test.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Length-prefixed MessagePack framing (4-byte BE length + payload),
LocalBridge struct implementing SimBridge trait over Unix domain
sockets, BridgeResource wrapper for ECS integration. Adds Io
error variant to BridgeError. Two integration tests verify
snapshot and input round-trips over real sockets.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Same fix as the ticket CLI — uses git rev-parse --git-common-dir to
resolve DB path to the main worktree. Prevents WAL/journal pollution
when sqlite-query or sqlite-exec are called from feature branches.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Uses git rev-parse --git-common-dir to find the main worktree root,
then resolves the DB path there. Prevents WAL/journal pollution on
feature branch worktrees that caused merge conflicts on commonwealth.db.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Syncs team branch with main, finds the active sprint, reads the sprint
briefing, loads ticket details and key decisions, then presents an
actionable work plan with suggested first task.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sprint briefings (docs/sprints/sprint-N/{team}.md) are now the primary
starting point for implementation work. Per-agent briefings remain as
background context.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Per-team sprint briefings under docs/sprints/sprint-1/ for server,
client, and joint tracks. Each lists assigned tickets, dependencies,
key decisions to read, and implementation notes. Agents use
ticket show <id> for full details.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reference db/connectors/ticket CLI in project structure and agent
instructions. Rewrite ticket skill to use CLI commands instead of
raw SQL wrapper scripts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ergonomic Python CLI wrapping parameterized SQLite queries for ticket
management. Supports list, show, create, assign, sprint, deps, search,
epics, children, count commands with JSON output. Replaces raw SQL
access for Si and other agents.
Also includes Sprint 1 "Run" creation and story assignments:
- #77, #79 → client
- #78, #236 → server
- #81, #82, #83 → joint
- 36 tickets updated to done (boilerplate work completed by merged PRs)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
main, maintenance, server, client are protected on Gitea.
Agents must not delete or force-push to these branches.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge origin/client into main. Resolve binary conflict in
commonwealth.db by keeping main's version (latest ticket state).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Camera2D now tracks player_position from GameState (D-015)
- Add SubViewport child to minimap SubViewportContainer (fixes editor warning)
- Wire MonologueDisplay into main loop for D-016 perception data path
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Document that tea pr merge fails (405) on conflicting branches,
requiring local merge + tea pr close. Also note heredoc hanging
issue with tea comment — use temp file instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Merge origin/server into main. Resolve CHANGELOG.md conflict by keeping
both sets of entries (main's review-pr skill + server's boilerplate entries).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix input_mapper double-check bug (redundant InputEventKey + pressed filter)
- Add bounds checking for position arrays in entity_renderer and game_state
- Make test snapshot deterministic (incrementing counter, not wall clock)
- Fix tween overlap in monologue_display (cancel active tween before new one)
- Extract TILE_SIZE constant from magic number 32
- Add 5 D-030 Layer 1 fixture tests for snapshot parsing (7/7 total passing)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add roundtrip tests for all PlayerAction variants (Hoshe #6)
- Add roundtrip tests for all EntityKind variants (Hoshe #6)
- Add day wraparound at midnight edge case test (Hoshe #7)
- Add day() calculation test (Hoshe #7)
- Add out-of-order input rejection test (Hoshe #7)
- Total: 15 → 20 tests
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Documents non-interactive tea usage with all required flags to
prevent TTY crashes in Claude Code. Agents were accessing the
Gitea API directly — this standardizes on tea CLI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace raw curl API calls with tea comment command using proper
flags for non-interactive PR comment posting on Gitea.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Spawns Hoshe (code quality) and Tyre (architecture) in parallel to
review branch diffs against main. Includes Gitea tea CLI integration,
vendor/generated file exclusion patterns, and practical tips learned
from first review run on server and client boilerplate PRs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Document Gitea tea CLI usage for pull requests with all required
flags for non-interactive execution. Adds Gitea to local services.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tickets 276 (epic) and 278-286 (stories/tasks) updated to done
status after make ci-server passed green.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds tooling/install-rust script that installs Rust via rustup if
not present, with clippy and rustfmt components. Idempotent — skips
when already installed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>