Commit Graph

424 Commits

Author SHA1 Message Date
daddy 3596922696 Fix real flake in smoke_test_network_client.gd's prediction-buffer check
Found while re-verifying the full PC2 test suite from a fresh clone:
the "prediction buffer has entries" check failed ~1 in 3 runs. Root
cause is a genuine race in the test, not in prediction/reconciliation
itself -- a server snapshot RPC can land on the 60-frame loop's final
`await process_frame`, triggering a legitimate reconciliation that
clears the buffer (network_client.gd's documented behavior) right
before the check reads it. The desync-correction check right after it
already proves reconciliation logic works correctly on its own, so
this was never actually catching a real bug -- just occasionally
racing a real correction event.

Fix: one more predict_and_send() right before the check guarantees a
fresh buffer entry regardless of whether a correction just fired.
Verified 5/5 clean runs against a real dedicated server after the fix
(previously observed a failure within 3 runs).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M6rUEynmv2QmweocAQYARN
2026-08-21 01:44:28 +00:00
agent-bot 1526f3a636 Merge pull request 'Avatar loader & customization system: merge onto main + fix regressions, add smoke coverage' (#53) from agent/896fbb97de1d into main 2026-08-21 01:35:28 +00:00
coder-bot b6e146e4b2 Avatar loader & customization system: merge onto main + fix regressions, add smoke coverage
Merges the pre-existing avatar system implementation (catalog, slot
registry, loadout, glTF-based loader, customization UI, visualizer --
~2300 lines across scripts/avatar/) onto current main, which had
diverged significantly since this branch was last touched (PC1 UI
fixes, PC2's playable level/player/multiplayer work).

Fixes found while integrating:
- project.godot had wholesale-replaced the [autoload] section again
  (same recurring pattern as the multiplayer server/client branches),
  dropping the ApiClient autoload entirely. Restored it additively
  alongside AvatarSystem.
- All other real conflicts (main_menu.tscn/.gd, main.tscn, .godot
  cache) were pure "this branch re-created a stale duplicate of
  something main already has" -- resolved by taking main's version,
  confirmed via `git diff` that this task's own changes never touched
  those files' actual logic.

New: scripts/smoke_test_avatar_system.gd -- confirms AvatarSystem is a
real autoload, the committed catalog.json parses, loadout equip/
validate/JSON-round-trip works against real catalog entries, and --
since assets/avatars/*.glb model files don't exist yet -- that
AvatarLoader.load_base_body() fails gracefully (null + load_error
signal) rather than crashing when given a real catalog entry with no
backing file. 10/10 passing.

Verified no regressions: all 10 pre-existing Godot smoke suites still
pass against a live backend, and all 61 backend pytest tests pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M6rUEynmv2QmweocAQYARN
2026-08-21 01:34:51 +00:00
coder-bot 59ca5a4c6e Merge main into agent/896fbb97de1d
# Conflicts:
#	.godot/editor/filesystem_cache10
#	.godot/editor/project_metadata.cfg
#	.godot/global_script_class_cache.cfg
#	.godot/uid_cache.bin
#	project.godot
#	scenes/main.tscn
#	scenes/main_menu.tscn
#	scripts/main_menu.gd
#	scripts/main_menu.gd.uid
2026-08-21 01:26:13 +00:00
reviewer-bot b422e41a0f Merge pull request 'Client-side position sync + prediction/reconciliation' (#52) from agent/806cbbff5213 into main 2026-08-21 01:22:34 +00:00
claude-checkpoint-tooling bd44ecba14 Client-side position sync + prediction/reconciliation
Real client-side networking for the player controller, verified with a
genuine two-process integration test (an actual dedicated server process
+ a real ENet-connected client), per docs/architecture/networking.md §5.

scripts/network_client.gd: NetworkClient -- predicts movement locally on
input (same movement constants as scripts/player_spawner.gd), sends input
to the server via RPC, and reconciles against the server's authoritative
snapshots when they diverge beyond a threshold.

scripts/network_receiver_proxy.gd + network_player_proxy.gd: the RPC
plumbing that makes this actually route correctly, which took real
debugging to get right:
- Godot's rpc_id() resolves the receiving node by matching the sending
  node's NodePath between peers. scripts/server.gd is the SceneTree root
  node "Server" when the dedicated server runs, and spawns each player as
  "Player_<peer_id>" under itself -- so the client needs its own node
  tree at those same paths purely for RPC routing.
- Godot also enforces an RPC "node checksum": both peers must declare the
  *same set* of @rpc methods at a matching path, or every RPC at that
  path fails, not just a genuinely missing one. Every @rpc method on
  scripts/server.gd's root and scripts/player_spawner.gd had to be
  mirrored here (mostly as no-op stubs), not just the ones this class
  actually calls.

Known, explicitly-scoped simplification (stated in the code, not hidden):
scripts/server.gd's snapshot doesn't currently echo back a per-peer "last
input seq processed", so reconciliation corrects against the most recent
prediction rather than true tick-exact rollback-and-replay
(networking.md §5.2 step 4). A real follow-up once the server echoes
that ack, not faked here.

Verified: real two-process test (godot --headless --path . scenes/
server.tscn as an actual persistent process, a second process running
scripts/smoke_test_network_client.gd against it over real ENet) --
4/4 passing: connects, predicts locally before any server round trip,
sends real input, and a deliberately-desynced position (moved 9999 units
away) gets corrected by the very next real snapshot. Full existing
client suite (10 suites) + 61 backend pytest still passing.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M6rUEynmv2QmweocAQYARN
2026-08-21 01:21:37 +00:00
coder-bot bae326e14c WIP checkpoint: Client-side position sync + prediction/reconciliation 2026-08-21 01:18:34 +00:00
coder-bot 140db9df91 Recovered orphaned WIP before switching to a new task 2026-08-21 01:17:16 +00:00
coder-bot 2dff83bae3 WIP checkpoint: Client-side position sync + prediction/reconciliation 2026-08-21 01:17:13 +00:00
coder-bot 1a8821e3c8 WIP checkpoint: Client-side position sync + prediction/reconciliation 2026-08-21 01:14:07 +00:00
reviewer-bot 019dfca14f Merge pull request 'Address review feedback: Implement Godot dedicated server scene + player spawning' (#51) from agent/3bba30f838d1 into main 2026-08-21 01:00:23 +00:00
claude-checkpoint-tooling 7be50e3313 Fix real scene collision + a real regression from removing the Server autoload
Two genuine bugs, found by reproducing rather than trusting the branch's
own state:

1. scenes/player.tscn collided with PC2's client-side player scene at the
   exact same path (server-authoritative PlayerNode vs. the local
   single-player character) -- whichever merged last would silently
   overwrite the other. The branch's own last commit had literally
   committed unresolved <<<<<<< conflict markers into the file instead of
   resolving them. Renamed the server's version to
   scenes/server_player.tscn, restored scenes/player.tscn to match main's
   real client scene exactly, repointed scripts/server.gd's preload.

2. scenes/server.tscn's root Node had no script attached at all -- it only
   ever worked before because project.godot had `Server` registered as a
   project-wide autoload (the exact wholesale-overwrite this task was
   already asked to fix). Once that autoload was correctly removed,
   nothing attached server.gd to the scene tree anymore and the dedicated
   server silently did nothing. Attached scripts/server.gd directly to
   scenes/server.tscn's root node instead.

Verified: godot --headless --import/--quit both clean, full 10-suite
client smoke test all passing, and the dedicated server actually listens
on UDP port 7777 when launched explicitly (`godot --path . scenes/server.tscn`)
-- confirmed with `ss -ulnp`, not just trusting the startup print (first
checked with `ss -tlnp`, which only shows TCP and falsely suggested it
wasn't listening at all; ENet is UDP).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M6rUEynmv2QmweocAQYARN
2026-08-21 00:59:24 +00:00
coder-bot 29de1c5c3a Merge main into agent/3bba30f838d1 2026-08-21 00:56:17 +00:00
claude-checkpoint-tooling 92c10fa657 Add smoke_test_enter_world.gd + doc update that never made it into PR #50
Both were verified (9/9 passing) before PR #50 merged but got lost in the
handoff between my push and the concurrent live agent session reusing the
same workspace -- PR #50's actual merged diff only had the world_list.gd/
player.gd code changes, missing the new test file and the doc update.
Caught while auditing everything feeding PC2 for real completeness.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M6rUEynmv2QmweocAQYARN
2026-08-21 00:53:55 +00:00
reviewer-bot 8357643072 Merge pull request 'PC2: Wire "Enter World" from the browse list to the playable level' (#50) from agent/9e7930c1b631 into main 2026-08-21 00:47:26 +00:00
architect-bot 736ebce0d0 WIP checkpoint: Address review feedback: Implement Godot dedicated server scene + player spawning 2026-08-21 00:44:47 +00:00
coder-bot b60480798f WIP checkpoint: PC2: Wire "Enter World" from the browse list to the playable level 2026-08-21 00:43:45 +00:00
reviewer-bot 77f7511a4f Merge pull request 'PC2: Basic visible player character representation + local movement controller' (#49) from agent/9bfb90314053 into main 2026-08-21 00:41:53 +00:00
coder-bot 8be962248d Merge main into agent/9bfb90314053
# Conflicts:
#	scenes/worlds/test_level.tscn
2026-08-21 00:39:28 +00:00
claude-checkpoint-tooling 7790670559 WIP: add Camera3D, fix jump/forward-direction bugs, add mouse capture, build game.tscn composition 2026-08-21 00:39:13 +00:00
architect-bot c4eab8db92 WIP checkpoint: Address review feedback: Implement Godot dedicated server scene + player spawning 2026-08-21 00:20:21 +00:00
coder-bot 4d754ae48e WIP checkpoint: Implement avatar loader and customization UI in Godot 2026-08-21 00:19:51 +00:00
coder-bot e2a77b055f WIP checkpoint: PC2: Basic visible player character representation 2026-08-21 00:09:44 +00:00
coder-bot 5966fa9044 WIP checkpoint: PC2: Basic visible player character representation 2026-08-21 00:06:54 +00:00
coder-bot d1d03df2e6 WIP checkpoint: Implement avatar loader and customization UI in Godot 2026-08-21 00:01:24 +00:00
architect-bot 4dda636ed0 WIP checkpoint: Address review feedback: Implement Godot dedicated server scene + player spawning 2026-08-21 00:01:15 +00:00
coder-bot 945c498a31 WIP checkpoint: PC2: Basic visible player character representation 2026-08-21 00:01:08 +00:00
reviewer-bot be0acb1862 Merge pull request 'PC2: Build a basic playable test level scene' (#48) from agent/0c49a36fc7db into main 2026-08-21 00:00:12 +00:00
coder-bot 8118f3074b WIP checkpoint: PC2: Basic visible player character representation 2026-08-20 23:46:29 +00:00
architect-bot 4276a89a6a WIP checkpoint: Address review feedback: Implement Godot dedicated server scene + player spawning 2026-08-20 23:31:27 +00:00
architect-bot 5803f47069 WIP checkpoint: PC2: Basic visible player character representation 2026-08-20 23:19:05 +00:00
coder-bot e33b91d976 WIP checkpoint: PC2: Build a basic playable test level scene 2026-08-20 23:17:43 +00:00
coder-bot 1c3c57dbd0 WIP checkpoint: Address review feedback: Implement Godot dedicated server scene + player spawning 2026-08-20 23:17:09 +00:00
coder-bot fdc43bd5f1 WIP checkpoint: PC2: Build a basic playable test level scene 2026-08-20 23:01:55 +00:00
architect-bot 406ff3457e WIP checkpoint: PC2: Basic visible player character representation 2026-08-20 22:50:48 +00:00
coder-bot 3f7acf857c WIP checkpoint: PC2: Build a basic playable test level scene 2026-08-20 22:41:53 +00:00
coder-bot 6648b2bba5 WIP checkpoint: PC2: Build a basic playable test level scene 2026-08-20 22:31:46 +00:00
coder-bot bfcbd0486f WIP checkpoint: Implement avatar loader and customization UI in Godot 2026-08-20 22:30:31 +00:00
architect-bot f70b5b2ee5 WIP checkpoint: PC2: Basic visible player character representation 2026-08-20 22:28:06 +00:00
architect-bot 2fa7b1f475 WIP checkpoint: PC2: Basic visible player character representation 2026-08-20 22:26:08 +00:00
coder-bot 7f753cb1b8 WIP checkpoint: PC2: Build a basic playable test level scene 2026-08-20 22:17:48 +00:00
coder-bot 1be947f9ef WIP checkpoint: Implement avatar loader and customization UI in Godot 2026-08-20 22:05:30 +00:00
reviewer-bot 66adcff145 Merge pull request 'PC2: Design the test level & player spawn approach' (#46) from agent/a6deeb84eace into main 2026-08-20 21:58:55 +00:00
coder-bot 88197ffe8f WIP checkpoint: Implement Godot dedicated server scene + player spawning 2026-08-20 21:28:00 +00:00
coder-bot 38d97a3051 WIP checkpoint: Implement avatar loader and customization UI in Godot 2026-08-20 21:27:57 +00:00
coder-bot 174d3c2630 WIP checkpoint: Implement Godot dedicated server scene + player spawning 2026-08-20 21:11:52 +00:00
coder-bot b86e4053bd WIP checkpoint: Implement avatar loader and customization UI in Godot 2026-08-20 21:11:25 +00:00
coder-bot 07f655815f WIP checkpoint: Implement avatar loader and customization UI in Godot 2026-08-20 21:09:33 +00:00
architect-bot 2ffcd9cd3f WIP checkpoint: PC2: Design the test level & player spawn approach 2026-08-20 21:09:30 +00:00
claude-checkpoint-tooling aeccc78143 Fix login form fields reappearing after Play -> Back (real playtest bug)
_show_authenticated() (the session-restore path, used when returning to
main_menu.tscn -- e.g. after clicking Back from world_list) only hid
EmailEdit/Over18Check, unlike _on_auth_complete() (the fresh-login path)
which hides the full form: UsernameEdit, PasswordEdit, EmailEdit,
Over18Check, AuthButton, AuthModeLabel. Play was correctly enabled and
the welcome message was correctly visible, so a check that stopped at
those two passed clean -- but the actual login fields were still on
screen, which is what a real user sees as "it's making me log in again."
Confirmed via live PC1 playtest today.

Reported by: real playtest, 2026-08-20 (yesterday's automated regression
test for this exact Play -> Back flow only asserted Play/welcome/auth
buttons row -- strengthened smoke_test_main_menu_back.gd to also check
the individual form fields, and confirmed it fails exactly this way with
the bug reintroduced before restoring the fix).

Verified against a live backend: 61/61 pytest (unaffected), 8/8 Godot
smoke tests (including 20/20 on the strengthened back-nav test).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M6rUEynmv2QmweocAQYARN
2026-08-20 19:21:40 +00:00