# TOAST Addon Roadmap

## Versiestrategie

Addon en bot hebben aparte versienummers.

- Addon: `0.9.x-alpha` = interne alpha, `0.9.x-beta` = gesloten beta, `1.0.0` = publieke release.
- Bot: `2.0.0` wanneer de addon publiek live gaat.
- Dagelijkse data-exports wijzigen de addonversie niet.

---

## Huidig: v0.9.4.2-beta

### Fundament en distributie

- [x] Addon skeleton, `/toast` dispatcher en minimap button.
- [x] Dagelijks gegenereerde roster-, leaderboard-, trends-, benchmark- en forecastdata.
- [x] CurseForge packaging via `.pkgmeta`.
- [x] Accountbrede SavedVariables (`TOAST_DB`).
- [x] Addonversie als single source of truth vanuit `TOAST.toc`.

### Dashboard en leaderboard

- [x] Dashboard met Status Report, My Crew, Current SEAMEN Keys, Your Progress en Community Pulse.
- [x] Leaderboard met class colors, role icons, Discord-prefixen en eigen-rij-highlight.
- [x] Zoekfunctie en filters voor role, Discord-prefix en minimale key level.
- [x] Contextmenu's voor Invite, Whisper, Copy Name en View Crew.
- [x] Online-status via C_Club met last-seen fallback.
- [x] Neutrale zebra-striping; goud voor identiteit/selectie en teal alleen voor live/statussignalen.

### Keys

- [x] Eigen key broadcast via `GUILD` bij login en na een dungeon.
- [x] LibKeystone-berichten van BigWigs, DBM en Details verwerken.
- [x] `KEY_REQUEST` via `GUILD` en gerichte `WHISPER`.
- [x] Gespreide discovery-whispers voor crewleden buiten de guild.
- [x] Keycache en wekelijkse reset via SavedVariables.
- [x] Alt-aware keyweergave en deduplicatie per Discord-gebruiker.
- [x] Resilient-key badge voor keys op of onder de Resi-floor.

### Trends en forecasts

- [x] Crew RIO-history met datumgebaseerde X-as.
- [x] Monotone PCHIP-rendering voor crewlijnen zonder spline-overshoot.
- [x] Benchmarklijnen voor AVG, Key Enjoyer, 1% en 0.1% cutoff.
- [x] Forecastprojecties als gestreepte voortzetting.
- [x] Estimated-range band met focus/hover en forecasttooltips.
- [x] Historische benchmarktooltips.
- [x] Lokale actuele score als aanvullend trendpunt.

### Centrale scorearchitectuur

- [x] Veilige lokale M+ API-observatie voor het ingelogde character.
- [x] Accountbrede score-observatiecache met season guard.
- [x] `TOAST.ResolveCharacterScore()` als centrale best-known scorebron.
- [x] Bronnen: local self, `members.lua`, `leaderboard.lua` en `trends.lua`.
- [x] Resolver gebruikt door Trends, My Crew, View Crew, Status Report, Your Progress en Leaderboard.
- [x] Resolver-gebaseerde leaderboard snapshot, volgorde en rang.
- [x] Gegenereerde botdata blijft immutable.

---

## Volgende fase: specificatie vóór implementatie

### 0. Centrale presence-laag

- [x] Presence losgekoppeld van key-data in `TOAST_DB.presence`.
- [x] Centrale statusresolver met `online`, `known` en onbekend.
- [x] Positieve observaties uit eigen login, C_Club en bekende addon-afzenders.
- [x] Leaderboard, View Crew, My Crew en Dashboard-footer gebruiken dezelfde presencebron.
- [x] Eenmalige migratie van bestaande `keys.lastSeen`; keyleeftijd blijft key-specifiek.
- [x] Mislukte of combat-geblokkeerde C_Club-scans wissen geen geldige sessiestatus.

### 1. Peer-to-peer Crew State protocol

- [ ] `COMMS_PROTOCOL.md` vastleggen voordat nieuwe comms-code wordt geschreven.
- [ ] Gescheiden `protocolVersion` en `addonVersion` definiëren.
- [ ] Compacte, versieerbare berichttypen specificeren:
  - `HELLO` / version discovery;
  - `STATE_REQUEST`;
  - score/key state response;
  - gerichte whisper-response.
- [ ] Exact identity-contract vastleggen: character, realm, season en afzender.
- [ ] Cachecontracten vastleggen voor keys en RIO:
  - keys zijn vluchtig en verlopen snel;
  - RIO is season-bound en normaal monotone stijgend.
