diff --git a/ci/core-ref.json b/ci/core-ref.json index 2afa537..2d7d07c 100644 --- a/ci/core-ref.json +++ b/ci/core-ref.json @@ -1,6 +1,6 @@ { - "$comment": "The core this module is proved against. MODULE_API.md §5.3: the frozen-manifest job clones RunicGateway/website at this exact ref, drops this module in as modules/uo and runs CORE's own routeManifest.js — nothing else can answer whether the URLs the module claims are the URLs it actually serves. Pinned rather than tracking a branch on purpose: core moves for reasons that have nothing to do with this module, and a bump is then a deliberate commit saying which core the module was last proved against, instead of an unexplained red X on someone else's PR. Bump it, regenerate routes.manifest.json, and commit both together. **It pointed at `edge` for the length of the Event System window** (org lead, 2026-09-04), and this commit ends that: `api.registerEventActions` exists only from MODULE_API 1.10.0, so under the previous `main` pin `register()` threw and the module did not load at all — the job would have been red by construction for eight phases and would have proved nothing while a real regression hid behind it. The Phase 16b cutover put 1.10.0 on `main`, so the pin comes home, and this is the same move that turns the Integration kit green again. **routes.manifest.json needed NO regeneration**: the job's own steps were run against this exact ref and answered `routes.manifest.json is current — 73 routes, all documented`, so the \"commit both together\" instruction above had nothing to pair with this time.", + "$comment": "The core this module is proved against. MODULE_API.md §5.3: the frozen-manifest job clones RunicGateway/website at this exact ref, drops this module in as modules/uo and runs CORE's own routeManifest.js — nothing else can answer whether the URLs the module claims are the URLs it actually serves. Pinned rather than tracking a branch on purpose: core moves for reasons that have nothing to do with this module, and a bump is then a deliberate commit saying which core the module was last proved against, instead of an unexplained red X on someone else's PR. Bump it, regenerate routes.manifest.json, and commit both together. **It pointed at `edge` for the length of the Event System window** (org lead, 2026-09-04), and this commit ends that: `api.registerEventActions` exists only from MODULE_API 1.10.0, so under the previous `main` pin `register()` threw and the module did not load at all — the job would have been red by construction for eight phases and would have proved nothing while a real regression hid behind it. The Phase 16b cutover put 1.10.0 on `main`, so the pin comes home, and this is the same move that turns the Integration kit green again. **routes.manifest.json needed NO regeneration**: the job's own steps were run against this exact ref and answered `routes.manifest.json is current — 73 routes, all documented`, so the \"commit both together\" instruction above had nothing to pair with this time. **2026-10-30, account deletion (ACCOUNT_DELETION.md §4.4):** this module registers onUserDeleting (MODULE_API 1.20.0), so coreApi is ^1.20.0 and the pin moves past 1.11.0-1.19.0 to `main` at the sha website#232 merged as. A 1.19.0 core has no api.onUserDeleting, so register() would throw under the old pin.", "repo": "https://gitea.whitlocktech.com/RunicGateway/website.git", - "ref": "655fbf3f69a6a1fd650ecbc81afd6cf9c2ad9f66", - "refName": "main @ MODULE_API 1.10.0, the Event System cutover (website#199)" + "ref": "7bd93b8bb0da734a642587f256d10c523ca39bea", + "refName": "main @ MODULE_API 1.20.0, account deletion (website#232)" } diff --git a/client/src/routes/admin/ShardAdmin.jsx b/client/src/routes/admin/ShardAdmin.jsx index f1e168c..6d0fe01 100644 --- a/client/src/routes/admin/ShardAdmin.jsx +++ b/client/src/routes/admin/ShardAdmin.jsx @@ -83,6 +83,39 @@ function StatusPanel({ config }) { ) } +// ── Unlinks a deleted website account left behind ─────────────────────────── +// +// ACCOUNT_DELETION.md §4.4. Deleting a website account unlinks its game accounts +// on the shard first; what the shard could not take is listed here until it +// clears. `pending` is retried by itself when the bridge reconnects. `refused` is +// a protected staff account the shard will not unlink over the bridge, so the +// shard's staff clear its WebsiteUserId tag by hand. A row goes on its own once a +// login on that account no longer carries the deleted user's id. +function PendingUnlinks({ rows }) { + if (!rows || rows.length === 0) return null + return ( +
+

Still linked on the shard

+

+ Game accounts whose website account was deleted, but whose link the shard has not cleared yet. +

+ +
+ ) +} + // ── Game-account signup ───────────────────────────────────────────────────── // // This field lived in core's Site Settings until slice 3 of the extraction. It @@ -285,6 +318,8 @@ export default function ShardAdmin() { + +