Why
Phase 1 of .claude/standards/data-fields.md (issue #512) covers session_events, network_requests, control_events, plays summary, and label vocabulary — enough for typical play-level investigations. Characterization-test investigations need more: the per-test report shapes (runner.Report, Step, StartupCycleResult, AbortCycleResult, RetryCycleResult, variant_activity, Summary) drive the analysis but aren't field-documented in one place yet.
Today, .claude/standards/*-characterization-test.md (startup, abort) cover their own test mode's fields well, but there's no cross-cutting reference for the shared types (the per-Step envelope, the variant_activity[] shape that appears across modes, the Summary aggregate).
What
Extend .claude/standards/data-fields.md with §6 — characterization report shapes. Same format as Phases 1+2 (entry per field: name, type, units, populated, meaning, gotchas, see).
Cover:
runner.Report top-level (mode, platform, device, player_id, play_ids, started_at, ended_at, variants, steps, samples, summary, abort_cycles, startup_cycles, retry_cycles)
Step (per-step envelope used by smooth/steps/pyramid/rampup/rampdown)
StartupCycleResult (cold-start / channel-change observations)
AbortCycleResult (abort behavior observations)
RetryCycleResult (persistent-fault retry observations)
variant_activity[] (per-variant fetch tracking — playlist_fetches, segment_fetches, first/last_segment_at_s, active_duration_s, peeked_but_never_used, avg/peak_mbps)
Summary (per-run aggregates)
Sample (per-sample telemetry: video_resolution, network_bitrate_mbps, buffer_depth_s, etc.)
Cross-reference (don't duplicate) the per-test standards docs ([[startup-characterization-test]], [[abort-characterization-test]], [[retry-backoff-characterization-test]], [[characterization-principles]]).
Acceptance
- §6 of
data-fields.md is no longer a stub; covers the shapes above with entry-per-field format.
- Bot can explain
variant_activity[i].peeked_but_never_used without inferring from raw JSON.
Out of scope
- Auto-generation from Go struct tags. Tempting but the prose semantics (e.g. "first_variant_picked is the first variant playlist the player fetched — NOT the first variant whose frames actually rendered, which is
variant_at_5s") are the value, and those aren't in the struct tags.
Why
Phase 1 of
.claude/standards/data-fields.md(issue #512) coverssession_events,network_requests,control_events, plays summary, and label vocabulary — enough for typical play-level investigations. Characterization-test investigations need more: the per-test report shapes (runner.Report,Step,StartupCycleResult,AbortCycleResult,RetryCycleResult,variant_activity,Summary) drive the analysis but aren't field-documented in one place yet.Today,
.claude/standards/*-characterization-test.md(startup, abort) cover their own test mode's fields well, but there's no cross-cutting reference for the shared types (the per-Stepenvelope, thevariant_activity[]shape that appears across modes, theSummaryaggregate).What
Extend
.claude/standards/data-fields.mdwith §6 — characterization report shapes. Same format as Phases 1+2 (entry per field: name, type, units, populated, meaning, gotchas, see).Cover:
runner.Reporttop-level (mode, platform, device, player_id, play_ids, started_at, ended_at, variants, steps, samples, summary, abort_cycles, startup_cycles, retry_cycles)Step(per-step envelope used by smooth/steps/pyramid/rampup/rampdown)StartupCycleResult(cold-start / channel-change observations)AbortCycleResult(abort behavior observations)RetryCycleResult(persistent-fault retry observations)variant_activity[](per-variant fetch tracking — playlist_fetches, segment_fetches, first/last_segment_at_s, active_duration_s, peeked_but_never_used, avg/peak_mbps)Summary(per-run aggregates)Sample(per-sample telemetry: video_resolution, network_bitrate_mbps, buffer_depth_s, etc.)Cross-reference (don't duplicate) the per-test standards docs ([[startup-characterization-test]], [[abort-characterization-test]], [[retry-backoff-characterization-test]], [[characterization-principles]]).
Acceptance
data-fields.mdis no longer a stub; covers the shapes above with entry-per-field format.variant_activity[i].peeked_but_never_usedwithout inferring from raw JSON.Out of scope
variant_at_5s") are the value, and those aren't in the struct tags.