feat(site): phase 17 — per-game module pages, /runicnpc/, and checkTerms over the built site #38

Merged
whitlocktech merged 1 commits from feat/phase-17-marketing into main 2026-10-22 20:26:03 -05:00
Member

What & why

PLAN.md §16 phase 17 (marketing), built on the org lead's answers of 2026-10-22, recorded as D75–D79 (count of record 79; "How phase 17 built it" in PLAN.md).

  • D75: core pages use neutral words and link to each game. The homepage, /features/, /architecture/ and /app/ name both games but use neither game's vocabulary. "Game intelligence" became "What a game module adds": seven things both modules supply, in core's words, with a button to each game's page. Each game's own list, in its own words, lives in src/data/games/ and renders only on the new pages:

    • /modules/uo/: the old Ultima Online list, the pieces with their versions, and the five UO screenshots /features/ used to show.
    • /modules/rust/: eight player features and four staff features, written from the phase-15 Rust docs. It has the pieces (module, rust-link, RunicGateway.cs, RunicNPC) and the RunicNPC card D61 asked for. No screenshots until phase 18 (D65).
    • /modules/ is now core: one card per game, then what both modules share.
  • The page-side capability check is per game. This is the item phase 13 moved here. assertGameCoverage() holds each game's list to its module's declared capabilities in both directions, so a capability added to either module fails the build.

  • D76: the homepage keeps its UO screenshot, labelled. screens.mjs entries may carry game (D67), and nine are tagged uo. Screenshot.astro and /app/'s phone grid print the game's name beside a tagged capture and mark it data-game.

  • D77: /app/ describes the Rust screens. Its game section is now The game, live, with one item per game. ⚠️ Those screens are on Android-app edge until today's release.

  • D78: /runicnpc/ is in the header (five items), the footer and the Rust page's card. It's written for a server owner with no site. Every number on it is read from data: release, API version and framework floors from platform.json, and the counts of calls and hooks from runicnpc.mjs.

  • D79: checkTerms.mjs --built. After the build, it reads every page's visible text plus alt, title, aria-label, placeholder, the <title> and the meta description. It doesn't read hrefs, scripts, styles or comments. Exempt from the word list:

    • a game's routes, and elements marked data-game;
    • Starlight's sidebar, which the source pass already reads as data;
    • previous/next links, since each is checked on its own page.

    It's still the twelfth check. It runs in verify and as a new CI step after Links.

  • The supported-games strip (D63) is SupportedGames.astro, on the homepage, /features/ and /modules/.

Re-read fixes in this repository

  • /architecture/ said two machines is "the minimum and also the maximum". That's false since Rust: six servers means six sidecars. It also said the installer prints "four values", which was one game's count.
  • /integrations/ and the Discord capability said "guild". They now say Discord server, as phase 14 made the docs say.
  • collection.mjs was re-read against what Steam sign-in and Module-Rust keep:
    • Account records now names linked sign-in identities, including the Steam display name and avatar address (user_identities).
    • Game data names, for Rust:
      • Steam ids, in-game names, statistics, and who is online;
      • the event record, which holds chat, player reports and sign-in/ban IP addresses, staff only;
      • its retention: 30 days in the module (EVENT_RETENTION_DAYS) and 14 by default in the sidecar.
    • The Play Data Safety answers are unchanged. The app's Rust screens only read from the deployment, plus one POST of a one-time link code. PLAY_DATA_SAFETY.md was regenerated for one reworded sentence.
  • The narrow header was re-measured. With five links, Search fell to a third row at 390px. A tighter gap, link padding and type put it back on two rows.

How it was tested

  • npm run verify is green. The offline checks ran while Gitea was down. checkFacts (41 facts), checkQuickstart (59) and checkReference (55) ran once it was back.
  • The built pass was proven before it was trusted. I planted ten cases in the built HTML. Six failed, each naming where it broke: a word in a core page's text, in an alt, in a title, a UO word inside a block marked Rust, a word split across two highlighting <span>s, and a UO word on a Rust page. Four passed as intended: a word only in an href, one in a <script>, UO words on /modules/uo/, and a UO block on a core page. On the build before this phase it found 49 words on seven pages; all are gone.
  • Looked at in a browser:
    • at 1280px: /modules/, /modules/rust/, /runicnpc/, the /features/ game group, and the homepage's labelled capture;
    • at 390px: ten pages, each with no horizontal overflow and a two-row header (98px).
  • Every Rust claim was checked in source before it was written: the server list's map, size and next wipe in Servers.jsx; the five app tabs, the 10-second map refresh, and the Steam accounts, coins and backpack screens on Android edge; and the IP-carrying event kinds in catalogue.js.

For the org lead

  • The Android release: once it ships, checkFacts turns red until platform.json's Android-app moves to the new version. /app/'s download link stays in its "being replaced" state until androidApk.serviceable is set true for a build you've confirmed works.
  • Merging this deploys the site (D54).

Checklist

  • I have read CONTRIBUTING.md.
  • npm run verify passes locally (all twelve checks and both test suites).
  • No fact is stated in prose — versions and platform facts come from src/data/platform.json.
  • PLAN.md still describes what this repository does; a decision it records is either unchanged or amended here, with the reasoning.
  • My commits are reasonably scoped, with Conventional Commit messages.

AI-assisted contributions (required)

  • No AI tools were used to produce this contribution.
  • AI tools were used. Tool(s): Claude Code (Claude Opus 5.5). I have reviewed and understand every change, and take responsibility for it. AI-authored commits are marked with a Co-Authored-By / Assisted-By trailer.

License

  • I agree that my contribution is licensed under this project's license (GNU GPL v3.0 or later), and I have the right to contribute it.

🤖 Generated with Claude Code

https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY

## What & why PLAN.md §16 phase 17 (marketing), built on the org lead's answers of 2026-10-22, recorded as **D75–D79** (count of record **79**; "How phase 17 built it" in PLAN.md). - **D75: core pages use neutral words and link to each game.** The homepage, `/features/`, `/architecture/` and `/app/` name both games but use neither game's vocabulary. "Game intelligence" became **"What a game module adds"**: seven things both modules supply, in core's words, with a button to each game's page. Each game's own list, in its own words, lives in `src/data/games/` and renders only on the new pages: - **`/modules/uo/`**: the old Ultima Online list, the pieces with their versions, and the five UO screenshots `/features/` used to show. - **`/modules/rust/`**: eight player features and four staff features, written from the phase-15 Rust docs. It has the pieces (module, rust-link, `RunicGateway.cs`, RunicNPC) and the RunicNPC card D61 asked for. No screenshots until phase 18 (D65). - **`/modules/`** is now core: one card per game, then what both modules share. - **The page-side capability check is per game.** This is the item phase 13 moved here. `assertGameCoverage()` holds each game's list to its module's declared capabilities in both directions, so a capability added to either module fails the build. - **D76: the homepage keeps its UO screenshot, labelled.** `screens.mjs` entries may carry `game` (D67), and nine are tagged `uo`. `Screenshot.astro` and `/app/`'s phone grid print the game's name beside a tagged capture and mark it `data-game`. - **D77: `/app/` describes the Rust screens.** Its game section is now *The game, live*, with one item per game. ⚠️ Those screens are on `Android-app` `edge` until today's release. - **D78: `/runicnpc/` is in the header** (five items), the footer and the Rust page's card. It's written for a server owner with no site. Every number on it is read from data: release, API version and framework floors from `platform.json`, and the counts of calls and hooks from `runicnpc.mjs`. - **D79: `checkTerms.mjs --built`.** After the build, it reads every page's visible text plus `alt`, `title`, `aria-label`, `placeholder`, the `<title>` and the meta description. It doesn't read hrefs, scripts, styles or comments. Exempt from the word list: - a game's routes, and elements marked `data-game`; - Starlight's sidebar, which the source pass already reads as data; - previous/next links, since each is checked on its own page. It's still the twelfth check. It runs in `verify` and as a new CI step after Links. - **The supported-games strip** (D63) is `SupportedGames.astro`, on the homepage, `/features/` and `/modules/`. ### Re-read fixes in this repository - **`/architecture/` said two machines is "the minimum and also the maximum".** That's false since Rust: six servers means six sidecars. It also said the installer prints "four values", which was one game's count. - **`/integrations/` and the Discord capability said "guild".** They now say *Discord server*, as phase 14 made the docs say. - **`collection.mjs` was re-read against what Steam sign-in and Module-Rust keep:** - *Account records* now names linked sign-in identities, including the Steam display name and avatar address (`user_identities`). - *Game data* names, for Rust: - Steam ids, in-game names, statistics, and who is online; - the event record, which holds chat, player reports and sign-in/ban IP addresses, staff only; - its retention: 30 days in the module (`EVENT_RETENTION_DAYS`) and 14 by default in the sidecar. - **The Play Data Safety answers are unchanged.** The app's Rust screens only read from the deployment, plus one POST of a one-time link code. `PLAY_DATA_SAFETY.md` was regenerated for one reworded sentence. - **The narrow header was re-measured.** With five links, Search fell to a third row at 390px. A tighter gap, link padding and type put it back on two rows. ## How it was tested - **`npm run verify` is green.** The offline checks ran while Gitea was down. `checkFacts` (41 facts), `checkQuickstart` (59) and `checkReference` (55) ran once it was back. - **The built pass was proven before it was trusted.** I planted ten cases in the built HTML. Six failed, each naming where it broke: a word in a core page's text, in an `alt`, in a `title`, a UO word inside a block marked Rust, a word split across two highlighting `<span>`s, and a UO word on a Rust page. Four passed as intended: a word only in an `href`, one in a `<script>`, UO words on `/modules/uo/`, and a UO block on a core page. On the build before this phase it found 49 words on seven pages; all are gone. - **Looked at in a browser:** - at 1280px: `/modules/`, `/modules/rust/`, `/runicnpc/`, the `/features/` game group, and the homepage's labelled capture; - at 390px: ten pages, each with no horizontal overflow and a two-row header (98px). - **Every Rust claim was checked in source before it was written:** the server list's map, size and next wipe in `Servers.jsx`; the five app tabs, the 10-second map refresh, and the Steam accounts, coins and backpack screens on Android `edge`; and the IP-carrying event kinds in `catalogue.js`. ## For the org lead - **The Android release:** once it ships, `checkFacts` turns red until `platform.json`'s `Android-app` moves to the new version. `/app/`'s download link stays in its "being replaced" state until `androidApk.serviceable` is set true for a build you've confirmed works. - **Merging this deploys the site** (D54). ## Checklist - [x] I have read [CONTRIBUTING.md](CONTRIBUTING.md). - [x] `npm run verify` passes locally (all twelve checks and both test suites). - [x] No fact is stated in prose — versions and platform facts come from `src/data/platform.json`. - [x] `PLAN.md` still describes what this repository does; a decision it records is either unchanged or amended here, with the reasoning. - [x] My commits are reasonably scoped, with Conventional Commit messages. ## AI-assisted contributions (required) - [ ] No AI tools were used to produce this contribution. - [x] AI tools were used. Tool(s): `Claude Code (Claude Opus 5.5)`. I have reviewed and understand every change, and take responsibility for it. AI-authored commits are marked with a `Co-Authored-By` / `Assisted-By` trailer. ## License - [x] I agree that my contribution is licensed under this project's license (**GNU GPL v3.0 or later**), and I have the right to contribute it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 1 commit 2026-10-22 20:24:50 -05:00
feat(site): phase 17 - per-game module pages, /runicnpc/, and checkTerms over the built site
All checks were successful
PR checks / checks (pull_request) Successful in 2m37s
56473d4d51
PLAN.md §16 phase 17, built on the org lead's answers of 2026-10-22,
recorded as D75-D79 (count of record 79).

