Adds the attribute keys the Apple and Android clients need to record startup, network, auth, and playback behavior in diagnostics reports. The four playback keys were already being emitted by the Apple client but were never registered here, so they were silently dropped by this collector and hard-rejected by the hosted one. Registering them makes the canonical registry the superset it was always meant to be. position_seconds is deliberately registered as position_ms (integer): attrValueType has only string and integer, and a millisecond ordinal avoids adding a float type for a single key. launch_type is a string for the same reason, rather than a bool. New keys: playback: session_id, play_method, reason, position_ms lifecycle: phase, duration_ms, outcome, reason, launch_type network: outcome, error_code, attempt Purely additive; no existing key changes type or is removed. TestAttrRegistryStaysInSync keeps the Go map and the JSON in lockstep. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
The canonical client-diagnostics v1 contract lives in v1/.
Clients vendor the schema files, attribute registry, and fixtures from this directory.
Servers accept supported schema versions and ignore unknown additive fields.
Within v1, changes are additive only: new optional fields, enum values after coordinated client support, and new allowlisted archive entries.
Breaking changes require a new versioned contract directory and explicit server support.