Historische Originaltexte in ihrer Quellsprache. Frühere Installationsbefehle und Modulversionen beschreiben den damaligen Stand; für ein aktuelles Update gilt die Anleitung des neuesten Pakets.
CHANGELOG_V101_PLAYER_JOURNEY.md
# WARGRID v101 · private match guides and readiness
## Installed website changes
- Event planner → Captains & teams → **Personal match guides and start readiness**. Same square controls and responsive layout as the War planner.
- Encrypted per-event/per-server join-password storage using the existing stable web-host secret (`WARGRID_RENTAL_BRIDGE_SECRET`). Admin GET responses expose only `passwordConfigured`. Preserve that secret and `.wargrid-secrets.json` across deployments. A password saved here does **not** change the actual Trackmania server password.
- Detailed English private driver guide with team, captain, role, exact server, Zurich start, confirmed match status, password, PC/PS/Xbox joining instructions, rules and editable support/welcome text. Templates support `{player}`, `{team}`, `{war}`.
- Verified Discord IDs only. Typed names do not unlock delivery. Persistent message IDs allow editing the existing guide after team, captain, password, schedule, online state or live-state changes.
- Captains see a current missing/spectating/unknown-driver list in their private guide. Actual player presence comes from the selected server’s snapshot, never from registration counts.
- Optional 30/10/5-minute reminders, deduplicated by exact event/server/War/player/start schedule. Only the current threshold is sent; no retroactive 30-minute backlog. Already-driving players, offline/unknown servers and ACTIVE Wars are not reminded.
- Optional start gates: bound confirmed teams and captains, fresh source, online game server, reported module versions, planned start reached, stored password when required, verified Discord links and all players driving when enabled. A manual live-control action is still an intentional staff override, not governed by these automatic-start switches.
- Optional live late entry. Both application and approval recheck the exact ACTIVE deployment, fresh online server, enabled assignment automation and free team capacity. Staff approval is still required. Accepted players are queued into the smaller free team, and receive their guide only after the signed EvoSC roster confirms membership. Existing registration remains closed; reaching capacity does not overwrite `started` with `full`.
- Persistent private delivery ledger (no stored message bodies/passwords): state, recipient login, attempts, message/channel IDs, digest, retry deadline and sanitized error. Discord 429 pauses the batch across restarts. PATCH updates can be safely retried with backoff; ambiguous POST outcomes become `uncertain` rather than blindly duplicated. Explicit retry is available in the existing deployment controls.
- Closed DMs get a non-secret website notification; it never includes the game-server password.
- Removed/relinked players and ended/archived events get the bot’s existing guides redacted when Discord permits editing. This cannot erase screenshots, forwarded messages or credentials somebody already memorized. Rotate the **actual** server password if access must be revoked immediately.
- Discord text/voice cleanup now requires a confirmed end for the exact server and War. A missing War, pause or stale source is not a cleanup signal.
## Setup order
1. Install the website release, preserving private environment files and encryption keys. Run `npm run db:migrate` with the existing database environment, then restart the existing website process. Do not replace its private configuration with a package example.
2. Ensure the selected server reports a fresh Bridge heartbeat, running Bridge/Manager versions, the game’s `online` state and `livePlayers` with `isSpectator` flags. Bundled modules remain Bridge **0.2.6** / Manager **0.17.2**; this release changes the website workflow, not PHP module versions.
3. Link participant Discord identities. A typed Discord name is not an identity verification.
4. Create an empty EvoSC draft, close normal event registration and select captains. Save deployment settings with DMs enabled.
5. Save the private match guide. Enter the existing game-server password, or explicitly declare a public server; configure support and readiness gates.
6. **Deploy teams before the planned start** if you want 30/10/5-minute reminders. “Deploy at the start time” cannot send pre-start guides to teams that do not yet exist. Enable automatic start with readiness gates to hold the already-deployed draft until the planned time and configured requirements pass.
7. Enable team text/voice and public match announcements in the existing Discord settings. Those channels still use the confirmed ACTIVE roster and global guild/category settings; they are not created from signup previews.
8. Test one PC and one console player on a non-production draft. Check private guide delivery, a changed password, missing-driver status, manual console helper invite, actual join detection and an actual EvoSC start/end acknowledgment before enabling unattended production use.
## State contract
`APPLICATION_PENDING → STAFF_ACCEPTED → TEAM_COMMAND_QUEUED → EVOSC_TEAM_CONFIRMED → PRIVATE_GUIDE → DRIVER_PRESENT → START_CHECKS_PASS → START_COMMAND_QUEUED → EVOSC_ACTIVE → EVOSC_FINISHED → DELAYED_CHANNEL_CLEANUP`
None of the intermediate website states is a substitute for an EvoSC acknowledgment. A Discord message failure does not undo admission. A driver presence error does not invent readiness.
## Complete requested lifecycle: honest coverage
| Requirement group | This build |
|---|---|
| War ID, selected server, captains, real roster, version diagnostics | Existing implementation + new event/server binding checks. |
| Private A/B text and voice channels/access reconciliation | Existing ACTIVE-only workflow; hardened confirmed-end cleanup. |
| New player, approval, team deployment and personal welcome | Existing atomic approval/assignment plus new detailed updateable private guide. |
| Server password, start time, team/captain changes | Encrypted private configuration and guide updates; actual game password rotation remains an operator action. |
| Reminders, missing-driver list, start gates, live-state transition | Added here. A game login connected without a spectator flag is `connected`, not falsely `driving`. |
| Late entry during an ongoing match | Added, opt-in, exact fresh ACTIVE War and free slot required. |
| Console invitation request, helper claim, expiry, join confirmation | Existing bridge/helper workflow; the actual in-game invitation is still sent by a connected player. |
| Closed DMs, rate limiting, restart state, uncertain delivery | Persistent ledger/backoff/non-secret fallback + explicit review/retry. |
| Registration/captain/record/result announcements | Existing configurable Discord announcement workflow. |
| Automatic pre-war category + central pinned war-info message | **Not added in v101**. Current private channels remain ACTIVE-only; driver guides are the new central private source per person. |
| Staff-only/captain-only channel roles and captain reserve-management commands | **Not added in v101**. Existing staff/admin and signed late-entry review permissions remain in effect. |
| Actual Discord voice presence (e.g. 4/5 ready) | **Not available from the REST-only bot**. Requires a deployed Discord Gateway consumer and appropriate state tracking; never infer it from channel permissions. |
| Wrong actual in-game team detection/escalation | **Not available in the current player snapshot**. War roster membership is available; live game team selection is not. |
| Per-user locale, all template variants, unified lifecycle event bus | English match guides + existing templates/engines. **Not a complete event-bus or multilingual rebuild.** |
| Central results attachment and read-only-channel phase | Existing result announcements and delayed cleanup; **no new pinned-results/read-only phase here**. |
| Fully automatic game invites and password installation/rotation | **Not claimed.** No supported game-invite API was introduced; this build stores the operator’s existing join password securely. |
The 39-point attachment is a target specification, not a statement that all 39 points have passed live integration tests. Production Discord permissions, real game invites and fresh installed module heartbeats require a real staged run.