Skip to content

Commit 4fcc6e0

Browse files
Merge pull request #508 from open-element/dev
release: v0.41.0-alpha.19 (ADR-0118 third audit cleanup sweep)
2 parents 60e906f + 344f2b5 commit 4fcc6e0

138 files changed

Lines changed: 2371 additions & 1956 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ node_modules/
33

44
# Deno
55
.deno/
6-
.deno-cache/
7-
.deno_cache/
86
vendor/*
97
# Keep vendored dependency attribution tracked for license compliance
108
!vendor/jsr.io/
@@ -23,13 +21,10 @@ dist/
2321
custom-dist/
2422
dist-test-*/
2523
www/dist/
26-
npm/
2724
packages/adapter-vite/__fixtures__/nitro-proof/.output-*/
2825
packages/adapter-vite/__fixtures__/nitro-proof/.wrangler/
2926
packages/adapter-vite/__fixtures__/nitro-proof/.nitro/
3027
packages/adapter-vite/__fixtures__/nitro-proof/node_modules/
31-
*.tsbuildinfo
32-
.tsbuildinfo
3328
www/app/data/_generated-blog-data.ts
3429
.openElement/
3530
www/.openElement/
@@ -73,7 +68,6 @@ test-results/
7368
.gstack/
7469
.qoder/
7570
.codebuddy/settings.local.json
76-
docs/autoflow/cells/*/state.json
7771

7872
# Vite cache
7973
.vite/
@@ -82,27 +76,9 @@ docs/autoflow/cells/*/state.json
8276
# Generated www data modules and the UI manifest are intentionally tracked.
8377
# repo:hygiene fails if a tracked file also matches .gitignore.
8478

85-
# Test / build / lint / coverage output files
86-
test-*.txt
87-
cov-*.txt
88-
ui-test*.txt
89-
lint-*.txt
90-
coverage-*.txt
91-
coverage-output.txt
92-
.git-commit-msg.txt
93-
docs/vite-build-*.txt
94-
9579
# Root-level logo source files (design originals, keep local)
9680
/open-logo*.svg
9781
/open-favicon.svg
9882

99-
debug.log
10083
hub-index/
10184
hub-submission.json
102-
lighthouse-result*.json
103-
104-
# Root-level audit artifact
105-
/audit-ast.json
106-
107-
# Vite virtual assets
108-
assets/_virtual_*

CHANGELOG.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ evidence.
2828
- Adds WebKit smoke to CI, gates examples checks, single-sources the
2929
guide with real Chinese rendering, and covers the SPA action chain in a
3030
real browser.
31-
- Removes dead exports, fields and scripts (breaking; see the release
32-
note for migration), removes `renderIntent.streaming`, converges
33-
fmt/lint exclusions, and retires stale files and config entries.
31+
- Removes dead exports, fields and scripts (breaking; see the GitHub
32+
prerelease notes for migration), removes `renderIntent.streaming`,
33+
converges fmt/lint exclusions, and retires stale files and config entries.
3434

3535
## 0.41.0-alpha.17
3636

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Elements are the durable application contract; JSX and Basic Element are the
77
authoring layer; Declarative Shadow DOM is the default server representation;
88
interactive regions upgrade selectively.
99

10-
Published package line: `0.41.0-alpha.18` (`v0.41.0-alpha.18`). This release
10+
Published package line: `0.41.0-alpha.19` (`v0.41.0-alpha.19`). This release
1111
keeps the project in alpha while the five-package product and external adoption
1212
evidence continue to mature; the abandoned beta naming is not an active line.
1313

@@ -51,11 +51,11 @@ external adoption. It is not presented as an already-achieved market claim.
5151

5252
## Current release state
5353

54-
The five-package convergence is published as `0.41.0-alpha.18`. npm beta.1
54+
The five-package convergence is published as `0.41.0-alpha.19`. npm beta.1
5555
through beta.3 remain withdrawn partial artifacts and are not compatibility
5656
baselines. External adopter pilot #390 remains the primary repository-external
57-
condition before the project can make a stability commitment. Alpha.18 is the
58-
active second audit sweep (see
57+
condition before the project can make a stability commitment. Alpha.18
58+
completed the second audit sweep (see
5959
[ADR-0117](./docs/adr/ADR-0117-second-audit-round-alpha18-sweep.md)).
6060

6161
Stable `0.41.0` is released only when alpha releases need no more architecture,

README.zh.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
Elements 是可长期保存的应用组件模型;JSX 与 Basic Element 是作者层;
77
Declarative Shadow DOM 是默认服务端表示;交互区域按需升级。
88

9-
已发布包线为 `0.41.0-alpha.18``v0.41.0-alpha.18`)。项目继续使用 alpha
9+
已发布包线为 `0.41.0-alpha.19``v0.41.0-alpha.19`)。项目继续使用 alpha
1010
命名,直到五包产品与外部采用证据充分成熟;已放弃的 beta 命名不再是当前版本线。
1111

