From fe28273985ae6bcf5f9dd539f431b1a5782e0b41 Mon Sep 17 00:00:00 2001 From: Rowan Date: Wed, 14 Oct 2026 10:46:46 -0400 Subject: [PATCH 1/3] roadmap: open sprint cards moved out of the stopped sprint (2026-10-14) Each open card of this repository's sprint streams that is neither rocketnet nor v1.3 work is recorded as a roadmap entry: card id, title, what it does, tier, base branch and any pushed head to resume from. The sprint store is unchanged. Co-Authored-By: Claude Opus 5.5 --- ROADMAP.md | 53 +++++++++++++++++++++++++++++++++++++++++++++ docs/roadmap.sexp | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 ROADMAP.md create mode 100644 docs/roadmap.sexp diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 0000000..2402822 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,53 @@ +# netcode.cs 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 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 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 diff --git a/docs/roadmap.sexp b/docs/roadmap.sexp new file mode 100644 index 0000000..f115fa0 --- /dev/null +++ b/docs/roadmap.sexp @@ -0,0 +1,55 @@ +; 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 && /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 "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 "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 "")) +)) From 6cd56fd878ce0b32da664a0368aad1834ee3ab6f Mon Sep 17 00:00:00 2001 From: Rowan Date: Wed, 14 Oct 2026 11:11:59 -0400 Subject: [PATCH 2/3] roadmap: open GitHub issues and unfinished pull requests move into docs/roadmap.sexp (Glenn, 2026-10-14) Roadmaps are the standard for future work now (Glenn, 2026-10-14). Each moved issue and pull request is one item naming its number (and, for a pull request, its branch and head commit; the branch is kept). ROADMAP.md is regenerated with nova-sprint's tools/roadmap. Co-Authored-By: Claude Opus 5.5 --- ROADMAP.md | 11 +++++++++++ docs/roadmap.sexp | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/ROADMAP.md b/ROADMAP.md index 2402822..a592c2e 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -6,8 +6,19 @@ Planned work for netcode.cs. Each item below was an open sprint card, moved out ## Contents +- [Moved from GitHub issues on 2026-10-14](#moved-from-github-issues-on-2026-10-14) (1) - [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. + +### 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. diff --git a/docs/roadmap.sexp b/docs/roadmap.sexp index f115fa0..4131a06 100644 --- a/docs/roadmap.sexp +++ b/docs/roadmap.sexp @@ -11,12 +11,22 @@ :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-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." From b0adc5826ff00a2029a290f736dc27c295989c4b Mon Sep 17 00:00:00 2001 From: Rowan Claude Date: Fri, 16 Oct 2026 05:40:32 -0400 Subject: [PATCH 3/3] roadmap: record issue #6 (the pre-1.4.5 connect-token reuse) --- ROADMAP.md | 8 +++++++- docs/roadmap.sexp | 7 +++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index a592c2e..e335879 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -6,13 +6,19 @@ Planned work for netcode.cs. Each item below was an open sprint card, moved out ## Contents -- [Moved from GitHub issues on 2026-10-14](#moved-from-github-issues-on-2026-10-14) (1) +- [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: diff --git a/docs/roadmap.sexp b/docs/roadmap.sexp index 4131a06..4e357c2 100644 --- a/docs/roadmap.sexp +++ b/docs/roadmap.sexp @@ -20,6 +20,13 @@ :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:"