Show HN: Wasted Cycles – Local wall-clock profiler for AI coding agents

zozo123-IB-IL21 pts0 comments

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 &ldquo;waiting for human&rdquo;.<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.

&ldquo;Model work&rdquo; 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...

time waiting agent runs work build

Related Articles