{ "version": "v0.8", "date": "2026-06-11", "title": "Framework & Architecture", "layout": "default", "sections": [ { "type": "new", "label": "New Features", "emoji": "✨", "items": [ { "text": "`/tg poll mark-left` — mark a character as having left TG mid-game with 🪲 counter", "emojiKey": "cockroach" }, { "text": "Leave counter displays total times a character has left TG", "emojiKey": null }, { "text": "W.Rank no-rank placeholder alignment — players without rank now align correctly with ranked players", "emojiKey": null } ] }, { "type": "improvement", "label": "Improvements", "emoji": "⚡", "items": [ { "text": "Voting is faster — poll embed and companion ephemeral now update in parallel", "emojiKey": null }, { "text": "Config changes no longer require a bot restart — hot-reloadable from `config.json`", "emojiKey": null } ] }, { "type": "technical", "label": "Under the Hood", "emoji": "🔩", "items": [ { "text": "`Runtime` lifecycle system — phased startup: load → restore → connect → schedule → ready", "emojiKey": null }, { "text": "`Config` namespace — `Config.get({ section, key })` with full type safety per section", "emojiKey": null }, { "text": "All config organized into sections — `poll`, `wrank`, `channels`, `roles`, etc.", "emojiKey": null }, { "text": "`Store` abstraction — centralized JSON file I/O with error handling", "emojiKey": null }, { "text": "`Paths` helper — no more `path.join(__dirname, ...)` scattered across the codebase", "emojiKey": null }, { "text": "`Discord` abstraction layer — `Discord.Interaction`, `Discord.Guild`, `Discord.Channel`", "emojiKey": null }, { "text": "`Scheduler` plugin system — drop a file in `scheduler/` to add a cron job", "emojiKey": null }, { "text": "`Logger` with levels and context icons — structured, filterable output", "emojiKey": null }, { "text": "`WRankEntry` hydration — runtime entries carry full `Character` object", "emojiKey": null }, { "text": "`Leaves` system — character leave tracking keyed by character name and history key", "emojiKey": null } ] } ], "examples": [ { "caption": "🪲 Leave indicator — cockroach with leave count", "type": "poll", "layout": "side-by-side", "file": "examples/poll-leaves.json" } ] }