## What changed
- Combine file-backed rollouts and buffered rollout prefixes into `rollouts.tar.gz`, keeping diagnostics as separate attachments.
- Bound the archive and its upload envelope by the existing size limit, skip invalid or duplicate archive filenames, and fall back to individual rollout attachments if archiving fails.
- Add `rollout_archive_filename` to the report thread index so rollout filenames identify archive entries or fallback attachments.
## Testing
Add an upload test that extracts the archive and verifies the filenames and contents of both a compressed file-backed rollout and a buffered rollout. Update the thread index test to check the archive filename.
GitOrigin-RevId: 973da6eec2249b04ef7992b5e1e4fd27f044b80f
## Why
Sentry tags cannot contain newlines or exceed 200 characters, but report comments can contain both.
## What changed
Limit the `reason` tag to the first 200 Unicode characters and replace each carriage return or newline with a space. Preserve the full, unchanged comment in the exception body.
## Testing
Add coverage for line endings, the 200-character boundary, and multibyte Unicode comments. A mock upload test checks that the compressed Sentry envelope contains the bounded tag preview and full comment, even when caller tags attempt to override `reason`.
GitOrigin-RevId: e0f0db6a9797a817da2f868727077c948ad82bfb
## Why
Callers need to label report events without causing submissions that share a title
to be grouped together and suppress new-issue alerts.
## What changed
- Use the caller-provided title tag for the event message and exception type when
its value is nonblank.
- Give custom-titled events a unique fingerprint so each report remains separate.
- Preserve the existing session-based title and grouping when the tag is missing
or blank.
## Testing
Add event contract tests covering custom, missing, and blank titles; preserved
comments; Unicode and whitespace; and unique fingerprints.
GitOrigin-RevId: 8a03065bb6c4d4d0cfb741496e2aa2e8ac102327