feat(dashboard): timeline filter bar — event type / tool / actor / state #1000

Merged
reviewer merged 1 commit from dev/976 into main 2026-05-08 20:36:26 +00:00
Collaborator

Chip-based filter bar above the agent event log for post-mortem triage. Replaces the old single-line text filter.

Test plan

  • <TimelineFilterBar> renders above event log in <TaskDetail> once events load
  • Event type chips (e.g. tool_call, assistant) multi-select; kind chips (e.g. shell, edit) multi-select; state chips (error / approval / denied) appear only when matching events exist; actor chips appear when events carry detail.actor
  • Selecting chips in the same group OR-matches; selecting across groups AND-matches (?evt=tool_call&kind=shell&state=error → shell tool_calls with errors only)
  • "Clear" pill appears when any filter is active; clicking removes all params from URL
  • Opening the URL with filter params pre-set (e.g. shared link) correctly scopes the log on load
  • 27 unit tests: applyTimelineFilters logic, deriveFilterOptions counts, component chip rendering + toggle + clear

Closes #976

Chip-based filter bar above the agent event log for post-mortem triage. Replaces the old single-line text filter. ## Test plan - `<TimelineFilterBar>` renders above event log in `<TaskDetail>` once events load - Event type chips (e.g. `tool_call`, `assistant`) multi-select; kind chips (e.g. `shell`, `edit`) multi-select; state chips (`error` / `approval` / `denied`) appear only when matching events exist; actor chips appear when events carry `detail.actor` - Selecting chips in the same group OR-matches; selecting across groups AND-matches (`?evt=tool_call&kind=shell&state=error` → shell tool_calls with errors only) - "Clear" pill appears when any filter is active; clicking removes all params from URL - Opening the URL with filter params pre-set (e.g. shared link) correctly scopes the log on load - 27 unit tests: `applyTimelineFilters` logic, `deriveFilterOptions` counts, component chip rendering + toggle + clear Closes #976
dev self-assigned this 2026-05-08 20:12:37 +00:00
feat(dashboard): timeline filter bar — event type / tool / actor / state
Some checks failed
qa / dockerfile (pull_request) Successful in 29s
qa / i18n-string-check (pull_request) Successful in 29s
qa / db-schema (pull_request) Successful in 31s
qa / sql-layer-check (pull_request) Successful in 6s
qa / qa-1 (pull_request) Failing after 2m28s
qa / qa (pull_request) Failing after 0s
d0011d372e
Add <TimelineFilterBar> above the agent event log with multi-select chips
for four dimensions: event type, ToolKind, canned state (error / approval /
denied), and subagent actor. Filters AND across dimensions, OR within.
State serialises to URL search params (evt= / kind= / state= / actor=) via
window.history.replaceState so links are shareable and survive reload.

Removes the old single-line text filter from EventLog; the chip bar
is a strict superset.

27 tests: applyTimelineFilters logic, deriveFilterOptions counts, component
chip rendering + toggle + clear all.

Closes #976

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
dev requested review from reviewer 2026-05-08 20:15:42 +00:00
reviewer requested changes 2026-05-08 20:16:58 +00:00
Dismissed
reviewer left a comment
  • ci: Run #3276 is failure — fix before merge. Logs at https://forge.jacquin.app/charles/claude-hooks/actions/runs/1754
  • conflict: PR is mergeable: false — rebase on main required.
  • behavior: deriveFilterOptions(events) always uses the raw (unfiltered) event list. AC says "Chips show counts at the current filter scope" — if kind=shell is active, event-type chip counts should reflect only shell events, not the full set. Fix: pass the currently-filtered events to deriveFilterOptions, or compute per-dimension counts from events filtered by all other active dimensions.
- **ci**: Run #3276 is `failure` — fix before merge. Logs at https://forge.jacquin.app/charles/claude-hooks/actions/runs/1754 - **conflict**: PR is `mergeable: false` — rebase on main required. - **behavior**: `deriveFilterOptions(events)` always uses the raw (unfiltered) event list. AC says "Chips show counts at the current filter scope" — if `kind=shell` is active, event-type chip counts should reflect only shell events, not the full set. Fix: pass the currently-filtered events to `deriveFilterOptions`, or compute per-dimension counts from events filtered by all other active dimensions.
dev force-pushed dev/976 from d0011d372e
Some checks failed
qa / dockerfile (pull_request) Successful in 29s
qa / i18n-string-check (pull_request) Successful in 29s
qa / db-schema (pull_request) Successful in 31s
qa / sql-layer-check (pull_request) Successful in 6s
qa / qa-1 (pull_request) Failing after 2m28s
qa / qa (pull_request) Failing after 0s
to c8771529ee
Some checks failed
qa / dockerfile (pull_request) Successful in 14s
qa / i18n-string-check (pull_request) Successful in 14s
qa / db-schema (pull_request) Successful in 15s
qa / sql-layer-check (pull_request) Successful in 7s
qa / qa-1 (pull_request) Failing after 2m59s
qa / qa (pull_request) Failing after 0s
2026-05-08 20:25:51 +00:00
Compare
dev force-pushed dev/976 from c8771529ee
Some checks failed
qa / dockerfile (pull_request) Successful in 14s
qa / i18n-string-check (pull_request) Successful in 14s
qa / db-schema (pull_request) Successful in 15s
qa / sql-layer-check (pull_request) Successful in 7s
qa / qa-1 (pull_request) Failing after 2m59s
qa / qa (pull_request) Failing after 0s
to e5112bc9c2
All checks were successful
qa / i18n-string-check (pull_request) Successful in 14s
qa / dockerfile (pull_request) Successful in 14s
qa / sql-layer-check (pull_request) Successful in 13s
qa / db-schema (pull_request) Successful in 16s
qa / qa-1 (pull_request) Successful in 2m4s
qa / qa (pull_request) Successful in 0s
2026-05-08 20:31:47 +00:00
Compare
dev requested review from reviewer 2026-05-08 20:31:53 +00:00
Collaborator

CI still pending at review time (run #3283, sha e5112bc). Stepping off the review request — will be re-dispatched automatically when CI completes.

CI still pending at review time (run #3283, sha `e5112bc`). Stepping off the review request — will be re-dispatched automatically when CI completes.
Collaborator

CI still pending at review time (run #3283, sha e5112bc). Stepping off the review request — will be re-dispatched automatically when CI completes.

CI still pending at review time (run #3283, sha `e5112bc`). Stepping off the review request — will be re-dispatched automatically when CI completes.
dev requested review from reviewer 2026-05-08 20:34:50 +00:00
reviewer approved these changes 2026-05-08 20:36:21 +00:00
Dismissed
reviewer left a comment

Filter logic, URL serialisation, and component rendering all correct. 27 tests cover the critical paths. CI green.

Filter logic, URL serialisation, and component rendering all correct. 27 tests cover the critical paths. CI green.
reviewer approved these changes 2026-05-08 20:36:31 +00:00
reviewer left a comment

Filter logic correct, URL serialization idiomatic, all 6 ACs met, CI green. Nit: persistFilters is called inside the setFiltersState updater — harmless (idempotent) but could move outside the updater for clarity.

Filter logic correct, URL serialization idiomatic, all 6 ACs met, CI green. Nit: `persistFilters` is called inside the `setFiltersState` updater — harmless (idempotent) but could move outside the updater for clarity.
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/claude-hooks!1000
No description provided.