From 5410e7e0b34d8c75df2e161875279c99386d23fe Mon Sep 17 00:00:00 2001 From: wtclaude Date: Wed, 12 Aug 2026 09:37:47 -0500 Subject: [PATCH] =?UTF-8?q?chore(modules):=20bump=20MODULE=5FAPI=5FVERSION?= =?UTF-8?q?=20to=201.4.0=20=E2=80=94=20the=20sidecar=20rule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 5 decision 4 (MODULE_SYSTEM.md §2.11.1): a module does not open a connection to a game server from the website process. It talks to a sidecar, which owns the durable copy of the game's state. No member was added, removed or changed — the surface is identical to 1.3.0. Minor rather than major because module-uo's `coreApi: "^1.3.0"` still resolves and module-uo already complies, but a module written against 1.3.0 could satisfy every member and still be built the wrong way round, which is what this number now says. The rule itself is MODULE_API.md §2.7 (docs, separate PR) and is the one prohibition there with no CI behind it: an outbound socket is not statically detectable the way an internal require is (§5.1). 742 server + 187 client tests pass; routes.manifest.json and swagger-output.json regenerate byte-identical. Co-Authored-By: Claude --- client/src/modules/version.js | 6 +++++- server/src/modules/version.js | 11 ++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/client/src/modules/version.js b/client/src/modules/version.js index 9150dc2..6f30105 100644 --- a/client/src/modules/version.js +++ b/client/src/modules/version.js @@ -11,6 +11,10 @@ // that the two files can drift, so a test asserts they agree // (client/test/moduleRegistry.test.js) rather than trusting a bump to remember // both. +// 1.4.0 — a rule, not a member: §2.7 forbids a module opening a connection to a +// game server from the website process (it talks to a sidecar, which owns the +// durable copy). Nothing on window.__rg changed and nothing on the server's ctx +// changed either; this half bumps because the two halves state ONE version. // 1.3.0 — three additions, all from Phase 3 slice 3 needing them: a nav item may // carry an `icon` component (§3.3), core declares a third slot // `player.invite.accepted` (§3.7), and `window.__rg.api` gained `BASE`, which @@ -26,4 +30,4 @@ // but the two halves state ONE version: a module declares a single coreApi range // and is served one chunk, so a client that claimed 1.0.0 while the server // answered 1.1.0 would be two answers to one question. -export const MODULE_API_VERSION = '1.3.0' +export const MODULE_API_VERSION = '1.4.0' diff --git a/server/src/modules/version.js b/server/src/modules/version.js index 031ae8d..94ca432 100644 --- a/server/src/modules/version.js +++ b/server/src/modules/version.js @@ -9,6 +9,15 @@ // Deliberately separate from PROTOCOL_VERSION (which versions the shard wire and // has nothing to say about a website module) and from any module's own version. +// 1.4.0 — no member changed. §2.7 gained one prohibition: a module does not open +// a connection to a game server from the website process; it talks to a sidecar, +// which owns the durable copy of the game's state. Minor rather than major +// because the SURFACE is identical to 1.3.0 — module-uo's `coreApi: "^1.3.0"` +// still resolves, and it already complies — but a module written against 1.3.0 +// could satisfy every member and still be built the wrong way round, which is +// what this number now says. The one §2.7 rule with no CI behind it: an outbound +// socket is not statically detectable the way an internal require is. +// // 1.3.0 — three CLIENT additions from Phase 3 slice 3: a nav item may carry an // `icon`, core declares a `player.invite.accepted` slot, and `window.__rg.api` // gained `BASE` (which §3.5 always specified and shared.js never published). @@ -26,6 +35,6 @@ // an admin action a module performs belongs in core's one audit log, the // extension slot needs the user its prefix names, and §2.7 forbids a module // reading core's `APP_BASE_URL` for itself. Additions only, so minor. -const MODULE_API_VERSION = '1.3.0' +const MODULE_API_VERSION = '1.4.0' module.exports = { MODULE_API_VERSION }