pub fn to_csv(summary: &StatsSummary) -> StringExpand description
Renders summary as two CSV sections separated by a blank line: a one-row summary table,
then the recent_requests table. A manual writer (no new dependency) is enough for this
shape — every field is a plain number or a short known-alphabet string, so the only escaping
that can ever matter is on project/project_hash/bypass_reason, handled by [csv_field].