Features
Once runs are flowing in, UniTrack turns the raw JUnit and JaCoCo data into the signals teams actually act on. Each feature has its own page:
-
Flaky Detection — find tests that pass and fail on the same commit.
-
Quality Gate — fail builds when coverage drops or new failures appear, measured against a baseline.
-
Coverage Flags — slice coverage by component using the
flagfield. -
Report Merging — combine sharded/parallel runs into one logical run via a
runKey. -
Failure Clustering & Triage — group similar failures and auto-categorise them with rules.
-
AI Root-Cause Analysis — click-to-run LLM root cause + fix direction for a failure cluster (bring your own key; off by default).
-
Test Regression Report — the itemised diff vs the baseline: what newly failed, what got fixed, what is still failing.
-
Unit-test Performance — slowest-tests leaderboard and per-test / suite-time duration trends, over timings already captured at ingest.
-
GitHub PR Checks — post the quality-gate verdict back to the pull request as a commit status.
1. The dashboard
All of the above surface in the Thymeleaf dashboard:
-
a project list (board) with the latest run and coverage at a glance, failing gates first, and a "broken since" rot signal (age + run count) on projects that regressed and stayed red;
-
a project page charting pass/fail and coverage trends over a true time axis (so a slow regression and its onset are visible, not just the current number);
-
a run page with the suite/case tree, captured output and attachments, and the quality-gate verdict;
-
dedicated flaky, clusters and triage views.
The UI supports a dark/light theme toggle, persisted in the browser.
2. Embeddable badges
Each project exposes status badges for its latest run, for READMEs and PRs:
-
SVG:
/badge/{projectId}/coverage.svg,/badge/{projectId}/pass.svg,/badge/{projectId}/flaky.svg -
shields.io endpoint (JSON):
/badge/{projectId}/{metric}— use ashttps://img.shields.io/endpoint?url=<unitrack>/badge/{projectId}/coverage
Badges honor visibility: a public project’s badge renders for anyone, a private project’s badge returns 404 (so it can’t be used to probe it).
3. Run export
Every run page has an Export ↗ link (/runs/{id}/export) that renders the run as a single,
self-contained HTML document: all styles are inlined and there are no external requests, so it
opens offline and can be attached as a CI artifact (curl the URL to a file). It carries an
@media print stylesheet and a Print / Save as PDF button for a paper/PDF copy. The export
covers the run summary, quality-gate verdict, failures (with triage category and stacktrace),
suite breakdown and per-file coverage. It honors visibility — a private
run’s export is 404 for anyone who can’t read the project.
4. Public share links
A run can be shared read-only with people who don’t have an account. From the run page,
write members create a revocable share link (/share/{token}); the unguessable token is the
capability, so the link renders the read-only report even for a private project. The token
is shown once and only its SHA-256 hash is stored; revoking it (also from the run page)
immediately 404s the link. This is the one deliberate public route besides badges — creating
and revoking links still requires write access to the project.