Wasted Cycles — wall-clock profiler for coding-agent runs
Copy<br>$ curl -fsSL https://raw.githubusercontent.com/zozo123/wasted-cycles/main/run | sh
No install, no account, no daemon, no API key, no upload. The runner downloads a<br>checksum-verified binary into a temporary directory, runs it, and deletes it on exit.
What it answers
How much of a run was spent blocked on a machine instead of coding?
Which one — the compiler, the test suite, CI, containers, or the registry?
Is the same build or test running more than once?
Which coding harness keeps moving on your workload?
What is the highest-impact bottleneck to fix next?
What the output looks like
Built-in demo dataset — not a real measurement
Every number below comes from the synthetic dataset shipped with<br>--demo, reproduced here in HTML. It exists to show the shape of the<br>report, not to make a claim about any harness. Run the profiler on your own traces<br>to get real figures.
Where the time went<br>4 demo runs · last 7 days
AGENT WORKING
Model work
1h 04m 21%
Read & search
34m 11%
Code changes
1h 10m 23%
Other tool work
6m 2%
BLOCKED ON COMPUTE
Waiting for build
32m 11%
Waiting for tests
29m 10%
Waiting for CI
24m 8%
Waiting for containers
13m 4%
Waiting for agents
12m 4%
Waiting for packages
7m 2%
Repeated build / test
8m 3%
NOT COUNTED
Outside the agent loop
48m
Agent time · blocked on compute<br>4h 59m · 2h 05m (42%)
Blocked on compute is what this tool measures · human time is shown but never counted
In the terminal the same data is a live TUI: arrow keys switch between Overview,<br>Histogram, Runs, and Method; q quits.
Supported trace roots
HarnessLocal sourceResolution
Codex~/.codex/sessionsper event<br>Claude Code~/.claude/projectsper event<br>Grok Build~/.grok/sessionsper turn
JSONL trace files modified inside the selected window are read in place. Nothing is<br>written back, and nothing leaves the machine.
Cursor is not supported. Its transcripts carry no per-event timestamps,<br>only a wall-clock marker on each user turn, and time reconstructed from those markers<br>cannot separate work from idling — on a real corpus it reported a scheduled agent that<br>ticked every 30 minutes for five days as 120 hours of continuous work. A number that<br>wrong is worse than no number, so Cursor traces are skipped until the harness records<br>event times.
Method & limits
The profiler reconstructs elapsed segments between timestamped trace events and<br>classifies each segment by the structured action that opened it: the tool that was<br>called, the command that tool ran, or the message that ended a turn. It reads parsed<br>event structure rather than matching text, so a pasted log or a quoted command in a<br>prompt cannot be mistaken for real activity. It measures wall-clock time, not tokens<br>and not cost.
Every segment lands in one of three groups: agent working (model work,<br>reads, edits, other tool calls), blocked on compute (build, tests, CI,<br>containers, packages, sub-agents, repeated work), and not counted<br>(waiting on a human). Agent time is working plus blocked; throughput is the share of<br>agent time that was not spent waiting on a machine. Human time sits beside those numbers<br>so you can see it, and outside them so it cannot distort them.
A build, test, or CI command that runs more than once in a session is reclassified as<br>repeated work, because the machine did the same job twice.
Harnesses record different things. Codex and Claude Code stamp individual events.<br>Cursor transcripts carry no per-event timestamps, so its runs are reconstructed per<br>user turn and each turn takes the dominant tool category observed inside it; those<br>runs are marked turn on the Runs screen and carry low confidence. Grok Build<br>records only a session start and end, so a Grok run collapses to a single coarse block<br>and is marked turn too. Records the profiler cannot identify are skipped<br>instead of guessed.
Idle time uses two thresholds, because a wait and a walk-away are not the same thing.<br>A gap longer than 2 hours is a session break and is not counted at<br>all, so closing the laptop overnight cannot show up as “waiting for human”.<br>A shorter gap is capped at 30 minutes, and those segments are marked<br>clamped with low confidence. The clamped share of the report is stated<br>on the Method screen and emitted as inferred_ns, so measured time and<br>inferred time stay distinguishable.
“Model work” is an inference proxy , not measured GPU compute<br>time. It is the interval after a user message or a tool result and before the next<br>emitted action. Harnesses expose different levels of timing detail; unless a trace<br>records an exact duration, that interval is an upper bound on real inference. The<br>Method screen in the TUI states this outright, and --json emits a<br>per-segment confidence score so you can weigh each classification<br>yourself.
Prompt text and source code are never stored, rendered, or uploaded. Only timestamps,<br>event kinds, and coarse labels are...