feat(rdm): RDM manager — victim reports, staff case queue, slay punishment#40
Open
GabeHirakawa wants to merge 19 commits into
Open
feat(rdm): RDM manager — victim reports, staff case queue, slay punishment#40GabeHirakawa wants to merge 19 commits into
GabeHirakawa wants to merge 19 commits into
Conversation
Victim-driven RDM reporting + staff case queue (chat commands) + slay-queue punishment, persisted to SQLite. Sits alongside existing auto-karma; reuses an extracted shared IDamageTracker for suspect-kill detection. Claude-Session: https://claude.ai/code/session_015VpDpUwhCqDKEHWofQfjXH
12 TDD tasks: module scaffold, shared IDamageTracker extraction, suspect classifier, SQLite store, death-log + victim prompt, case manager, !rdm, staff !cases/!info/!handle/!verdict, slay queue, production wiring + e2e. Claude-Session: https://claude.ai/code/session_015VpDpUwhCqDKEHWofQfjXH
- CasesCommand: staff-gated !cases lists open RDM case count + brief entries - InfoCommand: staff-gated !info <id> shows full case details (Args[1] corrected from brief's Args[0]) - New locale keys: RDM_CASES_COUNT, RDM_CASES_ENTRY, RDM_INFO, RDM_CASE_NOT_FOUND - FakePermissionManager: add SetFlags for per-player flag grants; HasFlags now enforces when flags required - LogsTest: grant @ttt/admin explicitly (LogsCommand requires it; old blanket-true fake masked this)
…eview) - CS2RdmConfig.Start(BasePlugin?) now calls plugin.RegisterFakeConVars(this) so css_ttt_rdm_* cvars are registered in the engine on plugin load - SqliteRdmStore wraps all 11 IRdmStore methods with SemaphoreSlim(1,1) gate to prevent concurrent access on the single shared connection - SlayQueueListener faulted-task continuation logs payout errors via Messenger - RdmCommand.Description corrected (no dismiss path exists)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
RDM Manager
Ports the SourceMod/CS:GO TTT RDM (Random Death Match) manager into a new engine-agnostic
TTT/RDMmodule. Adds a victim-driven reporting + staff case-queue + slay-punishment workflow alongside the existing auto-karma system (Karma is left functionally intact).Design spec:
docs/superpowers/specs/2026-06-28-rdm-manager-design.mdImplementation plan (12 tasks):
docs/superpowers/plans/2026-06-28-rdm-manager.mdFlow
!rdm(lists their recent suspect deaths;!rdm <n> [reason]files a report). Non-response defaults to "not RDM" — no case is created.!cases(count + list),!info <id>(details + karma evidence),!handle [id](claim oldest/specific),!verdict guilty|forgive.Architecture
IDamageTrackerextracted fromKarmaListenerintoTTT/Game/Damage(option A) so suspect/fault detection has one source of truth;KarmaListenerbehavior is preserved (existing tests unchanged).rdm.db) for deaths, cases, and slay debts, so cases and owed slays survive round changes, map changes, and restarts.IRdmStorehas an in-memory impl (tests) and aSqliteRdmStore(production), the latter serialized with aSemaphoreSlimfor its shared connection.RdmServiceCollection.AddRdmService(); CS2 cvars (css_ttt_rdm_*) viaCS2RdmConfig, mirroringCS2KarmaConfig.@ttt/admin(same flag as!logs), configurable viaRdmConfig.StaffFlag.Testing
ModuleInitializationTest.Started_ShouldNotBeInit_IfNotStarted) is a pre-existing order-dependent flake ondev, not introduced by this branch (zero new failures).TTT/TestandTTT/Pluginboth build with 0 errors.Built task-by-task with a fresh implementer + independent reviewer per task, plus a final whole-branch review (which caught and fixed two production-only issues invisible to the test suite: the CS2 cvar registration and the SQLite single-connection concurrency hazard).
Heads-up before merge
deathstable / session-scoping of the round counter; a few coverage tests (report-window & per-round-cap guards, offline-debtor slay preservation); minor polish (verdict displayed-count nuance, config getter caching).https://claude.ai/code/session_015VpDpUwhCqDKEHWofQfjXH