diff --git a/.claude/skills/release/SKILL.md b/.claude/skills/release/SKILL.md index 4fbf0be1..13a303b6 100644 --- a/.claude/skills/release/SKILL.md +++ b/.claude/skills/release/SKILL.md @@ -96,21 +96,16 @@ Rules: ## Step 5 — Generate Slack release notes -Produce a ready-to-paste Slack message. Be **verbose** — explain how each feature works with a short example where helpful, and link to the relevant documentation page. +Produce a ready-to-paste Slack message. Keep it **short and scannable**: the notes announce the release, the changelog and docs hold the detail. -Documentation base URL: `https://marketsquare.github.io/robotframework-dashboard/` - -Key doc pages and their slugs: -- `filtering.html` — filters, tag modes (AND/OR/NOT), custom filters, versions -- `log-linking.html` — log URL support, `--uselogs` flag -- `basic-command-line-interface-cli.html` — CLI flags, `--customfilters`, output import -- `listener-integration.html` — listener, standalone push script -- `customization.html` — layout, undo/redo, GridStack -- `performance.html` — benchmarking, scale data -- `graphs-tables.html` — charts, data tables, horizontal scrolling -- `settings.html` — settings modal, themes, widget toggles - -**Shout out external contributors** — scan all PR entries for authors who are *not* `@timdegroot1996` and call them out by name with a :pray: in the relevant bullet or in a dedicated thanks line. +Rules: +- **One-line summary** under the title, naming the theme of the release (e.g. "A small performance release: …"). +- **Section headers without emoji**: `Added`, `Fixed`, `Changed`, `Resources`, in that order, only the non-empty ones. No `---` separators. +- **One bullet per change**: `** — `. No code examples, no per-bullet docs links, no PR numbers. +- **No timings in the bullets.** When a release is about performance, put the headline gains in the summary line or a single closing bullet as percentages or "N× faster" measured on a large dashboard, and state the dataset size once (e.g. "on a dashboard with 504 runs and 208k test results"). Never list raw millisecond numbers. +- **Fixed bullets** are plain sentences describing the user-visible symptom that is gone. +- **Thank external contributors inline**: scan the PR authors and co-authors for anyone who is *not* `@timdegroot1996` and end the bullet their work landed in with `Thanks @name for …!` (no emoji). +- **Resources** always has the same four lines. Format: @@ -119,25 +114,18 @@ Format: ---- - -*:new: Added* +*Added* +• ** — . -• ** — <2–3 sentences explaining what it does and why it's useful. Include a short code example if applicable.> → +*Changed* +• ** — . Thanks @contributor for ! -*:wrench: Fixed* - -• . Thanks *@contributor* for the fix! :pray: - -*:arrows_counterclockwise: Changed* - -• - ---- +*Fixed* +• . -*:bookmark: Resources* -Full changelog: -PyPI: +*Resources* +Full changelog: https://github.com/MarketSquare/robotframework-dashboard/compare/vPREVIOUS...vX.Y.Z +PyPI: https://pypi.org/project/robotframework-dashboard/X.Y.Z/ Docs: https://marketsquare.github.io/robotframework-dashboard/ Example dashboard: https://marketsquare.github.io/robotframework-dashboard/example/robot_dashboard.html ``` @@ -183,6 +171,6 @@ The user merges the release PR (squash, `Release X.Y.Z (#PR)`), uploads to PyPI - [ ] `example/robot_dashboard.html` — regenerated - [ ] `example/robot_results.db` — regenerated - [ ] `CHANGELOG.md` — new section added at the top -- [ ] Slack release notes produced +- [ ] Slack release notes produced (short format, no timings, contributors thanked inline) - [ ] After the merge: `vX.Y.Z` tag pushed on the merge commit, GitHub Release created - [ ] `gh workflow run deploy.yml` after the tag push; `/`, `/vX.Y.Z/` and `versions.json` on the docs site show the new version diff --git a/CHANGELOG.md b/CHANGELOG.md index 190963bd..62081d70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). --- +## [2.4.1](https://github.com/MarketSquare/robotframework-dashboard/releases/tag/v2.4.1) - 2026-09-28 + +### Changed +- Much faster filtering on large dashboards — suites, tests and keywords are matched to the filtered runs with a set lookup instead of a scan per row, and the millisecond/timezone versions of the data are computed once per setting instead of on every filter change. On a dashboard with 504 runs and 208k tests, applying the default filter went from 1.2 s to 0.4 s and applying all runs from 9.8 s to 3.6 s +- Faster Most Failed, Most Flaky and Messages timelines — their rows are grouped once by test and run instead of scanning every row for every cell, and the rules of a `--messageconfig` are compiled once +- The Overview page only draws the donut of a run card when the card scrolls into view, so updating an Overview with hundreds of run cards went from about 4 s to under 0.1 s +- Faster Tables page — the column types are set up front instead of DataTables checking every cell on every update (3.9 s to 2.4 s with all runs) +- Faster initial load — the embedded data is decompressed in parallel with the browser's native `DecompressionStream`, and the pako library is no longer needed (also not in `--offlinedependencies` mode). The dashboard now needs Chrome 80+, Firefox 113+ or Safari 16.4+. Loading the 504 run dashboard went from 3.8 s to 2.3 s + +### Fixed +- The donut charts of the Overview run cards were never freed when the cards were rebuilt, so the page used more memory with every filter change +- The Messages timeline with a `--messageconfig` relied on an undeclared variable and a block-scoped function that break in strict JavaScript + +--- + ## [2.4.0](https://github.com/MarketSquare/robotframework-dashboard/releases/tag/v2.4.0) - 2026-09-26 ### Added diff --git a/docs/performance.md b/docs/performance.md index 093e915b..8d89f328 100644 --- a/docs/performance.md +++ b/docs/performance.md @@ -14,7 +14,7 @@ The process has three distinct stages — each with its own time and size cost: |---|---| | **XML processing** | `OutputProcessor` uses `robot.api.ExecutionResult` to parse each `output.xml` and insert its data into the SQLite database. | | **Dashboard generation** | `DashboardGenerator` reads all data from the database, compresses it (JSON → zlib → base64), inlines all JS/CSS, and writes a single self-contained `.html` file. | -| **Browser rendering** | The browser decompresses the embedded data and renders charts using Chart.js. Render time scales with the number of displayed runs and active data views. | +| **Browser rendering** | The browser decompresses the embedded data with its native `DecompressionStream` (Chrome 80+, Firefox 113+, Safari 16.4+) and renders charts using Chart.js. Render time scales with the number of displayed runs and active data views. | ## Baseline Results @@ -88,8 +88,7 @@ Very large dashboards (500+ runs with many unique tests) may reach 5–10 MB. Th The time it takes for the dashboard to finish drawing after the page opens is driven by Chart.js — not by data size or HTML file size. Key factors: - **Default quantity is 20 runs per project** — renders near-instantly on any hardware. The amount filter is applied per project (run name / `project_` tag), so a dashboard with several projects renders more runs than the quantity itself. -- **50 runs** — expect a couple of seconds while Chart.js draws all graphs. -- **100+ runs** — rendering can approach **~10 seconds or more!**. The exact time depends on: +- **Hundreds of runs** — expect a few seconds. As a reference, a dashboard with 504 runs, 208k test results and 138k keyword results loads in about 2.3 seconds with the default quantity, and applying a filter that shows all 504 runs takes about 3.6 seconds on the Dashboard page, 2.4 seconds on the Tables page and under 0.1 seconds on the Overview page. The exact time depends on: - The **size of your test suite** — more tests and suites mean more data points per chart. - Whether **"All Suites"** or **"All Tests"** is selected in their respective sections — these views render one data series per unique suite/test name, which scales with the breadth of your suite. diff --git a/example/robot_dashboard.html b/example/robot_dashboard.html index f59d3d54..61b17139 100644 --- a/example/robot_dashboard.html +++ b/example/robot_dashboard.html @@ -14,7 +14,6 @@ -