- D75: core marketing pages describe what a game module adds in core's
  words. "Game intelligence" became "What a game module adds"; each
  game's own list moved to src/data/games/ and renders only on the new
  /modules/uo/ and /modules/rust/. /modules/ is a card per game.
- The page-side capability check is per game (assertGameCoverage), the
  item phase 13 moved here.
- D76: the homepage keeps its game screenshot, labelled. screens.mjs
  entries may carry `game` (D67); Screenshot.astro and the app grid
  print the game's name and mark the figure data-game.
- D77: /app/ describes the Rust screens (released the same day).
- D78: /runicnpc/, the standalone page, is in the header and footer;
  the narrow header was re-measured so five links keep two rows.
- D79: checkTerms.mjs --built reads every built page's visible text
  after the build; game routes and data-game elements allow their
  game's words. Proven against ten plants. Still the twelfth check.
- Re-read fixes: /architecture/'s "two machines is also the maximum",
  Discord "guild" on /integrations/, and collection.mjs against what
  Steam sign-in and the Rust module keep (PLAY_DATA_SAFETY.md
  regenerated; the Play answers are unchanged).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech merged commit 4f38e29ad7 into main 2026-10-22 20:26:03 -05:00
whitlocktech deleted branch feat/phase-17-marketing 2026-10-22 20:26:04 -05:00
Sign in to join this conversation.
No description provided.