chore(modules): bump MODULE_API_VERSION to 1.4.0 — the sidecar rule #147

Merged
whitlocktech merged 1 commits from chore/module-api-1.4.0 into edge 2026-08-12 14:41:29 +00:00
Member

Phase 5, decision 4 (docs#145, MODULE_SYSTEM.md §2.11.1). Pairs with that PR; either order.

What this is

MODULE_API.md §2.7 gains one prohibition: a module does not open a connection to a game server from the website process — a game socket, an RCON channel, a query port, an engine's admin API. It talks to a sidecar, which owns the durable copy of the game's state.

This PR is the two declaration sites of the version number that says so.

Why it is minor, not major

No member was added, removed or changed — the surface is byte-for-byte the 1.3.0 surface. module-uo's coreApi: "^1.3.0" still resolves, and module-uo already complies, because the sidecar is where it came from.

It bumps at all because a module written against 1.3.0 could satisfy every member of ctx and api and still be built the wrong way round, and the version is the only thing a module author checks before writing code.

Why the rule exists

  • The website is the internet-facing process and the game is not. A module dialling the game directly makes the public web app the thing the game trusts. With a sidecar the game dials out and opens no listening port.
  • The sidecar owns the durable copy. It persists before it forwards — uo-link writes every event and board snapshot into SQLite and serves REST reads from there, so a website that is down, restarting or mid-deploy loses nothing. A module holding the connection itself has nowhere to put what arrives while the website is not running.
  • Neither side can stall the other. The live feed is deliberately lossy (a lagging consumer drops frames) because durability is the store's job. A module owning the socket inherits that inside an Express process, where the failure mode is a wedged request handler.

This is the one §2.7 rule with no CI behind it — an outbound socket is not statically detectable the way an internal require is (§5.1) — so it is enforced in review, and stated so that every second module does not re-decide it.

Checks

  • 742 server tests pass, 187 client tests pass (unchanged counts; the client's version test asserts the two halves agree, which is what would have caught a one-sided bump).
  • npm run routes:manifest and npm run swagger regenerate byte-identical — 166 routes + 2 internal, no spec change.

  • AI-assisted: written with Claude Code (Claude Opus), reviewed by the author.

🤖 Generated with Claude Code

https://claude.ai/code/session_018ocYxQWk3EhZe5gWRJXFU8

Phase 5, decision 4 (docs#145, `MODULE_SYSTEM.md` §2.11.1). Pairs with that PR; either order. ## What this is `MODULE_API.md` §2.7 gains one prohibition: **a module does not open a connection to a game server from the website process** — a game socket, an RCON channel, a query port, an engine's admin API. It talks to a **sidecar**, which owns the durable copy of the game's state. This PR is the two declaration sites of the version number that says so. ## Why it is minor, not major No member was added, removed or changed — the surface is byte-for-byte the 1.3.0 surface. `module-uo`'s `coreApi: "^1.3.0"` still resolves, and module-uo already complies, because the sidecar is where it came from. It bumps at all because a module written against 1.3.0 could satisfy every member of `ctx` and `api` and still be built the wrong way round, and the version is the only thing a module author checks before writing code. ## Why the rule exists - **The website is the internet-facing process and the game is not.** A module dialling the game directly makes the public web app the thing the game trusts. With a sidecar the game dials *out* and opens no listening port. - **The sidecar owns the durable copy.** It persists before it forwards — `uo-link` writes every event and board snapshot into SQLite and serves REST reads from there, so a website that is down, restarting or mid-deploy loses nothing. A module holding the connection itself has nowhere to put what arrives while the website is not running. - **Neither side can stall the other.** The live feed is deliberately lossy (a lagging consumer drops frames) because durability is the store's job. A module owning the socket inherits that inside an Express process, where the failure mode is a wedged request handler. **This is the one §2.7 rule with no CI behind it** — an outbound socket is not statically detectable the way an internal `require` is (§5.1) — so it is enforced in review, and stated so that every second module does not re-decide it. ## Checks - 742 server tests pass, 187 client tests pass (unchanged counts; the client's version test asserts the two halves agree, which is what would have caught a one-sided bump). - `npm run routes:manifest` and `npm run swagger` regenerate **byte-identical** — 166 routes + 2 internal, no spec change. --- - [x] AI-assisted: written with Claude Code (Claude Opus), reviewed by the author. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_018ocYxQWk3EhZe5gWRJXFU8
wtclaude added 1 commit 2026-08-12 14:39:05 +00:00
chore(modules): bump MODULE_API_VERSION to 1.4.0 — the sidecar rule
All checks were successful
PR Checks / client-build (pull_request) Successful in 25s
PR Checks / server-tests (pull_request) Successful in 29s
PR Checks / bot-install (pull_request) Successful in 8m45s
5410e7e0b3
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 <noreply@anthropic.com>
whitlocktech merged commit 1b692bf624 into edge 2026-08-12 14:41:29 +00:00
whitlocktech deleted branch chore/module-api-1.4.0 2026-08-12 14:41:29 +00:00
Sign in to join this conversation.
No description provided.