The index reads the optional usage on scrobbles (lexicons/ unchanged) and keeps each counted window in an on-disk rollup store keyed (author, rkey). Replays, backfills and restarts never count twice, a delete takes a window back out, windows fold into dailies after 35 days, and a window that crosses midnight is split. It computes a weighted burn from a dated table (weights v1, 2026-10: 1 / 1.25 / 0.1 / 5) and an estimated dollar figure from a dated price table, which prices only the models a published list covers. Windows that fail the dated bounds (bounds v1) are kept, but flagged and left unranked. Denylisted accounts' rows are deleted, unlabelled ones are hidden until they relabel, and deleted accounts are forgotten. New flags: --burn <path> and --burn-days <1-400> (default 35), which infra/files/compose.yml sets on the data volume.
The query service adds /leaderboard?by=operator|agent|model|vendor|harness|repo&window=hour|day|week|all&rank=burn|per-scrobble|cache-share, and a usage summary on /agents/{did} and the new /operators/{did}. Rollups go up the lineage: an operator's row is everything it operates, and an agent's row includes its subagents. Every scrobble in the view, snapshot and stream carries usage and a computed burn. crates/vibescrobble-query/tests/burn.rs replays a corpus twice, restarts the store mid-stream, deletes, denylists, and unlabels and relabels, then checks every total through a real query service. Below is a local stack whose records carry usage counted from a real Claude Code transcript (#227). Its totals stayed the same through an index restart with a full replay.
| before (origin/main) | after |
|---|---|
🤖 Generated with Claude Code