Hub display fixes: complete run ids + humanized durations, [hidden] guard, hero dedup (#491, #492, #493) - #508
Conversation
The stalled-run alert built its detail from run.runId.slice(-12), clipping
every id longer than 12 chars into something unsearchable (run-fx-blocked
→ "n-fx-blocked", run-fx-active → "un-fx-active"), and printed raw minute
math ("42431 min" for a 29-day stall). The cost alert had the same
slice(-12) mangle. The studio3d freshness chip had the sibling problem —
"Observed 42433m ago" with no hours/days tiers.
Alert details now name the complete run id, and durations render through
humanizeDurationMs ("45m", "1h 30m", "29d 11h"). formatSnapshotAge gains
matching hours/days tiers ("Observed 29d 11h ago"); the two formatters are
cross-referenced so the shapes stay in step.
Closes #491.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
With a focused run, the overview projection's title already IS the
readiness summary (state/overview.js), and the page rendered the rationale
as readiness.summary || title — so the hero painted the identical sentence
twice ("Release is blocked by 6 source-backed conditions." as both
headline and sub-line), adding zero information.
The projection now owns a server-side `rationale` that is null whenever it
would merely repeat the title (kept only when readiness.summary genuinely
differs, e.g. the no-run state); the page consumes overview.rationale
alone — the readiness.summary fallback that caused the echo is gone — and
hides the element when there is nothing distinct to say. Honest empties
preserved: no rationale is ever invented.
Pinned by projection invariants across run/no-run/no-summary states and a
browser assertion that a visible rationale never equals the headline.
Closes #493.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
renderRunWorkspace correctly sets empty.hidden = true when a run is
scoped, but .run-workspace-empty's own display:grid (an author rule)
overrides the UA stylesheet's [hidden] { display:none }, so the "Select
one run to open its workspace" prompt stayed visible above the opened
workspace. Two classes already carried hand-written [hidden] twins
(.secondary-nav, .run-workspace-panel); this class was the one that
didn't — a whack-a-mole class of bug.
Close the class instead of adding a third twin: a global
[hidden] { display:none !important; } guard, the identical pattern the
studio3d stylesheet has carried since #431 (studio3d/styles.css). Audit of
every hidden-attribute toggle site (secondary-nav, run-workspace panels /
empty / content, overview-rationale, studio3d, mobile nav) confirmed
nothing relies on being visible while carrying hidden; the two elements
shown via inline style.display (#err, #studio-inspector) never carry the
attribute. The existing per-class twins stay (now redundant, harmless).
Pinned by a browser assertion that the scoped workspace renders with the
empty prompt taking zero space.
Closes #492.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Strix Security ReviewNo security issues found. Updated for Reviewed by Strix |
|
Warning Review limit reached
Next review available in: 20 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (9)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
PR Summary by QodoHub display fixes: full run IDs, humanized durations, [hidden] guard
AI Description
Diagram
High-Level Assessment
Files changed (9)
|
Code Review by Qodo
Context used✅ Compliance rules (platform):
300 rules✅ Skills:
|
| /** | ||
| * #492 — with a run scoped, the Run Workspace "Select one run" empty prompt | ||
| * | ||
| * must actually disappear — the `hidden` attribute was defeated by the | ||
| * class's own `display:grid` (author styles beat the UA [hidden] rule). | ||
| * | ||
| * Same harness as dashboard-96: real server on an ephemeral port, canonical | ||
| * fixtures, real Chromium via playwright-core; skips cleanly with no browser. | ||
| * | ||
| * owner: RStack developed by Richardson Gunde | ||
| */ |
There was a problem hiding this comment.
3. Regression tests lack attribution fields 📜 Skill insight ⚙ Maintainability
New regression tests include issue context but omit required attribution details (date found and QA report path). This reduces traceability for future audits and debugging of regressions.
Agent Prompt
## Issue description
Regression tests added in this PR do not include the full attribution comment block required by policy (issue ID, what broke, date found, and QA report path).
## Issue Context
These tests already mention `#491/#492/#493` and a brief description, but they do not include the "Found by ... on YYYY-MM-DD" and "Report: ..." lines.
## Fix Focus Areas
- tests/browser/dashboard-492-workspace-empty.test.js[1-11]
- tests/browser/dashboard-493-hero.test.js[1-10]
- tests/hub-alerts-copy-491.test.js[1-7]
- tests/hub-overview-rationale-493.test.js[1-7]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Qodo (convention, PR #490 precedent): humanizeDurationMs and formatSnapshotAge now branch on named constants (MS_PER_MINUTE, MINUTES_PER_HOUR, HOURS_PER_DAY) — the two formatters are meant to stay in step, and named thresholds make drift visible at a glance. Browser-test timeouts are named constants in both new test files. Refs #491 #492 #493 (PR #508 review follow-up). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Qodo's convention findings addressed in the follow-up commit (all were skill-insights; it reported 0 bugs on this PR): |
Three root-caused display bugs from the 2026-07-30 Hub tour, one bisected commit per bug, TDD throughout (every test verified failing on unfixed code first — RED transcripts in this session's evidence).
Closes #491
Closes #492
Closes #493
Commit 1 — #491: alert copy names the complete run id and humanizes durations
alerts/engine.jsbuilt stall details fromrun.runId.slice(-12)("run-fx-blocked" → "n-fx-blocked") and printed raw minutes ("42431 min" for a 29-day stall); the cost alert had the same slice mangle; the studio3d topbar chip had the sibling problem ("Observed 42433m ago"). Details now carry the full id, durations render throughhumanizeDurationMs("45m" / "1h 30m" / "29d 11h"), andformatSnapshotAgegains matching hours/days tiers — the two formatters cross-reference each other. Pinned by 5 unit tests including a "no\d{3,} min" pattern gate.Commit 2 — #493: the hero never repeats its headline
With a focused run,
overview.titlealready ISreadiness.summary, and the page rendered the rationale asreadiness.summary || title— the same sentence twice, always. The projection now ownsrationale(server-side, null when it would echo the title, kept when it genuinely adds information — e.g. the no-run state); the page consumesoverview.rationaleonly and hides the element when empty. Projection invariants pinned across run / no-run / no-summary states + a browser assertion.Commit 3 — #492: the hidden attribute always wins
empty.hidden = truewas correct in JS but.run-workspace-empty'sdisplay:griddefeats the UA[hidden]rule, so the "Select one run" prompt floated above every opened workspace. Rather than adding a third hand-written per-class twin (two already existed), the hub stylesheet gains the global[hidden] { display:none !important; }guard — the identical pattern studio3d's stylesheet has carried since #431 — closing the whole class. Audit of all hidden-toggle sites (commit message has the full table): secondary-nav ✓, run-workspace panels/empty/content ✓, overview-rationale ✓, studio3d ✓ (own guard), mobile nav (aria-hidden, unaffected); the two inline-style.displayelements (#err,#studio-inspector) never carry the attribute.Verification
Branch is off current main — independent of PR #504 (no shared files, no stacked base).
Held for Richardson's review — please verify before merge. Note the three separate
Closeslines above (the "Closes X and Y" single-keyword form only closes the first — the #449 lesson); still worth confirming all three issues auto-closed after merge.🤖 Generated with Claude Code