(engine-verified)` — **ship with declared failures, never silently claim pass.**
diff --git a/skills/keystone/references/engine.md b/skills/keystone/references/engine.md
index 01d754c..299ab63 100644
--- a/skills/keystone/references/engine.md
+++ b/skills/keystone/references/engine.md
@@ -2,7 +2,7 @@
How the executable gate engine works. The model reads this to orchestrate
Step 7 (the engine-verified slop test). For the gate definitions themselves,
-see gates.md. For the render extension, see the render tool.
+see gates.md. For the render layer, see § The render layer below.
## Three tiers (recap)
@@ -10,7 +10,7 @@ see gates.md. For the render extension, see the render tool.
|---|---|---|---|
| Skill | rule-set, catalog, gate definitions | skills/keystone/ | the model reads it |
| Engine | deterministic gate checkers (math + DOM + CSS parse) | engine/ | `node engine/check-gates.mjs` (bash) |
-| Extension | headless render + screenshot + computed-styles dump | extensions/render.ts | the `keystone_render` tool |
+| Render | headless render + screenshot + computed-styles dump | engine/render-core.mjs + drivers | `keystone_render` tool (pi) · eval-kernel import (omp) · CLI `--render` |
## The deterministic gates (Phase 1 — shipped)
@@ -53,8 +53,9 @@ Flags:
- `--out` — output directory (default: `.`)
- `--log` — path to `.keystone/log.json`; feeds G8/G32 (diversification)
the prior macrostructure log so reuse is detected
-- `--render` — runs headless Chromium via the render extension; without it
- only the 11 CSS/HTML-only gates run (G34/G44/G40-41 need the render dump)
+- `--render` — runs headless Chromium via the playwright driver (child
+ process); without it only the 11 CSS/HTML-only gates run
+ (G34/G44/G40-41 need the render dump)
- `--viewports` — csv CSS pixel widths (default: `1280,375,320,414,768`
when `--render` is set; `[]` otherwise)
@@ -80,19 +81,27 @@ Each detector is a pure function `(ctx: DetectorContext) => GateResult[]`
(or single `GateResult`). Detectors use `pass(gate, name)` and
`fail(gate, name, evidence, fix, file?, line?)` from `engine/types.mjs`.
-## The render extension
+## The render layer
+
+One flow — `engine/render-core.mjs` — behind three drivers:
+
+| Driver | File | Used by |
+|---|---|---|
+| playwright-core (lazy import) | `engine/driver-playwright.mjs` | the CLI (`--render`, audit) and the `keystone_render` pi extension tool |
+| omp built-in browser | `engine/driver-omp-native.mjs` | omp hosts — imported from omp's eval kernel as `engine/render-omp.mjs` |
```
-keystone_render({ htmlPath, viewports?: [1280, 375, 320, 414, 768], outDir?: string })
- -> { screenshots: [{ width, path }], computedStylesPath, domSnapshotPath, viewportMetrics }
+render({ htmlPath, url?, viewports?: [1280, 375, 320, 414, 768], outDir?: string })
+ -> { screenshots: [{ width, path }], computedStylesPath, domSnapshotPath, viewportMetrics, finalUrl, clickableMetrics }
```
-Headless Chromium (via `playwright-core`) at exact CSS px widths. Returns
-screenshot paths + a computed-styles JSON dump (`computed.json` — up to 200
-`{ selector, color, backgroundColor }` pairs from the 1280px pass, converted
-to canonical OKLCH strings via `engine/color.mjs`) + a DOM snapshot
-(`dom.html`) + `viewportMetrics` (one per viewport: `{ width, scrollWidth,
-innerWidth, innerHeight, hero? }`).
+Headless Chromium at exact CSS px widths. Returns screenshot paths + a
+computed-styles JSON dump (`computed.json` — up to 200
+`{ selector, color, backgroundColor, width, height }` pairs from the 1280px
+pass, converted to canonical OKLCH strings via `engine/color.mjs`) + a DOM
+snapshot (`dom.html`) + `viewportMetrics` (one per viewport: `{ width,
+scrollWidth, innerWidth, innerHeight, hero? }`) + `clickable.json` (G49
+line-metrics at 1280 + 375) + `finalUrl` (post-redirect, audit re-check).
`viewports.json` is written to `outDir` with the full `viewportMetrics`
array. The `hero` object is captured only at the 1280px pass (omitted from
@@ -102,15 +111,19 @@ headline; preceding short-text sibling (`///
/` with
following `` = lede; first ``/`