1212
## 当前产品
@@ -41,9 +41,9 @@ official build path = Vite + Nitro
4141

4242
## 当前发布状态
4343

44-
五包收敛已作为 `0.41.0-alpha.18` 发布。npm beta.1 至 beta.3 仍是已撤回的
44+
五包收敛已作为 `0.41.0-alpha.19` 发布。npm beta.1 至 beta.3 仍是已撤回的
4545
不完整历史产物,不构成兼容基线。外部 adopter pilot #390 仍是作出稳定性承诺前
46-
最重要的仓库外条件。Alpha.18 是当前第二轮审计清扫版本(ADR-0117)。
46+
最重要的仓库外条件。Alpha.18 已完成第二轮审计清扫(ADR-0117)。
4747

4848
只有后续 alpha 不再需要架构、公开接口或采用工作时,才发布 stable `0.41.0`
4949
request-time data、forms、sessions 与 cache 仍是后续产品工作;当前承诺是具有

SECURITY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ update within ten business days. Please include affected package and version,
99
reproduction steps, impact, and any proposed mitigation. We coordinate a fix,
1010
credit reporters when requested, and publish an advisory when users need to act.
1111

12-
Only the latest published `0.41.x` line is supported while alpha.7 is active.
12+
Only the latest published release on the current alpha line is supported.
1313
Pre-release packages may change before stable release; security fixes are made
1414
on the active release line whenever practical.
1515

