feat(facts): phase 13 - per-game facts, Rust and RunicNPC checked, main green again
All checks were successful
PR checks / checks (pull_request) Successful in 8m25s

platform.json drops the single protocol/bundle/capability list for a
`games` object (uo, rust) plus a `runicnpc` block. checkFacts.mjs loops
the protocol, plugin-protocol, capability and bundle checks over both
games, reads the schema-2 bundles at v2/<game>/current.json, checks each
module's coreApi, and reads RunicNPC's plugin.toml. 41 facts, up from 19;
clears the two that were red on main (Module API 1.17.0, installer
v0.8.0).

D66: the hero, footer and structured data show the Module API only; each
game's protocol and bundle go on that game's pages, and the docs landing
table splits into shared versions plus one column per game.

The re-read section 1 requires found, and this fixes:
- three hard-coded "1.6.0" Module API versions in the module docs
- module-lifecycle saying modules load alphabetically (the loader now
  refuses a second module, W19), and the install pages never mentioning
  the one-module rule
- "there is one module" in five places, now two modules both built
  inside this project; the Integration Kit keeps its draft banner
- the homepage diagram's ServUO/uo-link sub-labels (D63 wording now)

notBuilt drops `second-module` (resolved by Module-Rust's release) and
rewords `multi-module`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
This commit is contained in:
2026-10-22 08:09:22 -05:00
parent 2971b84d51
commit 9938e71e07
29 changed files with 384 additions and 154 deletions

View File

@@ -12,24 +12,28 @@
"wrong protocol number in the first place."
],
"verifiedOn": "2026-09-15",
"verifiedOn": "2026-10-22",
"protocol": 8,
"moduleApi": "1.10.0",
"bundle": {
"tag": "2026.09.15",
"sidecar": "v2.3.0",
"overlay": "v1.3.0",
"servuoMin": "57.4"
},
"$comment_moduleApi": [
"The one version every deployment shares, whichever game it runs. D66: it is the only",
"version the homepage hero and the footer show — a protocol and a bundle belong to a game,",
"so they appear on that game's own pages."
],
"moduleApi": "1.17.0",
"$comment_releases": [
"Every repository whose release the site quotes, flat, so checkFacts.mjs reads them all",
"the same way. Which game a repository belongs to is said once, under `games` below."
],
"releases": {
"installer": "v0.8.0",
"Android-app": "v0.5.0",
"link": "v2.3.0",
"installer": "v0.2.0",
"Module-uo": "v1.3.0",
"Android-app": "v0.5.0"
"Rust-Link": "v0.3.0",
"Rust-Plugins": "v0.3.0",
"Module-Rust": "v0.5.0",
"runicnpc-rust": "v1.0.0"
},
"$comment_website": [
@@ -40,16 +44,70 @@
],
"websiteHasReleases": false,
"moduleUoCapabilities": [
"shard",
"atlas",
"market",
"governors",
"guilds",
"houses",
"champs",
"cliloc"
"$comment_games": [
"PLAN.md §16. One entry per game the platform supports. Each game has its own wire",
"protocol (declared by its sidecar AND its game-side plugin, and re-read from both) and",
"its own bundle on the installer's `bundles` branch, at `v2/<bundleGame>/current.json`.",
"The root `current.json` is the schema-1 manifest and is no longer read: it stopped",
"moving when the installer went to one bundle per game.",
"",
"`module.capabilities` is re-read from the module's own module.json, unsorted order being",
"the module's business. `name` is the game's own name — D63 lets the site at large say it."
],
"games": {
"uo": {
"name": "Ultima Online",
"bundleGame": "servuo",
"protocol": 8,
"module": {
"repo": "Module-uo",
"coreApi": "^1.10.0",
"capabilities": ["shard", "atlas", "market", "governors", "guilds", "houses", "champs", "cliloc"]
},
"sidecarRepo": "link",
"pluginRepo": "servuo-plugins",
"bundle": {
"tag": "2026.09.15",
"sidecar": "v2.3.0",
"overlay": "v1.3.0",
"servuoMin": "57.4"
}
},
"rust": {
"name": "Rust",
"bundleGame": "rust",
"protocol": 14,
"module": {
"repo": "Module-Rust",
"coreApi": "^1.17.0",
"capabilities": ["rust", "servers", "killfeed", "leaderboard", "presence", "wipes", "identity", "map"]
},
"sidecarRepo": "Rust-Link",
"pluginRepo": "Rust-Plugins",
"bundle": {
"tag": "2026.10.22",
"sidecar": "v0.3.0",
"plugin": "v0.3.0",
"oxideMin": "2.0.7585",
"carbonMin": "2.0.259",
"requiresPlugins": ["Kits", "ZoneManager"],
"runicnpc": "v1.0.0"
}
}
},
"$comment_runicnpc": [
"RunicNPC — the Rust NPC plugin (PLAN.md §16, D61). It ships in the Rust bundle and also",
"stands alone, so it has facts of its own: `api` is the version a calling plugin relies",
"on, declared in runicnpc-rust's plugin.toml and re-read from there and from the bundle.",
"Its framework floors are its own and differ from the bridge's."
],
"runicnpc": {
"api": 6,
"oxideMin": "2.0.7726",
"carbonMin": "2.0.259",
"requiresPlugins": ["Kits"]
},
"androidApplicationId": "com.runicgateway.app",