- [ ] Throttling, batching, deduplicatie en request-jitter vastleggen.
- [ ] Kanaalregels behouden:
  - `GUILD` voor guildbrede state;
  - `WHISPER` voor bekende crewleden buiten de guild;
  - geen addon-messagekanaal voor WoW Communities.
- [ ] Baseline-validatie vastleggen:
  - sender identity moet bij de payload passen;
  - season mismatch en ongeldige waarden weigeren;
  - ontvangen claims nooit namens derden doorsturen;
  - ontvangsttijd lokaal zetten en geen sender timestamp vertrouwen.

### 2. Addonversie en updatewaarschuwing

- [ ] Addonversie meenemen in het nieuwe `HELLO/STATE`-protocol.
- [ ] Semantic versions inclusief alpha-suffix correct vergelijken.
- [ ] Bij een hogere waargenomen versie één chatmelding per sessie tonen.
- [ ] Bekende guild-/crewafzenders accepteren; ongeldige versies negeren.
- [ ] Geen HTTP-checks, pop-upspam of waarschuwingen door dagelijkse database-updates.

### 3. What's New / changelog-popup

- [ ] `CHANGELOG.md` blijft de menselijke source of truth.
- [ ] Release/packaging-stap genereert Lua-data voor de huidige versie.
- [ ] `TOAST_DB.lastChangelogVersion` accountbreed bewaren.
- [ ] Popup lazy tonen bij de eerste geopende TOAST-view na een echte addonversie-update.
- [ ] Dagelijkse data-updates activeren de popup niet.
- [ ] Alleen de huidige versie tonen; een nieuwe installatie gebruikt de bestaande welcome-flow.
- [ ] Compacte TOAST-layout met muted gold, zonder algemene UI-redesign.

### 4. RIO delen via comms

- [ ] Eigen score proactief via `GUILD` delen bij login en relevante scorewijziging.
- [ ] Score/state reactief via `WHISPER` beantwoorden aan bekende crewleden buiten de guild.
- [ ] Iedere client bewaart per character de meest recente geldige peer-observatie.
- [ ] Peer-RIO als nieuwe kandidaatbron aan `ResolveCharacterScore()` toevoegen.
- [ ] Alle bestaande views profiteren automatisch via de resolver; geen losse UI-precedence meer.
- [ ] Binnen hetzelfde seizoen geen lagere peer-score accepteren.
- [ ] Remote cache nooit gebruiken om namens een ander character te broadcasten.

---

## Trend Viewer v2

Doel: lange scoregeschiedenis leesbaar houden zonder extra visuele drukte.

### Viewport en tijdnavigatie

- [x] Een datumgebaseerde viewport los van het volledige datadomein introduceren.
- [x] Compacte vaste presets boven de grafiek: `7D`, `4W`, `8W`, `16W`, `ALL`.
- [x] Standaard `8W` tonen wanneer die geschiedenis beschikbaar is; anders direct `ALL`.
- [x] Een preset alleen activeren wanneer die de historische crewdata werkelijk begrenst; langere niet-passende presets blijven zichtbaar maar gedimd.
- [x] Klikken kiest een preset; het muiswiel doorloopt uitsluitend beschikbare presets met een korte interne throttle.
- [x] `ALL` toont de volledige beschikbare history plus een eventuele actieve forecast.
- [x] Presets tellen terug vanaf de nieuwste echte crewsnapshot; forecastdagen tellen niet mee voor beschikbaarheid en mogen het domein rechts uitbreiden.
- [x] Geen vrije zoom, drag-pan, dagelijkse tussenvensters of permanente range-slider.

### Assen, rendering en interactie

- [x] Y-as automatisch berekenen uit uitsluitend zichtbare crewdata, actieve benchmarks en zichtbare forecast ranges.
- [x] X-aslabels dynamisch verdelen op beschikbare pixels en zichtbare datumrange.
- [x] Alleen zichtbare punten, hovertargets, bands en lijnsegmenten renderen.
- [x] Tooltips, focus en benchmarktoggles blijven werken binnen de viewport.
- [x] Geen Lua-side statistiek toevoegen; forecastwaarden blijven volledig bot-generated.
- [x] Performance bewaken bij langere histories en dagelijkse benchmark/forecastdata.

### Maximize / restore

- [ ] Maximize-knop toevoegen naast de viewportcontrols.
- [ ] Vergrote layout binnen `UIParent` met kleine schermmarges; geen `SetScale()`.
- [ ] Plot werkelijk opnieuw berekenen op de grotere breedte en hoogte.
- [ ] Header, legenda, crew-overzicht en TOAST-huisstijl behouden.
- [ ] Restore herstelt vorige positie en afmetingen.
- [ ] Maximize-status blijft session-only tenzij later een duidelijke gebruikersbehoefte ontstaat.

