SAMPLE REPORT

See exactly what you get.

A complete example of the PDF report, written for a fictional team. Your report follows the same structure, with findings from your own repository and pipeline.

Fictional example. “Northwind Billing” is an invented company. The files, numbers and findings below are made up to show the format. This is not a review of a real repository or customer.

This is the Health Check report. The Quick Scan report is shorter: an indicative score, the top 5 risks and quick wins, based on your CI configuration and reports, without file-level evidence from source code.

1. Summary

72 / 100Health score: working with notable risks
6Findings: 1 high, 4 medium, 1 low
4Quick wins, about 4 hours in total
8–10 daysTotal effort to fix all six findings

In plain words. The test suite is well organised and covers the main customer flows. The biggest problem is that failures are hidden: failed tests are re-run automatically and the report shows only the final green result. Builds look healthier than they are, and people stop trusting red builds.

What to do first. Make retries visible and save screenshots and traces on failure (about 1.5 hours). Then give each parallel worker its own test user and split the pipeline into parallel jobs. Together this should bring CI from 38 to about 15 minutes and remove most false alarms.

What was reviewed

ItemDetails
Repositorynorthwind-e2e (fictional)
Tests412 in total: 318 UI and 94 API
StackPlaywright, TypeScript
CIGitHub Actions, one workflow (e2e.yml), 38 minutes per run
MaterialsRepository archive and reports from the 30 most recent CI runs
Not checkedThe tests were not executed. Production code, security and performance were out of scope.

2. Health score: 72 / 100

Band: working with notable risks. The scale is 0–39 fragile foundations, 40–59 needs focused improvement, 60–79 working with notable risks, 80–100 strong foundations. Each category below is scored from 0 to 100 and weighted by importance.

CategoryWeightScoreIn plain words
Architecture15%78Test layers are clear and shared helpers are easy to find.
Test reliability20%62Intermittent failures are common and hidden by retries (F1, F2, F3).
Maintainability15%86Readable names and small page objects. The strongest area.
Coverage strategy15%76Login, checkout and invoices are covered. Refunds are not (F6).
CI/CD15%70Works, but slow and running one test at a time (F4).
Reporting and observability10%66Failures leave no screenshots or traces (F5).
Test data and environments10%66One shared account is used by many tests (F3).
Overall100%72Working with notable risks

How it adds up: score × weight, summed. 78×15% + 62×20% + 86×15% + 76×15% + 70×15% + 66×10% + 66×10% ≈ 72.

3. How the test suite and pipeline are built

Test suite

The structure is sound, which is why architecture and maintainability score well.

CI pipeline

One GitHub Actions workflow runs all 412 tests in a single job and takes 38 minutes. It uses one worker, re-runs failures twice and does not keep screenshots or traces (F1, F4, F5).

Flaky-test risk

Confirmed: nine tests passed only on retry in the last 30 runs, and four of them collide on the shared account (F3). Not verified: the other five. They need to be reproduced locally with traces turned on.

4. Findings

Six findings, ordered by priority. Each one shows what we saw, why it matters, what to do, how long it takes and what you get.

IDSeverityFindingEffort
F1HIGHFailed tests are re-run automatically, so problems stay hiddenAbout 1 hour for steps 1–2, then 2–3 days for step 3
F2MEDIUMFixed waits slow tests down and still fail when the app is slow1–2 days
F3MEDIUMAll tests log in with the same accountAbout 1 day
F4MEDIUMThe pipeline runs everything in one 38-minute jobAbout 1 day
F5LOWFailures leave no screenshots or tracesAbout 30 minutes
F6MEDIUMRefunds and plan downgrades have no automated checksAbout 2 days
HIGH F1

Failed tests are re-run automatically, so problems stay hidden

What we found
playwright.config.ts:14 sets retries: 2 for every test, and .github/workflows/e2e.yml:41 publishes only the final result. In 23 of the 30 recent runs, at least one test failed first and passed on retry. Nine tests cause 81% of these retries.
Why it matters
A real bug that appears only sometimes will turn green and ship. The team also cannot tell which tests are unreliable, so builds get re-run out of habit and failures are no longer trusted.
What to do
  1. Show tests that passed on retry as “flaky” in the CI summary.
  2. Lower retries to 1.
  3. Fix the nine repeat offenders, worst first.
Effort
About 1 hour for steps 1–2, then 2–3 days for step 3
Result
Flaky tests become visible and countable, and the retry rate becomes a number you can bring down.
MEDIUM F2

