diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8dcc591..0eb3e95 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,7 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
---
-### Unreleased
+### v3.9.0 — 2026-10-21
+
+- **`Locator` keyboard and pointer actions: `press(Keys...)`, `focus()`, `doubleClick()`, `rightClick()`** — send keys without clearing the value, focus without clicking, or perform native double/context clicks directly on a locator. Each action re-resolves on every poll and retries stale or not-yet-present elements until `timeouts.explicit` elapses. (#134, #188)
+
+- **HTML report: flaky-test trend line** — the dashboard gains a third "Flaky Test Trend" line chart (flaky tests per run) next to the pass-rate and duration charts. (#185)
+
+- **Fix: Cucumber quarantine check no longer silently skipped** — `checkCucumberQuarantine` threw when the framework context was not yet initialised and the error was swallowed, so quarantined scenarios ran instead of being skipped. It now guards on initialisation. (#186)
+
+- **Fix: Gemini default model** — `ai.provider: gemini` now defaults to the `gemini-flash-latest` alias; the previously pinned `gemini-2.5-flash` returned 404 for new API keys. (#171)
+
+- **Dependency updates** — selenium-java 4.51.0, cucumber-testng 8.0.4, cucumber-junit-platform-engine, jackson-databind, mockito-core 5.24.0, jakarta.mail 2.0.2.
- **HTML report: tab and failure fixes** — the report always opens on the Dashboard (it no longer restores the last-open tab), failure details start collapsed, and the Failures tab no longer goes empty after you expand or collapse a class in Test Cases (both tabs shared one group id).
diff --git a/README.md b/README.md
index 9675b1c..82bb65f 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,7 @@ Three files. Copy them as-is and `mvn test` goes green against a real Chrome.
io.github.seleniumboot
selenium-boot
- 3.8.0
+ 3.9.0
@@ -286,7 +286,7 @@ Grab the jar from the [latest release](https://github.com/seleniumboot/selenium-
## Project Status
-**Current release: v3.8.0** — `Locator.first()` / `Locator.last()` and a results-first HTML report (suite wall-clock time in `hh:mm:ss`).
+**Current release: v3.9.0** — failure intelligence (triage and suggested actions, AI provider choice, run summary), trend charts, Cucumber on the JUnit Platform, and more `Locator` actions.
See the full version history in **[CHANGELOG.md](CHANGELOG.md)**.
diff --git a/docs-site/docs/changelog.md b/docs-site/docs/changelog.md
index ce5e7ab..ccd5f6a 100644
--- a/docs-site/docs/changelog.md
+++ b/docs-site/docs/changelog.md
@@ -9,9 +9,18 @@ sidebar_position: 99
All notable changes to Selenium Boot are documented here.
-## [Unreleased]
+## [3.9.0] — 2026-10-21
+
+- **`Locator` keyboard and pointer actions: `press(Keys...)`, `focus()`, `doubleClick()`, `rightClick()`** — send keys without clearing the value, focus without clicking, or perform native double/context clicks directly on a locator. Each action re-resolves on every poll and retries stale or not-yet-present elements until `timeouts.explicit` elapses. (#134, #188)
+
+- **HTML report: flaky-test trend line** — the dashboard gains a third "Flaky Test Trend" line chart (flaky tests per run) next to the pass-rate and duration charts. (#185)
+
+- **Fix: Cucumber quarantine check no longer silently skipped** — `checkCucumberQuarantine` threw when the framework context was not yet initialised and the error was swallowed, so quarantined scenarios ran instead of being skipped. It now guards on initialisation. (#186)
+
+- **Fix: Gemini default model** — `ai.provider: gemini` now defaults to the `gemini-flash-latest` alias; the previously pinned `gemini-2.5-flash` returned 404 for new API keys. (#171)
+
+- **Dependency updates** — selenium-java 4.51.0, cucumber-testng 8.0.4, cucumber-junit-platform-engine, jackson-databind, mockito-core 5.24.0, jakarta.mail 2.0.2.
-- **`Locator` keyboard and pointer actions: `press(Keys...)`, `focus()`, `doubleClick()`, `rightClick()`** — send keys without clearing the value, focus without clicking, or perform native double/context clicks directly on a locator. Each action re-resolves on every poll and retries stale or not-yet-present elements until `timeouts.explicit` elapses. (#134)
- **Failure Intelligence: high-level triage and suggested actions** — each failure is classified as `Product bug`, `Test bug`, `Environment`, `Flaky` or `Unknown` (flaky keeps its cause, e.g. `Flaky (Locator not found)`), with a rule-based suggested action. Shown in the HTML report, as `failureType` / `suggestedAction` in the metrics JSON, and in the JUnit XML; opt-in AI analysis uses it as a baseline. No API key needed. (#138)
@@ -43,10 +52,6 @@ All notable changes to Selenium Boot are documented here.
- **`Locator` form actions: `clear()`, `check()`, `uncheck()`, `isChecked()`, `selectOption(text)`, `selectOptionByValue(value)`, `inputValue()`** — form controls can now be manipulated and inspected directly on `Locator` without falling back to `BasePage` helpers or raw `WebElement`s. `check()` and `uncheck()` are idempotent (no click if already in the target state), `isChecked()` queries checked state without waiting, and terminal actions (`clear`, `check`, `uncheck`, `selectOption`, `selectOptionByValue`, `inputValue`) auto-wait, re-resolving from scratch on every poll to survive stale or late-appearing elements. (#133)
----
-
-## [Unreleased]
-
- **Failure classification** — every failed test is tagged with a category (`LOCATOR_NOT_FOUND`, `ELEMENT_NOT_INTERACTABLE`, `STALE_ELEMENT`, `TIMEOUT`, `ASSERTION_MISMATCH`, `NAVIGATION_ERROR`, `BROWSER_CRASH`, or `UNKNOWN`) and the evidence for it, from the exception class chain and message alone. No AI, no API key, no network. Shown as a badge in the HTML report's failure panel, as `failureCategory` / `failureEvidence` in the metrics JSON, and as the `type` of `` in the JUnit XML. The raw error and stack trace are unchanged. (#139)
---
diff --git a/docs-site/docs/cucumber.md b/docs-site/docs/cucumber.md
index 555ecae..0829359 100644
--- a/docs-site/docs/cucumber.md
+++ b/docs-site/docs/cucumber.md
@@ -21,7 +21,7 @@ Add Cucumber to your project alongside Selenium Boot.
io.github.seleniumboot
selenium-boot
- 3.8.0
+ 3.9.0
@@ -52,7 +52,7 @@ Add Cucumber to your project alongside Selenium Boot.
io.github.seleniumboot
selenium-boot
- 3.8.0
+ 3.9.0
diff --git a/docs-site/docs/getting-started.md b/docs-site/docs/getting-started.md
index f6fc2e2..0921592 100644
--- a/docs-site/docs/getting-started.md
+++ b/docs-site/docs/getting-started.md
@@ -41,7 +41,7 @@ config, a page object and passing tests, ready for `mvn test`.
io.github.seleniumboot
selenium-boot
- 3.8.0
+ 3.9.0
```
diff --git a/docs-site/docs/junit5.md b/docs-site/docs/junit5.md
index 38026d8..6bd4e4a 100644
--- a/docs-site/docs/junit5.md
+++ b/docs-site/docs/junit5.md
@@ -17,7 +17,7 @@ Selenium Boot supports both **TestNG** (built-in) and **JUnit 5** (opt-in). The
io.github.seleniumboot
selenium-boot
- 3.8.0
+ 3.9.0
diff --git a/docs-site/src/pages/index.js b/docs-site/src/pages/index.js
index c15e394..6fc283a 100644
--- a/docs-site/src/pages/index.js
+++ b/docs-site/src/pages/index.js
@@ -241,7 +241,7 @@ export default function Home() {
code={`
io.github.seleniumboot
selenium-boot
- 3.8.0
+ 3.9.0
`}
/>
diff --git a/pom.xml b/pom.xml
index 64a22a4..08ff2fd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
io.github.seleniumboot
selenium-boot
- 3.8.0
+ 3.9.0
jar
Selenium Boot