### Geplande implementatiepasses

1. [x] Vaste presets, dynamische beschikbaarheid, bediening en horizontale clipping.
2. [x] Y-as uit zichtbare data en interactie-/forecast-randgevallen.
3. [x] Visuele polish en in-game performancecheck.
4. [ ] Maximize/restore reflow als zelfstandig vervolgtraject.

Niet gepland: vrije zoom/pan, een permanente range-slider of mini-overzichtsgrafiek; die voegen meer complexiteit en visuele drukte toe dan navigatiewaarde.

---

## Verdere v0.9.x backlog

- [ ] Activity-ranking highlights in het leaderboard.
- [ ] Favorites-systeem.
- [ ] Settings-scherm.
- [ ] Crew-alts state sharing verder uitbreiden na het comms-fundament.
- [ ] `/help`- en `/info`-teksten toetsen aan de actuele functionaliteit.
- [ ] Cross-navigation patroon centraliseren in een shared helper.
- [ ] `SetDeltaColor`-duplicatie opruimen.
- [ ] Witness-verificatie voor peer-scores onderzoeken:
  - onafhankelijke addon-confirmatie;
  - confidence/quorum;
  - bescherming tegen opzettelijk corrupte broadcasts.

---

## v1.0.0 - Publieke release

- [ ] Alle gekozen v0.9.x-features stabiel.
- [ ] CurseForge listing publiek maken.
- [ ] README en installatie-instructies voor eindgebruikers.
- [ ] Bot versie `2.0.0`.

---

## Na v1.0.0 - Runtime lifecycle hardening

Doel: de regels uit `ARCHITECTURE.md` toepassen zonder deze wijzigingen nog
voor de publieke release in het kritieke pad te brengen.

### Geplande implementatiepasses

1. [ ] Activity-driven addon-messagequeue:
   - geen permanente `OnUpdate` wanneer de queue leeg is;
   - exact wakker worden voor het volgende verzendbare item;
   - prioriteiten, `notBefore`, throttling, retries en callbacks behouden;
   - in combat slapen en via `PLAYER_REGEN_ENABLED` hervatten;
   - maximaal één geplande wake-up en geen dubbele verzending.
2. [ ] Aparte in-game queuevalidatie en correctiepass:
   - loginbroadcast, guild, whisper en chunked transfers;
   - throttle/retry en combat defer/resume;
   - bevestigen dat de queue na afloop volledig slaapt.
3. [ ] Activity-scoped comms-cleanup:
   - starten bij de eerste tijdelijke claim, transfer, sync of harvest-entry;
   - verlopen state blijven opruimen;
   - stoppen zodra alle beheerde registries leeg zijn.
4. [ ] Scrollbar lifecycle:
   - smooth-scrolldriver alleen terwijl easing actief is;
   - drag-driver alleen tussen mouse-down en mouse-up;
   - defensief stoppen bij `OnHide` of afgebroken drag.
5. [ ] Finale read-only audit van `OnUpdate`, timers, tickers, events, hooks en
   verborgen-view refreshes, gevolgd door een in-game idle/combat smoke test.

Deze passes veranderen het Crew State protocol niet. Ze worden bewust na de
release uitgevoerd zodat communicatiegedrag voldoende stabilisatietijd krijgt.

---

## v1.1 - September: Trends LoadOnDemand

- [ ] Trends-view en volledige historische trenddata als afzonderlijke
  LoadOnDemand addonboundary ontwerpen.
- [ ] Kleine dashboard-samenvatting apart laten exporteren, zodat het dashboard
  de volledige trendhistorie niet hoeft te laden.
- [ ] Packaging, SavedVariables, commando-routing en eerste-load foutafhandeling
  specificeren voordat bestanden worden verplaatst.
- [ ] Login-RAM en laadtijd vóór en na de splitsing in WoW vergelijken.

Niet meenemen als incidentele cleanup in de runtime-lifecyclepasses hierboven.

---

## Najaar - Bridge captain (v1.x)

- [ ] Bridge script op captain-pc leest TOAST SavedVariables.
- [ ] State naar de TOAST bot sturen.
- [ ] `#current-keys` Discord-channel.
- [ ] Twee bridge captains voor redundantie (TIDE en SEAMEN).

---

## Laag prioriteit / optioneel

- [ ] `!lfm` in guildchat triggert een in-game keybroadcast.
- [ ] `!lfm` naar Discord LFM-event (bridge-afhankelijk).
- [ ] Right-click menu voor minimap button.
- [ ] Minimap button hide/show setting.

## On hold, afhankelijk van 12.1

- [ ] In-game LFM/listing-systeem alleen bouwen als Blizzard dit niet zelf afdekt.
