Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions ROADMAP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# netcode.cs roadmap

<!-- Generated from docs/roadmap.sexp by tools/roadmap. Do not edit this file: edit docs/roadmap.sexp and run `make roadmap`. -->

Planned work for netcode.cs. Each item below was an open sprint card, moved out of the stopped sprint on 2026-10-14; it names its card, its tier, its base branch and any pushed work to resume from. Landed work is in git.

## Contents

- [Moved from GitHub issues on 2026-10-14](#moved-from-github-issues-on-2026-10-14) (2)
- [Moved out of the sprint on 2026-10-14: netcode-cs-port](#moved-out-of-the-sprint-on-2026-10-14-netcode-cs-port) (5)

## Moved from GitHub issues on 2026-10-14

Open GitHub issues of mas-bandwidth/netcode.cs, recorded here on 2026-10-14 when roadmaps became the standard for future work (Glenn, 2026-10-14). Each item names its issue; the issue is closed with a pointer here.

### Port still has the pre-1.4.5 connect-token reuse (GHSA-v29p-3vj4-vg4f)

C netcode 1.4.5 (advisory GHSA-v29p-3vj4-vg4f) spends a connect token when the client is installed. A consumed token admits nothing, from any address. History-full refuses instead of evicting. Tokens that could have been issued before this server process started are refused.

From: mas-bandwidth/netcode.cs issue #6, opened 2026-09-07 by gafferongames; moved here 2026-10-14, added 2026-10-16

### Mirror #191: two new create-time error codes and the unchecked callback class

The C reference landed a robustness batch in mas-bandwidth/netcode#191 (from netcode#190). Two pieces of it are mirrored surface in this port and should land here too. No wire format change in either. netcode.h gained:

From: mas-bandwidth/netcode.cs issue #7, opened 2026-09-13 by rowan-claude; moved here 2026-10-14

## Moved out of the sprint on 2026-10-14: netcode-cs-port

The open cards of sprint stream netcode-cs-port, moved out of the stopped sprint on 2026-10-14, one item per card. Landed cards of the stream are in git and are not listed. Each item names its card, its tier, its base branch and any pushed work to resume from.

### Cs netcode disconnect callback cannot reenter a clearing slot

Server.DisconnectClientInternal calls the callback at src/Server.cs:563 and clears the slot at 580-584; a re-entrant disconnect reaches ClientIndex[-1] at :580 and throws IndexOutOfRangeException, and a callback with no self-guard recurses to an uncatchable StackOverflow.

Why it waits: Moved out of the stopped sprint on 2026-10-14: neither rocketnet nor v1.3 work.

From: sprint card cs-netcode-disconnect-callback-cannot-reenter-a-clearing-slot (stream netcode-cs-port, column working, tier pro, base sprint/netcode-cs-port), moved out of the sprint 2026-10-14

### Cs netcode replay top sequence and restart floor edges

N4: `if (sequence == ulong.MaxValue) return true;` first in AlreadyReceived.

Why it waits: Moved out of the stopped sprint on 2026-10-14: neither rocketnet nor v1.3 work.

From: sprint card cs-netcode-replay-top-sequence-and-restart-floor-edges (stream netcode-cs-port, column waiting, tier pro, base sprint/netcode-cs-port), moved out of the sprint 2026-10-14

### Cs netcode token lifetimes are bounded

N7: a pure PreconnectExpireTime( time, timeoutSeconds ) returning time + (timeoutSeconds > 0 ? timeoutSeconds : Defines.PreconnectMappingSeconds /* 10 */), used at src/Server.cs:714.

Why it waits: Moved out of the stopped sprint on 2026-10-14: neither rocketnet nor v1.3 work.

From: sprint card cs-netcode-token-lifetimes-are-bounded (stream netcode-cs-port, column waiting, tier pro, base sprint/netcode-cs-port), moved out of the sprint 2026-10-14

### Cs netcode client refuses a server address it has no socket for

The port never touches a closed descriptor (`socketIpv4?.` at src/Netcode.cs:1990, 1994; null checks at src/Client.cs:508-517) but silently drops sends, and Connect and ConnectToNextServer (src/Client.cs:348-349, 630-631) never skip the address or set InvalidConnectToken.

Why it waits: Moved out of the stopped sprint on 2026-10-14: neither rocketnet nor v1.3 work.

From: sprint card cs-netcode-client-refuses-a-server-address-it-has-no-socket-for (stream netcode-cs-port, column waiting, tier pro, base sprint/netcode-cs-port), moved out of the sprint 2026-10-14

### Cs netcode global packet nonces differ between servers sharing a token

Cs netcode global packet nonces differ between servers sharing a token. Done when: the new tests are red before the fix and green after it;

Why it waits: Moved out of the stopped sprint on 2026-10-14: neither rocketnet nor v1.3 work.

From: sprint card cs-netcode-global-packet-nonces-differ-between-servers-sharing-a-token (stream netcode-cs-port, column waiting, tier pro, base sprint/netcode-cs-port), moved out of the sprint 2026-10-14
72 changes: 72 additions & 0 deletions docs/roadmap.sexp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
; The netcode.cs roadmap: the data ROADMAP.md is generated from.
; Same shape as nova-sprint's docs/roadmap.sexp (internal/roadmapdoc's package comment):
; data, never evaluated. Edit this file, then regenerate ROADMAP.md with nova-sprint's
; generator, from a nova-sprint checkout:
; go build -o /tmp/roadmap ./tools/roadmap && (cd <this repo> && /tmp/roadmap --file docs/roadmap.sexp --out ROADMAP.md)
; Never edit ROADMAP.md by hand. Created 2026-10-14 when the open sprint cards of this
; repository were moved out of the stopped sprint.
(roadmap "v1"
:title "netcode.cs roadmap"
:text "Planned work for netcode.cs. Each item below was an open sprint card, moved out of the stopped sprint on 2026-10-14; it names its card, its tier, its base branch and any pushed work to resume from. Landed work is in git."

:groups
(
(group "github-issues" :title "Moved from GitHub issues on 2026-10-14"
:text "Open GitHub issues of mas-bandwidth/netcode.cs, recorded here on 2026-10-14 when roadmaps became the standard for future work (Glenn, 2026-10-14). Each item names its issue; the issue is closed with a pointer here.")

(group "export-netcode-cs-port" :title "Moved out of the sprint on 2026-10-14: netcode-cs-port"
:text "The open cards of sprint stream netcode-cs-port, moved out of the stopped sprint on 2026-10-14, one item per card. Landed cards of the stream are in git and are not listed. Each item names its card, its tier, its base branch and any pushed work to resume from.")
)

:items
(
(item "issue-6" :group "github-issues" :area "netcode.cs"
:title "Port still has the pre-1.4.5 connect-token reuse (GHSA-v29p-3vj4-vg4f)"
:text "C netcode 1.4.5 (advisory GHSA-v29p-3vj4-vg4f) spends a connect token when the client is installed. A consumed token admits nothing, from any address. History-full refuses instead of evicting. Tokens that could have been issued before this server process started are refused."
:date "2026-10-14"
:origin "mas-bandwidth/netcode.cs issue #6, opened 2026-09-07 by gafferongames; moved here 2026-10-14, added 2026-10-16"
:kept (:github-issue "6" :labels ""))

(item "issue-7" :group "github-issues" :area "netcode.cs"
:title "Mirror #191: two new create-time error codes and the unchecked callback class"
:text "The C reference landed a robustness batch in mas-bandwidth/netcode#191 (from netcode#190). Two pieces of it are mirrored surface in this port and should land here too. No wire format change in either. netcode.h gained:"
:date "2026-10-14"
:origin "mas-bandwidth/netcode.cs issue #7, opened 2026-09-13 by rowan-claude; moved here 2026-10-14"
:kept (:github-issue "7" :labels ""))

(item "cs-netcode-disconnect-callback-cannot-reenter-a-clearing-slot" :group "export-netcode-cs-port" :area "netcode.cs"
:title "Cs netcode disconnect callback cannot reenter a clearing slot"
:text "Server.DisconnectClientInternal calls the callback at src/Server.cs:563 and clears the slot at 580-584; a re-entrant disconnect reaches ClientIndex[-1] at :580 and throws IndexOutOfRangeException, and a callback with no self-guard recurses to an uncatchable StackOverflow."
:why "Moved out of the stopped sprint on 2026-10-14: neither rocketnet nor v1.3 work."
:date "2026-10-14"
:origin "sprint card cs-netcode-disconnect-callback-cannot-reenter-a-clearing-slot (stream netcode-cs-port, column working, tier pro, base sprint/netcode-cs-port), moved out of the sprint 2026-10-14"
:kept (:sprint-card "cs-netcode-disconnect-callback-cannot-reenter-a-clearing-slot" :sprint-stream "netcode-cs-port" :sprint-column "working" :tier "pro" :sprint-base "sprint/netcode-cs-port" :needs "cs-netcode-connection-response-takes-only-its-own-mappings-challenge" :pushed-head "" :pushed-branch ""))
(item "cs-netcode-replay-top-sequence-and-restart-floor-edges" :group "export-netcode-cs-port" :area "netcode.cs"
:title "Cs netcode replay top sequence and restart floor edges"
:text "N4: `if (sequence == ulong.MaxValue) return true;` first in AlreadyReceived."
:why "Moved out of the stopped sprint on 2026-10-14: neither rocketnet nor v1.3 work."
:date "2026-10-14"
:origin "sprint card cs-netcode-replay-top-sequence-and-restart-floor-edges (stream netcode-cs-port, column waiting, tier pro, base sprint/netcode-cs-port), moved out of the sprint 2026-10-14"
:kept (:sprint-card "cs-netcode-replay-top-sequence-and-restart-floor-edges" :sprint-stream "netcode-cs-port" :sprint-column "waiting" :tier "pro" :sprint-base "sprint/netcode-cs-port" :needs "cs-netcode-disconnect-callback-cannot-reenter-a-clearing-slot,netfix-restart-floor-refuses-a-token-from-the-start-second" :pushed-head "" :pushed-branch ""))
(item "cs-netcode-token-lifetimes-are-bounded" :group "export-netcode-cs-port" :area "netcode.cs"
:title "Cs netcode token lifetimes are bounded"
:text "N7: a pure PreconnectExpireTime( time, timeoutSeconds ) returning time + (timeoutSeconds > 0 ? timeoutSeconds : Defines.PreconnectMappingSeconds /* 10 */), used at src/Server.cs:714."
:why "Moved out of the stopped sprint on 2026-10-14: neither rocketnet nor v1.3 work."
:date "2026-10-14"
:origin "sprint card cs-netcode-token-lifetimes-are-bounded (stream netcode-cs-port, column waiting, tier pro, base sprint/netcode-cs-port), moved out of the sprint 2026-10-14"
:kept (:sprint-card "cs-netcode-token-lifetimes-are-bounded" :sprint-stream "netcode-cs-port" :sprint-column "waiting" :tier "pro" :sprint-base "sprint/netcode-cs-port" :needs "cs-netcode-replay-top-sequence-and-restart-floor-edges,netfix-preconnect-mapping-lifetime-ignores-a-nonpositive-token-timeout,netfix-never-expiring-tokens-are-refused-or-documented-against-the-restart-floor" :pushed-head "" :pushed-branch ""))
(item "cs-netcode-client-refuses-a-server-address-it-has-no-socket-for" :group "export-netcode-cs-port" :area "netcode.cs"
:title "Cs netcode client refuses a server address it has no socket for"
:text "The port never touches a closed descriptor (`socketIpv4?.` at src/Netcode.cs:1990, 1994; null checks at src/Client.cs:508-517) but silently drops sends, and Connect and ConnectToNextServer (src/Client.cs:348-349, 630-631) never skip the address or set InvalidConnectToken."
:why "Moved out of the stopped sprint on 2026-10-14: neither rocketnet nor v1.3 work."
:date "2026-10-14"
:origin "sprint card cs-netcode-client-refuses-a-server-address-it-has-no-socket-for (stream netcode-cs-port, column waiting, tier pro, base sprint/netcode-cs-port), moved out of the sprint 2026-10-14"
:kept (:sprint-card "cs-netcode-client-refuses-a-server-address-it-has-no-socket-for" :sprint-stream "netcode-cs-port" :sprint-column "waiting" :tier "pro" :sprint-base "sprint/netcode-cs-port" :needs "cs-netcode-token-lifetimes-are-bounded,netfix-client-refuses-a-server-address-it-has-no-socket-for" :pushed-head "" :pushed-branch ""))
(item "cs-netcode-global-packet-nonces-differ-between-servers-sharing-a-token" :group "export-netcode-cs-port" :area "netcode.cs"
:title "Cs netcode global packet nonces differ between servers sharing a token"
:text "Cs netcode global packet nonces differ between servers sharing a token. Done when: the new tests are red before the fix and green after it;"
:why "Moved out of the stopped sprint on 2026-10-14: neither rocketnet nor v1.3 work."
:date "2026-10-14"
:origin "sprint card cs-netcode-global-packet-nonces-differ-between-servers-sharing-a-token (stream netcode-cs-port, column waiting, tier pro, base sprint/netcode-cs-port), moved out of the sprint 2026-10-14"
:kept (:sprint-card "cs-netcode-global-packet-nonces-differ-between-servers-sharing-a-token" :sprint-stream "netcode-cs-port" :sprint-column "waiting" :tier "pro" :sprint-base "sprint/netcode-cs-port" :needs "cs-netcode-client-refuses-a-server-address-it-has-no-socket-for,netfix-global-packet-nonces-differ-between-servers-sharing-a-token" :pushed-head "" :pushed-branch ""))
))
Loading