componentsrefactor(agentExecutions): absolute imports in the new trace module
CLAUDE.md requires absolute imports; the execution-trace work introduced 30
relative ones, which is what Greptile flagged. Same treatment as the canvas
modules in 6410cb601 — intra-module `./Sibling` specifiers are rewritten too,
not just the `../` ones, so the module does not establish a second convention.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 17, 2026, 10:43 PMutilsrefactor(agentExecutions): absolute imports in the new trace module
CLAUDE.md requires absolute imports; the execution-trace work introduced 30
relative ones, which is what Greptile flagged. Same treatment as the canvas
modules in 6410cb601 — intra-module `./Sibling` specifiers are rewritten too,
not just the `../` ones, so the module does not establish a second convention.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 17, 2026, 10:43 PMconstants.tsfeat: draw measured tool calls as real bars, and stop the filter inventing dead time
Tool spans now render as bars scaled to the root window when timingSource is
'measured', keeping the minimum clickable floor; 'completion-only' rows keep the
point marker. The discriminator is the flag, never durationMs === 0, because a
genuinely instantaneous measured call is now representable and must look
different from one that was never measured.
The stale copy was inverted, not merely incomplete: the module claimed
`created_at` was a start ("Tool calls store only a start time") when it is the
completion, so the marker was drawn at an end and labelled a start. The labels
are fixed too, not just the shape.
The gap indicator was structurally incapable of firing on any execution whose
children are tool calls — they were all zero-width, so coverage was empty and it
returned early. That is the whole leaf tier of every trace. Measured tool calls
now count as coverage and the bands appear where they were always meant to.
The design's "usually the model thinking" is documented as an upper bound rather
than an identity: a mixed trace still hides un-instrumented tool time inside the
gap, only direct children count, and framework latency lands there too.
One live correctness bug found while verifying that: gaps were computed from the
FILTERED span list. Harmless while tools covered nothing, but with real widths,
filtering to one tool deleted a covering call and fabricated ~2.8s of thinking
that never happened. Gaps are now computed over the unfiltered spans — a gap is a
fact about the run, not about the view.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 11, 2026, 3:05 PMindex.tsrefactor(agentExecutions): absolute imports in the new trace module
CLAUDE.md requires absolute imports; the execution-trace work introduced 30
relative ones, which is what Greptile flagged. Same treatment as the canvas
modules in 6410cb601 — intra-module `./Sibling` specifiers are rewritten too,
not just the `../` ones, so the module does not establish a second convention.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 17, 2026, 10:43 PMtypes.tsfeat: draw measured tool calls as real bars, and stop the filter inventing dead time
Tool spans now render as bars scaled to the root window when timingSource is
'measured', keeping the minimum clickable floor; 'completion-only' rows keep the
point marker. The discriminator is the flag, never durationMs === 0, because a
genuinely instantaneous measured call is now representable and must look
different from one that was never measured.
The stale copy was inverted, not merely incomplete: the module claimed
`created_at` was a start ("Tool calls store only a start time") when it is the
completion, so the marker was drawn at an end and labelled a start. The labels
are fixed too, not just the shape.
The gap indicator was structurally incapable of firing on any execution whose
children are tool calls — they were all zero-width, so coverage was empty and it
returned early. That is the whole leaf tier of every trace. Measured tool calls
now count as coverage and the bands appear where they were always meant to.
The design's "usually the model thinking" is documented as an upper bound rather
than an identity: a mixed trace still hides un-instrumented tool time inside the
gap, only direct children count, and framework latency lands there too.
One live correctness bug found while verifying that: gaps were computed from the
FILTERED span list. Harmless while tools covered nothing, but with real widths,
filtering to one tool deleted a covering call and fabricated ~2.8s of thinking
that never happened. Gaps are now computed over the unfiltered spans — a gap is a
fact about the run, not about the view.
Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 11, 2026, 3:05 PM