Skip to content

feat(ui): redesign diagnostics page and fix mobile table cropping#1013

Merged
NodeJSmith merged 9 commits into
mainfrom
worktree-fable-ui
Jun 11, 2026
Merged

feat(ui): redesign diagnostics page and fix mobile table cropping#1013
NodeJSmith merged 9 commits into
mainfrom
worktree-fable-ui

Conversation

@jessica-claude

@jessica-claude jessica-claude Bot commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Fixes mobile table cropping at the root: the global stylesheet flipped fixed-layout tables to table-layout: auto at ≤768px, letting unbreakable mono content (app keys, log messages) push tables past the viewport. Tables now stay fixed on mobile; the apps table's colgroup widths moved into CSS module classes so media queries reallocate all width to the visible columns, app names truncate with ellipsis, and the log table's existing per-column mobile widths take effect again. DESIGN_RULES.md updated to document the fixed-layout + colgroup-reallocation pattern.
  • Redesigns the diagnostics page and un-hides it: a stats strip summarizes health at a glance (services / running / boot issues / drops), services render as a compact multi-column grid with anomalies sorted first and full-row detail (status, phase, retry, exception) shown only for non-running services, and the boot-issues/telemetry panels render only when there's something to show. The page joins the sidebar nav and command palette, gets a docs page (web-ui/diagnostics.md, fitted to the new task-oriented docs structure from docs: rewrite documentation site #970), and all docs screenshots are regenerated.
  • Fixes all broken example apps: five of six examples were missing the now-required name= on bus listener registrations and failed at startup with ListenerNameRequiredError (CI guard for this filed as Add CI check that example apps initialize against the framework #1011).
  • Adds UI QA tooling (.claude/skills/ui-qa/ + tools/frontend/ui_qa_capture.py): demo-stack harness reference, a pages × viewports × themes screenshot matrix capture tool, and three task-driven personas that drive Playwright against the live demo to surface navigation dead ends.

Verification

  • 1231 frontend unit tests, tsc --noEmit, eslint, prettier
  • All five frontend guard scripts (CSS allowlist, dead CSS, module globals, undefined refs, breakpoint drift)
  • Full e2e suite: 163 passed (two pre-existing flaky drawer tests under -n auto pass in isolation — filed as Fix flaky drawer backdrop e2e tests under parallel runs #1006)
  • mkdocs build --strict after merging the docs: rewrite documentation site #970 docs rewrite
  • Verified live at 320/375/768/900/1280px in light and dark themes against the demo stack

Related issues

Issues found during this session and filed separately: #1005 (stale module on reload), #1006 (flaky e2e), #1007#1010 (UI polish), #1011 (examples CI guard). Partially related existing work: #900, #903.

Summary by CodeRabbit

  • New Features

    • Added "Diagnostics" web page to monitor framework health, services, boot issues, and telemetry
    • Added UI QA tooling: automated screenshot capture and persona-driven walkthroughs
  • Bug Fixes

    • Fixed mobile table layout to use fixed mode, preventing horizontal scroll and overflow
  • Documentation

    • Added Diagnostics page docs, UI QA harness and persona guides, and updated responsive table rules
    • Added screenshot manifest entry for Diagnostics
  • Tests

    • Added Diagnostics navigation and updated responsive/diagnostics UI tests
  • Chores

    • Standardized example event-listener naming

The name= parameter became mandatory for DB-registered listeners but
five example apps were never updated, so every demo app failed at
startup with ListenerNameRequiredError.
Tables flipped to table-layout: auto at 768px, which let unbreakable
mono content (app keys, log messages) push tables past the viewport
and crop columns mid-word. Fixed-layout tables now stay fixed on
mobile: the apps table colgroup moves to CSS module classes so media
queries can reallocate all width to the visible columns, app names
truncate with ellipsis, and the log table's existing mobile colgroup
widths take effect again.
The page was hidden because it read as a wall of noise: 20 identical
'running' rows, a giant empty state for boot issues, and a mostly
empty telemetry card. Now a stats strip summarizes health at a glance,
services render as a compact multi-column grid with anomalies sorted
first (status/phase text only appears for non-running services), and
the boot-issues and telemetry panels render only when there is
something to show. Diagnostics joins the sidebar nav and command
palette.
The old rule recommended table-layout: auto on mobile, which is the
exact mechanism that caused the column cropping fixed in the previous
commit. Document the fixed-layout + colgroup-reallocation pattern
instead.
Adds the web-ui/diagnostics.md page, updates layout.md nav references
from four to five top-level pages, and regenerates all docs screenshots
to reflect the new sidebar item and diagnostics redesign.
Encodes the UI QA harness learned during the polish session: demo
stack lifecycle and gotchas, a pages x viewports x themes screenshot
matrix tool (tools/ui_qa_capture.py), screenshot critique agents
anchored to DESIGN_RULES.md, and three task-driven personas (Morgan,
Riley, Devon) that drive Playwright against the live demo to surface
navigation dead ends that per-page review cannot see.
# Conflicts:
#	docs/_static/web_ui_detail_column_picker.png
#	docs/pages/web-ui/layout.md
#	mkdocs.yml
@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

This PR adds a complete UI QA skill and Playwright screenshot CLI, delivers a Diagnostics page (component, styling, docs, nav, screenshot manifest, and tests), enforces fixed-layout mobile table behavior with new column classes, and adds explicit event listener names in example automations.

Changes

UI QA Skill System

Layer / File(s) Summary
UI QA Skill Specification & References
.claude/skills/ui-qa/SKILL.md, .claude/skills/ui-qa/references/harness.md, .claude/skills/ui-qa/references/personas.md
Defines the ui-qa skill workflow with two modes (screens/personas), harness startup/readiness guidance, and three task-based personas (Morgan, Riley, Devon) with viewport constraints and friction assessment criteria.
Screenshot Capture Tool Implementation
tools/frontend/ui_qa_capture.py
Implements a Playwright-based CLI that generates a screenshot matrix across themes and viewports, injects animation-suppression CSS, and supports page/viewport/theme filtering and exit codes.

Diagnostics Page Feature

Layer / File(s) Summary
Diagnostics Component & Styling
frontend/src/pages/diagnostics.tsx, frontend/src/pages/diagnostics.module.css
Refactors diagnostics data merging and ordering (anomalies first), removes from_ws, adds buildDiagCells and StatsStrip, adjusts DiagServiceRow rendering and switches service list to a responsive grid.
Diagnostics Page Tests & Component Integration
frontend/src/pages/diagnostics.test.tsx
Updates tests for new conditional rendering: stats strip and services visible by default; boot/telemetry panels hidden when empty; verifies degraded banner and running vs non-running row text behavior.
Diagnostics Navigation & Documentation
frontend/src/components/layout/palette-items.ts, frontend/src/components/layout/sidebar.tsx, docs/pages/web-ui/diagnostics.md, mkdocs.yml, docs/screenshots.yml
Adds diagnostics to palette/sidebar navigation, the docs site nav, a diagnostics docs page, and a screenshot manifest entry for /diagnostics.

Apps Table Responsive Layout & Supporting Cleanup

Layer / File(s) Summary
Apps Table CSS Column Classes & Responsive Breakpoints
frontend/src/pages/apps.module.css
Introduces column classes (.colName, .colStatus, etc.), adds .nameCellInner a truncation styling, reallocates widths at the 900px breakpoint, and removes the 768px nth-child hiding rules.
Apps Table React Component & Mobile Testing
frontend/src/pages/apps.tsx, tests/e2e/test_responsive.py
Updates the apps table colgroup to use CSS module classes; updates e2e to assert table-layout: fixed on mobile and that the page does not horizontally scroll.
Table Design Rules & Mobile Table CSS Scoping
frontend/DESIGN_RULES.md, frontend/src/styles/tables.css
Clarifies 768px fixed-layout rule for non-compact tables and scopes mobile table overrides to compact tables with explanatory comments.

Event Listener Naming in Example Handlers

Layer / File(s) Summary
Named bus subscription registrations
examples/climate_controller.py, examples/cover_scheduler.py, examples/demo_stimulator.py, examples/motion_lights.py, examples/presence_tracker.py
Adds explicit name= identifiers to example bus event/attribute change registrations; no behavioral changes to handlers.

Navigation E2E Test Updates

Layer / File(s) Summary
Sidebar navigation test data
tests/e2e/test_navigation.py
Extends SIDEBAR_LINKS and SIDEBAR_ACTIVE to include the new /diagnostics route and its active-state assertion.

🎯 3 (Moderate) | ⏱️ ~25 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 27.78% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly and concisely summarizes the two main changes: diagnostics page redesign and mobile table cropping fix, matching the primary objectives of the PR.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch worktree-fable-ui

Comment @coderabbitai help to get the list of available commands and usage tips.

@NodeJSmith NodeJSmith marked this pull request as ready for review June 11, 2026 04:51
Copilot AI review requested due to automatic review settings June 11, 2026 04:51
@read-the-docs-community

read-the-docs-community Bot commented Jun 11, 2026

Copy link
Copy Markdown

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves Hassette’s Web UI responsiveness and observability by fixing mobile table layout overflow, redesigning and surfacing the Diagnostics page (including navigation + docs), repairing broken example apps, and adding tooling/docs to support repeatable UI QA against the demo stack.

Changes:

  • Keep fixed-layout tables fixed on mobile and reallocate colgroup widths via CSS Modules to prevent viewport overflow.
  • Redesign Diagnostics with a stats strip + compact services grid, conditional boot/telemetry panels, and add it to sidebar + command palette + docs.
  • Fix example apps by providing required name= values on listener registrations; add UI QA capture tooling and supporting references.

Reviewed changes

Copilot reviewed 24 out of 37 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
tools/frontend/ui_qa_capture.py New Playwright-based screenshot matrix capture script for UI QA.
tests/e2e/test_responsive.py Updates mobile apps-table assertions to require fixed layout and no horizontal scroll.
tests/e2e/test_navigation.py Adds Diagnostics to navigation coverage tests.
mkdocs.yml Adds Diagnostics page to MkDocs nav.
frontend/src/styles/tables.css Stops flipping .ht-table--fixed to auto layout at mobile breakpoints.
frontend/src/pages/diagnostics.tsx Diagnostics redesign: stats strip, anomaly-first sorting, services grid, conditional panels.
frontend/src/pages/diagnostics.test.tsx Updates diagnostics tests to match new conditional rendering and service row behavior.
frontend/src/pages/diagnostics.module.css Converts services list into compact responsive grid with detailed-row spanning.
frontend/src/pages/apps.tsx Moves apps table col widths from inline col styles to CSS module classes.
frontend/src/pages/apps.module.css Implements breakpoint-based colgroup width reallocation + mobile truncation/ellipsis.
frontend/src/components/layout/sidebar.tsx Adds Diagnostics to sidebar nav.
frontend/src/components/layout/palette-items.ts Adds Diagnostics to command palette static pages.
frontend/DESIGN_RULES.md Updates responsive table guidance (fixed layout + colgroup reallocation pattern).
examples/presence_tracker.py Adds required name= to bus listener registration.
examples/motion_lights.py Adds required name= to bus listener registrations.
examples/demo_stimulator.py Adds required name= to bus listener registration.
examples/cover_scheduler.py Adds required name= to bus listener registrations.
examples/climate_controller.py Adds required name= to bus listener registrations.
docs/screenshots.yml Adds Diagnostics screenshot capture entry; adjusts screenshot set.
docs/pages/web-ui/index.md Links Diagnostics in Web UI overview task list.
docs/pages/web-ui/diagnostics.md New Diagnostics docs page describing the redesigned UI and semantics.
.claude/skills/ui-qa/SKILL.md Adds a UI QA skill doc describing matrix/persona workflows.
.claude/skills/ui-qa/references/personas.md Adds task-driven UI personas for agent walkthrough QA.
.claude/skills/ui-qa/references/harness.md Adds demo-stack lifecycle and QA workflow reference for UI QA runs.

Comment thread tools/frontend/ui_qa_capture.py
Comment thread frontend/src/pages/diagnostics.tsx
Comment thread frontend/DESIGN_RULES.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.claude/skills/ui-qa/references/harness.md:
- Around line 18-25: The fenced code block that begins with
"DEMO_HA_URL=http://localhost:NNNNN" is missing a language specifier; change the
opening fence from ``` to ```text so the block becomes ```text ... ``` (i.e.,
add the "text" specifier) in .claude/skills/ui-qa/references/harness.md to
satisfy the Markdown lint rule.

In `@frontend/src/pages/apps.module.css`:
- Around line 203-218: Remove the redundant width: 0 declarations for the hidden
column classes—.colError, .colRuns, .colLast, and .colActions—since those
columns are already hidden later with display: none via nth-child selectors;
locate the block defining .colError, .colRuns, .colLast, .colActions and delete
the width: 0 rules to simplify the CSS while leaving the display: none rules
intact.

In `@frontend/src/styles/tables.css`:
- Around line 77-82: The mobile override sets .ht-table--compact { table-layout:
auto } which conflicts with DESIGN_RULES.md and the components
execution-table.tsx and config-tab.tsx that do not use a <colgroup>; remove the
`@media` rule that switches .ht-table--compact to table-layout: auto (leaving
table-layout: fixed at all breakpoints) or alternatively implement the
colgroup/width reallocation pattern in execution-table.tsx and config-tab.tsx
and update the comment to reflect the new behavior; prefer deleting the mobile
override in frontend/src/styles/tables.css and keep the comment aligned with
DESIGN_RULES.md.

In `@tools/frontend/ui_qa_capture.py`:
- Line 63: The page.goto call is missing an explicit timeout; update the call to
pass an explicit timeout (e.g., timeout=30000 or a shared constant) to
page.goto(base_url + PAGES[page_name], wait_until="networkidle", timeout=...) so
the wait behavior is visible and follows the "explicit timeouts on external
calls" guideline; adjust any test config or imported timeout constant if your
project centralizes timeouts.
- Around line 75-86: Add a Google-style docstring to the main function
describing its purpose, arguments, and return behavior: document that main
parses CLI args (--base-url, --output-dir, --pages, --viewports, --themes),
calls capture_matrix(base_url, output_dir, pages, viewports, themes) to capture
screenshots, prints the count and output directory, and exits with status 0 on
success or 1 on failure; place the docstring immediately below the def main()
line and follow Google-style sections (Args, Returns) referencing the parsed
arguments and the exit code.
- Around line 51-72: The function capture_matrix is missing a Google-style
docstring; add a docstring immediately under its def that describes the function
purpose, lists and types/meanings of parameters (base_url, output_dir: Path,
pages: list[str], viewports: list[str], themes: list[str]), describes the return
value (int count of screenshots), and notes any side-effects (creates
output_dir, launches browser/uses VIEWPORTS, PAGES, ANIMATION_KILL_CSS,
SETTLE_MS). Keep the format consistent with other project docstrings (short
summary line, blank line, Args: ..., Returns: ..., and any Raises: if relevant).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 48cc6314-06b3-423f-98b7-d4a50581e5cc

📥 Commits

Reviewing files that changed from the base of the PR and between 32d945e and 9f3c00e.

⛔ Files ignored due to path filters (13)
  • docs/_static/web_ui_app_detail_code.png is excluded by !**/*.png
  • docs/_static/web_ui_app_detail_config.png is excluded by !**/*.png
  • docs/_static/web_ui_app_detail_handlers.png is excluded by !**/*.png
  • docs/_static/web_ui_app_detail_overview.png is excluded by !**/*.png
  • docs/_static/web_ui_apps.png is excluded by !**/*.png
  • docs/_static/web_ui_config.png is excluded by !**/*.png
  • docs/_static/web_ui_detail_command_palette.png is excluded by !**/*.png
  • docs/_static/web_ui_detail_log_drawer.png is excluded by !**/*.png
  • docs/_static/web_ui_detail_sidebar.png is excluded by !**/*.png
  • docs/_static/web_ui_detail_status_bar.png is excluded by !**/*.png
  • docs/_static/web_ui_diagnostics.png is excluded by !**/*.png
  • docs/_static/web_ui_handlers.png is excluded by !**/*.png
  • docs/_static/web_ui_logs.png is excluded by !**/*.png
📒 Files selected for processing (24)
  • .claude/skills/ui-qa/SKILL.md
  • .claude/skills/ui-qa/references/harness.md
  • .claude/skills/ui-qa/references/personas.md
  • docs/pages/web-ui/diagnostics.md
  • docs/pages/web-ui/index.md
  • docs/screenshots.yml
  • examples/climate_controller.py
  • examples/cover_scheduler.py
  • examples/demo_stimulator.py
  • examples/motion_lights.py
  • examples/presence_tracker.py
  • frontend/DESIGN_RULES.md
  • frontend/src/components/layout/palette-items.ts
  • frontend/src/components/layout/sidebar.tsx
  • frontend/src/pages/apps.module.css
  • frontend/src/pages/apps.tsx
  • frontend/src/pages/diagnostics.module.css
  • frontend/src/pages/diagnostics.test.tsx
  • frontend/src/pages/diagnostics.tsx
  • frontend/src/styles/tables.css
  • mkdocs.yml
  • tests/e2e/test_navigation.py
  • tests/e2e/test_responsive.py
  • tools/frontend/ui_qa_capture.py

Comment thread .claude/skills/ui-qa/references/harness.md Outdated
Comment thread frontend/src/pages/apps.module.css
Comment thread frontend/src/styles/tables.css Outdated
Comment thread tools/frontend/ui_qa_capture.py
Comment thread tools/frontend/ui_qa_capture.py Outdated
Comment thread tools/frontend/ui_qa_capture.py
…ce rows

The title attribute is invisible on touch devices and unreliable for
assistive tech. The phase already renders inline for non-running
services, where it carries diagnostic value.
- fix usage path and add docstrings + explicit goto timeout in
  ui_qa_capture.py
- add language specifier to fenced block in ui-qa harness reference
- align tables.css comment and DESIGN_RULES.md with the actual
  compact-table mobile behavior: --fixed tables stay fixed at every
  breakpoint; --compact flips to auto only because every visible
  mobile column is bounded

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
tools/frontend/ui_qa_capture.py (1)

66-84: 🧹 Nitpick | 🔵 Trivial | 💤 Low value

Consider wrapping browser lifecycle in try-finally for explicit cleanup.

While the sync_playwright() context manager likely ensures cleanup, explicitly closing the browser in a finally block would make resource management more visible and robust if an exception occurs between browser.launch() and browser.close().

♻️ Suggested refactor
     output_dir.mkdir(parents=True, exist_ok=True)
     count = 0
     with sync_playwright() as pw:
         browser = pw.chromium.launch()
-        for theme in themes:
-            for vp_name in viewports:
-                width, height = VIEWPORTS[vp_name]
-                context = browser.new_context(viewport={"width": width, "height": height})
-                context.add_init_script(f"localStorage.setItem('hassette:theme', '\"{theme}\"');")
-                page = context.new_page()
-                for page_name in pages:
-                    page.goto(base_url + PAGES[page_name], wait_until="networkidle", timeout=30_000)
-                    page.evaluate(ANIMATION_KILL_CSS)
-                    page.wait_for_timeout(SETTLE_MS)
-                    out = output_dir / f"{page_name}--{vp_name}--{theme}.png"
-                    page.screenshot(path=str(out), full_page=True)
-                    print(f"captured {out}")
-                    count += 1
-                context.close()
-        browser.close()
+        try:
+            for theme in themes:
+                for vp_name in viewports:
+                    width, height = VIEWPORTS[vp_name]
+                    context = browser.new_context(viewport={"width": width, "height": height})
+                    context.add_init_script(f"localStorage.setItem('hassette:theme', '\"{theme}\"');")
+                    page = context.new_page()
+                    for page_name in pages:
+                        page.goto(base_url + PAGES[page_name], wait_until="networkidle", timeout=30_000)
+                        page.evaluate(ANIMATION_KILL_CSS)
+                        page.wait_for_timeout(SETTLE_MS)
+                        out = output_dir / f"{page_name}--{vp_name}--{theme}.png"
+                        page.screenshot(path=str(out), full_page=True)
+                        print(f"captured {out}")
+                        count += 1
+                    context.close()
+        finally:
+            browser.close()
     return count
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tools/frontend/ui_qa_capture.py` around lines 66 - 84, Wrap the browser
lifecycle from the call to pw.chromium.launch() in a try/finally so
browser.close() is always executed (use the existing sync_playwright() but add
try: ... finally: browser.close()), and similarly ensure each created context is
closed if an exception occurs by wrapping the per-viewport creation of context
(browser.new_context(...)) and its page usage in a try/finally that calls
context.close() in the finally. Reference the symbols sync_playwright, browser
(from pw.chromium.launch()), context (from browser.new_context), page,
context.close(), and browser.close() when making the changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@tools/frontend/ui_qa_capture.py`:
- Around line 66-84: Wrap the browser lifecycle from the call to
pw.chromium.launch() in a try/finally so browser.close() is always executed (use
the existing sync_playwright() but add try: ... finally: browser.close()), and
similarly ensure each created context is closed if an exception occurs by
wrapping the per-viewport creation of context (browser.new_context(...)) and its
page usage in a try/finally that calls context.close() in the finally. Reference
the symbols sync_playwright, browser (from pw.chromium.launch()), context (from
browser.new_context), page, context.close(), and browser.close() when making the
changes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d511ffc6-4201-4907-b81d-158fca700384

📥 Commits

Reviewing files that changed from the base of the PR and between 9f3c00e and be502bb.

📒 Files selected for processing (5)
  • .claude/skills/ui-qa/references/harness.md
  • frontend/DESIGN_RULES.md
  • frontend/src/pages/diagnostics.tsx
  • frontend/src/styles/tables.css
  • tools/frontend/ui_qa_capture.py

@NodeJSmith NodeJSmith merged commit 3fee929 into main Jun 11, 2026
28 checks passed
@NodeJSmith NodeJSmith deleted the worktree-fable-ui branch June 11, 2026 12:08
NodeJSmith pushed a commit that referenced this pull request Jun 11, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.42.0](v0.41.0...v0.42.0)
(2026-06-11)


### Features

* **ui:** redesign diagnostics page and fix mobile table cropping
([#1013](#1013))
([3fee929](3fee929))


### Bug Fixes

* coerce numeric strings in Comparison condition
([#1003](#1003))
([ae751a6](ae751a6))
* Docker semver images not published since v0.39.0
([#999](#999))
([ee1d804](ee1d804))


### Documentation

* rewrite documentation site
([#970](#970))
([32d945e](32d945e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: hassette-release-please[bot] <273458268+hassette-release-please[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants