Skip to main content

Report Archive: Monthly and Quarterly Reports from Daily Runs

Sysadmin
Fluency Sysadmin

A reports release, published October 23, 2026. A scheduled report can now keep every day's result for 12 months. With the new fluency-report-rollup skill, Claude builds a month, a quarter or a trend from those daily results. It runs no long query, is not held to a report's 60-day limit, and states on the page which days it covers.

Report Archive is available on every instance. For analysts who build reports in Claude Co-Work or Claude Code, it needs two things: the archive turned on for the report, and the fluency-report-rollup skill.

What's new​

  • A daily archive. A scheduled report with the archive turned on runs once a day for exactly the previous day, 00:00 to 24:00 in the archive timezone (UTC unless an administrator sets another). Each day's result is kept for 12 months, with its row counts and the version of the report script it ran on.

  • Archive tools on the MCP server. Three new tools on the tenant's MCP server let Claude work with the archive:

    ToolWhat it does
    list_report_archiveLists the archived reports, or for one report, its days with a coverage summary: missing, aborted and running days, and the script versions in the range.
    download_report_archiveDownloads one day, or a range of up to 92 days.
    backfill_report_archiveRuns the report for past days that are missing, in the background.
  • The fluency-report-rollup skill (1.0.0). It checks coverage, reads the report's script to decide how each table combines, merges the daily results, and hands them to fluency-report to draw the page.

Running a 90-day report directly is slow, and many reports refuse ranges that long. An archived day is a finished result, so a month is 30 small results that already exist, and Claude only has to combine them correctly.

Before you start​

  1. Turn the archive on for the report. Ask Claude Which reports are archived? If yours is not listed, an Ingext administrator turns the archive on in the report's definition. The report also needs a daily schedule:

    "scheduleFlag": true,
    "schedule": { "interval": "daily", "hour": 3, "minute": 15, "timezone": "GMT" },
    "archive": { "enabled": true, "timezone": "UTC" }

    archive.timezone sets where a day starts and ends; schedule.timezone only sets when the run fires. For a report managed in git, add the archive block to the report's file in the Scripts repo, next to schedule. The report editor on Reports → Scheduler does not show this block yet. Days exist from the moment the archive is on. Earlier days can be backfilled while their data is still in the datalake.

  2. Install the skill. Install fluency-report-rollup from the ingext_skills repository; the packaged file is cowork/fluency-report-rollup.skill. It works with fluency-report, which draws the page, so install that too if you don't have it.

How Claude builds the report​

  1. Checks coverage. Claude lists the archive for your period, with both ends included: "September" is September 1 to 30, "Q3" is July 1 to September 30, and "the last 90 days" is the 90 days ending yesterday. Missing days are named, and Claude offers to backfill them, or builds the report from the days that exist and says so on the page. It never scales a partial month up to a full one.
  2. Reads the report script. For every table the report returns, Claude decides how daily results combine (see the merge rules below).
  3. Downloads, merges and renders. Up to 92 days arrive in one download; longer periods are split. The merge takes seconds. The page states the period, the timezone of its day boundaries, the coverage, and whether the script changed during the period.

Merge rules​

Adding up daily results is only right for some kinds of numbers, so the skill decides table by table from the report's script.

The table holdsHow the days are combined
Counts and sizes per keySummed per key. A key that appears on only some days still counts.
A top-N listRe-ranked from the summed table. Something ranked 11th every day can be first for the month, so daily top-10s are never combined.
TotalsRecomputed from the merged table. Six event types every day is six for the month, not 180.
A time seriesEach hour kept once, then rolled up to days, or to months for a quarter.
Peaks, lows, latest stateThe maximum, the minimum, or the newest day's value.
Averages and ratiosRecomputed from the summed parts when the report returns them; never an average of daily averages.

Medians, percentiles, and distinct counts that come without a per-key table cannot be rebuilt from daily values. Claude says so and shows them per day, or leaves them out. It does not approximate them.

Worked example and accuracy​

System_Event_Ingress_Report shows how much data a tenant ingests, by event type, product and destination, with a time series. It refuses ranges over 60 days, so a quarter can only be assembled from daily results. On a Fluency test tenant, Claude built it for the 30 days from September 23 to October 22, 2026 (UTC): 30 of 30 days, one script version throughout.

  • 14.81 GB ingested in 5.65 million events, across 6 event types: 494 MB a day on average, with the largest day on October 19 (1.27 GB).
  • By destination: eventwatch 11.10 GB (3,852,231 events), datalake 3.71 GB (1,798,064 events).
  • Each daily run also returns the hourly bucket that straddles its start. The 30 buckets that belonged to the previous day were left out of the series, so no hour is counted twice.

We also ran the report directly over the same 30 days and compared every table:

TableAssembled vs. direct run
Total ingress14,811,590,885 vs. 14,811,615,349 bytes (−0.0002%)
By event type, product, destinationSame keys; the worst single key differs by 0.015%
Daily seriesThe worst day differs by 0.0006%
Top event types and productsIdentical order

The small differences come from how metrics are measured at the edges of a time window, and they shrink as the period grows. The first time you assemble a report, ask Claude to spot-check one number against a direct run over the last 7 days.

Prompts to try​

  • Which of my scheduled reports are archived, and how many days does each have?
  • Build the September 2026 System Event Ingress report from the archive.
  • Build a Q3 2026 System Event Ingress report with one row per month in the trend.
  • Compare System Event Ingress month over month for the last three full months, by event type.
  • Which days of the last 90 are missing from the System Event Ingress archive? Backfill them.

Limits​

  • Retention. 12 months from the day the archive was turned on. Before that, days can be backfilled while the source data is still in the datalake.
  • Today is not included. A day is archived after it ends, at the next scheduled run. "Last 30 days" means the 30 days ending yesterday.
  • Missing days. Claude names them and asks whether to backfill. Backfill runs in the background, one day after another, about one report run per day, and skips days already completed. One backfill runs at a time per tenant. A day whose data has aged out of the datalake comes back empty, and Claude flags days far below their neighbours.
  • Script changes. Each day records the script version it ran on. If the version changes inside your period, Claude warns that days before and after may not be comparable. With your agreement it reruns the older days on the current script, which replaces them.
  • Timezone. Days are in the archive timezone, UTC unless an administrator set another. The page always states it.

See Scheduling and Delivery for putting a report on a schedule.