4.2 KiB
Code review — NEO-14 idle / rest stability (Godot client)
Date: 2026-04-05
Scope: Branch NEO-14-idle-vibration-fix vs merge-base 3283f6d04c8724f6536ca591a2a4c8ca06ea7b61 (tracked as origin/main at review time). Issue NEO-14; no PR URL supplied.
Base: origin/main @ 3283f6d04c8724f6536ca591a2a4c8ca06ea7b61
Follow-up: Review suggestions below are done (strikethrough + Done.); nits remain optional.
Verdict
Approve with nits
Summary
This branch delivers NEO-14 by hardening the prototype CharacterBody3D idle path (player.gd): dual floor_max_angle behavior, rim/straddle detection, idle nudges, bump proximity escape, floor_block_on_wall, NavigationAgent3D.avoidance_enabled = false, and physics interpolation off at project + player node level. It fixes compound internal-edge issues by spawning each QA bump as its own StaticBody3D (random_floor_bumps.gd), adds Jolt in project.godot, and reduces z-fighting via capsule mesh Y lift (visual-only vs collision shape). client/README.md and server/README.md (bump height copy) are updated. Server contracts (MoveCommand / PositionState) are not changed; risk is localized to client feel and QA geometry. Manual QA by the author reports no remaining jitter in exercised poses.
Documentation checked
| Document | Result |
|---|---|
docs/plans/NEO-14-implementation-plan.md |
Matches — Resolution, checked AC, Shipped note, updated Open questions (015ca13). |
docs/plans/NEO-11-implementation-plan.md |
Matches at intent level (client nav visual, server authority unchanged); no contract drift observed in the diff. |
docs/decomposition/modules/E1_M1_InputAndMovementRuntime.md |
Matches. Prototype client locomotion and reconciliation surface remain consistent; changes are polish under “movement-loop” / QA, not authority or wire shape. |
docs/decomposition/modules/module_dependency_register.md |
N/A for code behavior; cited as the hub for module IDs. No register Status change required for this client-only jitter fix. |
docs/decomposition/modules/client_server_authority.md |
N/A (no change to who owns PositionState or move validation). |
client/README.md |
Matches NEO-14 call to document the pattern and manual steps (idle 10+ s, bumps). |
Blocking issues
(none)
Suggestions
All done.
Close the loop inDone. Check off acceptance criteria; add Resolution (shipped mitigations) and Shipped note under technical approach —docs/plans/NEO-14-implementation-plan.md:015ca13.DRY bump collision constants (Done.BUMP_COLLISION_*aligned acrossplayer.gd/random_floor_bumps.gd):client/scripts/random_floor_bump_collision_constants.gd+ preload from both scripts; README references —015ca13, doc sync87d8ee0(file later renamed offns19_*identifiers).Future character yaw (Done._snap_capsule_upright()full identity basis):TODO(NEO-14 follow-on)on_snap_capsule_upright()inplayer.gd; plan Open questions —015ca13.
Nits
get_tree().get_nodes_in_group(...)onrandom_floor_bump_mesheach idle tick is fine at two bumps; if the group grows, cache references after spawn or guard cost.Commit history:Done. Branch history squashed to a singleNEO-14:commit before merge; no strayfix:/docs:subjects on the slice.
Verification
Per NEO-14-implementation-plan.md and client/README.md:
- Run
main.tscnwith server as in NEO-7/NEO-11 README steps. - Idle 10+ s at spawn and after a move (no click goal); confirm no visible vibration on slab and on random green bumps (new positions each run).
- Walking, arrival,
snap_to_serveron cold boot; NEO-10 reject UX (pedestal / far pad) unchanged. - Obstacle / descend flows per NEO-11 tradeoff (multi-click around tall obstacle if needed).
- Spot-check bump rim, cylinder side, and floor–bump contact (prior jitter loci).
Automated: None required for NEO-14 (no Godot harness in repo).