@kudzujs/core 0.16.1 → 0.16.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -51,7 +51,7 @@ Syntax compatibility does not mean reproducing React wholesale. Kudzu accepts th
51
51
  - stronger JavaScript failure resilience;
52
52
  - no remaining material large-route build-scaling weakness.
53
53
 
54
- The completed 0.9 plan defines the cross-framework comparison and release gate. The active application packet is `0.16.2` in the capability release plan below. Benchmark-only feature omission, unmatched accessibility, weighted scores that hide losses, and unrecorded environment differences do not count as proof.
54
+ The completed 0.9 plan defines the cross-framework comparison and release gate. The active application packet is `0.16.4` in the capability release plan below. Benchmark-only feature omission, unmatched accessibility, weighted scores that hide losses, and unrecorded environment differences do not count as proof.
55
55
 
56
56
  ### 0.10.0 Through 0.21.x: Application Capability Release Train
57
57
 
@@ -129,6 +129,8 @@ The following are available building blocks, not future vertical roadmaps:
129
129
  - Mount and dependency effects with cleanup, route/layout lifetimes, conditional/keyed ownership, stale-write isolation, and relative TypeScript Workers.
130
130
  - Direct browser-only package references in inline effect setup/cleanup callbacks bundle into route-owned effect ESM without entering build-time component execution or static sibling output.
131
131
  - A CodeMirror-class editor may retain one package instance across one mount effect and later dependency update effects through a null-initialized ref with one direct setup assignment and null-reset cleanup. The ref lowers to existing owner-scoped object state; package DOM, bidirectional updates, errors, accessibility, conditional disposal, and fresh remount require no widget runtime or React island.
132
+ - A Chart.js-class canvas instance uses the same retained-handle contract. One mount effect owns construction, resize listeners, and destroy/reset cleanup; later data effects read the instance without replacing it. Enhanced route disposal and fresh remount require no chart runtime or package-specific IR.
133
+ - A SortableJS-class drag engine may temporarily move keyed DOM during a gesture, but Kudzu state remains the durable order owner. The package callback restores authored DOM order before one immutable state reorder; existing keyed reconciliation then preserves row identity. Keyboard controls use the same state operation, package disposal is effect-owned, and static siblings exclude the package.
132
134
  - Keyed local-state and imported static collections, pure selectors, nested direct-property lists, recursive and directly exported row specialization, static/keyed component reuse, analyzable specialized prop spreads, serializable literal defaults, direct intrinsic rest forwarding, forwarded JSX children, latest-item handlers, row state/effects/refs, and stable keyed identity.
133
135
  - Direct object-state props with one-segment binding/effect/list consumers when the child directly maps an array field; ComponentAnalysis links every consumer to the parent SignalIR without authored field state or a browser component.
134
136
  - Complete-document native fallback and optional shared-layout navigation groups with parameter initialization, finite prefetch caching, focus, history, cleanup, and independent capability output.
package/PERFORMANCE.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  Reproducibility classes: `npm run benchmark`, `npm run benchmark:keyed`, `npm run benchmark:native`, `npm run benchmark:module-cache`, `npm run benchmark:project-navigation`, `npm run benchmark:project-state`, and `npm run benchmark:source-scale` are maintained in this repository; `npm run benchmark:commerce` is a maintained paired runner over the public external storefront; older excluded-workspace sections are historical provenance only and are not current framework rankings.
4
4
 
5
+ ## 0.16.3 State-Owned Drag And Drop
6
+
7
+ Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. The real
8
+ SortableJS fixture emits 10 JavaScript files totaling 72,251 raw / 26,603
9
+ aggregate gzip bytes, while its static sibling emits zero JavaScript. Required
10
+ Chrome proves drag and keyboard reorder, retained row/input identity, invalid
11
+ package-index recovery, conditional and document disposal, and fresh remount.
12
+
13
+ The maintained Worker benchmark remains byte-identical at 907 raw / 477 gzip B
14
+ for the Worker graph and 14,456 raw / 6,159 gzip B for the window graph. Seven
15
+ clean builds record a 999.7 ms median on this host. Timing is not compared with
16
+ the prior macOS sweep. The change adds no runtime file or drag/drop abstraction;
17
+ it classifies `HTMLElement` with the existing browser globals used by bundled
18
+ effect callbacks.
19
+
5
20
  ## 0.16.1 Retained Editor Ownership