Fixed waits slow tests down and still fail when the app is slow

What we found
74 hard-coded pauses (waitForTimeout) in 31 files. For example, tests/checkout/payment.spec.ts:57 always waits 3 seconds. Together they add about 3 minutes of pure waiting to every run.
Why it matters
If the app takes 3.5 seconds, the test fails. If it takes 0.5 seconds, the test still waits 3. It is slow and unreliable at the same time.
What to do
Replace each pause with a wait for the real condition, for example await expect(page.getByText('Payment received')).toBeVisible(). Start with the 10 files that have the most pauses.
Effort
1–2 days
Result
Faster runs and fewer timing-related failures.
MEDIUM F3

All tests log in with the same account

What we found
tests/fixtures/auth.ts:12 signs every test in as [email protected], and 41 tests create invoices under it. Four of the nine flaky tests fail only when two of them run at the same time.
Why it matters
Tests interfere with each other when run in parallel. A single test re-run on its own gives a different result than in the full run, which makes debugging slow.
What to do
Create a fresh user per parallel worker through the API and delete its data at the end of the run.
Effort
About 1 day
Result
Removes the collisions behind about 4 of the 9 flaky tests and makes parallel runs safe, which F4 needs.
MEDIUM F4

The pipeline runs everything in one 38-minute job

What we found
e2e.yml has a single job. playwright.config.ts:19 sets workers: 1 in CI, and browsers are downloaded again on every run (about 4 minutes).
Why it matters
Developers wait 38 minutes to learn whether a change is safe, so they batch changes or stop waiting for the result.
What to do
Split the tests into 4 parallel jobs with --shard, cache the Playwright browsers, and raise workers to 2 once F3 is fixed.
Effort
About 1 day
Result
CI time drops from about 38 to about 15 minutes.
LOW F5

Failures leave no screenshots or traces

What we found
playwright.config.ts:22–23 sets trace: 'off' and screenshot: 'off', and the workflow does not upload the report folder.
Why it matters
To understand a failure, an engineer has to reproduce it locally, which often takes longer than fixing it. Low severity, but a very cheap fix.
What to do
Set trace: 'on-first-retry' and screenshot: 'only-on-failure', and upload playwright-report/ as a CI artifact kept for 14 days.
Effort
About 30 minutes
Result
Every failure can be opened and understood in minutes.
MEDIUM F6

Refunds and plan downgrades have no automated checks

What we found
The 412 tests cover login, checkout and invoices, but none exercise the refund or plan-change features. Both move money.
Why it matters
Mistakes here cost money and customer trust, and manual testing before each release is easy to skip.
What to do
Add API tests first, because they are cheaper and more stable than UI tests: full refund, partial refund and downgrade at renewal. Add one UI check per flow later.
Effort
About 2 days
Result
The highest-risk flows are protected on every release.

5. Quick wins

Low-risk actions your team can finish in one afternoon.

ActionTimeBenefit
Save screenshots and traces on failure and upload the report (F5)30 minEvery failure can be diagnosed without re-running locally.
Show tests that passed on retry in the CI summary (F1)1 hourHidden flakiness becomes a visible list.
Cache Playwright browsers in CI (F4)20 minSaves about 4 minutes per run.
Remove the 10 longest fixed waits (F2)2 hoursAbout 1 minute faster and fewer timing failures.

6. 30-day plan

What to do and when, so the work fits around normal development.

WhenWhatResult
Now (week 1)The four quick wins, then lower retries to 1 (F1, F5, F4, F2)Failures are visible and easy to diagnose.
Next (weeks 2–3)Per-worker test users (F3), 4 parallel jobs (F4), start fixing the nine flaky tests (F1)CI about 15 minutes and far fewer false failures.
Later (week 4)Replace remaining fixed waits (F2), add refund and downgrade API tests (F6)A faster, steadier suite with money flows protected.

What to expect after 30 days

MeasureBeforeTarget
CI run time38 minutesabout 15 minutes
Runs with a hidden retry23 of 30fewer than 5 of 30
Failures with a screenshot or trace0%100%

These are targets for the fictional example. Real reports give estimates based on your materials, not guarantees.

What happens next

Your team decides what to act on. Fixes are not part of the Health Check. If you want help, the Audit + Fix Sprint covers up to 10 hours of fixes delivered as pull requests: request a proposal.

How to read the score

The weighted score is an internal framework, not an industry standard, certification or guarantee of software quality. In a real report, every finding points to evidence in your materials.

Order Health Check · €349 → Order Quick Scan · €149