# Phase 16 — Anonymous Play & Share Tracking (Design Spec) Status: **design-complete — decisions D1–D7 resolved by Daniel 2026-06-19.** Author: product-designer. Drafted 2026-06-18; decisions resolved and phasing re-sequenced 2026-06-19. **No code has been written by this doc.** This is the phase deferred behind the home-hero "Plays" stat card, which today renders a static `XXX / Plays (Coming Soon)` odometer placeholder in `NowPlayingStats.razor`. **Phasing note (Daniel directive, 2026-06-19):** the waves run **bottom-up** — foundation first, metrics stacked on the substrate, the user-visible Plays-card flip is the **capstone (built last)**. This deliberately **reverses** the earlier "visible win comes early" framing: Daniel does not care about the live card until everything underneath it is finished, so the whole telemetry substrate and all metrics (including unique listeners) land before the card lights up. See §6. This spec adds a **privacy-light, anonymous play & share telemetry layer** to the public site: counting plays (bucketed by completion) and shares, tied to individual tracks and releases, with an optional unique-listener "plus" metric. It does **not** add accounts, PII, or any per-user identity model — that is a hard constraint, not a deferral. ## Phase numbering This is **Phase 16**. Phase 15 (Visualizer Controls Enhancements) is the highest-numbered phase in `PLAN.md`. Phases 11 and 10-Reframe are landed; no phase 16 exists yet. If a concurrent worktree has claimed 16 by the time this is scoped, bump to the next free number — the content is number-independent. ## Cross-references (read these before implementing) - `DeepDrftPublic.Client/Services/StreamingAudioPlayerService.cs` — the production player. The instrumentation seam lives here: `LoadTrackStreaming` (track-load = play-start candidate), the progress callback path, and `ResetToIdle` (stop/unload/switch). `_currentTrackId` holds the current `EntryKey`. **No release id is currently held by the player** — see §2.3. - `DeepDrftPublic.Client/Services/AudioPlayerService.cs` — base class. `OnProgressCallback(double currentTime)` is the per-tick position seam; `OnPlaybackEndCallback` is the organic end-of-stream seam (and the only place `TrackEnded` fires). `Duration` is set from the WAV header during load. - `DeepDrftPublic.Client/Services/AudioInteropService.cs` — `SetOnProgressCallbackAsync` / `SetOnEndCallbackAsync` are the JS→.NET callbacks already wired in `InitializeAsync`. Progress is throttled to ~10/sec on the JS side already. - `DeepDrftPublic.Client/Services/QueueService.cs` — auto-advance orchestrator. Album playthroughs flow `PlayRelease → PlayCurrent → SelectTrackStreaming` per track; `OnTrackEnded` advances. Every track in an album play is an independent `SelectTrackStreaming` call, so per-track play events arise naturally without queue-specific instrumentation. - `DeepDrftPublic.Client/Controls/SharePopover.razor[.cs]` — the **real** share surface. Two share actions exist today: **Copy link** (track mode + release mode) and **Copy embed** (track mode only, an `