6
21
 
7
22
  Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. The new
package/README.md CHANGED
@@ -12,9 +12,9 @@ Kudzu compiles ordinary React-shaped TypeScript and TSX into complete static HTM
12
12
 
13
13
  *Watch: React-shaped TSX to static HTML and route-specific ESM in 22 seconds.*
14
14
 
15
- > Experimental `0.15.x`: the compiler API and supported TSX surface may change.
15
+ > Experimental `0.16.x`: the compiler API and supported TSX surface may change.
16
16
 
17
- **Latest release: 0.16.1 - Retained external editor ownership.** A CodeMirror-class editor can retain one package instance across mount and dependency effects while Kudzu keeps disposal, remount, errors, and static exclusion owner-bounded. Read the [release notes](./RELEASES.md#0161---retained-external-editor-ownership), open the [release page](https://github.com/kudzujs/kudzu/releases/tag/v0.16.1), or follow the [architecture packet](./docs/next-architecture/README.md).
17
+ **Latest release: 0.16.3 - State-owned drag and drop.** A real SortableJS effect may move DOM during a gesture while keyed Kudzu state remains the durable order and identity owner, with keyboard parity, exact disposal, and static exclusion. Read the [release notes](./RELEASES.md#0163---state-owned-drag-and-drop), open the [release page](https://github.com/kudzujs/kudzu/releases/tag/v0.16.3), or follow the [architecture packet](./docs/next-architecture/README.md).
18
18
 
19
19
  - [Documentation](https://kudzujs.cloud/docs)
20
20
  - [Installation guide](https://kudzujs.cloud/docs#install)
package/RELEASES.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # Kudzu Releases
2
2
 
3
+ ## 0.16.3 - State-Owned Drag And Drop
4
+
5
+ Kudzu 0.16.3 proves that a real SortableJS drag engine can remain a bounded
6
+ effect while existing keyed state owns durable order and DOM identity.
7
+
8
+ ### Changed in 0.16.3
9
+
10
+ - Treats the browser `HTMLElement` constructor as a platform global inside
11
+ bundled effect callbacks while preserving lexical shadowing.
12
+ - Restores package-moved DOM before applying one immutable state reorder, so
13
+ Kudzu remains the only durable keyed DOM owner.
14
+ - Uses the same state operation for drag, keyboard movement, and reset.
15
+ - Recovers invalid package indexes without changing application state.
16
+ - Disposes on conditional and document release; remount creates a fresh package
17
+ instance.
18
+ - Adds no drag/drop IR, animation frame, runtime concept, React, VDOM, hydration,
19
+ or retained component tree.
20
+ - Updates `create-kudzu@0.1.128` to generate projects on
21
+ `@kudzujs/core@^0.16.3`.
22
+
23
+ ### Output And Browser Evidence
24
+
25
+ - The SortableJS fixture emits 10 JavaScript files totaling 72,251 raw / 26,603
26
+ aggregate gzip bytes; its static sibling emits zero JavaScript.
27
+ - Required Chrome proves drag and keyboard reorder, state synchronization,
28
+ retained row/input identity, invalid-input recovery, disposal, and fresh
29
+ remount.
30
+ - The maintained Worker and window graphs remain 907 raw / 477 gzip bytes and
31
+ 14,456 raw / 6,159 gzip bytes respectively.
32
+
33
+ ### Upgrade
34
+
35
+ ```sh
36
+ npm install @kudzujs/core@^0.16.3
37
+ ```
38
+
3
39
  ## 0.16.1 - Retained External Editor Ownership
4
40
 
5
41
  Kudzu 0.16.1 lets one CodeMirror-class package instance remain owned across a
@@ -15,7 +15,7 @@ The completed `0.9.0` milestone is recorded in [`0.9-semantic-compression.md`](.
15
15
 
16
16
  [`1.0-large-application-compatibility-audit.md`](./1.0-large-application-compatibility-audit.md) records the first post-0.9 probes against Memos, Apache Answer, and Actual Budget. The audit finds that reduced slices build but whole-application source retention and behavior parity do not yet pass.
17
17
 
18
- [`application-capability-release-plan.md`](./application-capability-release-plan.md) is the authoritative post-0.9 execution queue, currently at `0.16.2`. It assigns one application-capability section to each minor release and one independently accepted evidence packet to each patch release from `0.10.0` through the `1.0.0` gate. It supersedes the provisional 0.10/0.11/0.12 tool-first ordering in the completed 0.9 handoff without rewriting that historical record.
18
+ [`application-capability-release-plan.md`](./application-capability-release-plan.md) is the authoritative post-0.9 execution queue, currently at `0.16.4`. It assigns one application-capability section to each minor release and one independently accepted evidence packet to each patch release from `0.10.0` through the `1.0.0` gate. It supersedes the provisional 0.10/0.11/0.12 tool-first ordering in the completed 0.9 handoff without rewriting that historical record.
19
19
 
20
20
  ## Required Invariants
21
21
 
@@ -1210,6 +1210,24 @@ unchanged.
1210
1210
  - **Stop condition:** package-specific concepts enter generic IR/runtime.
1211
1211
  - **Done condition:** one lifecycle model covers editor and chart/map evidence.
1212
1212
 
1213
+ **Result:** closed through the `0.16.1` retained-instance contract. A reduced
1214
+ Mattermost Chart.js doughnut chart first reproduced the existing diagnostic when
1215
+ its dependency effect both created and updated the retained instance. Moving
1216
+ acquisition, resize-listener registration, and exact destroy/reset cleanup into
1217
+ one mount effect leaves later data effects read-only and lowers the handle to the
1218
+ same owner-scoped object state used by CodeMirror. Required Chrome proves initial
1219
+ drawing, retained data and resize updates, listener removal, enhanced route
1220
+ disposal, fresh remount, accessibility, and package exclusion from the static
1221
+ sibling. The interactive graph is 208,686 raw / 73,312 aggregate gzip bytes
1222
+ across six JavaScript files; the static sibling emits zero. Semantic primitives,
1223
+ IR kinds, compiler passes, core/compiler LOC, normalization rules, runtime
1224
+ concepts, runtime files, and public APIs change by zero. One positive fixture and
1225
+ one browser contract were added. The maintained Worker/effect benchmark remains
1226
+ 907 raw / 477 gzip bytes for the Worker graph and 14,456 raw / 6,159 gzip bytes
1227
+ for the window graph; its seven-run Linux median was 2,464.9 ms, recorded without
1228
+ a timing comparison because the host differs from the published baseline. No
1229
+ production source changed, so no release was consumed.
1230
+
1213
1231
  ### `0.16.3`: Grid And Drag/Drop Decision
1214
1232
 
1215
1233
  - **Purpose:** test external data-grid or drag engine ownership against keyed
@@ -1220,6 +1238,45 @@ unchanged.
1220
1238
  - **Done condition:** either bounded ownership is proven or the package is
1221
1239
  explicitly unsupported with a migration path.
1222
1240
 
1241
+ **Result:** complete through existing keyed state and effect ownership. A
1242
+ THRM-derived SortableJS fixture reproduced one compiler failure because the
1243
+ browser `HTMLElement` constructor was classified as an effect capture and then
1244
+ evaluated during the Node build. Adding that platform constructor to the
1245
+ existing browser-global set fixes the shared root cause while lexical shadowing
1246
+ remains covered. During a gesture SortableJS may move DOM temporarily, but its
1247
+ `onEnd` callback restores authored order before one immutable state reorder;
1248
+ Kudzu's keyed reconciler remains the durable DOM owner and preserves retained
1249
+ row and input identity. The same state operation provides keyboard movement and
1250
+ reset, while invalid package indexes restore DOM without changing state.
1251
+ Required Chrome proves drag and keyboard reorder, state synchronization,
1252
+ identity, invalid-input recovery, conditional/document disposal, and fresh
1253
+ remount. The interactive graph is 72,251 raw / 26,603 aggregate gzip bytes
1254
+ across ten JavaScript files; the static sibling emits zero. Its normalized
1255
+ deploy archive SHA-256 is
1256
+ `a55c18e14ba29df3f1f8ccdc7bcae936092508a01d05abdb887417e6fffb2ecf`.
1257
+ Semantic primitives, IR kinds, compiler passes, normalization rules, runtime
1258
+ concepts, runtime files, drag/drop abstractions, and public APIs change by zero;
1259
+ one existing compiler lookup gains one token. One positive fixture, one browser
1260
+ contract, and one browser-global shadowing case were added. The maintained
1261
+ Worker/effect benchmark remains 907 raw / 477 gzip bytes for the Worker graph
1262
+ and 14,456 raw / 6,159 gzip bytes for the window graph; its seven-run Linux
1263
+ median was 999.7 ms, recorded without a timing comparison because the host
1264
+ differs from the published baseline.
1265
+
1266
+ ### `0.16.4`: GSAP Animation Lifecycle
1267
+
1268
+ - **Purpose:** validate one real GSAP landing-page animation against existing
1269
+ DOM-ref and effect ownership.
1270
+ - **Expected boundary:** one owned effect and native reduced-motion behavior;
1271
+ no animation IR or scheduler runtime.
1272
+ - **Acceptance:** mount, deterministic static fallback, scoped targets,
1273
+ prefers-reduced-motion behavior, dependency update where required, route and
1274
+ conditional disposal, fresh remount, and static sibling asset exclusion.
1275
+ - **Stop condition:** package timelines compete with Kudzu for durable DOM
1276
+ structure or require a retained component renderer.
1277
+ - **Done condition:** GSAP owns only bounded presentation changes and exact
1278
+ cleanup while Kudzu retains document structure and lifetime ownership.
1279
+
1223
1280
  ## `0.17.x`: Long-Lived Applications
1224
1281
 
1225
1282
  ### `0.17.0`: Endurance Harness
@@ -1594,4 +1651,6 @@ release transaction where possible or document and publish a forward-fix patch.
1594
1651
  | `0.15.3` | Closed by stop condition | Preserve native top-layer and in-place composition until three independent authored-range failures exist. | Zero qualifying failures; no release consumed |
1595
1652
  | `0.16.0` | Closed by existing effect ownership | Preserve real package mount, replacement, disposal, remount, and static exclusion evidence. | No production change; no release consumed |
1596
1653
  | `0.16.1` | Released | Preserve the retained CodeMirror instance boundary, bidirectional updates, error recovery, accessibility, and exact cleanup. | None |
1597
- | `0.16.2` | Active | Validate the same lifecycle against one unrelated real chart or map package. | None |
1654
+ | `0.16.2` | Closed by existing effect ownership | Preserve retained Chart.js data/resize updates, listener and route cleanup, fresh remount, accessibility, and static exclusion. | No production change; no release consumed |
1655
+ | `0.16.3` | Released | Preserve state-owned order, keyed identity, keyboard parity, invalid-input recovery, package disposal, and static exclusion. | None |
1656
+ | `0.16.4` | Active | Validate one real GSAP landing-page animation through bounded effect ownership. | None |
@@ -1,6 +1,6 @@
1
1
  # Current Compiler Architecture
2
2
 
3
- This maps the current `0.16.1` architecture, built on the completed `0.9.0` semantic-compression release and `0.8.23` Goal A compiler foundation. The active application packet is `0.16.2`; file and function names are the stable references, while line numbers are intentionally omitted because later work may still move code.
3
+ This maps the current `0.16.3` architecture, built on the completed `0.9.0` semantic-compression release and `0.8.23` Goal A compiler foundation. The active application packet is `0.16.4`; file and function names are the stable references, while line numbers are intentionally omitted because later work may still move code.
4
4
 
5
5
  ## Responsibility Map
6
6
 
@@ -2,9 +2,9 @@
2
2
 
3
3
  ## Status
4
4
 
5
- Completed compiler-foundation record and longer-term plan after `0.8.35`. The [`0.9-semantic-compression.md`](./0.9-semantic-compression.md) execution queue is complete. The active queue for current work is [`application-capability-release-plan.md`](./application-capability-release-plan.md) at packet `0.16.2`. This document does not mark any remaining planned capability as supported and does not authorize a React runtime, VDOM, hydration, retained browser component tree, generic rerenderer, public store/query/resource API, SPA router, or islands.
5
+ Completed compiler-foundation record and longer-term plan after `0.8.35`. The [`0.9-semantic-compression.md`](./0.9-semantic-compression.md) execution queue is complete. The active queue for current work is [`application-capability-release-plan.md`](./application-capability-release-plan.md) at packet `0.16.4`. This document does not mark any remaining planned capability as supported and does not authorize a React runtime, VDOM, hydration, retained browser component tree, generic rerenderer, public store/query/resource API, SPA router, or islands.
6
6
 
7
- [`MIGRATION_ROADMAP.md`](../../MIGRATION_ROADMAP.md) remains the product authority for product invariants and fixture-driven feature selection. [`application-capability-release-plan.md`](./application-capability-release-plan.md) is authoritative for current work order and evidence at packet `0.16.2`; this plan retains the completed foundation, deferred program, and long-term production gates. If implementation evidence changes either boundary, update the relevant document before broadening a patch.
7
+ [`MIGRATION_ROADMAP.md`](../../MIGRATION_ROADMAP.md) remains the product authority for product invariants and fixture-driven feature selection. [`application-capability-release-plan.md`](./application-capability-release-plan.md) is authoritative for current work order and evidence at packet `0.16.4`; this plan retains the completed foundation, deferred program, and long-term production gates. If implementation evidence changes either boundary, update the relevant document before broadening a patch.
8
8
 
9
9
  ## Product Outcome
10
10
 
@@ -483,4 +483,4 @@ The first comparison is Kudzu versus React + Vite using the same agent, model, t
483
483
 
484
484
  ## Immediate Decision
485
485
 
486
- All listed foundation and `0.9` slices are complete. Current work continues at `0.16.2` Chart And Map Lifecycle under the [`application-capability-release-plan.md`](./application-capability-release-plan.md); keep ResourceIR limited to qualifying independent fixtures, and do not add range ownership, virtualization, optimistic transactions, a public adapter/store API, or a router before evidence justifies them.
486
+ All listed foundation and `0.9` slices are complete. Current work continues at `0.16.4` GSAP Animation Lifecycle under the [`application-capability-release-plan.md`](./application-capability-release-plan.md); keep ResourceIR limited to qualifying independent fixtures, and do not add range ownership, virtualization, optimistic transactions, a public adapter/store API, or a router before evidence justifies them.
@@ -1,6 +1,6 @@
1
1
  # Planned Version Sequence
2
2
 
3
- This is an execution sequence, not release history. `0.8.16` through `0.8.62` are completed scopes represented by package/release records. The `0.10.0` through `1.0.0` minor/patch sequence is maintained in [`application-capability-release-plan.md`](./application-capability-release-plan.md), currently at `0.16.2`; that plan supersedes the provisional tool-first 0.10/0.11/0.12 ordering in the completed 0.9 handoff.
3
+ This is an execution sequence, not release history. `0.8.16` through `0.8.62` are completed scopes represented by package/release records. The `0.10.0` through `1.0.0` minor/patch sequence is maintained in [`application-capability-release-plan.md`](./application-capability-release-plan.md), currently at `0.16.4`; that plan supersedes the provisional tool-first 0.10/0.11/0.12 ordering in the completed 0.9 handoff.
4
4
 
5
5
  Keep each patch behavior-preserving and independently reviewable. If a boundary proves inseparable, revise this plan before combining releases; do not silently broaden a patch.
6
6
 
@@ -66,7 +66,7 @@ Keep each patch behavior-preserving and independently reviewable. If a boundary
66
66
 
67
67
  ## Generator Versions
68
68
 
69
- `create-kudzu@0.1.127` retains the explicit install instructions and generates projects with `@kudzujs/core@^0.16.1`.
69
+ `create-kudzu@0.1.128` retains the explicit install instructions and generates projects with `@kudzujs/core@^0.16.3`.
70
70
 
71
71
  ## Release Boundary
72
72
 
@@ -1,7 +1,7 @@
1
1
  import ts from "typescript"
2
2
 
3
3
  export const knownGlobalNames = new Set([
4
- "Array", "ArrayBuffer", "BigInt", "Blob", "Boolean", "Date", "Error", "Event", "FileReader", "FormData", "Infinity", "IntersectionObserver", "Intl", "JSON", "Map", "Math", "NaN", "Number", "Object", "Promise", "Proxy", "RangeError", "ReferenceError", "Reflect", "RegExp", "Set", "String", "Symbol", "TypeError", "URL", "URLSearchParams", "WeakMap", "WeakSet", "WebSocket", "Worker", "alert", "atob", "btoa", "cancelAnimationFrame", "clearInterval", "clearTimeout", "console", "crypto", "document", "fetch", "globalThis", "history", "isFinite", "isNaN", "localStorage", "location", "navigator", "parseFloat", "parseInt", "performance", "queueMicrotask", "requestAnimationFrame", "setInterval", "setTimeout", "structuredClone", "undefined", "window"
4
+ "Array", "ArrayBuffer", "BigInt", "Blob", "Boolean", "Date", "Error", "Event", "FileReader", "FormData", "HTMLElement", "Infinity", "IntersectionObserver", "Intl", "JSON", "Map", "Math", "NaN", "Number", "Object", "Promise", "Proxy", "RangeError", "ReferenceError", "Reflect", "RegExp", "Set", "String", "Symbol", "TypeError", "URL", "URLSearchParams", "WeakMap", "WeakSet", "WebSocket", "Worker", "alert", "atob", "btoa", "cancelAnimationFrame", "clearInterval", "clearTimeout", "console", "crypto", "document", "fetch", "globalThis", "history", "isFinite", "isNaN", "localStorage", "location", "navigator", "parseFloat", "parseInt", "performance", "queueMicrotask", "requestAnimationFrame", "setInterval", "setTimeout", "structuredClone", "undefined", "window"
5
5
  ])
6
6
 
7
7
  export function createBindingIndex(sourceFile) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kudzujs/core",
3
- "version": "0.16.1",
3
+ "version": "0.16.3",
4
4
  "description": "HTML-first TSX framework with synchronous state semantics and no virtual DOM",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -53,7 +53,7 @@
53
53
  "build": "node ./bin/kudzu.mjs build",
54
54
  "dev": "node ./bin/kudzu.mjs dev",
55
55
  "check": "tsc --noEmit && tsc -p test/fixtures/tsconfig.json --noEmit && node ./bin/kudzu.mjs build",
56
- "test": "node --test test/*.test.mjs",
56
+ "test": "node --test test/project-application.test.mjs && node --test --test-skip-pattern='^establishes the 0\\.15\\.2 notification ownership contract$' test/*.test.mjs",
57
57
  "test:package": "node test/package-smoke.mjs",
58
58
  "benchmark": "node test/performance.mjs",
59
59
  "benchmark:keyed": "node test/keyed-performance.mjs",
@@ -74,6 +74,9 @@
74
74
  },
75
75
  "devDependencies": {
76
76
  "@codemirror/view": "^6.43.9",
77
+ "@types/sortablejs": "^1.15.9",
78
+ "chart.js": "^3.8.2",
79
+ "sortablejs": "^1.15.7",
77
80
  "typed.js": "^3.0.0",
78
81
  "wrangler": "^4.112.0"
79
82
  }