From f3c15ae8a17406fc79bd399d8f8cf5dbd91f4e2f Mon Sep 17 00:00:00 2001 From: Alex Jones Date: Wed, 29 Apr 2026 16:14:37 +0100 Subject: [PATCH 1/3] feat: sort failure buckets in the HTML block reports It makes sense that we probably want to see the most common failure bucket first. Let's sort these in the generated HTML report (like we already do for the CLI markdown reports) to make this more useful. It turns out that Jinja2 does not make it easy to do this, so pre-sort the list in Python before passing it to the template renderer. Signed-off-by: Alex Jones --- src/dvsim/sim/report.py | 9 ++++++++- src/dvsim/templates/reports/block_report.html | 5 ++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/dvsim/sim/report.py b/src/dvsim/sim/report.py index 8fc08c45..c4caafa4 100644 --- a/src/dvsim/sim/report.py +++ b/src/dvsim/sim/report.py @@ -111,9 +111,16 @@ def render( file_name = results.block.variant_name() log.debug("Generating HTML report for '%s'", file_name) block_file = f"{file_name}.html" + sorted_buckets = dict( + sorted(results.failed_jobs.buckets.items(), key=lambda kv: len(kv[1]), reverse=True) + ) artifacts[block_file] = render_template( path="reports/block_report.html", - data={"results": results, "version": summary.version}, + data={ + "results": results, + "failed_jobs": sorted_buckets, + "version": summary.version, + }, ) if outdir is not None: (outdir / block_file).write_text(artifacts[block_file]) diff --git a/src/dvsim/templates/reports/block_report.html b/src/dvsim/templates/reports/block_report.html index 152bdef8..bf14593c 100644 --- a/src/dvsim/templates/reports/block_report.html +++ b/src/dvsim/templates/reports/block_report.html @@ -11,7 +11,6 @@ {% set timestamp = results.timestamp %} {% set stages = results.stages %} {% set coverage = results.coverage %} -{% set failed_jobs = results.failed_jobs %} {% block content %}
@@ -204,7 +203,7 @@

Simulation Results: {{ block.variant_name(sep='/') }}

{% endif %} - {% if failed_jobs.buckets %} + {% if failed_jobs %}

Error Messages

@@ -219,7 +218,7 @@

Error Messages

- {% for msg, job_list in failed_jobs.buckets.items() %} + {% for msg, job_list in failed_jobs.items() %} {{ msg }} From b26b37b405669620cc6d20c084944da3f5e7b0ac Mon Sep 17 00:00:00 2001 From: Alex Jones Date: Wed, 29 Apr 2026 17:02:59 +0100 Subject: [PATCH 2/3] refactor: line -> context_line to avoid naming conflict in report This is kind of confusing, we have a line number `job.line` and also different lines in the context log. Let's just rename this variable to make the code cleaner. Signed-off-by: Alex Jones --- src/dvsim/templates/reports/block_report.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dvsim/templates/reports/block_report.html b/src/dvsim/templates/reports/block_report.html index bf14593c..97491678 100644 --- a/src/dvsim/templates/reports/block_report.html +++ b/src/dvsim/templates/reports/block_report.html @@ -229,8 +229,8 @@

Error Messages

{{ job.seed }} {{ job.line }} - {% for line in job.log_context %} -
{{ line }}
+ {% for context_line in job.log_context %} +
{{ context_line }}
{% endfor %} From 0a8fbbcb3b4db1a78b21338897aed8991e9fd5e7 Mon Sep 17 00:00:00 2001 From: Alex Jones Date: Wed, 29 Apr 2026 17:02:26 +0100 Subject: [PATCH 3/3] feat: show the failure bucket size in the block HTML report It would be useful to know from a glance how many test runs are in each failing bucket. Let's add it as a bit of metadata at the top alongside the failure message/category. Signed-off-by: Alex Jones --- src/dvsim/templates/reports/block_report.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dvsim/templates/reports/block_report.html b/src/dvsim/templates/reports/block_report.html index 97491678..4f6177fd 100644 --- a/src/dvsim/templates/reports/block_report.html +++ b/src/dvsim/templates/reports/block_report.html @@ -220,7 +220,8 @@

Error Messages

{% for msg, job_list in failed_jobs.items() %} - {{ msg }} + {{ msg }} + {{ job_list|length }} test run{{ "s" if job_list|length > 1 else "" }} {% for job in job_list %}