{ "$comment": [ "PLAN.md §12: one file holding every externally-sourced fact. Every page reads from", "here, and NO version number is ever hardcoded in prose.", "", "`scripts/checkFacts.mjs` fetches the authority for each value below and fails the build", "on any disagreement. When the platform moves, this repo goes red so someone updates the", "site — that failure is the feature, exactly as in the Integration Kit's checkCoreApi.js.", "", "Do not edit a value here to make the check pass without also re-reading the page that", "quotes it. §1's process rule exists because a stale local `main` is what produced the", "wrong protocol number in the first place." ], "verifiedOn": "2026-10-23", "$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.1", "Android-app": "v0.6.0", "link": "v2.3.0", "Module-uo": "v1.3.0", "Rust-Link": "v0.3.0", "Rust-Plugins": "v0.3.0", "Module-Rust": "v0.5.1", "runicnpc-rust": "v1.0.0" }, "$comment_website": [ "`website` publishes no releases at all — it ships as container images and is never", "tagged. The site must never print a 'website version'; it refers to the platform by", "bundle tag and Module API version instead. checkFacts.mjs asserts the releases list is", "still empty, so the day that changes, this repo notices." ], "websiteHasReleases": false, "$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//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", "$comment_androidApk": [ "Phase 5 / `/app/`. The app is not on any store, so the only way to install it is the", "signed APK attached to each Android-app release. `asset` and `checksums` are the two", "assets checkFacts.mjs asserts exist on releases/latest, and `minSdk` is re-read from", "the app's build.gradle.kts — so the download block on /app/ cannot outlive the file it", "points at, and 'Android 10 or newer' cannot outlive the number that makes it true.", "", "`serviceable` is the one value here with no authority to check it against, and it is", "deliberately manual. It answers a question no API can: does the published build", "actually work. The org lead reports v0.5.0's does not, so the download block renders a", "'being replaced' state instead of a link, and flipping this to true is the single edit", "that turns the link back on once a working build is released. A check cannot run an", "APK; a person can, and this is where they record that they did." ], "androidApk": { "asset": "runic-gateway-0.6.0.apk", "checksums": "SHA256SUMS", "minSdk": 29, "minAndroid": "10", "serviceable": false }, "gitea": { "base": "https://gitea.whitlocktech.com", "org": "RunicGateway" } }