This roadmap reflects the finalized MVP specification and serves as the implementation sequence reference.
Current stage: The project has completed the MVP implementation track (MVP-0..MVP-6 with split verification) and is now in Beta readiness hardening. Core components (EBS, WoW addon, WPF Desktop, Twitch Extension viewer panel) are implemented; CI E2E Tier A+B is in place, with operational real-stack validation tracked separately.
Canonical implementation contracts live in:
docs/overview/SPEC.mdInteraction scenarios & test cases (for implementation / verification): When executing MVP steps below, agents should use docs/overview/INTERACTION_SCENARIOS.md for scenario IDs (SC-001, …), paired test cases (TC-001, …), and the Component Contracts section at each boundary.
UI/UX (screens, element inventory, flows): Hub docs/reference/UI_SPEC.md (tokens, navigation); implement against docs/components/twitch-extension/UI_SPEC.md, docs/components/desktop/UI_SPEC.md, and docs/components/wow-addon/UI_SPEC.md for UI-1xx–UI-4xx (Twitch ~318px panel, WPF windows, WoW frames) while building MVP-3 / MVP-4 / MVP-5.
Implementation snapshot (repository): The steps below describe the target MVP sequence. For current repo parity versus MVP-6 (tests, E2E harness) and residual risks, see docs/reference/IMPLEMENTATION_READINESS.md (Source code parity (MVP track)). For manual vs automated E2E mapping, see Automated E2E Scenarios (MVP-6) in docs/overview/INTERACTION_SCENARIOS.md.
Each step is executed with a checklist supplied by the project owner (often inline in the prompt). Agents must:
docs/overview/SPEC.md sections (§…).docs/overview/INTERACTION_SCENARIOS.md test cases (TC-…) when listed.docs/overview/SPEC.md.docs/overview/INTERACTION_SCENARIOS.md scenarios marked future / not MVP or placeholder unless docs/overview/SPEC.md explicitly adds the behavior (no speculative APIs — e.g. retry tokens, pause endpoints).Payout model note: see MVP_PRODUCT_SUMMARY.md (digest) and docs/overview/SPEC.md (normative).
src/MimironsGoldOMatic.slnx (includes Shared, Backend stack, Desktop; extend for remaining projects in MVP-0)src/:
MimironsGoldOMatic.SharedMimironsGoldOMatic.Backend.Api (+ Backend.* libraries; see docs/components/backend/ReadME.md)MimironsGoldOMatic.DesktopMimironsGoldOMatic.TwitchExtensionMimironsGoldOMatic.WoWAddonStatus — implemented: MimironsGoldOMatic.slnx lists the three .NET projects. MimironsGoldOMatic.TwitchExtension (Vite/React) and MimironsGoldOMatic.WoWAddon (30300 addon) exist under src/ with their own tooling and are not MSBuild projects in the solution file (see docs/reference/IMPLEMENTATION_READINESS.md).
Spec links:
docs/overview/SPEC.md#4-identity-idempotency-and-dtosMimironsGoldOMatic.Shared)PayoutStatus: Pending, InProgress, Sent, Failed, Cancelled, ExpiredCreatePayoutRequest: CharacterName, EnrollmentRequestIdPayoutDto fields (MVP):
Id, TwitchUserId, TwitchDisplayName, CharacterName, GoldAmount (fixed 1,000g), EnrollmentRequestId, Status, CreatedAt, IsRewardSentAnnouncedToChat (Helix §11 read-model flag; docs/overview/SPEC.md §6)CharacterNameStatus — implemented: src/MimironsGoldOMatic.Shared (.NET 10), namespace MimironsGoldOMatic.Shared: PayoutStatus, PayoutDto (incl. IsRewardSentAnnouncedToChat), CreatePayoutRequest, PayoutEconomics.MvpWinningPayoutGold (1,000g per SPEC §2), CharacterNameRules + FluentValidation (PayoutDtoValidator, CreatePayoutRequestValidator). Details: docs/components/shared/ReadME.md.
Spec links:
docs/overview/SPEC.md#3-statuses--lifecycle-transitionsdocs/overview/SPEC.md#4-identity-idempotency-and-dtosActing as [EBS/API Expert]:
docs/overview/SPEC.md and docs/components/shared/ReadME.md.MimironsGoldOMatic.Shared inside /src.PayoutStatus enum including: Pending, InProgress, Sent, Failed, Cancelled, ExpiredPayoutDto record including: Id, TwitchUserId, TwitchDisplayName, CharacterName, GoldAmount, EnrollmentRequestId, Status, CreatedAt, IsRewardSentAnnouncedToChatCreatePayoutRequest record including: CharacterName, EnrollmentRequestIdMimironsGoldOMatic.Shared.MimironsGoldOMatic.Backend.Api + Backend.*)EnrollmentRequestId (idempotency)!twgold <CharacterName> joins the pool firstPOST /api/payouts/claim (201 new, 200 idempotent replay) — pool enrollment (see docs/overview/SPEC.md)GET /api/payouts/pendingPATCH /api/payouts/{id}/statusPOST /api/payouts/{id}/confirm-acceptance (or equivalent) — Desktop after !twgold (willing to accept)Sent via [MGM_CONFIRM:UUID] in WoWChatLog.txt → Desktop → PATCH status (or equivalent)GET /api/payouts/my-last (404 when none exists)GET /api/roulette/state — server-authoritative nextSpinAt / serverNow + pool count + spin phase (docs/overview/SPEC.md §5.1)GET /api/pool/me — viewer enrollment hint for Extension (docs/overview/SPEC.md §5.1)POST /api/roulette/verify-candidate — Desktop submits /who result (parsed from [MGM_WHO] in WoWChatLog.txt); EBS creates Pending or no winner (docs/overview/SPEC.md §5, §8)Pending/InProgress older than 24h as Expired (terminal, no reactivation)Twitch:ExtensionSecret (base64); Twitch:ExtensionClientId as JWT aud when set. Development may use an empty secret with a fixed dev-derived key (Program.cs).Mgm:ApiKey (header X-MGM-ApiKey).Status — implemented (code): src/MimironsGoldOMatic.Backend/MimironsGoldOMatic.Backend.Api (and Backend.*) — Marten + PostgreSQL (ConnectionStrings:PostgreSQL), MVP HTTP routes (Extension JWT + Desktop X-MGM-ApiKey), EventSub channel.chat.message at POST /api/twitch/eventsub, MediatR handlers, roulette sync + payout expiration hosted services, Helix §11 inline retry after Sent, global rate limiter (EventSub exempt). Configure Mgm, Twitch, and Postgres before running; see docs/components/backend/ReadME.md and appsettings*.json. Runtime E2E against Twitch/Helix not verified in CI.
Spec links:
docs/overview/SPEC.md#2-mvp-economics--anti-abuse-rulesdocs/overview/SPEC.md#3-statuses--lifecycle-transitionsdocs/overview/SPEC.md#5-api-contract-mvp (includes §5.1 pool/roulette GETs)docs/overview/SPEC.md#6-persistence-model-mvp-es-firstdocs/overview/SPEC.md#7-expiration-job-mvpActing as [EBS/API Expert]:
docs/overview/SPEC.md, docs/components/backend/ReadME.md, and reference MimironsGoldOMatic.Shared./src (this repo: MimironsGoldOMatic.Backend.Api is the host; the removed monolith MimironsGoldOMatic.Backend folder is not present).TwitchUserId and TwitchDisplayNameEnrollmentRequestId idempotency guarantees in write/read flowPOST /api/payouts/claim (pool enrollment; enforce caps + idempotency; rate limit; return 201 for new and 200 for idempotent replay)!twgold <CharacterName> (!twgold prefix case-insensitive; non-subscribers log only); GET /api/roulette/state + GET /api/pool/me per docs/overview/SPEC.md §5.1 (JWT-only Extension auth; real Twitch JWTs); POST /api/roulette/verify-candidate ([MGM_WHO] log line from docs/overview/SPEC.md §8); winner whisper + confirm-acceptance per docs/overview/SPEC.md §9; UTC spin boundaries :00/:05/…; no re-draw same cycle; min 1 participant; non-winners stay; remove winner on Sent; CharacterName validation §4; winner notification payload for Extension; single broadcaster MVP (docs/overview/SPEC.md deployment scope)GET /api/payouts/pending (winner payouts)PATCH /api/payouts/{id}/statusPOST /api/payouts/{id}/confirm-acceptance after !twgold; Sent when log shows [MGM_CONFIRM:UUID]GET /api/payouts/my-last (return 404 when none exists)Sent, Send Chat Message per docs/overview/SPEC.md (inline 3 retries, no Outbox, no rollback on Helix failure, once per payout id)Pending/InProgress older than 24h to Expiredaud); Dev Rig for real tokensX-MGM-ApiKeyMimironsGoldOMatic.WoWAddon)ReceiveGold(dataString) to enqueue winner payoutsMAIL_SHOW and provide a side panel UISendMailNameEditBox, subject, gold-to-copper via MoneyInputFrame_SetCopper/who flow if implemented in-client: execute or surface /who <Winner_InGame_Nickname> results for Desktop/EBS (normative behavior in docs/overview/SPEC.md)!twgold and notify the Desktop utility (EBS acceptance via Desktop); winner must have been notified first per product flow[MGM_CONFIRM:UUID] to chat (UUID is payout id) for WoWChatLog.txt / SentStatus — implemented (code): src/MimironsGoldOMatic.WoWAddon — NotifyWinnerWhisper, ReceiveGold, MGM_RunWhoForSpin(spinCycleId, characterName) (Desktop /run with currentSpinCycleId from EBS), mail queue panel on MAIL_SHOW, Prepare Mail, [MGM_WHO] / [MGM_ACCEPT] / [MGM_CONFIRM] per docs/overview/SPEC.md §8–10. /mgm + minimap button. Runtime verification on a live 3.3.5a client is manual.
Spec links:
docs/overview/SPEC.md (§9 Addon; §10 Chat log / Desktop bridge)Acting as [WoW Addon/Lua Expert]:
docs/overview/SPEC.md and docs/components/wow-addon/ReadME.md.src/MimironsGoldOMatic.WoWAddon folder.MimironsGoldOMatic.lua with global NotifyWinnerWhisper(payoutId, characterName) (Desktop /run) to send §9 /whisper (docs/overview/SPEC.md §8–9)ReceiveGold(dataString) to parse and enqueue payoutsMAIL_SHOWSendMailNameEditBox and MoneyInputFrame_SetCopper!twgold whisper detection; print [MGM_ACCEPT:UUID] to chat for WoWChatLog.txt / Desktop (no HTTP from Lua)/who: run /who, parse 3.3.5a, emit [MGM_WHO] + JSON per docs/overview/SPEC.md §8 ( WoWChatLog.txt ) for Desktop → POST /api/roulette/verify-candidate[MGM_CONFIRM:UUID] after mail send (required for Sent via chat log)MimironsGoldOMatic.Desktop)GET /api/payouts/pendingNotifyWinnerWhisper inject for each Pending winner (docs/overview/SPEC.md §8–9), then Sync/Inject mail: PATCH /api/payouts/{id}/status -> InProgress[MGM_WHO] and POST /api/roulette/verify-candidate (see docs/overview/SPEC.md)WoW.exe (MVP)/run NotifyWinnerWhisper(...) and /run ReceiveGold("...") with <255 char chunkingPostMessage as primary strategy with SendInput fallback!twgold from addon → call EBS acceptance endpoint (not Sent)Logs\WoWChatLog.txt for [MGM_CONFIRM:UUID] → mark Sentdocs/overview/SPEC.md §3)Status — implemented (code): src/MimironsGoldOMatic.Desktop — MVVM main window + settings (API URL, DPAPI ApiKey, WoW log path, poll interval, PostMessage vs SendInput preference), GET /api/payouts/pending poll, auto NotifyWinnerWhisper for new Pending rows when WoW is foreground (persisted ids), Sync/Inject → PATCH InProgress + chunked /run ReceiveGold, single WoWChatLog.txt tail → verify-candidate / confirm-acceptance / PATCH Sent, Polly retries on HttpClient. Runtime WinAPI behavior on real 3.3.5a clients is manual.
Spec links:
docs/overview/SPEC.md#5-api-contract-mvpdocs/overview/SPEC.md#8-desktop--wow-injection-specification-mvpdocs/overview/SPEC.md (§9–10)Acting as [WPF/WinAPI Expert]:
docs/overview/SPEC.md, docs/components/desktop/ReadME.md, and reference MimironsGoldOMatic.Shared.MimironsGoldOMatic.Desktop in /src.GET /api/payouts/pendingPending winner: inject /run NotifyWinnerWhisper("<id>","<CharacterName>") per docs/overview/SPEC.md §8–9 (addon sends §9 whisper before mail ReceiveGold flow)PATCH /api/payouts/{id}/status -> InProgressPostMessage injection for NotifyWinnerWhisper and ReceiveGold in WoW:
WoW.exe process (MVP)/run commandsSendInput fallback strategy for blocked/unreliable primary injectionLogs\WoWChatLog.txt: [MGM_WHO] → POST /api/roulette/verify-candidate; [MGM_ACCEPT:UUID] → EBS acceptance; [MGM_CONFIRM:UUID] → EBS Sent; configurable log path (§10)PATCH InProgress → Pending per docs/overview/SPEC.md §3ApiKey when calling EBS endpoints.MimironsGoldOMatic.TwitchExtension)!twgold <CharacterName> in stream chat (see docs/overview/SPEC.md). Extension shows instructions + status (poll the EBS).
POST /api/payouts/claim with EnrollmentRequestId for testing!twgold <CharacterName> in chat; unique name; removed from pool after Sent; re-enter via chat!twgold (after notification whisper, docs/overview/SPEC.md §9)/who / verification state if API exposes itGET /api/payouts/my-last and/or pool/spin endpoints as implementedStatus — implemented (MVP): Viewer panel lives in src/MimironsGoldOMatic.TwitchExtension. UI inventory and copy: docs/components/twitch-extension/UI_SPEC.md; hub tokens and cross-client rules: docs/reference/UI_SPEC.md.
Spec links:
docs/overview/SPEC.md#5-api-contract-mvpdocs/overview/SPEC.md (§11 Twitch Extension)Acting as [Frontend/Twitch Expert]:
docs/overview/SPEC.md and docs/components/twitch-extension/ReadME.md.src/MimironsGoldOMatic.TwitchExtension using Vite + React + TypeScript.window.Twitch.ext); optional POST /api/payouts/claim for Dev Rig with EnrollmentRequestIdGET /api/payouts/my-last (and any pool APIs)docs/components/twitch-extension/UI_SPEC.md UI-101–106). Do not implement broadcaster dashboard panels UI-201–204 in MVP-5 (post-MVP / when the EBS adds broadcaster JWT routes).docs/overview/SPEC.md).!twgold <CharacterName> in chat → roulette spin (random candidate) → /who online OK → Desktop NotifyWinnerWhisper → winner notification whisper (§9) → winner !twgold in WoW → confirm-acceptance → desktop ReceiveGold inject → streamer sends mail → [MGM_CONFIRM:UUID] in log → EBS Sent → winner removed from poolEnrollmentRequestId)Status — MVP-6 (verification split):
src/Tests/MimironsGoldOMatic.Backend.UnitTests — xUnit, PostgreSQL via Testcontainers (Docker required for Integration category), plus Unit tests (no Docker) for time/spin-phase and !twgold line parsing. Integration coverage includes MediatR/HTTP paths aligned with the bullets above (claim rules, verify-candidate, expiration sweep, PATCH → Sent pool removal). See docs/components/backend/ReadME.md §Automated tests.WoWChatLog.txt → Desktop → Helix §11 announcement remains an operator validation flow (Dev Rig/live setup), documented in docs/overview/INTERACTION_SCENARIOS.md (e.g. SC-001, SC-005). Step-by-step mapping of manual vs automated slices: Automated E2E Scenarios (MVP-6).Next steps (MVP-6):
e2e-test.yml healthy and monitor failures/trends.docs/overview/INTERACTION_SCENARIOS.md.For details on the automation approach, see E2E Automation Plan. Actionable work items: E2E Automation Tasks.
TIER_C_CLOSURE_REPORT.md, TIER_C_HANDOVER.md). Remaining C1/C2/C3 follow-up backlog is tracked in Tier C docs.Solution layout: MimironsGoldOMatic.slnx includes MimironsGoldOMatic.Backend.UnitTests; Twitch Extension and WoW addon stay non-MSBuild trees (same as MVP-0).
Spec links:
docs/overview/SPEC.mdActing as [Senior Architect]:
docs/overview/SPEC.md and docs/overview/ROADMAP.md for end-to-end consistency.src/MimironsGoldOMatic.slnx./who validates winner online -> notify winner -> EBS winner payout Pending!twgold → acceptance; [MGM_CONFIRM:UUID] → Sent → pool removalunit-integration-tests.yml, e2e-test.yml, release/monitoring workflows)