Skip to content

Conversation

@danieldilly
Copy link
Contributor

Summary

Implements FS-0007: v0 Two-Client Multiplayer Slice — the minimal end-to-end multiplayer foundation for Flowstate.

  • Simulation Core (crates/sim): Deterministic World with fixed timestep, explicit tick parameter, FNV-1a 64-bit state digest, WASD movement (5.0 units/sec)
  • Wire Protocol (crates/wire): Shared protobuf types (ClientHello, ServerWelcome, InputCmdProto, SnapshotProto, ReplayArtifact)
  • Replay System (crates/replay): Full verification pipeline with initialization and final digest anchors
  • Server Edge (crates/server): Input validation, InputSeq selection, TargetTickFloor management, LastKnownIntent fallback, session management

Trace Block

Issue: #7
Spec: docs/specs/FS-0007-v0-multiplayer-slice.md
Constitution: INV-0001, INV-0002, INV-0003, INV-0004, INV-0005, INV-0006, INV-0007, DM-0001, DM-0006, DM-0007, DM-0014, DM-0016, DM-0017, DM-0018, DM-0019, DM-0020, DM-0023, DM-0024, DM-0025, DM-0026, DM-0027, AC-0001, KC-0001, KC-0002
ADRs: ADR-0001, ADR-0002, ADR-0003, ADR-0004, ADR-0005, ADR-0006, ADR-0007

Files Changed

  • crates/sim/Cargo.toml — Updated metadata
  • crates/sim/src/lib.rs — Complete Simulation Core implementation (World, StepInput, Snapshot, Baseline, StateDigest)
  • crates/wire/Cargo.toml — New crate for shared wire protocol types
  • crates/wire/src/lib.rs — Protobuf message types (prost derive)
  • crates/replay/Cargo.toml — New crate for replay recording/verification
  • crates/replay/src/lib.rs — AppliedInput, ReplayRecorder, verify_replay()
  • crates/server/Cargo.toml — New crate for Server Edge
  • crates/server/src/lib.rs — Server main module (session lifecycle, stepping, finalization)
  • crates/server/src/session.rs — Session management
  • crates/server/src/validation.rs — Input validation (NaN/Inf, magnitude, tick window, rate limit)
  • crates/server/src/input_buffer.rs — Input buffering with InputSeq selection

Determinism / Simulation Impact

  • This PR changes simulation-plane logic
    • Impact: Establishes the deterministic foundation. World::advance() is pure (no I/O), uses explicit tick parameter per ADR-0003, and produces identical StateDigest for identical inputs.
    • Verification: test_t0_04_determinism_multiple_runs verifies digest equality across fresh World instances. test_t0_09_replay_verification_passes validates full replay path.

Verification

  • just ci — All 58 tests pass (sim: 16, wire: 6, replay: 8, server: 28)
  • just ids — Constitution IDs valid
  • just spec-lint — Spec lint passed

Test Coverage (Tier-0 Gates)

Gate Test
T0.1 test_t0_01_two_client_handshake
T0.2 test_t0_02_join_baseline
T0.4 test_t0_04_wasd_deterministic_movement, test_t0_04_determinism_multiple_runs
T0.5 test_t0_05_advance_takes_explicit_tick, crate isolation
T0.5a test_t0_05a_tick_floor_relationship
T0.7 test_t0_07_malformed_inputs_no_crash
T0.8 test_t0_08_replay_artifact_has_required_fields
T0.9 test_t0_09_replay_verification_passes
T0.10 test_t0_10_initialization_anchor_failure
T0.11 test_t0_11_future_input_buffered
T0.12 test_t0_12_lki_determinism, test_t0_12_lki_fallback, test_t0_12_empty_inputs_deterministic
T0.12a test_t0_12a_noncanonical_input_order
T0.13 test_t0_13_inputseq_tie_uses_lki, validation tests
T0.13a test_t0_13a_floor_enforcement_recovery
T0.14 test_t0_14_disconnect_handling
T0.15 test_t0_15_match_termination
T0.16 test_t0_16_connection_timeout
T0.17 test_t0_17_playerid_test_mode, test_t0_17_playerid_non_assumption
T0.18 test_t0_18_floor_coherency_broadcast
T0.19 test_t0_19_wire_crate_exists (shared crate structure)
T0.20 just ci passes

Risk / Notes

  • Networking not integrated: This PR provides server-side logic in "manual step mode." Actual ENet transport layer is a follow-up (Tier-1).
  • No Game Client: Client implementation is deferred. Tests simulate client behavior via server API.
  • Cross-platform replay: Deferred per ADR-0005 (v0 scope is same-build, same-platform).

Checklist

  • Trace block is complete and accurate
  • This PR stays within Constitution invariants (no silent weakening)
  • No new dependencies added, or licensing intake updated under docs/licensing/
  • Spec exists for non-trivial changes
  • Gates added per spec's Gate Plan

@danieldilly danieldilly merged commit e8f772a into main Dec 23, 2025
1 check passed
@danieldilly danieldilly deleted the fs/0007-v0-multiplayer-slice branch December 23, 2025 21:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant