Roadmap: ship the Rendezvous connection control plane #1
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Product outcome
Give SpaceGame, Unscouted, and future Final Factory multiplayer games one reusable connection control plane that can publish and browse compatible sessions, authorize a join, introduce peers through NAT, and return a typed outcome without owning gameplay or carrying normal gameplay traffic.
The service is intentionally narrower than a general game-services platform and broader than a bare server list plus NAT helper. It owns the connection lifecycle through an authenticated direct-connect attempt, then exits the gameplay path.
Product boundaries
Rendezvous owns:
Each game owns:
Gameplay hosting, social/chat, skill matchmaking, and relaying remain out of the initial runtime.
Recommended architecture
One deployable ASP.NET Core service with separable modules:
FinalFactory.Rendezvous.Server: directory, join authorization, endpoint registry, NAT mediator, and operations.FinalFactory.Rendezvous.Contracts: transport-neutral IDs, requests, responses, errors, limits, and version rules.FinalFactory.Rendezvous.Client: publisher, browser, join client, and caller-driven LiteNetLib coordinator.FinalFactory.Rendezvous.Tests: unit, contract, security, adverse-network, lifecycle, and three-party integration tests.FinalFactory.Rendezvous.TestClient: thin interactive/scriptable host, browser, and join diagnostic using only public SDK contracts.The server targets the current .NET LTS. Client/contracts remain compatible with the .NET runtime used by the Godot consumers. LiteNetLib is pinned to a stable 2.x release.
Initial ephemeral state is single-instance/in-memory behind explicit store interfaces. Shared state and deterministic mediator routing are required before horizontal scaling.
Core domain
SessionListing: bounded public discovery record.Lease: renewable capability controlling listing lifetime.HostPresence: fresh, authenticated local/public UDP observation.JoinAttempt: short-lived authorization connecting one client to one session.PunchCapability: opaque one-time credential scoped to attempt, role, game, environment, and expiry.ConnectionTicket: compact signed credential presented during the direct LiteNetLib connection.A listing is browser-visible only while both its HTTP lease and its authenticated UDP host presence are fresh. Raw endpoints, lease credentials, punch capabilities, and internal identifiers never appear in browser responses.
v1 connection flow
NetManager.NatPunchModuleusing the same gameplay UDP socket.NetManagerand sends the punch capability to the mediator.NatIntroducewith internal/external endpoints and a compact connection ticket.Initial policy recommendations to ratify
SessionListingas the canonical public noun.Delivery phases
Phase 0 — decisions and foundation
Ratify the ADR/threat model, bootstrap the solution and CI, then freeze v1 contracts and compatibility rules.
Phase 1 — minimum useful control plane
Implement game policy, listings/leases, browsing, publisher/browser SDKs, join authorization, LiteNetLib mediation, direct-connect coordination, a thin test client, and a deterministic three-party test.
Phase 2 — production hardening
Add malformed/replay/amplification defenses, rate limits, fuzz/load/soak tests, health/metrics/audit/admin controls, deployment artifacts, package/release automation, and failure/fallback examples.
Phase 3 — consumers and scale
Integrate SpaceGame and Unscouted independently, prove production run shapes, then add shared ephemeral state and mediator routing only when multiple service instances are required.
Future — relay
Specify and implement an optional relay only after direct-punch failure data justifies its cost. Relay remains isolated from directory/mediator state and is not a prerequisite for the direct-connect MVP.
Release gates
Tracking
This roadmap is complete when the implementation, hardening, adoption, and readiness issues below are closed. Individual issues remain unassigned until someone starts them.
Implementation backlog
Phase 0 — decisions and foundation
Phase 1 — minimum useful control plane
Phase 2 — public-Internet hardening and operations
Phase 3 — consumer adoption and production readiness
Optional enhancements
Evidence-driven future scope
Roadmap progress: issue #4 (versioned v1 HTTP/UDP/error/compatibility contracts) is implemented and pushed as
69c8b2doncodex/issue-4-v1-contracts. Locked restore, Release build, formatter, generated-OpenAPI drift check, real-process HTTP/UDP smoke, and all 36 tests pass. The stacked issue branch is not merged yet.Roadmap progress: issue #5 (game/environment provisioning, typed principals, and tenant-scoped signing-key lifecycle) is implemented and pushed as
47382ddoncodex/issue-5-provisioning. Locked restore, formatter, Release build, OpenAPI drift check, real Development readiness, explicit Production fail-closed startup, and all 56 tests pass. The stacked branch is not merged yet.Roadmap progress: issue #6 (bounded atomic ephemeral state and single-active availability semantics) is implemented and pushed as
02ca502oncodex/issue-6-atomic-state. Locked restore, formatter, Release build, generated-contract drift, real Development readiness, and all 78 tests pass. The stacked branch is not merged yet.Roadmap progress: issue #7 (authenticated session registration, UDP-presence-gated leases, ownership, and expiry) is implemented and pushed as
49564c7oncodex/issue-7-session-leases. Locked restore, formatter, Release build, OpenAPI drift, real HTTP/UDP smoke, and all 94 tests pass. The stacked branch is not merged yet.Roadmap progress: issue #8 (bounded compatible-session browsing and listing visibility) is implemented and pushed as
a9a2b3doncodex/issue-8-session-browser. Locked restore, formatter, Release build, OpenAPI drift, real HTTP browsing, and all 100 tests pass. The stacked branch is not merged yet.Roadmap progress: issue #9 (publisher and session-browser .NET client SDK) is implemented and pushed at
06c3973oncodex/issue-9-client-sdk.The SDK now covers typed publishing, renewal/update/deregistration, bounded browsing/paging, explicit lease maintenance, stable failures/retries, test injection seams, package guidance, API compatibility, and real-server integration. Final gates: Release build clean, package clean, 110/110 tests passing. Next dependency-ready item is #10.
Roadmap update: issue #10 is implemented and verified on
codex/issue-10-join-attemptsat1baa105(126/126 tests passing). Moving next to #11, the authenticated host-presence and amplification-safe LiteNetLib NAT mediator.Roadmap update: issue #11 is implemented, adversarially audited, and verified on
codex/issue-11-nat-mediatorat6d076c2(145/145 tests passing). Moving next to #12, the caller-owned LiteNetLib connection coordinator.Consolidated roadmap reconciliation checkpoint after closing #27:
99885f8oncodex/issue-27-diagnostic-dashboards, pushed with a clean worktree.mainbefore closure.No production-ready claim is made. The next local reconciliation step is landing the verified stack on
mainand closing the completed implementation issues; that external branch mutation still requires explicit merge authorization.Merge-gate checkpoint: the stacked roadmap branch is clean through Release build, 320/320 tests, 15/15 architecture/API/docs convention tests, formatting/analyzers, dashboard assets, compatibility/license checks, generated API verification, and the quick capacity/resilience gate. The gate exposed one full-suite-only SSE integration timeout; the test-only timing budget was stabilized and the complete suite is green again. This branch advances #1; external production/canary and public-package gates remain open.
Merge-gate update — branch green
Branch
codex/issue-27-diagnostic-dashboardsis now a clean, pushed, fast-forward candidate at589f802e2e20877a49b544849fac0fa72e077586(45 commits / 261 changed files from the reviewed base).Final verification:
origin/mainis an ancestor.The adversarial merge audit found and fixed the stream timing flake plus runner-only failures around the .NET 8 diagnostic runtime, JSONL smoke assertions, per-run ports, Docker inspect templates, bind-source visibility, and sibling-container routing. The final smoke uses an ephemeral sidecar sharing the service network namespace; the default HTTP publication remains loopback-only. No P0/P1 findings remain.
Issue assessment: ADVANCE #1, keep open. The implementation stack is mergeable, but production completion still needs external evidence that cannot be manufactured in this checkout:
#21/#22/#23/#24 therefore remain open; #28–#30 remain post-v1 trigger-gated rather than speculative.