{"_id":"@acahet/playwright-reporter","_rev":"6-e6477c6e0461c86034ea5004cbbf1b05","name":"@acahet/playwright-reporter","dist-tags":{"latest":"1.1.0"},"versions":{"0.0.2":{"name":"@acahet/playwright-reporter","version":"0.0.2","keywords":["playwright","playwright-reporter","test-history","test-automation","dashboard","testing","typescript"],"author":{"name":"acahet"},"license":"MIT","_id":"@acahet/playwright-reporter@0.0.2","maintainers":[{"name":"acahet","email":"anderson.cahet@gmail.com"}],"homepage":"https://github.com/acahet-automation-org/playwright-toolbox#readme","bugs":{"url":"https://github.com/acahet-automation-org/playwright-toolbox/issues"},"bin":{"pw-history-init":"dist/scripts/init.js"},"dist":{"shasum":"b889baf5d51f406de22dd1233895f146637d91bb","tarball":"https://registry.npmjs.org/@acahet/playwright-reporter/-/playwright-reporter-0.0.2.tgz","fileCount":11,"integrity":"sha512-CI/imtFIE+SV+f8IeRJmhpfGHfdRaCZy3SJF2TIwG1KDIWux12DeLl1DuGeeaE/LHQHpcw6N3E4AXpz6D8uFFA==","signatures":[{"sig":"MEQCIHFEHVeF4PF081VZTMx6kRHUDurGWYo5i7Zgyjnhwk6vAiAsFaVkPb5sb1YSMOqbBQwf/nhMdTTBDtk3as5sXHzyew==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":155817},"main":"./dist/src/reporter.js","types":"./dist/src/reporter.d.ts","exports":{".":{"types":"./dist/src/reporter.d.ts","import":"./dist/src/reporter.js","require":"./dist/src/reporter.js"},"./reporter":{"types":"./dist/src/reporter.d.ts","import":"./dist/src/reporter.js","require":"./dist/src/reporter.js"}},"gitHead":"8e8a69bed23bf09ef015c82e5a627936c4bdc3b4","scripts":{"build":"tsc --project tsconfig.json","build:watch":"tsc --project tsconfig.json --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"acahet","email":"anderson.cahet@gmail.com"},"repository":{"url":"git+https://github.com/acahet-automation-org/playwright-toolbox.git","type":"git","directory":"packages/playwright-reporter"},"_npmVersion":"11.11.0","description":"Self-hosted Playwright test history dashboard — custom reporter + single-file HTML dashboard. No SaaS, no subscriptions.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@playwright/test":"^1.50.0"},"peerDependencies":{"@playwright/test":">=1.40.0"},"peerDependenciesMeta":{"@playwright/test":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/playwright-reporter_0.0.2_1774388326925_0.40285933999980217","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@acahet/playwright-reporter","version":"0.1.1","keywords":["playwright","reporter","dashboard","test-history"],"author":{"name":"acahet"},"license":"MIT","_id":"@acahet/playwright-reporter@0.1.1","maintainers":[{"name":"acahet","email":"anderson.cahet@gmail.com"}],"dist":{"shasum":"1ec5631c2365e4ad084ec9fa320c6f6d99282aca","tarball":"https://registry.npmjs.org/@acahet/playwright-reporter/-/playwright-reporter-0.1.1.tgz","fileCount":11,"integrity":"sha512-i7/F50FX8YFn9E8qsMyv4ks+PU9kqUXFLFRsJC5OmY6WCq02LnVeH66gJCTfEuG2/IwGZHcMmIprvqFRzIOtGA==","signatures":[{"sig":"MEQCIB7kPPHNn7IHfzG9ZKm62Xi7KD7zJAb5wa5gPg/CqSm7AiAWReNUuZjYKK4pwu58OJ9pFMTHWmH4nW699U15P1KUXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158085},"main":"dist/src/reporter.js","types":"dist/src/reporter.d.ts","exports":{"./reporter":{"types":"./dist/src/reporter.d.ts","import":"./dist/src/reporter.js","require":"./dist/src/reporter.js"}},"gitHead":"5accc61c9b4e9597624fe5c6cbb61fa6fa67fb69","scripts":{"build":"tsc --project tsconfig.json","build:watch":"tsc --project tsconfig.json --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"acahet","email":"anderson.cahet@gmail.com"},"_npmVersion":"11.12.1","description":"Self-hosted Playwright test history dashboard — custom reporter + single-file HTML dashboard. No SaaS, no subscriptions.","directories":{},"_nodeVersion":"22.19.0","dependencies":{"serve":"^14.2.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.4.0","@playwright/test":"^1.42.0"},"peerDependencies":{"@playwright/test":">=1.42.0"},"_npmOperationalInternal":{"tmp":"tmp/playwright-reporter_0.1.1_1774711691018_0.030738674128112375","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@acahet/playwright-reporter","version":"0.1.2","keywords":["playwright","reporter","dashboard","test-history"],"author":{"name":"acahet"},"license":"MIT","_id":"@acahet/playwright-reporter@0.1.2","maintainers":[{"name":"acahet","email":"anderson.cahet@gmail.com"}],"dist":{"shasum":"84dcba769867de6bf00ba0ba7ed1c0812f64f7d4","tarball":"https://registry.npmjs.org/@acahet/playwright-reporter/-/playwright-reporter-0.1.2.tgz","fileCount":11,"integrity":"sha512-tiiQQLh3IhdZgu1GCsO0YwVjO0cTvgptI3m+9Tjq1isAHyjRNAo+iHYc/v9wYdCAYdlsG7KAEMyaIX7+Mv8bkg==","signatures":[{"sig":"MEUCIQCnjRLLqZIZ0Ze11/LzQD4dniwK+KwVOnEy4ovad8thRAIgHrvpodrsIckKHHx0+6z/uRXp1ZXmTmB81pQ0Hd0E0dA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158017},"main":"dist/src/reporter.js","types":"dist/src/reporter.d.ts","exports":{".":"./dist/src/reporter.js","./reporter":"./dist/src/reporter.js"},"gitHead":"d1e379ab56e3c0bca8a0f8fee4e9c86d9e0875ba","scripts":{"build":"tsc --project tsconfig.json","build:watch":"tsc --project tsconfig.json --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"acahet","email":"anderson.cahet@gmail.com"},"_npmVersion":"11.12.1","description":"Self-hosted Playwright test history dashboard — custom reporter + single-file HTML dashboard. No SaaS, no subscriptions.","directories":{},"_nodeVersion":"22.19.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"serve":"^14.2.0","typescript":"^5.4.0","@playwright/test":"^1.42.0"},"peerDependencies":{"@playwright/test":">=1.42.0"},"_npmOperationalInternal":{"tmp":"tmp/playwright-reporter_0.1.2_1774717530348_0.860568071941572","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@acahet/playwright-reporter","version":"0.1.3","keywords":["playwright","reporter","dashboard","test-history"],"author":{"name":"acahet"},"license":"MIT","_id":"@acahet/playwright-reporter@0.1.3","maintainers":[{"name":"acahet","email":"anderson.cahet@gmail.com"}],"dist":{"shasum":"06584b9fddb0c4644f0f7eb73f55119abf4d1d75","tarball":"https://registry.npmjs.org/@acahet/playwright-reporter/-/playwright-reporter-0.1.3.tgz","fileCount":12,"integrity":"sha512-foqUke2FWcuIzRrLHZHsf92NJVr8MuIx/0E7OYrN89nwBsgBuS/xOs9f8G5tAs9oDFavvhzgWQR8ZTnZqhacjA==","signatures":[{"sig":"MEQCIGRF30Nc9cT3m8yqKlXLZM5rYQgK4NsrSJnPX6K4csB2AiAZGj2YJrJWeNYKOGz38HLOUIz04Xb0EGQ1A5qgekC+/Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":205624},"main":"dist/src/reporter.js","types":"dist/src/reporter.d.ts","exports":{".":"./dist/src/reporter.js","./reporter":"./dist/src/reporter.js"},"gitHead":"a3480cc77b5c6520050d55754130cecb944146a6","scripts":{"build":"tsc --project tsconfig.json","build:watch":"tsc --project tsconfig.json --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"acahet","email":"anderson.cahet@gmail.com"},"_npmVersion":"11.12.1","description":"Self-hosted Playwright test history dashboard — custom reporter + single-file HTML dashboard. No SaaS, no subscriptions.","directories":{},"_nodeVersion":"22.19.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"serve":"^14.2.6","typescript":"^6.0.2","@playwright/test":"^1.58.2"},"peerDependencies":{"@playwright/test":">=1.42.0"},"_npmOperationalInternal":{"tmp":"tmp/playwright-reporter_0.1.3_1775318233068_0.3627433366248858","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@acahet/playwright-reporter","version":"1.0.0","keywords":["playwright","reporter","dashboard","test-history"],"author":{"name":"acahet"},"license":"MIT","_id":"@acahet/playwright-reporter@1.0.0","maintainers":[{"name":"acahet","email":"anderson.cahet@gmail.com"}],"dist":{"shasum":"d80a9f1961e199e6e334015843dfa8f076ce66df","tarball":"https://registry.npmjs.org/@acahet/playwright-reporter/-/playwright-reporter-1.0.0.tgz","fileCount":11,"integrity":"sha512-NSpfIczOzyrdKDvGI6EZVEfzNXBU2czkdz7KDwIoHqa6xlo1MGRdtXV8+FNVuE9qMaDxVOxltfLLF+sR8lJ7Iw==","signatures":[{"sig":"MEUCIHuNipmpc37QFeBvORJQyl6O1ZkGNzmwTcvI3Ub1Z73RAiEAyMCa9pdSfAzQdTa6gRKo3c6q/YxJAzh8Zp5URzo7Rwg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":237854},"main":"dist/src/reporter.js","types":"dist/src/reporter.d.ts","exports":{".":"./dist/src/reporter.js","./reporter":"./dist/src/reporter.js"},"gitHead":"d34c60bd794943ee6e62931cbff5284c83755f6d","scripts":{"build":"tsc --project tsconfig.json","build:watch":"tsc --project tsconfig.json --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"acahet","email":"anderson.cahet@gmail.com"},"_npmVersion":"11.11.0","description":"Self-hosted Playwright test history dashboard — custom reporter + single-file HTML dashboard. No SaaS, no subscriptions.","directories":{},"_nodeVersion":"22.14.0","dependencies":{},"_hasShrinkwrap":false,"devDependencies":{"serve":"^14.2.6","typescript":"^6.0.2","@playwright/test":"^1.59.1"},"peerDependencies":{"@playwright/test":">=1.42.0"},"_npmOperationalInternal":{"tmp":"tmp/playwright-reporter_1.0.0_1775545469162_0.7192568588859838","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@acahet/playwright-reporter","version":"1.1.0","main":"dist/src/reporter.js","description":"Self-hosted Playwright test history dashboard — custom reporter + single-file HTML dashboard. No SaaS, no subscriptions.","types":"dist/src/reporter.d.ts","exports":{".":"./dist/src/reporter.js","./reporter":"./dist/src/reporter.js"},"scripts":{"build":"npm run build:dashboard && tsc --project tsconfig.json","build:dashboard":"node dashboard/build.mjs","build:watch":"tsc --project tsconfig.json --watch","serve:dashboard":"npx serve dashboard","prepublishOnly":"npm run build"},"dependencies":{"serve":"^14.2.6"},"devDependencies":{"@playwright/test":"^1.59.1","typescript":"^6.0.2"},"peerDependencies":{"@playwright/test":">=1.42.0"},"keywords":["playwright","reporter","dashboard","test-history"],"author":{"name":"acahet"},"license":"MIT","gitHead":"04856140f21633a910fe9823f3d3b3de2840a8cb","_id":"@acahet/playwright-reporter@1.1.0","_nodeVersion":"22.14.0","_npmVersion":"11.11.0","dist":{"integrity":"sha512-YZQEqFMdxyGZ5kVzHiSsM2sy8TJwaIDdx7dWR3rnQKuzgOJBO1pij6tH5gWLAFyCSp+YvmVEYZY+5EsJPBD5bA==","shasum":"d6373d892fb3d93408844eda1cdc2e2fd1833ba2","tarball":"https://registry.npmjs.org/@acahet/playwright-reporter/-/playwright-reporter-1.1.0.tgz","fileCount":40,"unpackedSize":433700,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCebDTZw+LILA6Yk6EN0QA28qNX+1sye0CN4VcCZZ6YSQIgaPLLFrqkr6q64sL7vGuuO7USab+uQaUEMH/kftTS0NI="}]},"_npmUser":{"name":"acahet","email":"anderson.cahet@gmail.com"},"directories":{},"maintainers":[{"name":"acahet","email":"anderson.cahet@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/playwright-reporter_1.1.0_1775998371907_0.9878277580742649"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-24T21:38:46.808Z","modified":"2026-04-12T12:52:52.158Z","0.0.2":"2026-03-24T21:38:47.077Z","0.1.1":"2026-03-28T15:28:11.193Z","0.1.2":"2026-03-28T17:05:30.537Z","0.1.3":"2026-04-04T15:57:13.223Z","1.0.0":"2026-04-07T07:04:29.386Z","1.1.0":"2026-04-12T12:52:52.056Z"},"author":{"name":"acahet"},"license":"MIT","keywords":["playwright","reporter","dashboard","test-history"],"description":"Self-hosted Playwright test history dashboard — custom reporter + single-file HTML dashboard. No SaaS, no subscriptions.","maintainers":[{"name":"acahet","email":"anderson.cahet@gmail.com"}],"readme":"# @acahet/playwright-reporter\r\n\r\nA self-hosted Playwright test history dashboard — no SaaS, no subscriptions, no external services. A custom reporter writes a local JSON index and regenerates the dashboard HTML after every run, so everything stays in sync automatically.\r\n\r\nIn this workspace, the package source is located at `packages/playwright-reporter`.\r\n\r\n## Install\r\n\r\n```bash\r\nnpm install -D @acahet/playwright-reporter\r\n```\r\n\r\n## Quick start\r\n\r\n### 1. Register the reporter in `playwright.config.ts`\r\n\r\n```ts\r\nimport { defineConfig } from '@playwright/test';\r\n\r\nexport default defineConfig({\r\n\treporter: [\r\n\t\t['html'],\r\n\t\t[\r\n\t\t\t'@acahet/playwright-reporter/reporter',\r\n\t\t\t{\r\n\t\t\t\thistoryDir: 'dashboard/test-history', // where to write dashboard files\r\n\t\t\t\tprojectName: 'your project name',\r\n\t\t\t\tbrandName: 'your brand name',\r\n\t\t\t\tpageTitle: 'your title',\r\n\t\t\t\tmaxRuns: 10, // optional, default is 30\r\n\t\t\tdurationRegressionWindow: 10,    // optional, default is 10\r\n\t\t\tdurationRegressionThreshold: 1.5, // optional, default is 1.5\r\n\t\t\tdurationRegressionMinRuns: 3,    // optional, default is 3\r\n\t\t\t},\r\n\t\t],\r\n\t],\r\n\tuse: {\r\n\t\ttrace: 'on-first-retry',\r\n\t\tscreenshot: 'on', // required for the gallery page\r\n\t},\r\n});\r\n```\r\n\r\n### 2. Run tests and serve the dashboard\r\n\r\n```bash\r\nnpx playwright test\r\nnpx serve <your historyDir>\r\n# e.g. npx serve dashboard/test-history\r\n```\r\n\r\nOpen `http://localhost:3000` — the dashboard always shows the latest run.\r\n\r\nAfter every `npx playwright test`, the reporter automatically:\r\n- Updates `history-index.json` with the new run\r\n- Regenerates `index.html` with your current config injected\r\n\r\n---\r\n\r\n## Features\r\n\r\n### Reporter\r\n\r\n- Records every test run to `history-index.json`\r\n- Captures pass, fail, flaky, skipped counts and total duration per run\r\n- Stores per-test: title, file, project, duration, status, error message, tags, and Playwright annotations\r\n- Detects flaky tests automatically — passed on retry after a prior failure\r\n- Copies failure artifacts (trace + screenshot) into a per-run directory scoped to the specific failing test\r\n- Retains the last **N runs** (default 30) as the single retention policy — index and disk stay in sync\r\n- Orphan guard removes any run directories not referenced in the index\r\n- Regenerates `index.html` with injected config after every run\r\n- Error boundary in `onEnd` — reporter failures never affect test exit codes\r\n- Skips `setup` project tests\r\n- Requires Playwright ≥ 1.42\r\n\r\n### Dashboard pages\r\n\r\n**Dashboard**\r\n\r\n- Suite health grade (A–F) on the latest run: 60% pass rate, 30% stability, 10% performance\r\n- Latest run stat cards: pass rate, passed, failed, flaky, regressing, skipped, total, duration\r\n- Clicking passed / failed / flaky / regressing / skipped filters that run's test list instantly\r\n- Stacked bar chart across last 30 runs with hover tooltip\r\n- Run duration line chart\r\n- Per-test view: search by name, project, or tag; sparkline of last 10 runs per card\r\n\r\n**Test detail** (click any test card)\r\n\r\n- Full run history with date, runId, status, duration\r\n- Duration-over-time mini chart with min / avg / max, `±% vs prev` delta, and a dashed rolling-average reference line\r\n- `REGRESSING` badge and rolling avg stat when the latest run exceeds the threshold\r\n- Failure reason grouping — normalises error messages to surface recurring patterns\r\n- Annotation support: `title` shown before the error, `description` in the header\r\n- Playwright error collapsed by default, expandable on click\r\n\r\n**Trends**\r\n\r\n- 5 charts across last 30 runs: Pass rate, Duration, Flaky count, Slow count, Regressing count\r\n- Each panel shows current value, delta vs previous run, and min / avg / max\r\n\r\n**Gallery**\r\n\r\n- Grid of failure screenshots grouped by run\r\n- Lightbox on click, Escape to close\r\n\r\n**Sidebar**\r\n\r\n- Navigate: Dashboard, Trends, Search tests, Gallery\r\n- Tag and Spec filter chips auto-populated from your test data\r\n- Recent runs list — click any run to scroll and auto-expand it\r\n\r\n**Run cards**\r\n\r\n- Collapsed by default, showing failed + flaky only\r\n- `SLOW` badge on tests above 1.5× the P75 duration of that run\r\n- `REGRESSING` badge on tests whose duration exceeds their rolling average by the configured threshold\r\n- Errors collapsed inline, expandable per test\r\n- Artifact links: download trace or screenshot per test\r\n\r\n---\r\n\r\n## Options\r\n\r\n| Option                        | Type     | Default                      | Description                                                         |\r\n| ----------------------------- | -------- | ---------------------------- | ------------------------------------------------------------------- |\r\n| `projectName`                 | `string` | `''`                         | Label shown in topbar/footer                                        |\r\n| `brandName`                   | `string` | `'pw_dashboard'`             | Brand label shown in top-left                                       |\r\n| `pageTitle`                   | `string` | `'Test History Dashboard'`   | Browser tab title                                                   |\r\n| `historyDir`                  | `string` | `'./dashboard/test-history'` | Where to write/read dashboard files and run history                 |\r\n| `maxRuns`                     | `number` | `30`                         | How many runs to keep in the index and on disk                      |\r\n| `durationRegressionWindow`    | `number` | `10`                         | Number of prior runs used to compute each test's rolling average    |\r\n| `durationRegressionThreshold` | `number` | `1.5`                        | Multiplier above rolling average that flags a test as `REGRESSING`  |\r\n| `durationRegressionMinRuns`   | `number` | `3`                          | Minimum prior data points required before a test can be flagged     |\r\n\r\nAll options are set directly in `playwright.config.ts` reporter options.\r\n\r\n---\r\n\r\n## Duration regression alerts\r\n\r\nThe reporter tracks each test's duration across runs and flags tests that are **slowing down relative to their own history** — not just the current run's median.\r\n\r\nA test is marked `REGRESSING` when:\r\n\r\n```\r\ncurrentDuration > rollingAverage × durationRegressionThreshold\r\n```\r\n\r\nwhere `rollingAverage` is the mean duration over the last `durationRegressionWindow` runs (excluding the current one), and the test must have at least `durationRegressionMinRuns` prior data points before it can be flagged.\r\n\r\n### Default behaviour (no config needed)\r\n\r\nOut of the box, a test is flagged when it runs **≥ 1.5× its 10-run rolling average**, with at least 3 prior runs required.\r\n\r\n### Tighter alerts — flag anything 20% above average\r\n\r\n```ts\r\n[\r\n  '@acahet/playwright-reporter/reporter',\r\n  {\r\n    historyDir: 'dashboard/test-history',\r\n    projectName: 'My App',\r\n    durationRegressionThreshold: 1.2, // flag at 120% of rolling avg\r\n  },\r\n]\r\n```\r\n\r\n### Larger baseline window — smooth out noisy environments\r\n\r\n```ts\r\n[\r\n  '@acahet/playwright-reporter/reporter',\r\n  {\r\n    historyDir: 'dashboard/test-history',\r\n    projectName: 'My App',\r\n    durationRegressionWindow: 20,   // average over last 20 runs\r\n    durationRegressionMinRuns: 5,   // require 5 data points before flagging\r\n  },\r\n]\r\n```\r\n\r\n### Loose alerts — only flag severe regressions\r\n\r\n```ts\r\n[\r\n  '@acahet/playwright-reporter/reporter',\r\n  {\r\n    historyDir: 'dashboard/test-history',\r\n    projectName: 'My App',\r\n    durationRegressionThreshold: 2.0, // only flag when 2× rolling avg\r\n    durationRegressionMinRuns: 5,     // require a stable baseline\r\n  },\r\n]\r\n```\r\n\r\n### Where regressions appear\r\n\r\n| Location | What you see |\r\n| -------- | ------------ |\r\n| Overview stat cards | **Regressing** card with count; click to filter the test list |\r\n| Run-card header (latest run) | `N regressing` badge |\r\n| Test row | `REGRESSING` badge next to `SLOW` |\r\n| Test detail header | `REGRESSING` badge + **rolling avg** stat box in amber |\r\n| Duration chart | Dashed amber reference line; exceeded dots enlarged and amber; `⚠ regressing` in delta label |\r\n| Trends page | **Regressing** mini-panel alongside Pass rate / Duration / Flaky / Slow |\r\n\r\n---\r\n\r\n## Troubleshooting\r\n\r\n- `history-index.json` is missing: run `npx playwright test` at least once.\r\n- `index.html` missing or stale: run `npx playwright test` — the reporter regenerates it after every run.\r\n- Dashboard loads but shows no data: ensure `historyDir` in your reporter options points to the same directory you're serving.\r\n\r\n---\r\n\r\n## Using annotations\r\n\r\n```ts\r\ntest('checkout fails with expired card', async ({ page }) => {\r\n\ttest.info().annotations.push(\r\n\t\t{ type: 'title', description: 'Known payment gateway timeout' },\r\n\t\t{\r\n\t\t\ttype: 'description',\r\n\t\t\tdescription: 'Card validation times out after 30s under load',\r\n\t\t},\r\n\t);\r\n\t// test body\r\n});\r\n```\r\n\r\nThe `title` annotation appears as a prominent label before the Playwright error in run history. The `description` appears in the test detail header. Any other annotation types appear as chips under the test name.\r\n\r\n---\r\n\r\n## Using with Azure App Testing\r\n\r\nCreate a thin wrapper config — your reporter and test code stay untouched:\r\n\r\n```ts\r\n// playwright.service.config.ts\r\nimport { defineConfig } from '@playwright/test';\r\nimport { getServiceConfig } from '@azure/microsoft-playwright-testing';\r\nimport baseConfig from './playwright.config';\r\n\r\nexport default defineConfig(baseConfig, getServiceConfig(baseConfig), {\r\n\treporter: [\r\n\t\t['list'],\r\n\t\t['@azure/microsoft-playwright-testing/reporter'],\r\n\t\t['@acahet/playwright-reporter'],\r\n\t],\r\n});\r\n```\r\n\r\nRun with Azure: `npx playwright test --config=playwright.service.config.ts`\r\n\r\nTo detach: delete the service config, remove the package. Zero changes to tests.\r\n\r\n---\r\n\r\n## File structure after setup\r\n\r\n```\r\nyour-project/\r\n└── <historyDir>/\r\n\t├── index.html              ← generated by reporter after every run\r\n\t├── history-index.json      ← generated by reporter after every run\r\n\t└── runs/\r\n\t\t└── <run-id>/\r\n\t\t\t├── <test>-trace.zip\r\n\t\t\t└── <test>-screenshot.png\r\n```\r\n\r\nAdd to `.gitignore`:\r\n\r\n```\r\n<historyDir>/runs/\r\n<historyDir>/history-index.json\r\n```\r\n\r\n---\r\n\r\n## Requirements\r\n\r\n- Playwright ≥ 1.42\r\n- Node.js ≥ 18\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}