diff --git a/.gitignore b/.gitignore
index c3374a8..0bef111 100644
--- a/.gitignore
+++ b/.gitignore
@@ -49,3 +49,5 @@ ai-act-compass-*.pdf
# Vitest coverage output
coverage/
.vercel
+test-results/
+playwright-report/
diff --git a/e2e/parcours.spec.js b/e2e/parcours.spec.js
new file mode 100644
index 0000000..d45b86c
--- /dev/null
+++ b/e2e/parcours.spec.js
@@ -0,0 +1,169 @@
+// End-to-end parcours tests — drives a real browser through the 7-step flow
+// and asserts the verdict screen renders the expected primary category.
+// Catches the class of bug that unit + component tests can miss:
+// - Runtime React errors (scope, missing imports) — PR #3 C2 example
+// - UI navigation logic (Bug #1 art. 25 flip Step 7 visibility)
+// - Short-circuit interaction (Bug #2 prohibition + carve-out)
+//
+// Not in `npm test` (Vitest scope). Run manually: `npx playwright test`.
+//
+// Selectors anchor on the OptionCard aria-label, which is composed as
+// `
— — `. We match on unique fragments (often `sub`
+// like "art. 3(3)") to keep selectors stable across copy changes.
+
+import { test, expect } from '@playwright/test';
+
+const startQualification = (page) =>
+ page.getByRole('button', { name: /start qualification/i }).click();
+const clickContinue = (page) =>
+ page.getByRole('button', { name: /^continue$/i }).click();
+const clickViewVerdict = (page) =>
+ page.getByRole('button', { name: /view verdict|continue/i }).first().click();
+
+// OptionCard renders as