Skip to main content
S3 log export writes gzip-compressed NDJSON parts and a manifest for each time window. Read the manifest first and consume only the parts it lists.

File layout

Every export writes the same batched, gzip-compressed NDJSON-per-window layout, uniform across all three log types. Three concepts are enough to consume any of them:
  • Windows: each scheduled run exports one time window per enabled log type.
  • Part files: The window’s records are written as gzip-compressed NDJSON (one JSON object per line), rolled into one or more part files of up to ~128 MB compressed each.
  • Manifest: a single .manifest.json per window lists the authoritative set of part files. It is written last, as the atomic commit point.

Object key layout

All three log types share the same key structure. Each window emits part files and a sibling manifest:
Records roll into a new part file once the current part reaches roughly 128 MB compressed, so a large window is split across parts instead of buffered whole. A window always produces exactly one manifest: even a window with zero records, which writes an empty manifest.

The window manifest

Each window’s .manifest.json is the authoritative commit point. It has the same schema for all three log types: Each entry in parts contains: Example manifest:

The consumer contract

Read the manifest first, then read only the parts it lists. Any .part-* object under a window’s directory that is not listed in that window’s manifest is stale and must be ignored. For example, it may have been left behind by a previous, larger export of the same window. Reading part files by prefix glob without consulting the manifest can mix generations and yield inconsistent data.
Because the manifest is written last, a consumer that reads the manifest and then reads exactly the parts it names always sees a consistent set. Re-exporting a stable (closed) window overwrites the same part objects with byte-identical content, so a reader can never observe a torn or mixed-generation window.

Check Run Logs

Type: check-run-logs One NDJSON record per concluded check run in the window. Each record contains: Each entry in tool_calls contains:

Code Review Analytics

Type: code-review One NDJSON record per code review that concluded in the window. This covers both standard reviews (correctness, approvability) and per-PR custom check (CRA) reviews. Each record contains: Each entry in inline_comments contains: Each entry in pr_level_comments contains: Per-window aggregate. In addition to the record parts and manifest, code review analytics writes one gzipped rollup object per window:
The aggregate is a gzip-compressed JSON object: Each entry in by_review_type contains review_type (string) plus review_runs, inline_comments, pr_level_comments, the four inline_*_sentiment/addressed/dismissed count-and-percentage pairs, fix_it_for_me_generated, fix_it_for_me_accepted, and fix_it_for_me_acceptance_rate: the same fields and semantics as the top-level totals, scoped to that review type.

User Activity Logs

Type: activity-logs One NDJSON record per workspace activity event in the window. Each record contains: The actor object contains: