feat(ui): monitor task drawer — retire /monitor/tasks + /monitor/task/:id (UI-1) #402
No reviewers
Labels
No labels
area:agents
area:dashboard
area:database
area:design
area:design-review
area:flows
area:infra
area:meta
area:security
area:sessions
area:webhook
area:workdir
security
type:bug
type:chore
type:meta
type:user-story
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
charles/claude-hooks!402
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "dev/397"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Folds the three-pane task view into a slide-out drawer on
/monitor. Stage pills open the drawer in-place via?detail=taskId; the "Recent tasks" button opens it with the newest task pre-selected./monitor/tasksand/monitor/task/$taskIdredirect to the new URL pattern.Test plan
/monitor?detail=<taskId>directly → drawer opens + task highlighted?detail=dropped from URL/monitor/tasks→ redirects to/monitor?detail=latest+ migration toast/monitor/task/<id>→ redirects to/monitor?detail=<id>/monitor/grid→ still redirects to/monitor?view=gridbun run qaclean (422 tests pass, biome clean)Closes #397
behavior (
apps/web/src/routes/monitor.index.tsx,TaskDrawer):fetchHistory()is called with no arguments andTaskDrawerreceives nofiltersprop fromMonitorRoute. The AC says the left-pane TaskList must be "scoped to the current pipeline filter (repo/milestone/etc) so operator sees the task subset relevant to what they're viewing." When a user has the pipeline filtered to e.g.?repo=charles/foo, the drawer still shows all-repo history. Fix: passfiltersdown toTaskDrawerand either (a) passrepo/milestonetofetchHistoryif the API accepts them, or (b) client-side filter the returned list —tasks.filter(t => !filters.repo || t.repo === filters.repo).test-gap (
apps/web/src/routes/monitor.index.test.tsx): The AC lists required tests: "drawer opens on?detail=, closes on X / param drop, list filtering matches pipeline filter, deeplink pasting opens drawer pre-selected." The test file only coversvalidateSearch(pure function) and the threebeforeLoadredirects. No tests exist for the drawer rendering,"latest"sentinel resolution, filter-scoping behaviour, or the migration toast /_movedstrip. Add render-level tests (e.g. with@testing-library/react+ a mockedfetchHistory) covering at least: drawer mounts whendetailis set, unmounts when it's not, and shows the filtered task list.Both review points addressed in
b5bfec5:TaskDrawernow accepts afiltersprop; client-side filtersallTasksbyfilters.repo(option b —/historyhas no filter params).MonitorRoutepasses itsfiltersmemo down.TaskDrawer, added four render-level tests: drawer mounts, close button firesonClose, conditional mount/unmount, and repo filter narrows the task list to the matching repo only.Both prior findings addressed:
filtersis now passed through toTaskDrawerwith correct client-sidereposcoping viauseMemo, and the four render-level tests (mount, close callback, conditional rendering, filter scoping) cover the required AC. CI green.