From 8012a457fc32c965531cd51e097fb9dc8c9eaf73 Mon Sep 17 00:00:00 2001 From: wtclaude Date: Thu, 22 Oct 2026 14:43:37 -0500 Subject: [PATCH] fix(teams): say "game server", not "shard", on the never-synced Teams panel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Admin โ†’ Teams told an operator that an unsynced projection "is not a confirmed empty shard". Teams is a core primitive and core's word for the host is the game server; "shard" is Ultima Online's. The detail now reads "What is shown below does not confirm that the game server has no Teams." The matching test, and the four comments that said "shard" about the same state, follow it. Found while making runicgateway.com's core docs game-neutral (runicgateway.com#34), which had to paraphrase this line rather than quote it. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY --- client/src/lib/teamActivity.js | 4 ++-- client/src/lib/teamAdmin.js | 4 ++-- client/src/routes/admin/views/TeamsAdmin.jsx | 2 +- client/test/teamActivity.test.js | 2 +- client/test/teamAdmin.test.js | 4 ++-- server/src/model/teams/teams.model.js | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/client/src/lib/teamActivity.js b/client/src/lib/teamActivity.js index 2d5c3b6..d0508b3 100644 --- a/client/src/lib/teamActivity.js +++ b/client/src/lib/teamActivity.js @@ -41,7 +41,7 @@ export function relativeTime(when, now = Date.now()) { * Distinct from `teamAdmin.freshnessOf`, which is worded for an operator * debugging a sync. A visitor needs one sentence about whether what they are * looking at is current, and specifically must never be shown an unconfirmed - * empty projection as though it were a confirmed empty shard. + * empty projection as though it were a confirmed empty one. */ export function freshnessNote(sync = {}, now = Date.now()) { // Nothing supplies Teams here, so there is nothing to be stale ABOUT. A @@ -57,7 +57,7 @@ export function freshnessNote(sync = {}, now = Date.now()) { * Group feed items into days, newest first, preserving order within a day (ยง4.3). * * Keyed by local calendar date rather than by a UTC slice: "yesterday" is a - * property of where the reader is sitting, and a shard's evening raid landing at + * property of where the reader is sitting, and a game server's evening raid landing at * 00:30 UTC belongs on the day the players experienced it. */ export function groupByDay(items = [], locale = undefined) { diff --git a/client/src/lib/teamAdmin.js b/client/src/lib/teamAdmin.js index 7c3c34f..fd7d6e7 100644 --- a/client/src/lib/teamAdmin.js +++ b/client/src/lib/teamAdmin.js @@ -3,7 +3,7 @@ // // Plain JS with tests, following lib/moduleAdmin.js. The reason it is worth // splitting here specifically: this screen's job is to tell an operator the -// difference between "the shard has no Teams" and "core has not been able to ask +// difference between "the game server has no Teams" and "core has not been able to ask // for two hours", and those two produce almost the same page. Getting that // wording right is logic, not markup. @@ -31,7 +31,7 @@ export function freshnessOf(sync = {}) { return { tone: TONE.bad, label: 'Never synced', - detail: 'Core has never had an answer it could trust. What is shown below is not a confirmed empty shard.', + detail: 'Core has never had an answer it could trust. What is shown below does not confirm that the game server has no Teams.', } } if (sync.stale) { diff --git a/client/src/routes/admin/views/TeamsAdmin.jsx b/client/src/routes/admin/views/TeamsAdmin.jsx index ef8a8ff..00f9d8b 100644 --- a/client/src/routes/admin/views/TeamsAdmin.jsx +++ b/client/src/routes/admin/views/TeamsAdmin.jsx @@ -14,7 +14,7 @@ import TeamVoice from './TeamVoice.jsx' // Three panels, in the order an operator needs them: // // 1. **Sync state**, verbatim, including the last error. The screen's first job -// is to make "the shard has no Teams" and "core has not been able to ask for +// is to make "the game server has no Teams" and "core has not been able to ask for // two hours" impossible to confuse โ€” they render almost identically // otherwise, and one is fine while the other is an outage. // 2. **The review queue** โ€” Teams auto-hidden because their name matched the diff --git a/client/test/teamActivity.test.js b/client/test/teamActivity.test.js index d58cecb..0a1bed2 100644 --- a/client/test/teamActivity.test.js +++ b/client/test/teamActivity.test.js @@ -19,7 +19,7 @@ test('a deployment with no provider is not stale, it is uninvolved', () => { assert.equal(freshnessNote({ configured: false }, NOW), null) }) -test('never synced is a warning, and never reads as a confirmed empty shard', () => { +test('never synced is a warning, and never reads as a confirmed empty roster', () => { const note = freshnessNote({ configured: true, lastSyncAt: null }, NOW) assert.equal(note.tone, 'warn') assert.match(note.text, /Not yet confirmed/) diff --git a/client/test/teamAdmin.test.js b/client/test/teamAdmin.test.js index b0e889a..f155c3d 100644 --- a/client/test/teamAdmin.test.js +++ b/client/test/teamAdmin.test.js @@ -21,13 +21,13 @@ test('no provider is idle, not a fault', () => { assert.match(f.label, /No Team provider/) }) -test('never synced is reported as never synced, not as an empty shard', () => { +test('never synced is reported as never synced, not as a game server with no Teams', () => { // The failure this prevents: an empty projection core has never confirmed, // rendered as though the game genuinely has no Teams. const f = freshnessOf({ configured: true, lastSyncAt: null }) assert.equal(f.tone, TONE.bad) assert.equal(f.label, 'Never synced') - assert.match(f.detail, /not a confirmed empty shard/) + assert.match(f.detail, /does not confirm that the game server has no Teams/) }) test('stale says how old it is', () => { diff --git a/server/src/model/teams/teams.model.js b/server/src/model/teams/teams.model.js index 4d1be52..38e9eaa 100644 --- a/server/src/model/teams/teams.model.js +++ b/server/src/model/teams/teams.model.js @@ -135,7 +135,7 @@ async function syncStatus() { configured: true, lastSyncAt, // Never synced at all is stale: a page must not present an empty projection - // as a confirmed empty shard. + // as a confirmed empty one. stale: ageS > intervalS * STALE_INTERVALS, consecutiveFailures: state ? state.consecutive_failures : 0, } -- 2.49.1