Retract a meta game
Policy for removed meta games lives in gameslib retractedGames.json. Each entry sets independent knobs:
| Field | Values | Effect |
|---|---|---|
availability |
playable, hiddenProd, hiddenAll |
Catalog, Lab, challenges, /games/:uid (front + public API) |
recordsGeneration |
include, omit |
records Lambda: skip or archive GAME rows from the Dynamo dump |
publishStats |
true, false |
summarize, stats UI, co-occurrence recommendations |
archiveMetadata |
name, playercounts, variants | Labels when the engine is gone but include + stats stay public |
DynamoDB is never modified by retraction. omit only stops new S3 archive output; existing GAME rows remain in the table.
Recipe: broken game (Binar-class)
Designer wants the game gone from code and off public surfaces, historical Dynamo rows kept but not re-archived.
- Remove engine, locales, and tests from gameslib (no tombstone in
gameinfo). - Add registry entry, for example:
{
"mygame": {
"availability": "hiddenAll",
"recordsGeneration": "omit",
"publishStats": false,
"reason": "broken",
"removedAt": "YYYY-MM-DD",
"archiveMetadata": { "name": "My Game", "playercounts": [2], "variants": [] }
}
}
- Publish gameslib; run
npm run sync-depsin node-backend and front. - Deploy crons + API + front.
- Run records then summarize (or wait for the daily pipeline).
recordsskips dump rows, rewritesALL.jsonwithout the UID, and deletes orphanmeta/{uid}.json. - Optional one-time cleanup before deploy: delete stale
meta/{uid}.jsononrecords.abstractplay.comand re-run summarize.
Rights-holder demo checklist
- No
src/games/{uid}.tson main; onlyretractedGames.jsonmentions the UID. - Registry shows
recordsGeneration: omitandpublishStats: false. - Stats
/stats/gameshas no row after pipeline run.
Recipe: licence lapse
Play forbidden everywhere (including dev), but batch records and public stats continue with stable names after engine removal.
{
"mygame": {
"availability": "hiddenAll",
"recordsGeneration": "include",
"publishStats": true,
"reason": "licence",
"removedAt": "YYYY-MM-DD",
"archiveMetadata": {
"name": "My Game",
"playercounts": [2],
"variants": [{ "uid": "foo", "group": "board" }]
}
}
}
Remove playable code from gameslib. records uses archiveGameRecord.ts to build APGameRecord headers from stored Dynamo state + archiveMetadata when GameFactory is unavailable.
Pipeline touchpoints
| Job | Behaviour |
|---|---|
records.ts |
Skips omit rows; post-pass pruneOrphanMetaShards |
summarize.ts |
Scans ALL.json only; loads meta shards for UIDs in the scan with publishStats: true |
records-cooccur.ts |
Drops unreleased meta games from co-play sets |
Front gameOptions.js |
isCatalogVisible + isSummaryStatsVisible |
Do not use experimental alone
experimental hides prod catalog only. It does not omit records, prune S3, or hide stats. Use the retraction registry instead.