diff --git a/CHANGELOG.md b/CHANGELOG.md
index 12fa6ec37..f39ce1040 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,32 @@ Current truth lives in:
Historical changelog details remain available through git history and release
evidence.
+## 0.42.0-alpha.1
+
+- First alpha of the 0.42 line (ADR-0120): request-time rendering gains
+ semantics — `renderIntent.mode` was inert metadata before this release.
+- `rendering: 'dynamic'` routes skip prerendering, dynamic expansion and
+ i18n locale prerendering; they are served per request by the generated
+ `dist/server/index.js` (nitro-mount over the same SSR bundle), with
+ `dist/server/server-manifest.json` recording the partition.
+- Hard rule (ADR-0120): pages with actions cannot be prerendered — a route
+ module exporting an action without `mode: 'dynamic'` fails the build.
+- BuildPlan evidence records `requestTimeRoutes`; pure-static projects emit
+ no new artifacts (byte-identical public output proven against the 0.41.2
+ build: zero HTML/JS/CSS differences).
+- Request-time e2e fixture under
+ `packages/adapter-vite/__fixtures__/request-time/` proves loader data
+ varies per request and islands hydrate identically to static pages
+ (Chromium, Firefox and WebKit, 12/12).
+- Request-time HTML now receives the island client entry automatically —
+ the generated server entry injects the same script the static pipeline
+ injects post-build (found by the fixture; without it, islands on
+ request-time pages never hydrated). A latent `__headExtras is not
+ defined` codegen bug for projects without head extras is fixed too.
+- Loader/action contract types (`Loader`/`LoaderContext`/`Action`/
+ `ActionContext`) are unchanged — they already shipped; this alpha wires
+ the rendering-mode semantics around them.
+
## 0.41.2
- Patch release: release-tooling self-repair (TP-0 of the 0.42.0 plan) — no
diff --git a/README.md b/README.md
index efe267781..040719cb1 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ Elements are the durable application contract; JSX and Basic Element are the
authoring layer; Declarative Shadow DOM is the default server representation;
interactive regions upgrade selectively.
-Published package line: `0.41.2` (`v0.41.2`) — the stable five-package
+Published package line: `0.42.0-alpha.1` (`v0.42.0-alpha.1`) — the stable five-package
release under ADR-0119's scoped interface freeze; the abandoned beta naming
is not an active line.
diff --git a/README.zh.md b/README.zh.md
index de1e86d46..5f95ceb2a 100644
--- a/README.zh.md
+++ b/README.zh.md
@@ -6,7 +6,7 @@
Elements 是可长期保存的应用组件模型;JSX 与 Basic Element 是作者层;
Declarative Shadow DOM 是默认服务端表示;交互区域按需升级。
-已发布包线为 `0.41.2`(`v0.41.2`)——ADR-0119 范围化接口冻结下的
+已发布包线为 `0.42.0-alpha.1`(`v0.42.0-alpha.1`)——ADR-0119 范围化接口冻结下的
stable 五包版本;已放弃的 beta 命名不再是当前版本线。
## 当前产品
diff --git a/deno.json b/deno.json
index 0497d6279..d756d72d4 100644
--- a/deno.json
+++ b/deno.json
@@ -86,6 +86,9 @@
"test:e2e:firefox-smoke": "deno run -A npm:@playwright/test@1.59.1 test --config www/e2e/playwright.config.ts --project=firefox --grep \"DSD Layers|Layout Island Shell|Island Script Loading|Theme Toggle|Theme initialization|data-signal bindings|SSR/hydration mismatch degradation|router guards on browser history traversal|reflect: true static props\"",
"test:e2e:webkit-smoke": "deno run -A npm:@playwright/test@1.59.1 test --config www/e2e/playwright.config.ts --project=webkit --grep \"DSD Layers|Layout Island Shell|Island Script Loading|Theme Toggle|Theme initialization|data-signal bindings|SSR/hydration mismatch degradation|router guards on browser history traversal|reflect: true static props\"",
"test:e2e:browsers:install": "deno run -A npm:playwright@1.59.1 install chromium firefox webkit",
+ "fixture:request-time:build": "cd packages/adapter-vite/__fixtures__/request-time && deno run --config ../../../../deno.json --allow-read --allow-write --allow-net --allow-env --allow-ffi --allow-sys --allow-run ../../src/cli/build.ts",
+ "fixture:request-time:e2e": "deno run -A npm:@playwright/test@1.59.1 test --config packages/adapter-vite/__fixtures__/request-time/e2e/playwright.config.ts --project=chromium",
+ "fixture:request-time:e2e:browsers": "deno run -A npm:@playwright/test@1.59.1 test --config packages/adapter-vite/__fixtures__/request-time/e2e/playwright.config.ts",
"nitro:proof:node": "deno run --allow-read --allow-write --allow-run --allow-env --allow-net tools/nitro-proof.ts node",
"nitro:proof:workers": "deno run --allow-read --allow-write --allow-run --allow-env --allow-net tools/nitro-proof.ts workers",
"test:coverage:check": "deno run --allow-read --allow-run --allow-write --allow-env --allow-net --allow-ffi --allow-sys tools/check-coverage.ts --threshold 73 --branch-threshold 82 --function-threshold 77",
diff --git a/docs/current/VERSION_PLAN.md b/docs/current/VERSION_PLAN.md
index d662e5aaa..2de49c621 100644
--- a/docs/current/VERSION_PLAN.md
+++ b/docs/current/VERSION_PLAN.md
@@ -1,7 +1,7 @@
# v0.42.0 — WC Application Loop release plan
-> Current source package line: `v0.41.2`\
-> Current npm registry line: `v0.41.2`\
+> Current source package line: `v0.42.0-alpha.1`\
+> Current npm registry line: `v0.42.0-alpha.1`\
> Active release target: `v0.41.1`\
> Planning release target: `v0.42.0` (WC Application Loop)\
> Next release line: `v0.43.0` (Universal WC SSR)\
diff --git a/docs/governance/PROJECT_WORKFLOW.md b/docs/governance/PROJECT_WORKFLOW.md
index f02d4aa38..eadcdd894 100644
--- a/docs/governance/PROJECT_WORKFLOW.md
+++ b/docs/governance/PROJECT_WORKFLOW.md
@@ -11,8 +11,8 @@ complete because an issue, chat message, or SOP says it is complete. It is
complete only when the repository contains the decision, the execution package,
the implementation, and the gates that prove the claim.
-Current execution anchor: published package line `v0.41.2`, completed
-implementation anchor `v0.41.2`, and `0.42.0` WC Application Loop planning
+Current execution anchor: published package line `v0.42.0-alpha.1`, completed
+implementation anchor `v0.42.0-alpha.1`, and `0.42.0` WC Application Loop planning
under ADR-0120 and `docs/current/VERSION_PLAN.md`.
OpenElement is one Web Components-native,
static-first application framework: Basic Element is an authoring mode, not a
diff --git a/docs/roadmap/ROADMAP.md b/docs/roadmap/ROADMAP.md
index 0f017e494..fcde5d848 100644
--- a/docs/roadmap/ROADMAP.md
+++ b/docs/roadmap/ROADMAP.md
@@ -4,8 +4,8 @@ Execution and release state follow the
[`Project Workflow`](../governance/PROJECT_WORKFLOW.md).
> Source of truth for forward product planning.\
-> Published package line: `v0.41.2`.\
-> Active execution target: `v0.41.2`.\
+> Published package line: `v0.42.0-alpha.1`.\
+> Active execution target: `v0.42.0-alpha.1`.\
> Current implementation state: five-package convergence is published;
> alpha.17 closed the first audit remediation, alpha.18 completed the
> second audit sweep (ADR-0117), and alpha.19 completed the third (ADR-0118).\
@@ -116,7 +116,7 @@ making the standard Custom Element contract span both layers. See the official
## Current release state
-`0.41.2` is the published package line. npm beta.1 through beta.3 are
+`0.42.0-alpha.1` is the published package line. npm beta.1 through beta.3 are
immutable partial artifacts and remain withdrawn from the active release story.
The planned beta name was cancelled so the version label honestly reflects
that breaking architecture and interface changes are still allowed.
diff --git a/docs/status/STATUS.md b/docs/status/STATUS.md
index 982a0c314..86958c9fb 100644
--- a/docs/status/STATUS.md
+++ b/docs/status/STATUS.md
@@ -1,9 +1,9 @@
# OpenElement Status
> Updated: 2026-07-27\
-> Repository package line: `v0.41.2`\
-> npm registry line: `v0.41.2`\
-> Active release target: `v0.41.2`\
+> Repository package line: `v0.42.0-alpha.1`\
+> npm registry line: `v0.42.0-alpha.1`\
+> Active release target: `v0.42.0-alpha.1`\
> Next release line: `v0.42.0`\
> Product graph: five packages\
> Current maturity stage: stable (0.41.x)
diff --git a/packages/adapter-vite/__fixtures__/request-time/app/components/.gitkeep b/packages/adapter-vite/__fixtures__/request-time/app/components/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/adapter-vite/__fixtures__/request-time/app/islands/live-counter.tsx b/packages/adapter-vite/__fixtures__/request-time/app/islands/live-counter.tsx
new file mode 100644
index 000000000..9dd916593
--- /dev/null
+++ b/packages/adapter-vite/__fixtures__/request-time/app/islands/live-counter.tsx
@@ -0,0 +1,31 @@
+/**
+ * live-counter — minimal signal counter island.
+ *
+ * Hydrates on load; clicking the button increments the count. Used on the
+ * request-time /live page to prove hydration is identical to static pages.
+ */
+import { defineCustomElement, OpenElement, signal } from '@openelement/element';
+import { defineIslandConfig } from '@openelement/app';
+
+export const tagName = 'live-counter';
+export const openElement = defineIslandConfig({ hydrate: 'load', ssr: true, dsd: true });
+
+export default class LiveCounter extends OpenElement {
+ #count = signal(0);
+
+ constructor() {
+ super();
+ this.registerSignal('count', this.#count);
+ }
+
+ override render() {
+ return (
+
+
+
+
+ );
+ }
+}
+
+defineCustomElement(tagName, LiveCounter);
diff --git a/packages/adapter-vite/__fixtures__/request-time/app/routes/form.tsx b/packages/adapter-vite/__fixtures__/request-time/app/routes/form.tsx
new file mode 100644
index 000000000..69fc9abcf
--- /dev/null
+++ b/packages/adapter-vite/__fixtures__/request-time/app/routes/form.tsx
@@ -0,0 +1,38 @@
+/**
+ * /form — request-time page with an action export.
+ *
+ * Exercises the ADR-0120 hard rule from its valid side: a route with an
+ * action must declare renderIntent mode 'dynamic', and then builds fine.
+ */
+import { definePage, useActionData } from '@openelement/app';
+
+export const tagName = 'page-form';
+
+interface FormActionData {
+ echoed: string;
+}
+
+export function action(ctx: { formData: Record }): FormActionData {
+ return { echoed: String(ctx.formData?.message ?? '') };
+}
+
+const FormPage = definePage({
+ renderIntent: { mode: 'dynamic' },
+ head: { title: 'request-time fixture — form' },
+ render() {
+ const actionData = useActionData() as FormActionData | undefined;
+ return (
+
+