Files
runicgateway.com/src/data/platform.json
wtclaude 06a8892895
All checks were successful
PR checks / checks (pull_request) Successful in 2m28s
chore(facts): Android-app v0.6.0 and Module-Rust v0.5.1
Both were released on 2026-10-23. Android-app v0.6.0 is the cutover that
ships the Rust screens and the app's core wording (M20), and its APK asset
is runic-gateway-0.6.0.apk. Module-Rust v0.5.1 brings the weapon names in
the feed. verifiedOn moves to 2026-10-23, and checkFacts agrees on all 41
facts.

androidApk.serviceable stays false. It records a person's confirmation
that the published APK works, and nobody has run v0.6.0 against a real
site yet. A smoke test of the signed APK on the emulator covered install,
launch, the HTTPS rule and one TLS round trip, but no Runic Gateway site
serves HTTPS locally.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
2026-10-23 02:32:59 -05:00

141 lines
5.4 KiB
JSON

{
"$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/<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",
"$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"
}
}