Repository navigation
Hide routine timeline activity behind a visible toggle, never problems - #1924
Conversation
The Timeline list hid pods, replica sets and owned rows without saying so, including their warnings and failures. Split the list into owner rows, child problems (always shown) and routine child activity, shown on request through a "Show routine activity" checkbox with an exact count. Child problems fold per resource under their newest card so a crash-looping pod stays one entry. Picking a kind no longer overrides the toggle.
PR Summary by QodoShow child-resource problems while hiding routine timeline activity
AI Description
Diagram
High-Level Assessment
Files changed (9)
|
Code Review by Qodo
1. Recreated resources share a problem card
|
|
|
||
| for (const item of items) { | ||
| if (foldPerResource?.(item)) { | ||
| const key = `fold:${item.kind}:${item.namespace}:${item.name}` |
There was a problem hiding this comment.
1. Recreated resources share a problem card ð Bug ⥠Correctness
aggregateEvents keys folded problems by kind, namespace, and name but omits the resource UID. When a resource is deleted and recreated under the same name within one time group, problems from both incarnations appear under the newest resource's card.
Agent Prompt
## Issue description
Fold keys merge problems from distinct resources that reuse a kind, namespace, and name.
## Fix Focus Areas
- packages/k8s-ui/src/components/timeline/TimelineList.tsx[231-236]
## Recommended Fix
Use the subject resource UID in the fold key when present, retaining a name-based fallback for rows without a UID. Account for API-group collisions without splitting equivalent served versions of one resource.
â Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| <Collapse open={open}> | ||
| {open && <div className="mt-2 space-y-2 border-l-2 border-theme-border pl-3">{others.map((e) => ( | ||
| <div key={e.id} data-event-id={e.id} data-ts-from={new Date(e.timestamp).getTime()} data-ts-to={new Date(e.timestamp).getTime()}> |
There was a problem hiding this comment.
2. Expanding problems leaves the lens stale ð Bug ⥠Correctness
FoldedProblems mounts and unmounts timestamped rows when its button changes open, but that transition does not call reportVisibleWindow. If expansion changes which rows intersect the list viewport without a scroll event, the host's visible-window lens retains its previous range until another reporting trigger occurs.
Agent Prompt
## Issue description
Opening or closing a problem fold changes the visible rows without necessarily updating the host's visible-window lens.
## Fix Focus Areas
- packages/k8s-ui/src/components/timeline/TimelineList.tsx[858-880]
- packages/k8s-ui/src/components/timeline/TimelineList.tsx[363-389]
## Recommended Fix
Schedule visible-window reporting after a fold opens or closes and its layout has updated, including folds opened by external selection.
â Copy this prompt and use it to remediate the issue with your preferred AI generation tools
âĶ keyboard-reachable (i)
âĶthe k8s-ui floor The fold panel unmounted its rows the moment it closed, so it snapped shut instead of animating; Collapse with unmountOnExit keeps them through the close transition. FoldedProblems opened itself for a selection inside it, but no caller passes both foldPerResource and selectedEventId, so that path never ran. A plain open state replaces it. radar-app now imports isTimelineProblem, which no published k8s-ui has yet, so the peer floor moves to the next k8s-ui release.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
â Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Want higher recall? High effort reviews run extra passes and find more bugs. A team admin can switch effort levels in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit d3d1a3b. Configure here.
âĶ-rows # Conflicts: # package-lock.json # web/package.json

The Timeline list hides "managed" rows (pods, replica sets, Event-kind rows, anything with an owner) to stay readable, and nothing on screen says so. You can check this on main today:
Before and after
A single crash-looping pod with no Deployment above it, Problems filter on. Main shows "No activity found"; with this change the crash is listed and the hidden routine count is shown.
Ten crash-looping pods, Kinds â Pod. Main lists every pod event, including routine steps of healthy pods; with this change each crashing pod is one card with the rest of its history folded under it.
What changes
The list now splits its rows three ways:
isTimelineProblem)routine=1in the URL.The Applications-scoped list and the swimlane are unchanged.
Where to look hardest
splitRoutineActivity(web/src/components/timeline/TimelineList.tsx). One uncapped query over the already-loaded ring, so no extra fetch. It splits the rows into three buckets, each capped at the list limit. Three invariants rest on it:selectedEventId, and every folded row keepsdata-event-id, so selection from the swimlane still lands.Evidence
Measured on a kind cluster.
Not in scope
k8s-ui API
TimelineListprops:showRoutine,onShowRoutineChange,routineEvents,foldPerResource.isTimelineProblem.Tests
npm testinweb/: 148 files, 1708 tests. k8s-ui: 4036 tests.make tscis clean.Note
Medium Risk
Changes default timeline visibility and list fetch/cap logic; problems must stay visible via shared
isTimelineProblem, with broad unit test coverage but meaningful UX and performance impact on large rings.Overview
The timeline list hides routine child activity by default (pod starts, replica set churn, successful CronJob jobs) while always showing owner-level rows and child problems aligned with the Problems filter via new
isTimelineProblem.The web host adds
splitRoutineActivity: one uncapped fetch over the loaded ring, separate 2k caps per bucket so owner bursts cannot displace child problems, and opting in only adds rows.routine=1persists the Show routine activity toggle in the URL.k8s-ui
TimelineListgains optional routine props (checkbox row with filter-aware hidden/shown counts), an empty state when everything matching is routine, andfoldPerResourceto collapse multiple problem events per resource into one card with an expandable âN more on this Podâ line (when routine is hidden).Replaces the old rule where selecting a kind re-included all managed rows. Bumps
@skyhook-io/k8s-uipeer to >=1.16.3. Application-scoped lists and swimlanes are unchanged.Reviewed by Cursor Bugbot for commit d3b9282. Bugbot is set up for automated code reviews on this repo. Configure here.