deno.json

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
"dev": "cd www && deno run --allow-read --allow-write --allow-net --allow-env --allow-ffi --allow-sys npm:vite --config vite.config.ts",
3838
"build": "deno task generate:ui-manifest && (cd www && deno run --config ../deno.json --allow-read --allow-write --allow-net --allow-env --allow-ffi --allow-sys --allow-run ../packages/adapter-vite/src/cli/build.ts) && deno task www:check-artifact-truth",
3939
"preview": "cd www && deno run --allow-read --allow-write --allow-net --allow-env --allow-ffi npm:vite preview --config vite.config.ts",
40-
"build:docs": "deno task build",
4140
"workflow:check": "deno run --allow-read --allow-run=git tools/check-project-workflow.ts",
4241
"workflow:check-slimming": "deno run --allow-read tools/check-workflow-slimming.ts",
4342
"actions:check-pins": "deno run --allow-read --allow-env tools/check-action-pins.ts",
@@ -64,7 +63,6 @@
6463
"consumer:local": "deno run --allow-read --allow-write --allow-run --allow-env --allow-net tools/consumer-local.ts",
6564
"consumer:packaged": "deno task pack:dry-run && deno run --allow-read --allow-write --allow-run --allow-env --allow-net tools/consumer-packaged-starter.ts && deno run --allow-read --allow-write --allow-run --allow-env --allow-net tools/consumer-local.ts --packaged-import-map-check",
6665
"third-party-wc:smoke": "deno run --allow-read --allow-write --allow-run --allow-env --allow-net --allow-sys tools/third-party-wc-smoke.ts",
67-
"desktop-reader:smoke": "cd examples/deno-desktop-reader && deno test -A app/__tests__/",
6866
"examples:check": "cd examples/deno-desktop-reader && deno task check && deno task smoke && cd ../deno-desktop-mastodon && deno task check && deno task smoke",
6967
"stress:dogfood": "deno run --allow-read --allow-run --allow-env tools/run-dogfood-stress.ts",
7068
"dogfood:evidence": "deno run --allow-read --allow-write --allow-run tools/run-dogfood-evidence.ts",
@@ -84,8 +82,8 @@
8482
"test:visual-baselines": "OPEN_VISUAL_REGRESSION=1 deno run -A npm:@playwright/test@1.59.1 test www/e2e/visual-baselines.spec.ts --config www/e2e/playwright.config.ts --project=chromium",
8583
"test:e2e:browsers": "deno run -A npm:@playwright/test@1.59.1 test --config www/e2e/playwright.config.ts",
8684
"test:e2e:install": "deno run -A npm:playwright@1.59.1 install chromium",
87-
"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\"",
88-
"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\"",
85+
"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\"",
86+
"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\"",
8987
"test:e2e:browsers:install": "deno run -A npm:playwright@1.59.1 install chromium firefox webkit",
9088
"nitro:proof:node": "deno run --allow-read --allow-write --allow-run --allow-env --allow-net tools/nitro-proof.ts node",
9189
"nitro:proof:workers": "deno run --allow-read --allow-write --allow-run --allow-env --allow-net tools/nitro-proof.ts workers",
@@ -96,14 +94,13 @@
9694
"lint": "deno lint",
9795
"fmt": "deno fmt",
9896
"fmt:check": "deno fmt --check",
99-
"clean": "rm -rf packages/*/dist www/dist packages/*/*.tgz",
97+
"clean": "rm -rf packages/*/dist www/dist packages/*/*.tgz dist custom-dist dist-test-* playwright-report test-results .openElement www/.openElement",
10098
"hooks:install": "git config core.hooksPath .githooks",
10199
"hooks:uninstall": "git config core.hooksPath",
102100
"autoflow:dev": "deno run --allow-read --allow-run --allow-env tools/autoflow/mod3.ts dev",
103101
"autoflow:push": "deno run --allow-read --allow-run --allow-env tools/autoflow/mod3.ts push",
104102
"autoflow:ci": "deno run --allow-read --allow-run --allow-env tools/autoflow/mod3.ts ci",
105103
"autoflow:patch-release": "deno run --allow-read --allow-write --allow-run --allow-env tools/autoflow/mod3.ts patch-release",
106-
"autoflow:minor-plan": "deno run --allow-read --allow-run tools/autoflow/mod3.ts minor-plan",
107104
"autoflow:release": "deno run --allow-read --allow-write --allow-run --allow-env tools/autoflow/mod3.ts release",
108105
"autoflow:release-dispatch": "deno run --allow-read --allow-write --allow-run --allow-env tools/autoflow/mod3.ts release-dispatch",
109106
"autoflow:release-prepare": "deno run --allow-read --allow-write --allow-run --allow-env tools/autoflow/mod3.ts release-prepare",
@@ -122,7 +119,6 @@
122119
"exclude": [
123120
"www/content/blog/",
124121
"www/app/data/",
125-
"www/design/mockups/",
126122
"www/public/assets/",
127123
"custom-dist/",
128124
"dist-test-ssg-render/",
@@ -157,7 +153,6 @@
157153
"**/dist/**",
158154
"**/node_modules/**",
159155
".deno",
160-
".deno_cache",
161156
"custom-dist",
162157
"dist-test-ssg-render",
163158
"vendor",
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# ADR-0118: Third Audit Round and Alpha.19 Cleanup Sweep
2+
3+
- Status: ACCEPTED
4+
- Date: 2026-07-25
5+
6+
## Context
7+
8+
A third full-repository audit on 2026-07-25 (after alpha.18 shipped) reviewed
9+
architecture, redundancy and cleanliness across all five packages, the tooling
10+
layer, the docs site and the governance documents. It produced 26 issues
11+
(#481#506), all accepted into milestone `v0.41.0-alpha.19`: three
12+
high-severity, twenty medium/low-severity findings grouped around correctness
13+
residuals, surface drift, gate blind spots and hygiene.
14+
15+
The audit's meta-finding is an evolution of the alpha.17/18 sibling-path
16+
pattern: several alpha.18 fixes are correct on every path they touched but
17+
break on **combinations** of inputs — for example the reflect short-circuit
18+
misbehaves only when `removeAttribute` meets a default value, and the `For`
19+
drift token breaks only when content collides with the separator. Where the
20+
second round taught us to enumerate sibling paths, the third round teaches
21+
that acceptance for state-dependent fixes must enumerate input combinations,
22+
not just code paths.
23+
24+
## Decision
25+
26+
- Cut `v0.41.0-alpha.19` as a pure cleanup sweep governed by issues
27+
#481#506. It adds no new product surface and no new packages.
28+
- Every state-dependent fix ships with a "input combinations enumerated"
29+
acceptance note, extending the sibling-path doctrine from ADR-0117.
30+
- Gate blind spots found by the audit (www bare version mentions, governance
31+
doc bodies, export-star seams, assertion style) are mechanized so the same
32+
class of drift cannot return silently.
33+
- Confirmed dead code, dead config entries and stale comments are deleted
34+
with zero-consumer evidence recorded in each issue.
35+
36+
## Consequences
37+
38+
Positive: the audit's combination-path meta-finding becomes an enforceable
39+
acceptance rule; governance and surface drift gains mechanical coverage; the
40+
cleanup lowers maintenance surface before the `0.41.0` freeze decision.
41+
42+
Negative: the alpha line lengthens once more; some deletions remain breaking
43+
surface changes requiring release-note migration notes.
44+
45+
Neutral: ADR-0116 and ADR-0117 remain the parent decisions; this ADR records
46+
the third audit round as a continuation of the same doctrine.

docs/current/HYDRATION_CONTRACT.md

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
The v0.41 alpha line exposes one supported component runtime:
44
`@openelement/element`. Hydration internals are not application-authoring
5-
surface: the implementation modules remain importable as internal subpaths
6-
(`@openelement/element/open-element-render` and
7-
`@openelement/element/open-element-hydration`) for build tooling and Deno
8-
type generation, but they carry no compatibility promise and application code
9-
must not import them. Build-time helpers for adapters live behind
10-
`@openelement/element/build-utils`.
5+
surface: the `open-element-render` and `open-element-hydration` implementation
6+
modules are internal-only — their package subpath exports were removed in
7+
alpha.19 and application or tooling code must not import them. Build-time
8+
helpers for adapters live behind `@openelement/element/build-utils`.
119

1210
## Supported imports
1311

@@ -40,3 +38,12 @@ static, hydrate, or CSR implementation packages.
4038
`/@fs/` absolute-path specifier convention. That branch is covered by unit
4139
tests (`module-specifier.test.ts`) but has not been verified on a real
4240
Windows build; the regular root-relative path is exercised on every change.
41+
- `For` list tokens carry no per-item identity: objects without an `id`/`key`
42+
field are replaced in place at the same position rather than matched and
43+
moved. This is an accepted limitation of the current binding. (The token
44+
wire signature itself has switched to a length-prefixed encoding; parsers
45+
must not assume the old fixed-width format.)
46+
- `reflect` attribute mirroring normalizes values at the boundary: `NaN`
47+
becomes `0`, `-0` becomes `0`, objects are mirrored as `String(value)`, a
48+
failed `Number` parse falls back to `0`, and `removeAttribute` restores the
49+
declared default, which is then re-mirrored to the attribute.

docs/current/PACKAGE_SURFACE.md

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ authoring modes = Basic Element standalone + full application
2323
Application authors should normally learn `element`, `app`, `adapter-vite`,
2424
and `create`; `ui` is optional.
2525

26+
## Vocabulary
27+
28+
- **Hydration** — element-level: how and when a component's client JavaScript
29+
is loaded (`load`, `idle`, `visible`, `only`; see `HYDRATION_CONTRACT.md`).
30+
- **Upgrade** — island-level: the moment a server-rendered custom element is
31+
defined and its instance takes over the existing markup.
32+
- **Activation** — framework takeover: marker activation, event binding and
33+
state restoration performed by the runtime after upgrade.
34+
2635
The Element/App root surface exposes one functional element authoring helper:
2736
`defineElement`. The alpha-only `defineLayout` alias was removed in alpha.13;
2837
layouts use `defineElement` with the same definition object.
@@ -39,7 +48,7 @@ promise and are not application-authoring surface.
3948
{
4049
"@openelement/element": {
4150
"supported": [".", "jsx-runtime", "jsx-dev-runtime", "build-utils"],
42-
"internal": ["open-element-render", "open-element-hydration"]
51+
"internal": []
4352
},
4453
"@openelement/app": {
4554
"supported": [".", "hono", "model", "spa", "preact"],
@@ -66,10 +75,18 @@ promise and are not application-authoring surface.
6675
`createRuntimeAdapter` and the runtime handler types) for build adapters.
6776
They were removed from the element root export; application code must not
6877
import them.
69-
- `@openelement/element/open-element-render` and
70-
`@openelement/element/open-element-hydration` are hydration implementation
71-
modules (see `HYDRATION_CONTRACT.md`), kept importable for build tooling
72-
and Deno type generation.
78+
- The `open-element-render` and `open-element-hydration` modules are
79+
internal-only hydration implementation modules (see
80+
`HYDRATION_CONTRACT.md`); their subpath exports were removed in alpha.19.
81+
The module files remain inside the package for internal relative imports
82+
only.
83+
- The branded types `SafeHtml` and `UnsafeHtml` and the internal
84+
`StyleSheetRule` type are no longer exported from the element root
85+
(alpha.18 release notes already claimed their removal; alpha.19 makes it
86+
true). Their declarations stay in the internal protocol files.
87+
- The element root no longer carries `export type *` seams (alpha.19); the
88+
public type surface is an explicit export list in
89+
`packages/element/src/index.ts`.
7390
- `@openelement/app/i18n` is the optional locale-expansion integration point.
7491
- App's router implementation (`internal/router`) is not exported; the router
7592
types (`RouteConfig`, `RouterInstance`, `RouterMode`) were removed from the

0 commit comments

Comments
 (0)