@kudzujs/core 0.16.24 → 0.16.26

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.
Files changed (29) hide show
  1. package/README.md +47 -5
  2. package/framework/compiler/effect-private-ref-pass.mjs +2 -0
  3. package/framework/compiler/source-compiler.mjs +6 -1
  4. package/package.json +2 -7
  5. package/GOAL_A.md +0 -116
  6. package/GOAL_B.md +0 -121
  7. package/MIGRATION_ROADMAP.md +0 -457
  8. package/PERFORMANCE.md +0 -2200
  9. package/RELEASES.md +0 -4653
  10. package/docs/next-architecture/0.9-baseline.md +0 -1199
  11. package/docs/next-architecture/0.9-benchmark-contracts.md +0 -507
  12. package/docs/next-architecture/0.9-component-property-contract.md +0 -89
  13. package/docs/next-architecture/0.9-compression-ledger.md +0 -227
  14. package/docs/next-architecture/0.9-final-proof-audit.md +0 -176
  15. package/docs/next-architecture/0.9-implementation-plan.md +0 -1819
  16. package/docs/next-architecture/0.9-resource-lifecycle.md +0 -118
  17. package/docs/next-architecture/0.9-semantic-compression.md +0 -384
  18. package/docs/next-architecture/1.0-large-application-compatibility-audit.md +0 -372
  19. package/docs/next-architecture/README.md +0 -56
  20. package/docs/next-architecture/application-capability-release-plan.md +0 -2358
  21. package/docs/next-architecture/compiler-current-architecture.md +0 -95
  22. package/docs/next-architecture/goal-a-compiler-foundation.md +0 -151
  23. package/docs/next-architecture/goal-b-optimization-benchmarks.md +0 -86
  24. package/docs/next-architecture/goal-c-state-resource-research.md +0 -88
  25. package/docs/next-architecture/goal-d-routing-compatibility-decisions.md +0 -52
  26. package/docs/next-architecture/large-application-ai-native-roadmap.md +0 -486
  27. package/docs/next-architecture/performance-gates.md +0 -50
  28. package/docs/next-architecture/versioning.md +0 -91
  29. package/framework/README.md +0 -105
package/RELEASES.md DELETED
@@ -1,4653 +0,0 @@
1
- # Kudzu Releases
2
-
3
- ## 0.16.24 - Imported Article Search And Benchmark Integrity
4
-
5
- Kudzu 0.16.24 compiles the original authored imported-article search shape
6
- without an inlined workaround and hardens evidence lifecycle integrity for
7
- future AI delivery runs. This is source replay evidence, not a new AI score.
8
-
9
- ### Changed in 0.16.24
10
-
11
- - Follows imported collection selector aliases, normalizes proven pure query
12
- locals, and evaluates count dependencies from signal build values.
13
- - Adds 39 net core semantic lines across two existing compiler files, with no
14
- new semantic primitive, pass, IR kind, runtime concept, API, or dependency.
15
- - Covers three byte-identical search variants, six rejected unsafe forms,
16
- retained keyed identity, fresh remounts, and a zero-JavaScript static sibling.
17
- - Replays the original authored application search successfully through the
18
- unchanged content acceptance: 13 JavaScript files, 55,447 raw / 20,976 gzip
19
- bytes, identical to the retained inlined application's JavaScript.
20
- - Checkpoints adapter usage atomically, streams bounded output evidence, shares
21
- the deadline with setup, kills owned process trees on timeout, and prevents
22
- incomplete or timed-out attempts from becoming successful attribution.
23
- - Freezes r4 protocols with published 0.16.23 starters for future runs only.
24
- Historical raw evidence is unchanged. Linux lifecycle regressions cover the
25
- termination paths; the Windows `taskkill` path remains untested.
26
- - Makes no fresh timing, cost, or AI performance claim. The published 11/25
27
- versus 24/25 comparison and the `1.0.0` block remain unchanged.
28
- - Updates `create-kudzu@0.1.149` to generate `@kudzujs/core@^0.16.24` projects.
29
-
30
- ### Upgrade
31
-
32
- ```sh
33
- npm install @kudzujs/core@^0.16.24
34
- ```
35
-
36
- ## 0.16.23 - Reactive Conditional Branch Text
37
-
38
- Kudzu 0.16.23 removes the second commerce compiler blocker selected by the
39
- corrected `0.21.4` AI delivery evidence: scalar text inside a selected
40
- conditional branch remains reactive without restructuring ordinary TSX.
41
-
42
- ### Changed in 0.16.23
43
-
44
- - Lowers reactive scalar conditional branches through the existing text-binding
45
- compiler path while preserving conditional ownership and static HTML.
46
- - Verifies updates that remain in one branch and later replace that branch in
47
- required Chrome.
48
- - Passes all five retained commerce sources with `empty`, `below`, and `reached`
49
- true while preserving their zero-JavaScript static siblings.
50
- - Adds no semantic primitive, compiler pass, runtime concept, public API,
51
- dependency, or shared-runtime source byte; `1.0.0` remains unauthorized pending
52
- a complete equal-condition rerun.
53
- - Updates `create-kudzu@0.1.148` to generate projects on
54
- `@kudzujs/core@^0.16.23`.
55
-
56
- ### Upgrade
57
-
58
- ```sh
59
- npm install @kudzujs/core@^0.16.23
60
- ```
61
-
62
- ## 0.16.22 - Reactive Collection Count Reuse
63
-
64
- Kudzu 0.16.22 removes the first compiler blocker selected by the corrected
65
- `0.21.4` AI delivery evidence: an ordinary filtered collection alias can now
66
- feed keyed rendering, a top-level count, reactive text, and a count-selected
67
- conditional branch without duplicating state or restructuring the component.
68
-
69
- ### Changed in 0.16.22
70
-
71
- - Normalizes supported collection alias `.length` reads through existing
72
- collection analysis and reactive binding compilation.
73
- - Expands count aliases before conditional compilation while preserving initial
74
- server-rendered values and keyed DOM ownership across filter changes.
75
- - Verifies reactive count updates, empty-branch unmount, keyed remount, and the
76
- retained diagnostic for unsupported collection alias consumers in Chrome.
77
- - Adds no semantic primitive, compiler pass, runtime concept, public API,
78
- dependency, or shared-runtime byte; `1.0.0` remains unauthorized.
79
- - Updates `create-kudzu@0.1.147` to generate projects on
80
- `@kudzujs/core@^0.16.22`.
81
-
82
- ### Upgrade
83
-
84
- ```sh
85
- npm install @kudzujs/core@^0.16.22
86
- ```
87
-
88
- ## 0.16.21 - AI Evidence npm Recovery
89
-
90
- Kudzu 0.16.21 retries npm publication of the unchanged corrected `0.21.4` AI
91
- delivery evidence after npm rejected the `0.16.20` trusted-publishing signing
92
- certificate with HTTP 403.
93
-
94
- ### Changed in 0.16.21
95
-
96
- - Preserves the corrected protocols, 11/25 Kudzu versus 24/25 React + Vite
97
- result, failed `1.0.0` gate, and `v0.16.19` raw evidence archive unchanged.
98
- - Preserves the public `v0.16.20` tag and records its failed npm transaction
99
- rather than moving or reusing it.
100
- - Adds no compiler, runtime, public API, dependency, generated behavior, or
101
- browser byte.
102
- - Updates `create-kudzu@0.1.146` to generate projects on
103
- `@kudzujs/core@^0.16.21`.
104
-
105
- ### Upgrade
106
-
107
- ```sh
108
- npm install @kudzujs/core@^0.16.21
109
- ```
110
-
111
- ## 0.16.20 - AI Evidence Forward Release
112
-
113
- Kudzu 0.16.20 forward-publishes the unchanged `0.16.19` AI delivery evidence
114
- packet after that GitHub release's npm workflow stopped on an unrelated flaky
115
- project browser journey before either package was published.
116
-
117
- ### Changed in 0.16.20
118
-
119
- - Preserves the corrected `0.21.4` protocols, 11/25 Kudzu versus 24/25 React +
120
- Vite result, failed `1.0.0` gate, and raw evidence archive byte-for-byte.
121
- - Moves no tag and republishes no npm version; `0.16.19` remains the immutable
122
- GitHub evidence release.
123
- - Adds no compiler, runtime, public API, dependency, generated behavior, or
124
- browser byte.
125
- - Updates `create-kudzu@0.1.145` to generate projects on
126
- `@kudzujs/core@^0.16.20`.
127
- - Its npm workflow passed every repository gate, then npm rejected the core
128
- trusted-publishing signing certificate with HTTP 403 before either package
129
- was published. The immutable recovery release is `0.16.21` with generator
130
- `0.1.146`.
131
-
132
- ### Upgrade
133
-
134
- ```sh
135
- npm install @kudzujs/core@^0.16.20
136
- ```
137
-
138
- ## 0.16.19 - Corrected AI Delivery Evidence
139
-
140
- Kudzu 0.16.19 publishes the corrected five-task `0.21.4` AI delivery proof and
141
- records that the `1.0.0` gate did not pass.
142
-
143
- ### Changed in 0.16.19
144
-
145
- - Adds five paired production-shaped Kudzu and React + Vite starters, frozen
146
- prompts, independently hashed acceptance contracts, an OpenCode adapter, and
147
- browser acceptance for content, forms, CRUD/shared state, commerce-derived
148
- state, and realtime resource ownership.
149
- - Excludes the first diagnostic batch after finding hidden content/form selector
150
- assumptions and inconsistent React versions; retains that batch in the raw
151
- archive instead of presenting it as framework evidence.
152
- - Records the corrected result: Kudzu 11/25 attributable successes (44%) and
153
- React + Vite 24/25 (96%), with one React realtime adapter timeout correctly
154
- retained as incomplete.
155
- - Records that Kudzu has no successful task-level result for content or commerce,
156
- so its aggregate median token cost per successful task is unavailable and the
157
- `1.0.0` success-and-cost gate is not authorized.
158
- - Keeps React's aggregate failure-inclusive cost unavailable because its timed-out
159
- realtime attempt has no attribution trace.
160
- - Names the measured blockers: excessive correction cost for ordinary reactive
161
- content search, filtered-collection count reuse in CRUD, and reactive text
162
- frozen inside the selected commerce conditional branch.
163
- - Publishes both batches as the release asset
164
- `kudzu-ai-delivery-0.21.4-gpt-5.6-sol.tar.gz` with SHA-256
165
- `4e37d15b4c4b0cf88720a3a7743996794b2e0172dbc43d40514f944fb01bd0f8`.
166
- - Adds no semantic primitive, compiler pass, runtime concept, public API,
167
- dependency, generated application behavior, or browser byte.
168
- - Updates `create-kudzu@0.1.144` to generate projects on
169
- `@kudzujs/core@^0.16.19`.
170
- - The GitHub release and raw asset were published, but its npm workflow stopped
171
- before publication on an unrelated project browser-test failure. The immutable
172
- forward chain starts at `0.16.20` with generator `0.1.145`; npm recovery is
173
- `0.16.21` with generator `0.1.146`.
174
-
175
- ### Upgrade
176
-
177
- ```sh
178
- npm install @kudzujs/core@^0.16.19
179
- ```
180
-
181
- ## 0.16.18 - AI Attribution Integrity
182
-
183
- Kudzu 0.16.18 makes the AI delivery evidence boundary fail closed before the
184
- production-shaped `0.21.4` comparison.
185
-
186
- ### Changed in 0.16.18
187
-
188
- - Requires a recorded raw attribution trace before an AI delivery attempt can
189
- count as a success, even when its adapter, build, and acceptance all pass.
190
- - Retains missing-trace attempts as incomplete failures and reports zero
191
- successes instead of synthetic zero-token, zero-cost successes.
192
- - Keeps per-success token and monetary claims unavailable when no attributable
193
- success exists.
194
- - Adds a focused exit-zero/no-trace regression while preserving the existing
195
- paired success/failure and tooling-comparison checks.
196
- - Records the production corpus boundary: existing complete applications cover
197
- content, forms, CRUD/shared state, and resource ownership, while the pinned
198
- public commerce comparator remains the smallest complete paired source.
199
- - Claims no framework ranking and leaves `0.21.4` active until five attempts per
200
- framework and task pass the complete behavior, accessibility, build, browser,
201
- output, maintainability, and retained-performance contract.
202
- - Adds one harness condition and no semantic primitive, compiler pass, runtime
203
- concept, application API, dependency, or application browser byte.
204
- - Updates `create-kudzu@0.1.143` to generate projects on
205
- `@kudzujs/core@^0.16.18`.
206
-
207
- ### Upgrade
208
-
209
- ```sh
210
- npm install @kudzujs/core@^0.16.18
211
- ```
212
-
213
- ## 0.16.17 - Browser Performance Gates
214
-
215
- Kudzu 0.16.17 turns existing browser performance and memory evidence into
216
- maintained release alarms without changing production compiler or runtime code.
217
-
218
- ### Changed in 0.16.17
219
-
220
- - Enforces 100 ms median budgets for 2,000-row append, filter, restore, and
221
- reverse operations and project table-save and enhanced-navigation actions.
222
- - Enforces 1,000 ms bounded-list and 2,000 ms complete static 10,000-row load
223
- budgets while preserving retained identity and fresh off-range state.
224
- - Records exact initial, session, and lazy JavaScript ownership, including one
225
- shared deferred CodeMirror chunk and zero JavaScript on static siblings.
226
- - Revalidates 30 ownership cycles and 101 navigations with balanced editor
227
- handles, stable document/listener/cache counts, and 79,988 B forced-GC heap
228
- growth under the existing alarm.
229
- - Keeps single-run diagnostic acceptance outside statistical median enforcement.
230
- - Adds no semantic primitive, compiler pass, production source, runtime concept,
231
- public API, deploy artifact, or browser byte.
232
- - Updates `create-kudzu@0.1.142` to generate projects on
233
- `@kudzujs/core@^0.16.17`.
234
-
235
- ### Upgrade
236
-
237
- ```sh
238
- npm install @kudzujs/core@^0.16.17
239
- ```
240
-
241
- ## 0.16.16 - Bounded Compiler Module Cache
242
-
243
- Kudzu 0.16.16 bounds canonical TypeScript AST retention so the complete
244
- 10,000-route production-scale contract runs under a 10 GiB V8 heap.
245
-
246
- ### Changed in 0.16.16
247
-
248
- - Bounds complete canonical module records to a 1,024-entry LRU while preserving
249
- stable position-based module symbols and reparsing evicted source on demand.
250
- - Fixes the measured 10,000-route failure where roughly 90,000 retained
251
- parent-linked TypeScript ASTs exhausted a 10,240 MiB heap.
252
- - Completes the identical 100,000-module / 10,110,000-line topology with 5,461.0
253
- MiB clean-build RSS and 8,266.9 MiB retained-session peak RSS.
254
- - Verifies 10-module / one-page incremental scope, byte-identical changed-clean
255
- output, deterministic digests, and clean and retained-session recovery.
256
- - Adds scale-aware recovery timeout, diagnostic stage progress, and bounded
257
- temporary-fixture cleanup retries to the maintained benchmark harness.
258
- - Adds eight net production compiler lines, no semantic primitive, compiler
259
- pass, runtime concept, application API, dependency, deploy artifact, or
260
- browser byte.
261
- - Updates `create-kudzu@0.1.141` to generate projects on
262
- `@kudzujs/core@^0.16.16`.
263
-
264
- ### Upgrade
265
-
266
- ```sh
267
- npm install @kudzujs/core@^0.16.16
268
- ```
269
-
270
- ## 0.16.15 - Production Evidence Gates
271
-
272
- Kudzu 0.16.15 turns compiler scale, large-list parity, and AI attribution gaps
273
- into maintained executable evidence instead of release-time assumptions.
274
-
275
- ### Changed in 0.16.15
276
-
277
- - Adds opt-in internal source-read, graph, TypeScript parse, normalization,
278
- compile/transform, render, and write timing to the existing project session.
279
- - Extends `npm run benchmark:source-scale` with retained-session incremental
280
- timing and RSS, clean changed-source equivalence, output digests, and clean
281
- and retained-session failure recovery.
282
- - Records repeated 100-route / 1,000-module and 1,000-route / 10,000-module
283
- measurements. Every incremental sample recompiles 10 modules and renders one
284
- page while matching a clean changed-source build byte-for-byte.
285
- - Keeps the full 10,000-route / 100,000-module run explicitly pending a
286
- separately provisioned host; no projection or reduced fixture is called a
287
- pass.
288
- - Promotes the 10,000-item pagination decision to ordinary Chrome acceptance,
289
- including Enter navigation, focus retention, bounded 100-row DOM, state
290
- release, and a zero-JavaScript direct-list control.
291
- - Marks missing AI attribution traces incomplete and withholds token and cost
292
- per-success claims instead of treating missing data as zero.
293
- - Records the equal-condition OpenCode tooling trial: both conditions passed
294
- 5/5, while structured tools used 16,933 more tokens per success, so no AI cost
295
- reduction is claimed.
296
- - Adds no semantic primitive, compiler pass, runtime concept, application API,
297
- dependency, deploy artifact, or browser byte.
298
- - Passes `npm run check`, required-Chrome 300/300, package smoke, tarball
299
- inspection, and both npm publish dry-runs on the exact versioned tree.
300
- - Updates `create-kudzu@0.1.140` to generate projects on
301
- `@kudzujs/core@^0.16.15`.
302
-
303
- ### Upgrade
304
-
305
- ```sh
306
- npm install @kudzujs/core@^0.16.15
307
- ```
308
-
309
- ## 0.16.14 - Fair AI Delivery Evidence
310
-
311
- Kudzu 0.16.14 adds a repository-owned protocol and runner for equal-condition,
312
- fully retained Kudzu and React+Vite delivery attempts.
313
-
314
- ### Changed in 0.16.14
315
-
316
- - Adds `npm run benchmark:ai-delivery`, backed only by Node standard-library
317
- process, hash, filesystem, timing, and compression APIs.
318
- - Pins model revision, pricing, tool permissions, prompt, budgets, adapter,
319
- acceptance command, starter trees, public context, and paired attempt order.
320
- - Runs every attempt in an isolated starter copy, then independently reruns the
321
- declared build and framework-neutral acceptance command.
322
- - Preserves raw adapter/build/acceptance output, final authored source, browser
323
- artifacts, hashes, token/cost/tool/file/build metrics, and source retention.
324
- - Includes deliberate failures in the evidence and total cost-per-success
325
- numerator rather than cherry-picking successful attempts.
326
- - Adds no compiler pass, semantic primitive, runtime concept, application API,
327
- dependency, or browser byte.
328
- - Uses a deterministic fixture only to validate the protocol. It does not claim
329
- that Kudzu outperforms React+Vite; measured tooling-cost validation remains the
330
- next packet.
331
- - Updates `create-kudzu@0.1.139` to generate projects on
332
- `@kudzujs/core@^0.16.14`.
333
-
334
- ### Upgrade
335
-
336
- ```sh
337
- npm install @kudzujs/core@^0.16.14
338
- ```
339
-
340
- ## 0.16.13 - Route Artifact Explanations
341
-
342
- Kudzu 0.16.13 lets tools ask why one exact emitted route owns its browser bytes
343
- without reading raw semantic records or reconstructing an artifact graph.
344
-
345
- ### Changed in 0.16.13
346
-
347
- - Adds `kudzu explain --route <route> --json`, which runs the authoritative build
348
- and projects authored source, normalization provenance, semantic owners,
349
- capability facts, selected artifacts, and byte reasons for one emitted route.
350
- - Reports raw and gzip byte totals plus SHA-256 hashes for runtime, handler,
351
- transitive chunk, stylesheet, and Worker artifacts already selected by the
352
- existing route artifact report.
353
- - Explains zero-JavaScript routes from an absent behavior runtime family and an
354
- empty compiler-selected JavaScript closure.
355
- - Uses exact configured-base route matching and returns the structured
356
- `explain.route.not-found` diagnostic for missing routes.
357
- - Sorts every bounded section before truncation and excludes HTML, generated
358
- code, RouteIR, ModuleIR, captures, and state values.
359
- - Adds no analyzer, semantic primitive, compiler pass, runtime concept, public
360
- application API, or browser byte.
361
- - Updates `create-kudzu@0.1.138` to generate projects on
362
- `@kudzujs/core@^0.16.13`.
363
-
364
- ### Upgrade
365
-
366
- ```sh
367
- npm install @kudzujs/core@^0.16.13
368
- ```
369
-
370
- ## 0.16.12 - Bounded Application Inspection
371
-
372
- Kudzu 0.16.12 lets tools select the first migration blocker from a compact
373
- reachable-application inventory instead of reading the compiler's raw semantic
374
- records or scanning an entire source tree.
375
-
376
- ### Changed in 0.16.12
377
-
378
- - Adds `kudzu inspect --json`, which runs the authoritative build graph and emits
379
- one versioned report of reachable modules, routes, package compatibility,
380
- capability families, semantic owners, and blocker candidates.
381
- - Sorts every section before applying fixed limits and reports total and omitted
382
- counts so large applications retain bounded deterministic context.
383
- - Distinguishes confirmed structured diagnostic blockers from unsupported
384
- compatibility sites and partial-package review candidates.
385
- - Excludes unreachable source, generated module code, HTML, RouteIR, ModuleIR,
386
- captures, state values, and complete artifact closures from inspection output.
387
- - Reuses existing source, compatibility, ownership, capability, and artifact
388
- records; it adds no analyzer, semantic primitive, runtime concept, public
389
- application API, or browser byte.
390
- - Updates `create-kudzu@0.1.137` to generate projects on
391
- `@kudzujs/core@^0.16.12`.
392
-
393
- `inspect` performs the ordinary authoritative build, including configured
394
- `afterBuild()` behavior. A structured compiler failure returns a bounded blocked
395
- report with incomplete inventory rather than pretending that later facts exist.
396
-
397
- ### Upgrade
398
-
399
- ```sh
400
- npm install @kudzujs/core@^0.16.12
401
- ```
402
-
403
- ## 0.16.11 - Structured Compiler Diagnostics
404
-
405
- Kudzu 0.16.11 gives tools and agents stable machine-readable authored-source
406
- errors without replacing concise human diagnostics or exposing compiler internals.
407
-
408
- ### Changed in 0.16.11
409
-
410
- - Adds `kudzu build --json`, which emits one versioned diagnostic envelope with
411
- stable semantic code, stage, severity, project-relative source range, message,
412
- nullable compatibility class, and nullable safe suggestion.
413
- - Preserves readable source-located build and development errors; agents no
414
- longer need to parse maintained error-message substrings.
415
- - Covers unresolved imports and re-exports, unsupported dynamic imports,
416
- TypeScript syntax errors, runtime-locale `react-i18next`, and invalid keyed-row
417
- ref initializers through the shared diagnostic transport.
418
- - Reuses the existing compatibility registry and keeps pass filenames, generated
419
- source, IR slots, runtime records, and stack traces out of machine output.
420
- - Adds no semantic primitive, compiler pass, runtime concept, browser module, or
421
- deploy byte. Representative artifact manifests and hashes remain unchanged.
422
- - Updates `create-kudzu@0.1.136` to generate projects on
423
- `@kudzujs/core@^0.16.11`.
424
-
425
- ### Upgrade
426
-
427
- ```sh
428
- npm install @kudzujs/core@^0.16.11
429
- ```
430
-
431
- ## 0.16.10 - Apache Answer Authentication Journey
432
-
433
- Kudzu 0.16.10 promotes the existing Apache Answer authentication reduction from
434
- build-only evidence to a complete deterministic browser journey.
435
-
436
- ### Changed in 0.16.10
437
-
438
- - Proves anonymous startup, invalid login, valid login, token persistence, and
439
- token restoration after a full document reload.
440
- - Proves one layout-owned package-neutral session record updates the shared
441
- header and settings route without a browser component tree.
442
- - Proves a server 401 clears storage and shared state before native replacement
443
- navigation returns to the anonymous login document.
444
- - Runs the journey against a deterministic native test server while preserving
445
- the public sibling as complete HTML with zero JavaScript.
446
- - Adds no compiler behavior, semantic primitive, IR kind, runtime concept,
447
- package adapter, public API, or browser bytes.
448
- - Updates `create-kudzu@0.1.135` to generate projects on
449
- `@kudzujs/core@^0.16.10`.
450
-
451
- ### Upgrade
452
-
453
- ```sh
454
- npm install @kudzujs/core@^0.16.10
455
- ```
456
-
457
- ## 0.16.9 - Compatibility Boundary And Inventory
458
-
459
- Kudzu 0.16.9 records deterministic package compatibility provenance from the
460
- reachable authored source graph without changing semantic IR or browser output.
461
-
462
- ### Changed in 0.16.9
463
-
464
- - Centralizes package identities and compatibility classifications used by
465
- React, React Router, React Bootstrap, Zustand, `clsx`, and browser-signal
466
- normalization.
467
- - Writes `.kudzu/kudzu-compatibility.json` from original, pre-normalization
468
- source with package/API identity and exact line/column ranges.
469
- - Classifies sites as Native, Compiled, Normalized, Adapter, Owned External UI,
470
- Partial, or Unsupported with stable rule names and deterministic ordering.
471
- - Includes only modules reachable from page entries; unused migration source is
472
- excluded from the report just as it is from compilation.
473
- - Keeps package origin out of ComponentAnalysis, ModuleIR, RouteIR, codegen,
474
- runtime modules, and deploy output. No plugin API or browser capability is
475
- added.
476
- - Updates `create-kudzu@0.1.134` to generate projects on
477
- `@kudzujs/core@^0.16.9`.
478
-
479
- ### Upgrade
480
-
481
- ```sh
482
- npm install @kudzujs/core@^0.16.9
483
- ```
484
-
485
- ## 0.16.8 - Shared Lazy Capability Graphs
486
-
487
- Kudzu 0.16.8 shares one deferred package graph across route owners while
488
- keeping loading interaction-triggered and ownership validation lexical.
489
-
490
- ### Changed in 0.16.8
491
-
492
- - Records one deferred CodeMirror chunk as shared by both route owners without
493
- duplicating its package graph.
494
- - Keeps the shared chunk out of route HTML, module preload, navigation prefetch,
495
- and static siblings until an owner activates.
496
- - Uses the native browser module map for document-scoped deduplication and adds
497
- no loader, prefetch registry, cache, or browser runtime.
498
- - Resolves lazy `useEffect` ownership through lexical imports so a local
499
- same-named function cannot bypass ordinary dynamic-import diagnostics.
500
- - Preserves exact owner cleanup; native in-flight imports remain non-cancellable
501
- and late callbacks cannot mount after disposal.
502
- - Updates `create-kudzu@0.1.133` to generate projects on
503
- `@kudzujs/core@^0.16.8`.
504
-
505
- ### Output And Browser Evidence
506
-
507
- - Both owners share one 250,086 raw / 80,890 gzip byte deferred chunk. Their
508
- eager graphs are 21,599 raw / 9,466 gzip and 21,609 raw / 9,468 gzip bytes.
509
- - Required Chrome proves zero initial requests, one first-owner request, no
510
- route-prefetch request, no second-owner duplicate, and exact cleanup.
511
- - The static sibling emits zero JavaScript. The maintained Worker and window
512
- graphs remain 907 raw / 477 gzip bytes and 14,456 raw / 6,160 gzip bytes.
513
-
514
- ### Upgrade
515
-
516
- ```sh
517
- npm install @kudzujs/core@^0.16.8
518
- ```
519
-
520
- ## 0.16.7 - Lazy Retained Editor Lifecycle
521
-
522
- Kudzu 0.16.7 applies owner-triggered package loading to the real retained
523
- CodeMirror editor journey without losing update, error, identity, or cleanup
524
- behavior.
525
-
526
- ### Changed in 0.16.7
527
-
528
- - Lets one retained `useRef(null)` package handle receive its single setup
529
- assignment inside the direct `.then()` callback of a guarded literal package
530
- import.
531
- - Reuses existing owner-scoped retained state across the lazy activation effect
532
- and later read-only update effects.
533
- - Keeps indirect promise callbacks, multiple assignments, update-effect writes,
534
- attached refs, missing null-reset cleanup, and broader dynamic imports
535
- unsupported.
536
- - Preserves application-to-editor and editor-to-application updates, accessible
537
- package errors and recovery, retained DOM identity, conditional disposal, and
538
- fresh state on remount.
539
- - Uses the native browser module map for cached remount and adds no loader,
540
- resource registry, widget runtime, React, VDOM, hydration, or retained browser
541
- component tree.
542
- - Updates `create-kudzu@0.1.132` to generate projects on
543
- `@kudzujs/core@^0.16.7`.
544
-
545
- ### Output And Browser Evidence
546
-
547
- - The eager real editor owns 214,968 raw / 71,607 gzip bytes. The lazy journey
548
- initially owns 15,896 raw / 7,230 gzip bytes and defers 250,086 raw / 80,890
549
- gzip bytes, reducing initial gzip by 64,377 bytes (89.9%).
550
- - Required Chrome proves zero initial chunk requests, one on-demand request,
551
- bidirectional updates, accessible failure recovery, retained identity, exact
552
- conditional cleanup, cached fresh remount, and document cleanup.
553
- - The static sibling emits zero JavaScript. The maintained Worker and window
554
- graphs remain 907 raw / 477 gzip bytes and 14,456 raw / 6,160 gzip bytes.
555
-
556
- ### Upgrade
557
-
558
- ```sh
559
- npm install @kudzujs/core@^0.16.7
560
- ```
561
-
562
- ## 0.16.6 - Owner-Triggered Capability Imports
563
-
564
- Kudzu 0.16.6 lets one guarded effect load a literal package dependency only
565
- when its owner activates, using native ESM code splitting without a loader or
566
- component runtime.
567
-
568
- ### Changed in 0.16.6
569
-
570
- - Accepts one literal bare-package `import()` directly inside an inline
571
- synchronous `useEffect` with a direct dependency-state early-return guard.
572
- - Keeps relative, URL, render-time, event-handler, indirect, async-effect, and
573
- multiple dynamic imports unsupported with source diagnostics.
574
- - Removes the package edge from build-time component execution and preserves it
575
- only in the route-owned effect bundle.
576
- - Reports deferred handler closure separately as `handlers.lazyChunks` while
577
- retaining exact route ownership and shared-chunk accounting.
578
- - Uses native module-map deduplication across owner remounts and exact effect
579
- cleanup on owner and document release.
580
- - Adds no loader, retry cache, component runtime, React, VDOM, hydration, or
581
- retained browser component tree.
582
- - Updates `create-kudzu@0.1.131` to generate projects on
583
- `@kudzujs/core@^0.16.6`.
584
-
585
- ### Output And Browser Evidence
586
-
587
- - The eager CodeMirror route owns 214,968 raw / 71,607 gzip bytes. The lazy
588
- route initially owns 12,982 raw / 6,153 gzip bytes and defers 250,086 raw /
589
- 80,890 gzip bytes, reducing initial gzip by 65,454 bytes (91.4%).
590
- - Required Chrome proves zero initial chunk requests, one activation request,
591
- package mount, exact owner cleanup, cached remount without another request,
592
- and document cleanup.
593
- - The static sibling emits zero JavaScript. The maintained Worker and window
594
- graphs remain 907 raw / 477 gzip bytes and 14,456 raw / 6,160 gzip bytes.
595
-
596
- ### Upgrade
597
-
598
- ```sh
599
- npm install @kudzujs/core@^0.16.6
600
- ```
601
-
602
- ## 0.16.5 - Bounded Navigation Cache
603
-
604
- Kudzu 0.16.5 prevents superseded enhanced navigations from resurrecting pruned
605
- prefetched documents and adds a reproducible long-session ownership gate.
606
-
607
- ### Changed in 0.16.5
608
-
609
- - Checks the navigation revision before writing a completed prefetched document
610
- back into the route cache.
611
- - Prevents stale slow navigations from retaining parsed documents after a newer
612
- route has committed and pruned their URLs.
613
- - Adds a dedicated Chrome endurance harness with machine-readable heap, DOM,
614
- listener, logical-state, resource, and navigation counters.
615
- - Exercises ten deterministic stale-prefetch races followed by 30 route,
616
- conditional, keyed, dialog, and real CodeMirror ownership cycles.
617
- - Proves a layout-owned project notification WebSocket journey with validated
618
- keyed updates, reconnect, stale-callback rejection, offline recovery, retained
619
- navigation lifetime, and exact cleanup.
620
- - Adds no cache abstraction, LRU, transport runtime, ResourceIR, VDOM, hydration,
621
- React runtime, or retained component tree.
622
- - Updates `create-kudzu@0.1.130` to generate projects on
623
- `@kudzujs/core@^0.16.5`.
624
-
625
- ### Output And Browser Evidence
626
-
627
- - Before the fix, five stale-prefetch races increased retained CDP documents
628
- from 8 to 16 while logical state remained empty.
629
- - With the fix, the default 101-navigation run keeps documents at 8,
630
- `browserState.size` at 0, DOM nodes at 174, listeners at 7, and editor
631
- mounts/disposals balanced at 71/71.
632
- - Forced-GC heap moves from 1,826,244 to 2,022,160 bytes, below the declared
633
- larger-of-2-MiB-or-15% alarm.
634
- - The maintained Worker graph remains 907 raw / 477 gzip bytes; the window graph
635
- remains 14,456 raw / 6,160 gzip bytes. Static routes remain zero JavaScript.
636
-
637
- ### Upgrade
638
-
639
- ```sh
640
- npm install @kudzujs/core@^0.16.5
641
- ```
642
-
643
- ## 0.16.4 - Scoped GSAP Animation Lifecycle
644
-
645
- Kudzu 0.16.4 lets inline GSAP callbacks remain inside one owned effect while
646
- Kudzu retains structural DOM and exact route, conditional, and dependency
647
- lifetime ownership.
648
-
649
- ### Changed in 0.16.4
650
-
651
- - Accepts package references inside an unbroken chain of inline callbacks passed
652
- directly within an owned effect setup or cleanup.
653
- - Keeps named, local, imported, render-time, and mixed package indirection
654
- unsupported.
655
- - Preserves deterministic visible HTML before GSAP applies bounded opacity and
656
- transform presentation.
657
- - Uses native `prefers-reduced-motion` detection for a static presentation with
658
- no residual inline opacity, transform, or visibility.
659
- - Reverts the previous GSAP context before dependency replacement and on
660
- conditional or enhanced-route disposal; remount creates a fresh owner.
661
- - Adds no animation IR, scheduler, runtime concept, React, VDOM, hydration, or
662
- retained component tree.
663
- - Updates `create-kudzu@0.1.129` to generate projects on
664
- `@kudzujs/core@^0.16.4`.
665
-
666
- ### Output And Browser Evidence
667
-
668
- - The GSAP fixture emits 8 JavaScript files totaling 94,110 raw / 37,819
669
- aggregate gzip bytes; its static sibling emits zero JavaScript.
670
- - Required Chrome proves scoped mount, dependency replacement, reduced-motion
671
- fallback, conditional and route disposal, retained structure, and fresh
672
- remount.
673
- - The maintained Worker and window graphs remain 907 raw / 477 gzip bytes and
674
- 14,456 raw / 6,159 gzip bytes respectively.
675
-
676
- ### Upgrade
677
-
678
- ```sh
679
- npm install @kudzujs/core@^0.16.4
680
- ```
681
-
682
- ## 0.16.3 - State-Owned Drag And Drop
683
-
684
- Kudzu 0.16.3 proves that a real SortableJS drag engine can remain a bounded
685
- effect while existing keyed state owns durable order and DOM identity.
686
-
687
- ### Changed in 0.16.3
688
-
689
- - Treats the browser `HTMLElement` constructor as a platform global inside
690
- bundled effect callbacks while preserving lexical shadowing.
691
- - Restores package-moved DOM before applying one immutable state reorder, so
692
- Kudzu remains the only durable keyed DOM owner.
693
- - Uses the same state operation for drag, keyboard movement, and reset.
694
- - Recovers invalid package indexes without changing application state.
695
- - Disposes on conditional and document release; remount creates a fresh package
696
- instance.
697
- - Adds no drag/drop IR, animation frame, runtime concept, React, VDOM, hydration,
698
- or retained component tree.
699
- - Updates `create-kudzu@0.1.128` to generate projects on
700
- `@kudzujs/core@^0.16.3`.
701
-
702
- ### Output And Browser Evidence
703
-
704
- - The SortableJS fixture emits 10 JavaScript files totaling 72,251 raw / 26,603
705
- aggregate gzip bytes; its static sibling emits zero JavaScript.
706
- - Required Chrome proves drag and keyboard reorder, state synchronization,
707
- retained row/input identity, invalid-input recovery, disposal, and fresh
708
- remount.
709
- - The maintained Worker and window graphs remain 907 raw / 477 gzip bytes and
710
- 14,456 raw / 6,159 gzip bytes respectively.
711
-
712
- ### Upgrade
713
-
714
- ```sh
715
- npm install @kudzujs/core@^0.16.3
716
- ```
717
-
718
- ## 0.16.1 - Retained External Editor Ownership
719
-
720
- Kudzu 0.16.1 lets one CodeMirror-class package instance remain owned across a
721
- mount effect and later dependency update effects without a React island or
722
- generic widget runtime.
723
-
724
- ### Changed in 0.16.1
725
-
726
- - Lowers one proven unattached `useRef(null)` retained-instance handle to
727
- existing owner-scoped object state.
728
- - Requires one empty-dependency mount effect, one direct setup assignment,
729
- direct null-reset cleanup, and read-only later dependency effects.
730
- - Preserves editor DOM identity across application-state and editor-to-state
731
- updates, including accessible package errors and recovery.
732
- - Disposes on conditional and document release; remount receives a fresh handle.
733
- - Rejects malformed cleanup, update-effect writes, multiple retained handles,
734
- aliases, event use, and attached retained refs.
735
- - Adds no IR kind, runtime concept, resource registry, React, or widget runtime.
736
- - Updates `create-kudzu@0.1.127` to generate projects on
737
- `@kudzujs/core@^0.16.1`.
738
-
739
- ### Output And Browser Evidence
740
-
741
- - The CodeMirror fixture emits 7 JavaScript files totaling 214,968 raw /
742
- 71,607 aggregate gzip bytes; its static sibling emits zero JavaScript.
743
- - Required Chrome proves initial mount, retained application updates,
744
- editor-to-state updates, package-error recovery, disposal, and fresh remount.
745
- - The smaller Typed.js boundary fixture proves the same existing effect owner
746
- without any production compiler change.
747
-
748
- ### Upgrade
749
-
750
- ```sh
751
- npm install @kudzujs/core@^0.16.1
752
- ```
753
-
754
- ## 0.15.1 - Key-Scoped Native Popovers
755
-
756
- Kudzu 0.15.1 lets ordinary keyed row components use `useId()` for native
757
- Popover triggers and intrinsic ID relationships without duplicate cloned IDs.
758
-
759
- ### Changed in 0.15.1
760
-
761
- - Key-scoped keyed-row `useId()` through the existing list ownership path.
762
- - Rewrites cloned `id`, `htmlFor`, static ARIA IDREF, `form`, `headers`, `list`,
763
- and `popovertarget` attributes.
764
- - Rejects keyed IDs used in text, handlers, aliases, arbitrary attributes, or
765
- component prop forwarding.
766
- - Proves native Popover Escape, light dismiss, trigger focus restoration,
767
- retained reorder identity, inserted and remounted IDs, and route cleanup.
768
- - Adds no overlay runtime, focus manager, positioning engine, Portal/Slot
769
- reconciliation, retained component tree, or public API.
770
- - Updates `create-kudzu@0.1.126` to generate projects on
771
- `@kudzujs/core@^0.15.1`.
772
-
773
- ### Output And Browser Evidence
774
-
775
- - The maintained application emits 44 files totaling 171,202 raw / 53,629
776
- aggregate gzip bytes; `/help` remains 0 B JavaScript.
777
- - The two-route session remains 17 JavaScript files totaling 77,779 raw /
778
- 27,050 aggregate gzip bytes.
779
- - Seven Chrome profiles record a 0.5 ms table-update median and 2.5 ms
780
- navigation median, within prior retained-path ranges.
781
-
782
- ### Upgrade
783
-
784
- ```sh
785
- npm install @kudzujs/core@^0.15.1
786
- ```
787
-
788
- ## 0.14.3 - 10,000-Item Browser Decision
789
-
790
- Kudzu 0.14.3 measures direct DOM, pagination, and scroll-window alternatives
791
- for one deterministic 10,000-project table and selects native pagination.
792
-
793
- ### Changed in 0.14.3
794
-
795
- - Added a tracked three-route large-list decision fixture.
796
- - Added rotating fresh-Chrome load, range, DOM, heap, and identity measurement.
797
- - Rejected direct 10,000-row DOM after its 90,023-node result.
798
- - Rejected fixed-height scroll windowing for the project table because pagination
799
- is faster to change range, uses less heap, and preserves native page/focus and
800
- variable-row-height behavior.
801
- - Added no range primitive, virtualization runtime, compiler pass, or public API.
802
- - Updated `create-kudzu@0.1.125` to generate projects on
803
- `@kudzujs/core@^0.14.3`.
804
-
805
- ### Browser Evidence
806
-
807
- - Direct DOM loads in 806.6 ms median with 90,023 DOM nodes.
808
- - Pagination loads in 165.4 ms and changes its 100-row page in 12.1 ms median
809
- with 1,470 DOM nodes.
810
- - The scroll window loads in 161.2 ms and changes range in 16.5 ms median with
811
- 1,471 DOM nodes.
812
- - Both bounded strategies release an edited off-range row and restore fresh
813
- native input identity.
814
-
815
- ### Decision
816
-
817
- Use pagination for 10,000-item project tables. `0.14.4` virtual range ownership
818
- remains blocked until three independent real fixtures prove pagination and
819
- application-owned bounded ranges insufficient.
820
-
821
- ### Upgrade
822
-
823
- ```sh
824
- npm install @kudzujs/core@^0.14.3
825
- ```
826
-
827
- ## 0.14.2 - Infinite Loading Composition
828
-
829
- Kudzu 0.14.2 composes bounded sentinel-driven loading from ordinary state,
830
- owned effects, native `IntersectionObserver`, fetch, and existing keyed lists.
831
-
832
- ### Changed in 0.14.2
833
-
834
- - Added an intrinsic sentinel with an owned observer and exact disconnect.
835
- - Added cursor-based incremental fetch with duplicate project suppression.
836
- - Added accessible loading, error, retry, and terminal states.
837
- - Aborted in-flight incremental work when enhanced navigation releases the route.
838
- - Bounded successful incremental pages to two and retained projects to six.
839
- - Updated `create-kudzu@0.1.124` to generate projects on
840
- `@kudzujs/core@^0.14.2`.
841
-
842
- ### Output Evidence
843
-
844
- - The application emits 44 files totaling 168,037 raw / 52,955 aggregate gzip
845
- bytes with deploy digest
846
- `230dea098442275e42a966ca595743a4da9c832327ba52d4d09de663c68f8f1a`.
847
- - The maintained two-route session remains 17 JavaScript files and totals
848
- 76,889 raw / 26,750 aggregate gzip bytes; `/help` remains 0 B JavaScript.
849
- - No semantic primitive, IR kind, compiler pass, production compiler/runtime
850
- line, normalization rule, adapter, runtime concept, public API, infinite-query
851
- runtime, or observer scheduler was added.
852
-
853
- ### Validation
854
-
855
- - Required Chrome proves cursor progression, duplicate trigger and record
856
- suppression, HTTP error and retry, terminal state, retained row identity,
857
- bounded requests/results, observer disconnect, and route-owned fetch abort.
858
- - The complete suite passes 274 tests, package smoke, and serialized required-
859
- Chrome execution.
860
- - Seven fresh Chrome 151 profiles record a 0.5 ms table-update median with a
861
- 0.3-0.6 ms range and a 2.3 ms navigation median with a 2.2-2.6 ms range.
862
-
863
- ### Limits
864
-
865
- Incremental loading is capped at two successful pages of two records and six
866
- retained projects. Unbounded datasets, automatic query caching, windowing, and
867
- virtualization remain separate measured decisions.
868
-
869
- ### Upgrade
870
-
871
- ```sh
872
- npm install @kudzujs/core@^0.14.2
873
- ```
874
-
875
- ## 0.14.1 - Nested And Object-State Collections
876
-
877
- Kudzu 0.14.1 lets one direct immutable array field of ordinary object state own
878
- a root keyed collection and its nested direct-property lists.
879
-
880
- ### Changed in 0.14.1
881
-
882
- - Allowed compiler-proven object-state collection roots without authored field
883
- state.
884
- - Initialized binding-backed roots before nested row ownership mounts.
885
- - Preserved project and issue DOM identity through immutable replacement and
886
- nested update, reorder, and removal.
887
- - Preserved latest-item handlers and released descendant row state exactly.
888
- - Recreated removed and re-added nested rows with fresh local state.
889
- - Updated `create-kudzu@0.1.123` to generate projects on
890
- `@kudzujs/core@^0.14.1`.
891
-
892
- ### Output Evidence
893
-
894
- - The application emits 44 files totaling 164,305 raw / 52,185 aggregate gzip
895
- bytes with deploy digest
896
- `0a3b7e10b3447a76a9c04ef34ad7c2bfa30400ea53c9d16fc85b1c7cbf2ea203`.
897
- - The maintained two-route session remains 17 JavaScript files and totals
898
- 74,826 raw / 26,204 aggregate gzip bytes; `/help` remains 0 B JavaScript.
899
- - No semantic primitive, IR kind, compiler pass, runtime concept, or public API
900
- was added. One build-time validation line changed and one list-runtime line
901
- was added.
902
-
903
- ### Validation
904
-
905
- - Required Chrome proves immutable whole-object replacement, nested issue
906
- insert, update, reorder, removal, re-addition, retained identity, latest
907
- handlers, descendant state release, and fresh remount.
908
- - The complete suite passes 274 tests, package smoke, and serialized required-
909
- Chrome execution.
910
- - Seven fresh Chrome profiles record a 0.8 ms table-update median with a
911
- 0.7-0.9 ms range and a 4.1 ms navigation median with a 3.7-4.5 ms range.
912
-
913
- ### Limits
914
-
915
- Collection roots require one direct static array field and immutable whole-
916
- object replacement. Dynamic or computed paths, mutation, and non-array fields
917
- remain unsupported.
918
-
919
- ### Upgrade
920
-
921
- ```sh
922
- npm install @kudzujs/core@^0.14.1
923
- ```
924
-
925
- ## 0.14.0 - Project Table CRUD And Identity
926
-
927
- Kudzu 0.14.0 composes a complete native project table from ordinary state,
928
- collection selectors, and keyed ownership without a data-grid runtime.
929
-
930
- ### Changed in 0.14.0
931
-
932
- - Replaced the project article list with valid native table structure.
933
- - Added project insertion, inline name editing, save, and deletion.
934
- - Added reorder, immutable name sorting, active filtering, and row selection.
935
- - Preserved keyed row and draft-input identity through reorder and sort.
936
- - Recreated removed rows with fresh local state after filter restoration.
937
- - Kept editor controls mounted with native `hidden` and verified keyboard focus.
938
- - Updated `create-kudzu@0.1.122` to generate projects on
939
- `@kudzujs/core@^0.14.0`.
940
-
941
- ### Output Evidence
942
-
943
- - The application emits 44 files totaling 159,258 raw / 51,627 aggregate gzip
944
- bytes with deploy digest
945
- `ebb3358e7a03612459e723ae765c39d105498db9d293415b924f1066cddf4793`.
946
- - The maintained two-route session remains 17 JavaScript files and totals
947
- 73,304 raw / 25,930 aggregate gzip bytes; `/help` remains 0 B JavaScript.
948
- - No semantic primitive, IR kind, compiler pass, production compiler/runtime
949
- line, runtime concept, public API, or data-grid runtime was added.
950
-
951
- ### Validation
952
-
953
- - Required Chrome proves insert, update, delete, reorder, sort, filter,
954
- selection, keyboard access, row-local edit state, and retained DOM identity.
955
- - The complete suite passes 273 tests.
956
- - Seven fresh Chrome profiles record a 0.8 ms table-update median with a
957
- 0.7-1.1 ms range and a 3.9 ms navigation median with a 3.4-6.1 ms range.
958
-
959
- ### Limits
960
-
961
- This is an ordinary bounded table, not virtualization. Infinite loading,
962
- windowing, dynamic row measurement, and 10,000-row strategy selection remain
963
- separate evidence packets.
964
-
965
- ### Upgrade
966
-
967
- ```sh
968
- npm install @kudzujs/core@^0.14.0
969
- ```
970
-
971
- ## 0.13.3 - File Upload Boundary
972
-
973
- Kudzu 0.13.3 composes a bounded file-upload lifecycle from native controls,
974
- ordinary state, owned effects, and keyed rows without an upload runtime.
975
-
976
- ### Changed in 0.13.3
977
-
978
- - Added one native plain-text file input with type and 1 KiB size validation
979
- before any request.
980
- - Added application-owned `FormData` and fetch upload with an owned
981
- `AbortController`.
982
- - Added explicit user cancellation, delayed transport failure, and retry without
983
- requiring file reselection.
984
- - Aborted in-flight upload work when enhanced navigation releases the route.
985
- - Added successful keyed attachment mutation and an explicit statement that
986
- fetch does not expose upload progress.
987
- - Updated `create-kudzu@0.1.121` to generate projects on
988
- `@kudzujs/core@^0.13.3`.
989
-
990
- ### Output Evidence
991
-
992
- - The application emits 44 files totaling 150,023 raw / 50,240 aggregate gzip
993
- bytes with deploy digest
994
- `a16fd5dbc08086aa6a7c0ec0aba3a38fbe2a63b96005a81e8747a7f4e45e214e`.
995
- - The maintained two-route session remains 17 JavaScript files and totals
996
- 71,031 raw / 25,304 aggregate gzip bytes; `/help` remains 0 B JavaScript.
997
- - No semantic primitive, IR kind, compiler pass, production compiler/runtime
998
- line, normalization rule, adapter, runtime concept, public API, upload
999
- scheduler, or transfer runtime was added.
1000
-
1001
- ### Validation
1002
-
1003
- - Required Chrome proves pre-request validation, user cancellation, delayed
1004
- `503` feedback, retry, successful attachment mutation, and route-departure
1005
- cancellation.
1006
- - The complete suite passes 273 tests, including the preserved draft, nested
1007
- form, authentication, routing, and server retry journeys.
1008
- - Seven fresh Chrome profiles record a 3.8 ms list-to-detail median with a
1009
- 3.5-5.0 ms range. The destination changed, so no same-content latency change
1010
- is claimed.
1011
-
1012
- ### Limits
1013
-
1014
- Fetch upload progress is unavailable and no fake progress is rendered. Chunking,
1015
- resume, background sync, binary formats, concurrent files, and files above the
1016
- authored 1 KiB in-memory text limit remain unsupported until a real application
1017
- requires a different transport.
1018
-
1019
- ### Upgrade
1020
-
1021
- ```sh
1022
- npm install @kudzujs/core@^0.13.3
1023
- ```
1024
-
1025
- ## 0.13.2 - Multistep Draft And Autosave
1026
-
1027
- Kudzu 0.13.2 composes a persistent two-step draft and debounced server save
1028
- from ordinary route state and owned effects without a wizard or autosave runtime.
1029
-
1030
- ### Changed in 0.13.2
1031
-
1032
- - Added native first-step validation and conditional step navigation over
1033
- parent-owned draft values.
1034
- - Added guarded versioned local-storage restore and immediate draft persistence
1035
- across enhanced navigation and document reload.
1036
- - Added a direct dependency effect with timeout cleanup for debounced owned
1037
- server writes.
1038
- - Rejected stale server versions and ignored late stale completions while
1039
- retaining the current draft through conflict and transport failures.
1040
- - Added reset of step, values, status, version, storage, and pending debounce.
1041
- - Updated `create-kudzu@0.1.120` to generate projects on
1042
- `@kudzujs/core@^0.13.2`.
1043
-
1044
- ### Output Evidence
1045
-
1046
- - The application emits 44 files totaling 144,633 raw / 49,217 aggregate gzip
1047
- bytes with deploy digest
1048
- `06a35341c5e70bfec48c46ad767ac351326b39ba701f5c1f1d03992a65ec8b9e`.
1049
- - The maintained two-route session remains 17 JavaScript files and totals
1050
- 68,664 raw / 24,747 aggregate gzip bytes; `/help` remains 0 B JavaScript.
1051
- - No semantic primitive, IR kind, compiler pass, production compiler/runtime
1052
- line, normalization rule, adapter, runtime concept, public API, wizard
1053
- scheduler, or autosave scheduler was added.
1054
-
1055
- ### Validation
1056
-
1057
- - Required Chrome proves native validation, debounced save, server rejection of
1058
- an older in-flight version, ignored stale completion, navigation and reload
1059
- restoration, retained conflict input, and reset cleanup.
1060
- - The complete serial suite passes 273 tests, including the preserved nested
1061
- issue-form and server retry journey.
1062
- - Seven fresh Chrome profiles record a 6.1 ms list-to-detail median with a
1063
- 3.7-10.7 ms range. The destination changed and the range is noisy, so no
1064
- same-content latency change is claimed.
1065
-
1066
- ### Limits
1067
-
1068
- Draft persistence remains application-owned and versioned per form. Dynamic
1069
- step schemas, cross-document coordination, background sync, retry scheduling,
1070
- and a general autosave scheduler remain unsupported until independent real
1071
- applications prove a shared framework boundary.
1072
-
1073
- ### Upgrade
1074
-
1075
- ```sh
1076
- npm install @kudzujs/core@^0.13.2
1077
- ```
1078
-
1079
- ## 0.13.1 - Nested Form Metadata
1080
-
1081
- Kudzu 0.13.1 composes conditional fields, dynamic keyed rows, dirty/touched
1082
- display, and reset from ordinary application state without a form registry.
1083
-
1084
- ### Changed in 0.13.1
1085
-
1086
- - Added conditional assignee fields backed by one ordinary object state.
1087
- - Added dynamic checklist rows with immutable add, reorder, remove, input, and
1088
- touched updates over one ordinary array state.
1089
- - Preserved exact keyed DOM identity through reorder and reset while releasing
1090
- removed and reset-added rows.
1091
- - Kept native constraints, field/form server errors, retained values, and retry
1092
- behavior from `0.13.0`.
1093
- - Updated `create-kudzu@0.1.119` to generate projects on
1094
- `@kudzujs/core@^0.13.1`.
1095
-
1096
- ### Output Evidence
1097
-
1098
- - The application emits 44 files totaling 138,064 raw / 47,964 aggregate gzip
1099
- bytes with deploy digest
1100
- `f0d96cfd5dee2cf3fa67f4ebe25d8b32cbb1bf66e72ed5ca1c29bd06fdcc0a33`.
1101
- - The maintained two-route session remains 17 JavaScript files and totals
1102
- 65,404 raw / 23,899 aggregate gzip bytes; `/help` remains 0 B JavaScript.
1103
- - No semantic primitive, IR kind, compiler pass, production compiler/runtime
1104
- line, normalization rule, adapter, public API, registration function, proxy
1105
- metadata graph, schema adapter, or form runtime was added.
1106
-
1107
- ### Validation
1108
-
1109
- - Required Chrome proves dirty/touched output, conditional ownership, stable-key
1110
- reorder, removal release, native reset, and exact retained/released identity.
1111
- - The existing keyboard validation and delayed `422`, `503`, and `201` journey
1112
- passes while nested assignee and checklist values survive failures.
1113
- - Seven fresh Chrome profiles record a 3.3 ms list-to-detail median with a
1114
- 3.2-4.7 ms range. The range overlaps `0.13.0`, so no latency change is claimed.
1115
-
1116
- ### Limits
1117
-
1118
- Dynamic field names, schema-driven registration, generic watchers, and proxy
1119
- dirty/touched graphs remain unsupported. Add framework metadata only after
1120
- independent real forms prove the same otherwise-inexpressible graph.
1121
-
1122
- ### Upgrade
1123
-
1124
- ```sh
1125
- npm install @kudzujs/core@^0.13.1
1126
- ```
1127
-
1128
- ## 0.13.0 - Production Form And Server Validation
1129
-
1130
- Kudzu 0.13.0 compiles an accessible issue-creation form from ordinary TSX
1131
- without adding a form runtime, field registry, or metadata proxy.
1132
-
1133
- ### Changed in 0.13.0
1134
-
1135
- - Added a native issue form with `required` and `minLength` constraints,
1136
- keyboard submission, `FormData`, and application-owned pending state.
1137
- - Preserved field-level and form-level server errors, focused and ARIA-linked
1138
- field feedback, valid input across failures, and retry without re-entry.
1139
- - Reused existing state, ref, conditional, binding, and async handler semantics;
1140
- production compiler and runtime source remain unchanged.
1141
- - Updated `create-kudzu@0.1.118` to generate projects on
1142
- `@kudzujs/core@^0.13.0`.
1143
-
1144
- ### Output Evidence
1145
-
1146
- - The application emits 44 files totaling 127,343 raw / 46,261 aggregate gzip
1147
- bytes with deploy digest
1148
- `183f5a7ca081f99ae38de6974e61fdcb32ca49de699359aac053d0154ae38036`.
1149
- - The maintained two-route session uses 17 JavaScript files totaling 62,118 raw
1150
- / 23,096 aggregate gzip bytes; `/help` remains 0 B JavaScript.
1151
- - No semantic primitive, IR kind, compiler pass, production compiler/runtime
1152
- line, runtime concept, public API, form registry, schema adapter, or form
1153
- runtime was added.
1154
-
1155
- ### Validation
1156
-
1157
- - Required Chrome sends real Enter key input and proves native empty and
1158
- minimum-length constraints make zero requests.
1159
- - Deterministic delayed `422`, `503`, and `201` responses prove pending state,
1160
- exact request counts, field and form feedback, retained input, and retry.
1161
- - Seven fresh Chrome profiles record a 3.6 ms list-to-detail median with a
1162
- 2.6-5.6 ms range. This measures the changed destination form and handler, not
1163
- a same-content compiler/runtime regression.
1164
-
1165
- ### Limits
1166
-
1167
- Nested fields, field arrays, dirty/touched metadata, dynamic schemas, and form
1168
- registries remain unsupported. The `0.13.1` packet must first prove which of
1169
- those behaviors cannot be expressed with native controls and ordinary state.
1170
-
1171
- ### Upgrade
1172
-
1173
- ```sh
1174
- npm install @kudzujs/core@^0.13.0
1175
- ```
1176
-
1177
- ## 0.12.4 - Nested Layout Evidence Decision
1178
-
1179
- Kudzu 0.12.4 reviews executable route ownership evidence and keeps the existing
1180
- single-layout model instead of adding a speculative nested owner chain.
1181
-
1182
- ### Changed in 0.12.4
1183
-
1184
- - Reviewed the project application's list/detail/runtime routes, Apache Answer
1185
- route and authentication shells, Context and Zustand carts, and independent
1186
- navigation groups.
1187
- - Recorded zero routes requiring an intermediate retained layout whose state,
1188
- effects, or DOM survive descendant replacement and dispose on subtree exit.
1189
- - Accepted one shared layout plus static composition, route ownership, native
1190
- document navigation, and disjoint navigation groups as the current boundary.
1191
- - Updated `create-kudzu@0.1.117` to generate projects on
1192
- `@kudzujs/core@^0.12.4`.
1193
-
1194
- ### Output Evidence
1195
-
1196
- - The application remains unchanged at 43 files, 123,835 raw / 45,379 aggregate
1197
- gzip bytes, and deploy digest
1198
- `fb9d24cc01791bf80b67b659738ba62beded6ff6ce14a86a278fa4b34d088acf`.
1199
- - The maintained enhanced session remains 16 JavaScript files totaling 61,126
1200
- raw / 22,663 aggregate gzip bytes; `/help` remains 0 B JavaScript.
1201
- - No semantic primitive, IR kind, compiler pass, production compiler/runtime
1202
- line, runtime concept, layout registry, disposal path, or browser byte was
1203
- added.
1204
-
1205
- ### Validation
1206
-
1207
- - The machine-readable project contract records six reviewed route sets, zero
1208
- qualifying routes, no owner chain, and the reused ownership semantics.
1209
- - The full 273-test suite, package smoke, registry metadata, and fresh
1210
- installation are release gates.
1211
-
1212
- ### Limits
1213
-
1214
- Nested retained-layout owners remain unsupported. Reconsideration requires
1215
- three unrelated executable application routes proving the same intermediate
1216
- lifetime and explicit deepest-first disposal order.
1217
-
1218
- ### Upgrade
1219
-
1220
- ```sh
1221
- npm install @kudzujs/core@^0.12.4
1222
- ```
1223
-
1224
- ## 0.12.3 - Route Failure And Restoration Policy
1225
-
1226
- Kudzu 0.12.3 defines recovery for enhanced route failures without adding an
1227
- error-boundary renderer or client router.
1228
-
1229
- ### Changed in 0.12.3
1230
-
1231
- - Retained the current document when an enhanced navigation fetch or response
1232
- body fails in transit.
1233
- - Announced transport failure through the existing polite status and restored
1234
- focus to the initiating native link for explicit retry.
1235
- - Kept invalid document identity, missing capability modules, and missing
1236
- stylesheets on the existing native fallback path before route disposal.
1237
- - Proved retry after a failed pending prefetch and subsequent click request.
1238
- - Updated `create-kudzu@0.1.116` to generate projects on
1239
- `@kudzujs/core@^0.12.3`.
1240
-
1241
- ### Output Evidence
1242
-
1243
- - The application emits 43 files, 123,835 raw / 45,379 aggregate gzip bytes,
1244
- and deploy digest
1245
- `fb9d24cc01791bf80b67b659738ba62beded6ff6ce14a86a278fa4b34d088acf`.
1246
- - The maintained enhanced session uses 16 JavaScript files totaling 61,126 raw
1247
- / 22,663 aggregate gzip bytes, 359 raw bytes above `0.12.2`.
1248
- - `/help` remains complete HTML with 0 B JavaScript.
1249
- - No semantic primitive, compiler pass, core compiler line, runtime concept,
1250
- public API, error-boundary renderer, or browser file was added.
1251
-
1252
- ### Validation
1253
-
1254
- - Required Chrome proves retained fetch and body failures, accessible status,
1255
- restored link focus, retry, and native invalid-document/module/style fallback.
1256
- - Seven fresh Chrome profiles record a 1.8 ms navigation median with a 1.5-2.4
1257
- ms range. The host differs from `0.12.2`, so no latency change is claimed.
1258
- - The full 273-test suite, package smoke, registry metadata, and fresh
1259
- installation are release gates.
1260
-
1261
- ### Limits
1262
-
1263
- The retained-document policy covers classified transport failures. Invalid
1264
- documents and assets use native navigation; arbitrary corrupted generated mount
1265
- descriptors are outside this packet.
1266
-
1267
- ### Upgrade
1268
-
1269
- ```sh
1270
- npm install @kudzujs/core@^0.12.3
1271
- ```
1272
-
1273
- ## 0.12.2 - Authentication And Permission Boundary
1274
-
1275
- Kudzu 0.12.2 completes the project application's login, restoration,
1276
- permission-aware UI, server rejection, and logout journey using existing
1277
- application primitives.
1278
-
1279
- ### Changed in 0.12.2
1280
-
1281
- - Replaced the placeholder login route with a native constrained form and one
1282
- application-owned async submit handler.
1283
- - Added layout-owned token restoration, session validation, authenticated user
1284
- state, role-aware admin controls, and explicit logout.
1285
- - Added bearer authorization to project reads and mutations; the deterministic
1286
- server rejects missing tokens with 401 and member mutations with 403.
1287
- - Proved that protected static HTML is a UX shell while server authorization is
1288
- the security boundary.
1289
- - Updated `create-kudzu@0.1.115` to generate projects on
1290
- `@kudzujs/core@^0.12.2`.
1291
-
1292
- ### Output Evidence
1293
-
1294
- - The application emits 43 files, 123,476 raw / 45,305 aggregate gzip bytes,
1295
- and deploy digest
1296
- `81d0b3c5e0d1d1f72f29d219647601463f5317f215274e14a45fe5ba92eb033e`.
1297
- - The maintained enhanced session uses 16 JavaScript files totaling 60,767 raw
1298
- / 22,561 aggregate gzip bytes, 1,793 raw / 432 gzip bytes above `0.12.1`.
1299
- - The login route uses 12,093 raw / 5,795 aggregate gzip JavaScript bytes, while
1300
- `/help` remains complete HTML with 0 B JavaScript.
1301
- - No semantic primitive, compiler pass, core compiler line, runtime concept,
1302
- public API, auth runtime, or server was added to Kudzu.
1303
-
1304
- ### Validation
1305
-
1306
- - Required Chrome proves invalid and valid login, reload restoration, direct
1307
- anonymous and rejected entry, member/admin UI, server 401/403 responses,
1308
- token clearing, and logout.
1309
- - Seven fresh Chrome profiles record a 1.4 ms navigation median with a 1.2-1.5
1310
- ms range. The range overlaps `0.12.1`, so no latency change is claimed.
1311
- - The full suite, package smoke, registry metadata, and fresh installation are
1312
- release gates.
1313
-
1314
- ### Limits
1315
-
1316
- Client conditional rendering only controls presentation. Applications and
1317
- deployment hosts remain responsible for authorizing protected data and actions.
1318
-
1319
- ### Upgrade
1320
-
1321
- ```sh
1322
- npm install @kudzujs/core@^0.12.2
1323
- ```
1324
-
1325
- ## 0.12.1 - Shared Layout, History, Focus, And Scroll
1326
-
1327
- Kudzu 0.12.1 completes the accepted same-document project route group with
1328
- explicit history, focus, announcement, and scroll behavior.
1329
-
1330
- ### Changed in 0.12.1
1331
-
1332
- - Fixed non-hash enhanced navigation so the existing heading/main focus
1333
- fallback runs instead of treating an empty hash as a target.
1334
- - Proved push, back, and forward navigation with retained layout state and
1335
- freshly recreated route state.
1336
- - Added route titles, a native hash anchor, and an intrinsic hash destination to
1337
- the maintained project application.
1338
- - Proved polite navigation announcements, hash scrolling, top scrolling, and
1339
- browser-native links outside the configured route group.
1340
- - Updated `create-kudzu@0.1.114` to generate projects on
1341
- `@kudzujs/core@^0.12.1`.
1342
-
1343
- ### Output Evidence
1344
-
1345
- - The application emits 36 files, 106,096 raw / 38,201 aggregate gzip bytes,
1346
- and deploy digest
1347
- `4f1ce541af0794fcb17458ad37db7b32beb434f3a83cb7f949f13b3e4536fe1c`.
1348
- - The maintained enhanced session uses 16 JavaScript files totaling 58,974 raw
1349
- / 22,129 aggregate gzip bytes, 4 raw / 5 gzip bytes above `0.12.0`.
1350
- - `/help` remains complete HTML with 0 B JavaScript.
1351
- - No semantic primitive, compiler pass, core compiler line, runtime concept,
1352
- public API, or browser route registry was added.
1353
-
1354
- ### Validation
1355
-
1356
- - Required Chrome proves focused anchor activation, back/forward, layout
1357
- retention, route cleanup/reset, title/live updates, hash/heading focus, and
1358
- hash/top scroll behavior.
1359
- - Seven fresh Chrome profiles record a 1.3 ms navigation median with a 1.3-1.5
1360
- ms range. The range overlaps `0.12.0`, so no latency change is claimed.
1361
- - The full suite, package smoke, registry metadata, and fresh installation are
1362
- release gates.
1363
-
1364
- ### Limits
1365
-
1366
- Enhanced navigation remains explicit and route-group scoped. Routes outside the
1367
- group use browser-native document navigation.
1368
-
1369
- ### Upgrade
1370
-
1371
- ```sh
1372
- npm install @kudzujs/core@^0.12.1
1373
- ```
1374
-
1375
- ## 0.12.0 - Project Route Shell And Runtime Parameters
1376
-
1377
- Kudzu 0.12.0 opens the routing and application-lifetime train with directly
1378
- addressable project and issue routes.
1379
-
1380
- ### Changed in 0.12.0
1381
-
1382
- - Added bracket project and nested issue pages using supported React Router
1383
- `useParams()` migration syntax.
1384
- - Emitted complete fallback HTML and pathname parameter ESM for both routes.
1385
- - Preserved native project-to-issue links without an SPA route registry.
1386
- - Emitted ordered host rewrite records while retaining exact-file precedence.
1387
- - Updated `create-kudzu@0.1.113` to generate projects on
1388
- `@kudzujs/core@^0.12.0`.
1389
-
1390
- ### Output Evidence
1391
-
1392
- - The application emits 36 files, 105,577 raw / 38,067 aggregate gzip bytes,
1393
- and deploy digest
1394
- `6a6c5985cf2a7e9649b0bbd70506357051dac995a74225b0022c5f1ecedaf2b8`.
1395
- - The standalone project route uses 17,905 raw / 8,455 aggregate gzip
1396
- JavaScript bytes; the issue route uses 18,002 raw / 8,474 aggregate gzip.
1397
- - The maintained enhanced session remains byte-identical at 58,970 raw /
1398
- 22,124 aggregate gzip bytes, and `/help` remains 0 B JavaScript.
1399
- - No semantic primitive, compiler pass, production compiler line, runtime
1400
- concept, server, or browser route registry was added.
1401
-
1402
- ### Validation
1403
-
1404
- - Required Chrome proves direct project and issue entry plus issue reload.
1405
- - The parameter module rejects invalid encoded path segments before mounting.
1406
- - The full suite, package smoke, registry metadata, and fresh installation are
1407
- release gates.
1408
-
1409
- ### Limits
1410
-
1411
- The deployment host must install the generated runtime rewrites. Exact emitted
1412
- files must be checked before those fallbacks.
1413
-
1414
- ### Upgrade
1415
-
1416
- ```sh
1417
- npm install @kudzujs/core@^0.12.0
1418
- ```
1419
-
1420
- ## 0.11.4 - Pagination, Refresh, And Polling Policy
1421
-
1422
- Kudzu 0.11.4 completes the `0.11.x` server-data train with bounded URL-owned
1423
- pagination and application-owned refresh policy.
1424
-
1425
- ### Changed in 0.11.4
1426
-
1427
- - Synchronized project page/filter values with URL query signals and browser
1428
- back navigation.
1429
- - Proved explicit refresh and exact list request counts without a query cache.
1430
- - Added optional visibility-aware polling with interval/listener cleanup.
1431
- - Bounded every server response to two retained rows.
1432
- - Updated `create-kudzu@0.1.112` to generate projects on
1433
- `@kudzujs/core@^0.11.4`.
1434
-
1435
- ### Output Evidence
1436
-
1437
- - The application emits 20 files, 77,263 raw / 26,156 aggregate gzip bytes, and
1438
- deploy digest
1439
- `a3864a5155d658e86378fce80de94e082ef0894c5db5f5793d91b4de7f359b46`.
1440
- - The list/detail session uses 16 JavaScript files totaling 58,970 raw / 22,124
1441
- aggregate gzip bytes; `/help` remains 0 B JavaScript.
1442
- - Twenty-one fresh Chrome profiles record a 1.3 ms navigation median and
1443
- 1.2/1.6 ms range.
1444
- - No semantic primitive, compiler pass, production compiler line, runtime
1445
- concept, cache, retained result store, or scheduler was added.
1446
-
1447
- ### Validation
1448
-
1449
- - Required Chrome proves query push/back, bounded results, exact requests,
1450
- refresh, hidden polling suppression, visible refresh, and cleanup.
1451
- - The full suite, package smoke, registry metadata, and fresh installation are
1452
- release gates.
1453
-
1454
- ### Limits
1455
-
1456
- Polling remains authored route policy. Kudzu does not ship a universal
1457
- scheduler, request registry, invalidation graph, or retained query cache.
1458
-
1459
- ### Upgrade
1460
-
1461
- ```sh
1462
- npm install @kudzujs/core@^0.11.4
1463
- ```
1464
-
1465
- ## 0.11.3 - Optimistic Mutation And Rollback
1466
-
1467
- Kudzu 0.11.3 proves optimistic server mutation with ordinary shared state and
1468
- one owned async handler rather than a transaction runtime.
1469
-
1470
- ### Changed in 0.11.3
1471
-
1472
- - Added immediate optimistic project name/revision updates visible from list and
1473
- detail routes.
1474
- - Disabled duplicate submission after the synchronous-turn optimistic commit.
1475
- - Restored the exact prior state after an HTTP 500 and exposed an accessible
1476
- error.
1477
- - Proved retry success, retained keyed row identity, enhanced navigation, and
1478
- server restoration after document reload.
1479
- - Updated `create-kudzu@0.1.111` to generate projects on
1480
- `@kudzujs/core@^0.11.3`.
1481
-
1482
- ### Output Evidence
1483
-
1484
- - The application emits 19 files, 73,202 raw / 25,057 aggregate gzip bytes, and
1485
- deploy digest
1486
- `40c68fef4eeba5ea4c1a92e9a8003b74e6a45b7a10671ee2f3e4952010117b26`.
1487
- - The list/detail session uses 15 unique JavaScript files totaling 56,318 raw /
1488
- 21,211 aggregate gzip bytes; `/help` remains 0 B JavaScript.
1489
- - Twenty-one fresh Chrome profiles record a 0.8 ms navigation median and
1490
- 0.7/1.0 ms range.
1491
- - No semantic primitive, compiler pass, production compiler line, runtime
1492
- concept, transaction primitive, cache, or scheduler was added.
1493
-
1494
- ### Validation
1495
-
1496
- - Required Chrome proves optimistic state, one accepted attempt after failure,
1497
- exact rollback, retry, identity, navigation, and reload.
1498
- - The full suite, package smoke, registry metadata, and fresh installation are
1499
- release gates.
1500
-
1501
- ### Limits
1502
-
1503
- The authored handler owns one mutation and snapshot. Generic transactions and
1504
- same-turn programmatic reentrancy are not application semantics.
1505
-
1506
- ### Upgrade
1507
-
1508
- ```sh
1509
- npm install @kudzujs/core@^0.11.3
1510
- ```
1511
-
1512
- ## 0.11.2 - Request Coordination Evidence
1513
-
1514
- Kudzu 0.11.2 reviews three unrelated server-data fixtures and closes shared
1515
- request coordination without adding a new semantic primitive.
1516
-
1517
- ### Changed in 0.11.2
1518
-
1519
- - Reviewed the project application, TanStack Query-shaped product loading, and
1520
- Apache Answer/SWR-shaped question loading.
1521
- - Machine-recorded that all three use one explicit owner, ordinary state, one
1522
- owned fetch effect, dependency invalidation, cleanup, and static exclusion.
1523
- - Recorded no repeated same-key independent owners, subscriber lifetime,
1524
- mutation invalidation, retained query result, or cache-bound requirement.
1525
- - Updated `create-kudzu@0.1.110` to generate projects on
1526
- `@kudzujs/core@^0.11.2`.
1527
-
1528
- ### Output Evidence
1529
-
1530
- - The project application remains byte-identical at 20 files, 69,501 raw /
1531
- 24,649 aggregate gzip bytes, and deploy digest
1532
- `bc6335131b7867da2857621211919fad43ebfb9414aac711c45f0c8ed3803022`.
1533
- - The list/detail session remains 55,736 raw / 21,208 aggregate gzip JavaScript
1534
- bytes; `/help` remains 0 B JavaScript.
1535
- - No semantic primitive, compiler pass, production compiler line, runtime
1536
- concept, request registry, subscriber set, invalidation graph, cache, or
1537
- browser byte was added.
1538
-
1539
- ### Validation
1540
-
1541
- - Existing required-Chrome journeys remain the executable evidence for all
1542
- three reviewed fixtures.
1543
- - The full suite, package smoke, registry metadata, and fresh installation are
1544
- release gates.
1545
-
1546
- ### Limits
1547
-
1548
- Automatic same-key deduplication and retained query data remain unsupported.
1549
- They require repeated executable pressure from independent owners before a
1550
- shared primitive can be reconsidered.
1551
-
1552
- ### Upgrade
1553
-
1554
- ```sh
1555
- npm install @kudzujs/core@^0.11.2
1556
- ```
1557
-
1558
- ## 0.11.1 - List/Detail Data Consistency
1559
-
1560
- Kudzu 0.11.1 proves that ordinary layout-owned state and one native fetch effect
1561
- keep list and detail routes consistent without a query framework.
1562
-
1563
- ### Changed in 0.11.1
1564
-
1565
- - Added one server-backed project record owned by the retained application
1566
- layout and consumed by both project routes.
1567
- - Added a detail mutation whose confirmed result is immediately observed by the
1568
- list without another read.
1569
- - Counted exactly one initial GET, one mutation POST, no navigation GETs, and one
1570
- document-reload GET.
1571
- - Recorded document-lifetime retention and the absence of automatic
1572
- deduplication, invalidation, subscribers, and retained query caches.
1573
- - Updated `create-kudzu@0.1.109` to generate projects on
1574
- `@kudzujs/core@^0.11.1`.
1575
-
1576
- ### Output Evidence
1577
-
1578
- - The application fixture emits 20 files, 69,501 raw / 24,649 aggregate gzip
1579
- bytes, and deploy digest
1580
- `bc6335131b7867da2857621211919fad43ebfb9414aac711c45f0c8ed3803022`.
1581
- - The list/detail session uses 16 unique JavaScript files totaling 55,736 raw /
1582
- 21,208 aggregate gzip bytes; `/help` remains 0 B JavaScript.
1583
- - Twenty-one fresh Chrome profiles record a 0.9 ms navigation median and
1584
- 0.7/1.2 ms range after both initial fetches complete.
1585
- - No semantic primitive, compiler pass, production compiler line, runtime
1586
- concept, request registry, or query runtime was added.
1587
-
1588
- ### Validation
1589
-
1590
- - Required Chrome proves mutation visibility, exact request counts, retained
1591
- layout identity, route release, and server restoration after reload.
1592
- - The full suite, package smoke, registry metadata, and fresh installation are
1593
- release gates.
1594
-
1595
- ### Limits
1596
-
1597
- Shared data lasts for one document and retained layout owner. Independently
1598
- authored fetch owners are not deduplicated; coordinated requests remain blocked
1599
- until unrelated fixtures require the same missing contract.
1600
-
1601
- ### Upgrade
1602
-
1603
- ```sh
1604
- npm install @kudzujs/core@^0.11.1
1605
- ```
1606
-
1607
- ## 0.11.0 - Owned Fetch Lifecycle
1608
-
1609
- Kudzu 0.11.0 proves browser-only server data as application-owned state, one
1610
- native fetch effect, and exact route lifetime rather than a query framework.
1611
-
1612
- ### Changed in 0.11.0
1613
-
1614
- - Added accessible loading, success, and HTTP error states to the maintained
1615
- project application.
1616
- - Added explicit refetch and recovery through one primitive request dependency.
1617
- - Proved that a delayed prior continuation cannot overwrite newer keyed data.
1618
- - Added authored `AbortController` cleanup for dependency replacement and route
1619
- removal, with late route work denied state authority.
1620
- - Updated `create-kudzu@0.1.108` to generate projects on
1621
- `@kudzujs/core@^0.11.0`.
1622
-
1623
- ### Output Evidence
1624
-
1625
- - The application fixture emits 19 files, 67,886 raw / 24,077 aggregate gzip
1626
- bytes, and deploy digest
1627
- `9c06d2a5d47b4ea2ae54cebbc0448bf161907691ee37a02a5dae0e7c37779ae4`.
1628
- - The list/detail session uses 15 unique JavaScript files totaling 54,770 raw /
1629
- 20,763 aggregate gzip bytes; `/help` remains 0 B JavaScript.
1630
- - Twenty-one fresh Chrome profiles record a 0.8 ms navigation median and
1631
- 0.6/1.3 ms range after fetch completion and persisted workspace setup.
1632
- - No semantic primitive, compiler pass, production compiler line, runtime
1633
- concept, cache, Provider, retry scheduler, or query runtime was added.
1634
-
1635
- ### Validation
1636
-
1637
- - Required Chrome proves loading, stale completion rejection, accessible HTTP
1638
- failure, recovery, cancellation, and route-removal authority loss.
1639
- - The full suite, package smoke, registry metadata, and fresh installation are
1640
- release gates.
1641
-
1642
- ### Limits
1643
-
1644
- Shared request deduplication, invalidation, optimistic mutation, retries,
1645
- polling, and retained caches remain later evidence packets.
1646
-
1647
- ### Upgrade
1648
-
1649
- ```sh
1650
- npm install @kudzujs/core@^0.11.0
1651
- ```
1652
-
1653
- ## 0.10.3 - Application-Owned Persistence
1654
-
1655
- Kudzu 0.10.3 proves guarded browser persistence as application code composed
1656
- from ordinary state, effects, and native Web Storage.
1657
-
1658
- ### Changed in 0.10.3
1659
-
1660
- - Added a versioned workspace restore recipe with deterministic static fallback
1661
- and exact value/schema/version validation.
1662
- - Added a readiness guard so dependency persistence cannot overwrite storage
1663
- before mount restoration completes.
1664
- - Added application-owned logout clearing and visible state reset in one native
1665
- handler.
1666
- - Added required-Chrome cases for valid, absent, malformed, wrong-schema, and
1667
- wrong-version records, persistence writes, and logout removal.
1668
- - Updated `create-kudzu@0.1.107` to generate projects on
1669
- `@kudzujs/core@^0.10.3`.
1670
-
1671
- ### Output Evidence
1672
-
1673
- - The application fixture emits 19 files, 65,376 raw / 23,471 aggregate gzip
1674
- bytes, and deploy digest
1675
- `bb58826876bdf090a85d2c1f8a1edcbbc9abd35d5335eb3d1e7fb1fafe6bed72`.
1676
- - The list/detail session uses 15 unique JavaScript files totaling 53,562 raw /
1677
- 20,323 aggregate gzip bytes; `/help` remains 0 B JavaScript.
1678
- - Matched 21-profile navigation medians are 1.9 ms for 0.10.2 and 1.5 ms for
1679
- 0.10.3 with overlapping ranges, so no latency change is claimed.
1680
- - No semantic primitive, compiler pass, production compiler line, runtime
1681
- concept, persistence API, store, or storage runtime was added.
1682
-
1683
- ### Validation
1684
-
1685
- - Required Chrome proves restore, fallback, write, clear, conditional/keyed
1686
- release and fresh remount, route draft reset, and fresh direct documents.
1687
- - The full suite, package smoke, registry metadata, and fresh installation are
1688
- release gates.
1689
-
1690
- ### Limits
1691
-
1692
- Schema migration chains, expiry, encryption, cross-tab storage events, and
1693
- server synchronization remain application concerns or later evidence packets.
1694
-
1695
- ### Upgrade
1696
-
1697
- ```sh
1698
- npm install @kudzujs/core@^0.10.3
1699
- ```
1700
-
1701
- ## 0.10.2 - Shared-layout navigation
1702
-
1703
- Kudzu 0.10.2 extends the tracked project-management application with explicit
1704
- list/detail navigation, layout-owned workspace state, and route-owned drafts
1705
- using the existing navigation and shared-state semantics.
1706
-
1707
- ### Changed in 0.10.2
1708
-
1709
- - Added one Context-backed application layout that lowers through existing
1710
- `SharedStateIR` and persists workspace selection across list/detail routes.
1711
- - Added an exact Alpha detail route whose draft state releases on navigation and
1712
- initializes fresh on revisit and direct document load.
1713
- - Added a maintained seven-profile list-to-detail navigation benchmark with
1714
- session JavaScript and lifetime metadata.
1715
- - Kept `/help` and `/login` outside the navigation group; `/help` remains a
1716
- complete zero-JavaScript native-navigation target.
1717
- - Updated `create-kudzu@0.1.106` to generate projects on
1718
- `@kudzujs/core@^0.10.2`.
1719
-
1720
- ### Output Evidence
1721
-
1722
- - The application fixture emits 14 files, 57,293 raw / 19,985 aggregate gzip
1723
- bytes, and deploy digest
1724
- `1c867ee7119f7eb23b935c4506c2a46639acb75c13f0916b29c255421b0d123d`.
1725
- - The list/detail session uses 10 unique JavaScript files totaling 46,418 raw /
1726
- 17,045 aggregate gzip bytes; `/help` remains 0 B JavaScript.
1727
- - Seven fresh Chrome profiles record list-to-detail completion at a 2.3 ms
1728
- median, with 1.3/6.5 ms minimum/maximum.
1729
- - No semantic primitive, compiler pass, production compiler line, runtime
1730
- concept, store, or SPA router was added.
1731
-
1732
- ### Validation
1733
-
1734
- - Required Chrome proves layout identity and workspace persistence in both
1735
- directions, route DOM release, fresh draft state, and direct-load reset.
1736
- - The full suite, required-Chrome application journey, package smoke, registry
1737
- metadata, and fresh installation are release gates.
1738
-
1739
- ### Limits
1740
-
1741
- Navigation remains explicit and group-scoped with complete-document fallback.
1742
- This release does not add a universal SPA router, persistence, authentication,
1743
- server data, or cross-group shared state.
1744
-
1745
- ### Upgrade
1746
-
1747
- ```sh
1748
- npm install @kudzujs/core@^0.10.2
1749
- ```
1750
-
1751
- ## 0.10.1 - Application state scale
1752
-
1753
- Kudzu 0.10.1 extends the tracked project-management journey across ordinary
1754
- primitive, object, array, derived, conditional, nested keyed, and row-local
1755
- state while retaining static-first output and existing browser capabilities.
1756
-
1757
- ### Changed in 0.10.1
1758
-
1759
- - Added deterministic workspace summary replacement, project filtering, saved
1760
- filters, nested issue updates, conditional summary ownership, and keyed row
1761
- state release/remount to the greenfield application contract.
1762
- - Added a maintained 1/8/32-state Chrome commit benchmark with exact `v0.10.0`
1763
- deploy comparison and runtime metadata.
1764
- - Kept direct object-field nested-list replacement outside the accepted boundary
1765
- after the isolated experiment failed browser replacement.
1766
- - Updated `create-kudzu@0.1.105` to generate projects on
1767
- `@kudzujs/core@^0.10.1`.
1768
-
1769
- ### Output Evidence
1770
-
1771
- - The application fixture emits 12 files, 47,546 raw / 16,285 aggregate gzip
1772
- bytes, and deploy digest
1773
- `d50c9ff6dccba338559dd9e9141c4607ec62da30385658e617a86f7af3f52e0f`.
1774
- - `/app/projects` emits 39,178 raw / 14,143 aggregate gzip JavaScript bytes;
1775
- `/help` remains 0 B JavaScript.
1776
- - The generated scale deploy is byte-identical to `v0.10.0`; 1/8/32-state
1777
- commit medians are 0.5/0.6/0.9 ms across seven fresh Chrome processes.
1778
- - No semantic primitive, compiler pass, browser runtime concept, normalized
1779
- state, or generic rerender path was added.
1780
-
1781
- ### Validation
1782
-
1783
- - Required Chrome verifies derived updates, nested keyed identity, conditional
1784
- release/remount, keyed row state reset, and zero unrelated DOM mutations.
1785
- - `npm run check`, the complete test suite, required-Chrome application test,
1786
- package smoke, registry metadata, and fresh installation are release gates.
1787
-
1788
- ### Limits
1789
-
1790
- This release does not support direct object-field nested-list replacement,
1791
- arbitrary object mutation, normalized state, shared layout state, persistence,
1792
- authentication, or server data.
1793
-
1794
- ### Upgrade
1795
-
1796
- ```sh
1797
- npm install @kudzujs/core@^0.10.1
1798
- ```
1799
-
1800
- ## 0.10.0 - Application capability baseline
1801
-
1802
- Kudzu 0.10.0 begins the application capability release train with a durable
1803
- greenfield project-management contract. Later state, data, routing, form, list,
1804
- overlay, external UI, lifecycle, lazy-loading, migration, and AI work must extend
1805
- this application or another explicit evidence packet rather than claim success
1806
- from isolated build output.
1807
-
1808
- ### Changed in 0.10.0
1809
-
1810
- - Added tracked `/login`, `/app/projects`, and `/help` greenfield application
1811
- routes with a machine-readable capability contract.
1812
- - Reused the existing primitive state command and direct text output without a
1813
- compiler pass, Handler ESM, new semantic primitive, or new runtime concept.
1814
- - Added a dedicated browser journey for the project-state interaction and a
1815
- static help control that emits no JavaScript.
1816
- - Established the capability-by-minor and evidence-packet-by-patch release plan
1817
- through the `1.0.0` application and AI delivery gate.
1818
- - Updated `create-kudzu@0.1.104` to generate projects on
1819
- `@kudzujs/core@^0.10.0`.
1820
-
1821
- ### Output Evidence
1822
-
1823
- - The greenfield fixture emits 4 deploy files, 1,970 raw bytes, 1,265 aggregate
1824
- gzip bytes, and deploy digest
1825
- `94ce7d01cac2e80823a36279294015d2f22328acaed571abb9996f8ca6171121`.
1826
- - `/app/projects` uses the existing 768 raw / 441 aggregate gzip byte command
1827
- runtime graph.
1828
- - `/help` emits complete HTML and 0 B JavaScript.
1829
- - Production semantic primitives, compiler passes, compiler LOC, and runtime
1830
- concepts are unchanged.
1831
-
1832
- ### Validation
1833
-
1834
- - The focused greenfield browser contract passes in Chrome.
1835
- - `npm run check`, all 273 non-browser tests, all 273 required-Chrome tests, and
1836
- `npm run test:package` pass on the release worktree.
1837
- - No performance comparison is claimed because production compiler and runtime
1838
- sources are unchanged; the exact fixture output baseline is executable.
1839
-
1840
- ### Limits
1841
-
1842
- This release does not claim project CRUD, authentication, server data, shared
1843
- layout state, or a complete large application. Those remain ordered capability
1844
- packets beginning with `0.10.1`.
1845
-
1846
- ### Upgrade
1847
-
1848
- ```sh
1849
- npm install @kudzujs/core@^0.10.0
1850
- ```
1851
-
1852
- ## 0.9.3 - Large-app migration slices
1853
-
1854
- Kudzu 0.9.3 adds evidence-backed compiler and source-migration paths derived
1855
- from Apache Answer while preserving static-first output and fail-closed package
1856
- boundaries.
1857
-
1858
- ### Changed in 0.9.3
1859
-
1860
- - Exact static React Router `useMatch()` folds from the build-known route with
1861
- zero browser JavaScript.
1862
- - React Router query reads support numeric pagination and static imported-string
1863
- fallbacks, including reactive effect dependencies and read-only `popstate`.
1864
- - React Bootstrap `Row` and `Col` lower to native grid markup, including numeric
1865
- literal breakpoint spans from 1 through 12.
1866
- - Owned native fetch effects compose URL dependencies, stale-response isolation,
1867
- loading/error/data state, and nested keyed results without SWR or axios.
1868
- - Reduced shared-authentication build intake and route-shell, authoring, and
1869
- admin fixtures prove package-neutral paths with static sibling exclusion.
1870
- - Runtime-resource `react-i18next` receives an actionable locale-ownership
1871
- diagnostic rather than silently folding English or shipping i18next.
1872
-
1873
- ### Validation
1874
-
1875
- - Apache Answer-derived positive and negative fixtures cover router, query,
1876
- layout, data, authentication, route-shell, authoring, and admin boundaries.
1877
- - Static layout/legal/public siblings remain JavaScript-free.
1878
- - `npm run check`, `npm test`, and `npm run test:package` pass on the release
1879
- worktree.
1880
-
1881
- ### Limits
1882
-
1883
- This release does not claim a complete Apache Answer migration. Runtime i18n,
1884
- rich CodeMirror ownership, upload progress, broader React Bootstrap compounds,
1885
- plugins, AI screens, and all-route acceptance remain separate evidence gates.
1886
-
1887
- ### Upgrade
1888
-
1889
- ```sh
1890
- npm install @kudzujs/core@^0.9.3
1891
- ```
1892
-
1893
- ## 0.9.2 - Legacy CSS safety
1894
-
1895
- Kudzu 0.9.2 prevents pre-0.8.53 applications from silently producing an
1896
- unstyled deploy after upgrading to route-aware CSS ownership.
1897
-
1898
- ### Changed in 0.9.2
1899
-
1900
- - When no route imports CSS and `kudzu.config styles` is empty, source CSS is
1901
- linked globally in deterministic path order using the legacy behavior.
1902
- - The build prints an actionable warning directing applications to explicit
1903
- source imports or global configuration.
1904
- - Projects with any explicit CSS ownership retain unchanged route-aware output;
1905
- the fallback adds no browser JavaScript or explicit-path build work.
1906
-
1907
- ### Validation
1908
-
1909
- - A two-route legacy fixture emits both unimported styles on both routes in path
1910
- order and keeps both routes JavaScript-free.
1911
- - Configured global styles and explicit source-style tests retain their existing
1912
- output.
1913
- - `npm run check`, `npm test`, and `npm run test:package` pass with 254 tests.
1914
-
1915
- ### Upgrade
1916
-
1917
- ```sh
1918
- npm install @kudzujs/core@^0.9.2
1919
- ```
1920
-
1921
- ## 0.9.1 - Positional primitive lists
1922
-
1923
- Kudzu 0.9.1 allows JSON-safe primitive values in lists keyed by their authored
1924
- position while retaining the plain-object requirement for property-keyed rows.
1925
-
1926
- ### Changed in 0.9.1
1927
-
1928
- - Build and browser list validation now accept primitive positional rows.
1929
- - Compact object-row serialization ignores primitive arrays instead of treating
1930
- their values as object records.
1931
- - Lupin-derived fixtures prove realtime rooms, lobby and private-room entry,
1932
- stopwatch ownership, chat and spectator replacement, Canvas/RAF input,
1933
- IME handling, panic shortcuts, and exact cleanup without a game runtime.
1934
-
1935
- ### Validation
1936
-
1937
- - Static sibling routes remain complete HTML with zero JavaScript.
1938
- - `npm run check`, `npm test`, and `npm run test:package` pass with 253 tests.
1939
-
1940
- ### Upgrade
1941
-
1942
- ```sh
1943
- npm install @kudzujs/core@^0.9.1
1944
- ```
1945
-
1946
- ## 0.9.0 - Semantic compression
1947
-
1948
- Kudzu 0.9.0 consolidates evidence-backed React migration shapes onto the existing signal, handler, effect, component-ownership, and keyed-list semantics without adding React, hydration, a VDOM, or a retained browser component tree.
1949
-
1950
- ### Changed in 0.9.0
1951
-
1952
- - Relative calculated result fields, Context and reduced Zustand actions, object-property component consumers, custom hooks, refs, and multi-boundary callbacks specialize through existing package-neutral IR and ownership.
1953
- - Keyed row state, effects, refs, conditions, nested collections, SVG, and reactive selectors preserve identity and cleanup with route-specific capabilities only.
1954
- - One-shot production builds intern repeated route descriptors, stream plan evidence, release standalone plans, and stage rendered HTML until runtime families are known.
1955
- - `create-kudzu@0.1.103` generates projects on the `@kudzujs/core@^0.9.0` line.
1956
-
1957
- ### Performance
1958
-
1959
- - The frozen 21-profile C2 matrix passes all 19 behavior and ownership checks; row filter is faster than Vue, while row restore and search restore are within 3.5% and 1.8% of their nearest comparators.
1960
- - At 10,000 products Kudzu emits 10,011 accepted pages with cold/warm medians of 22,614.0 / 22,150.6 ms and 542,484 KiB peak RSS, versus Astro's 23,198.1 / 23,438.2 ms and 612,412 KiB.
1961
- - Static C1 routes ship zero JavaScript, and C5 Worker replacement/disposal finishes with balanced ownership and zero stale mutations or active handles.
1962
-
1963
- ### Validation
1964
-
1965
- - `npm run check` and all 246 required-Chrome tests pass.
1966
- - Fresh-install package smoke and maintained production benchmarks pass.
1967
- - The 10,000-product deploy remains 96,379,876 B with SHA-256 `811234693329ebd61eeceb6cd05e5d52473e5c81972a820253bf1aea664a0910`.
1968
-
1969
- ### Upgrade
1970
-
1971
- ```sh
1972
- npm install @kudzujs/core@^0.9.0
1973
- ```
1974
-
1975
- ## 0.8.62 - Outside-click hook ownership
1976
-
1977
- Kudzu 0.8.62 compiles the ClimateCompatibleGrowth `createRef()` and parameterized outside-click custom-hook shape through existing DOM-ref, effect-capture, and cleanup ownership.
1978
-
1979
- ### Changed in 0.8.62
1980
-
1981
- - A direct component `const ref = createRef<T>()` React migration input lowers to Kudzu's existing `useRef(null)` DOM ownership.
1982
- - A relative outside-click hook may accept that direct ref and one inline direct literal setter callback.
1983
- - The compiler specializes the callback into a serializable setter plus literal and retains only the ref, setter, and literal in existing effect scope.
1984
-
1985
- ### Boundaries
1986
-
1987
- - The hook must own one static `document` `mousedown` listener, test `ref.current.contains(event.target)`, and remove the same listener in cleanup.
1988
- - Ref aliases, callback aliases or captures, dynamic event names, multiple refs/listeners, and mismatched cleanup remain rejected.
1989
- - No outside-click, listener, ref, or callback runtime is added.
1990
-
1991
- ### Validation
1992
-
1993
- - A fixture reduced from ClimateCompatibleGrowth's MIT-licensed `useOutsideClickAlerter.ts` preserves its parameterized source shape.
1994
- - Browser coverage proves inside-click retention, outside-click closure, exact listener cleanup on conditional removal, and fresh remount ownership.
1995
- - A static sibling remains zero JavaScript and mismatched cleanup remains fail-closed.
1996
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 233 tests and 174 generated pages.
1997
-
1998
- ### Upgrade
1999
-
2000
- ```sh
2001
- npm install @kudzujs/core@^0.8.62
2002
- ```
2003
-
2004
- ## 0.8.61 - Parameterized debounce hooks
2005
-
2006
- Kudzu 0.8.61 compiles the common relative `useDebounce(state, literalDelay)` custom-hook shape through existing state and effect ownership.
2007
-
2008
- ### Changed in 0.8.61
2009
-
2010
- - A named or default relative synchronous hook may accept one direct primitive state value and one numeric literal delay.
2011
- - The hook may initialize one state from that value, own one timeout dependency effect with exact cleanup, and directly return the debounced state.
2012
- - The compiler preserves the source signal dependency, treats the literal delay as stable scope, and initializes the debounced signal from the source signal's build value.
2013
-
2014
- ### Boundaries
2015
-
2016
- - The hook body must be the direct `useState(value)`, `useEffect()`, and returned-state shape proven by the ClimateCompatibleGrowth fixture.
2017
- - Dynamic delays, non-primitive source state, aliases, additional statements/effects, intervals, and missing timeout cleanup remain rejected.
2018
- - No debounce/timer runtime, component tree, hydration, or new effect capability is added.
2019
-
2020
- ### Validation
2021
-
2022
- - A fixture reduced from ClimateCompatibleGrowth's MIT-licensed `useDebouce.ts` preserves its generic parameterized custom-hook source shape.
2023
- - Browser coverage proves rapid replacement, pending-timeout cleanup on conditional removal, fresh remount state, and latest-value commit.
2024
- - A static sibling remains zero JavaScript and dynamic delay input fails at its authored call site.
2025
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 230 tests and 174 generated pages.
2026
-
2027
- ### Upgrade
2028
-
2029
- ```sh
2030
- npm install @kudzujs/core@^0.8.61
2031
- ```
2032
-
2033
- ## 0.8.60 - Array draft effect sync
2034
-
2035
- Kudzu 0.8.60 lets a specialized child synchronize direct prop-derived array draft state through the matching parent setter in an ordinary dependency effect.
2036
-
2037
- ### Changed in 0.8.60
2038
-
2039
- - `useEffect(() => { setSelectedItems(items) }, [items, setSelectedItems])` compiles for the matching direct array prop-draft specialization.
2040
- - The compiler proves the parent state/setter pair, removes the stable setter dependency, and tracks the child array state through existing `Object.is` effect scheduling.
2041
- - Parent replacement still does not synchronize the independently owned child draft; the next authored child-state replacement reruns the effect.
2042
-
2043
- ### Boundaries
2044
-
2045
- - The effect must be top-level, synchronous, inline, and contain exactly one direct setter call with exact `[state, setter]` dependencies.
2046
- - Setter aliases, composed values, mismatched parent state/setter pairs, cleanup, and additional callback uses remain rejected.
2047
- - Object and derived array dependencies remain unchanged; no runtime module, EffectIR kind, component tree, or automatic prop synchronization is added.
2048
-
2049
- ### Validation
2050
-
2051
- - The ClimateCompatibleGrowth-derived dropdown now preserves its authored setter effect shape.
2052
- - Browser coverage proves initial setup, child replacement commit, independent parent reset, and effect rerun; a static sibling remains zero JavaScript.
2053
- - Existing effect ownership and object-dependency diagnostics remain covered.
2054
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 228 tests and 174 generated pages.
2055
-
2056
- ### Upgrade
2057
-
2058
- ```sh
2059
- npm install @kudzujs/core@^0.8.60
2060
- ```
2061
-
2062
- ## 0.8.59 - Array prop draft state
2063
-
2064
- Kudzu 0.8.59 lets a specialized child initialize independent local array draft state directly from one parent array-state prop while preserving an authored direct `set*` setter prop.
2065
-
2066
- ### Changed in 0.8.59
2067
-
2068
- - `const [draft, setDraft] = useState(selectedItems)` compiles when `selectedItems` is one direct prop backed by a parent `useState([...])` literal.
2069
- - A direct parent setter may enter that prop-draft specialization through an `on*` prop or an authored `set*` prop such as `setSelectedItems`.
2070
- - Parent and child retain distinct state IDs and independently serialized arrays.
2071
- - Mounted drafts remain local until the authored handler explicitly commits them to parent state.
2072
-
2073
- ### Boundaries
2074
-
2075
- - `set*` support is limited to prop-derived state components; unrelated effect setter props retain their existing path.
2076
- - Additional forwarding remains `on*`-only.
2077
- - Aliases, property paths, array spreads, composed expressions, indirect callbacks, and automatic prop synchronization remain rejected.
2078
- - No runtime module, VDOM, hydration, or retained component tree is added.
2079
-
2080
- ### Validation
2081
-
2082
- - A fixture reduced from ClimateCompatibleGrowth's MIT-licensed teaching-kit `Dropdown` preserves its direct `selectedItems` and `setSelectedItems` source shape.
2083
- - Browser coverage proves child draft independence, parent replacement without draft synchronization, explicit commit, and a static zero-JavaScript sibling.
2084
- - Existing conditional-effect `setResult` props remain outside setter-callback specialization.
2085
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 225 tests and 174 generated pages.
2086
-
2087
- ### Upgrade
2088
-
2089
- ```sh
2090
- npm install @kudzujs/core@^0.8.59
2091
- ```
2092
-
2093
- ## 0.8.58 - Keyed item draft state
2094
-
2095
- Kudzu 0.8.58 lets a keyed row initialize independent local object draft state directly from its keyed item prop.
2096
-
2097
- ### Changed in 0.8.58
2098
-
2099
- - `const [draft, setDraft] = useState(todo)` compiles when `todo` is the direct item prop of a keyed row.
2100
- - RouteIR marks the state with a narrow `list-item` initializer descriptor.
2101
- - New keys clone the current item into existing key-scoped row-state ownership without a component runtime.
2102
- - Retained keys preserve their draft state and DOM identity through item updates and reorder.
2103
-
2104
- ### Boundaries
2105
-
2106
- - Removing a key releases its draft; re-adding that key creates a fresh draft from the current item.
2107
- - Aliases, property paths, composed expressions, and indirect item props remain rejected.
2108
- - This does not add prop-to-state synchronization, array prop drafts, a VDOM, hydration, or a retained component tree.
2109
- - Static sibling routes remain complete HTML with zero JavaScript.
2110
-
2111
- ### Validation
2112
-
2113
- - The Todo reducer fixture proves independent row drafts, retained draft and DOM identity through reorder, exact removal, and fresh remount initialization.
2114
- - A dedicated alias fixture remains fail-closed with a source-located diagnostic.
2115
- - RouteIR records the `list-item` initializer and capability planning emits the existing complex row-state path only where required.
2116
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 224 tests and 173 generated pages.
2117
-
2118
- ### Upgrade
2119
-
2120
- ```sh
2121
- npm install @kudzujs/core@^0.8.58
2122
- ```
2123
-
2124
- ## 0.8.57 - Plain-object prop draft state
2125
-
2126
- Kudzu 0.8.57 lets a specialized setter-callback child initialize independent local draft state directly from one parent state prop authored with a JSON-safe plain-object literal.
2127
-
2128
- ### Changed in 0.8.57
2129
-
2130
- - `const [draft, setDraft] = useState(value)` compiles when `value` is one direct prop backed by a parent `useState({ ... })` literal.
2131
- - The existing parent SignalIR remains structural input while the child receives its own state slot and setter ownership.
2132
- - Direct primitive prop initialization and primitive-only zero-argument `.toString()` retain their existing behavior.
2133
- - The source compiler reuses its serializable literal proof; ModuleIR, RouteIR, runtime modules, and browser ABI are unchanged.
2134
-
2135
- ### Boundaries
2136
-
2137
- - Parent arrays, aliases, property paths, composed expressions, lazy values, and object `.toString()` remain rejected.
2138
- - The callback must still follow the existing direct setter-callback specialization and three-boundary limit.
2139
- - This is an object-editor migration slice, not automatic prop-to-state synchronization or a general clone runtime.
2140
- - Static siblings remain complete HTML with zero JavaScript.
2141
-
2142
- ### Validation
2143
-
2144
- - A FIRE-derived editor proves that changing the child object draft leaves the parent unchanged until the authored save callback commits it.
2145
- - Focused RouteIR coverage records separate, equal JSON-safe initial objects for parent and child ownership.
2146
- - A dedicated array-prop fixture remains fail-closed with a source diagnostic.
2147
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 223 tests and 172 generated pages.
2148
-
2149
- ### Upgrade
2150
-
2151
- ```sh
2152
- npm install @kudzujs/core@^0.8.57
2153
- ```
2154
-
2155
- ## 0.8.56 - Incremental affected-route development builds
2156
-
2157
- Kudzu 0.8.56 keeps one project session alive during development so source edits recompile and rerender only the routes whose runtime graphs changed.
2158
-
2159
- ### Changed in 0.8.56
2160
-
2161
- - The development server batches changed source paths and intersects them with current and prior per-page runtime graphs.
2162
- - Unaffected compiled `SourceResult` and pre-family route render records are reused across successful rebuilds.
2163
- - Every affected page recompiles its complete reachable graph so imported component specialization remains correct.
2164
- - Enhanced-navigation groups invalidate together to preserve shared layout function and ESM singleton identity.
2165
- - Generation-specific build-time module paths prevent stale Node ESM imports after both successful and failed builds.
2166
-
2167
- ### Safety
2168
-
2169
- - Failed rebuilds retain the previous deployed output and carry every pending changed path into the next attempt.
2170
- - Added and removed source files refresh the session index and reachable source set.
2171
- - CSS, assets, and unknown source events conservatively invalidate every page.
2172
- - Production builds retain the existing complete staging, collision checks, `afterBuild()`, and rollback-safe promotion.
2173
- - No browser runtime, hydration layer, VDOM, retained component tree, or SPA router is added.
2174
-
2175
- ### Validation
2176
-
2177
- - A focused independent-route fixture changes one route-owned helper and recompiles two of four modules while rerendering one of two pages.
2178
- - Its unaffected interactive route is reused, its static sibling remains zero JavaScript, and incremental deploy output is byte-identical to a fresh-process full build.
2179
- - Existing development error recovery, navigation groups, Workers, handlers, route families, and source-scale checks pass.
2180
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 222 tests and 171 generated pages.
2181
-
2182
- ### Upgrade
2183
-
2184
- ```sh
2185
- npm install @kudzujs/core@^0.8.56
2186
- ```
2187
-
2188
- ## 0.8.55 - Signature-keyed runtime families
2189
-
2190
- Kudzu 0.8.55 replaces site-wide runtime specialization with deterministic capability families loaded only by the routes that require them.
2191
-
2192
- ### Changed in 0.8.55
2193
-
2194
- - Equal standalone CapabilityIR signatures share one runtime family under `assets/runtime/<family>/`.
2195
- - Different route signatures emit isolated core, binding, list, effect, native, serialization, style, and selector modules.
2196
- - Route-specific parameter, effect, and native entries import their assigned family directly.
2197
- - Artifact report v2 records exact route signatures, assigned families, emitted family requirements, handlers, Workers, styles, and chunks.
2198
- - Development state restoration discovers the family core module from the rendered document.
2199
-
2200
- ### Navigation ownership
2201
-
2202
- - Every enhanced-navigation group unions its route capabilities into one family.
2203
- - Persistent layout state, committers, mount hooks, unmount hooks, and native listeners retain one ESM singleton identity across group navigation.
2204
- - Independent groups may reuse byte-identical family files while keeping their own route matcher and layout/application identity modules.
2205
-
2206
- ### Output
2207
-
2208
- - Static routes emit no runtime family and remain zero JavaScript.
2209
- - An unrelated standalone route capability no longer changes another route's loaded runtime bytes or cache URL.
2210
- - Legacy root-level `assets/kudzu*.js` runtime files are no longer emitted.
2211
- - No runtime loader, hydration layer, VDOM, component tree, or SPA router is added.
2212
-
2213
- ### Validation
2214
-
2215
- - Focused tests cover signature deduplication, distinct capability isolation, deterministic IDs, navigation unions, static exclusion, shared handler/Worker chunks, and family-aware public collisions.
2216
- - Existing navigation, effect, list, native, parameter, Worker, base-path, development restoration, and browser ownership journeys pass.
2217
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 221 tests and 170 generated pages.
2218
-
2219
- ### Upgrade
2220
-
2221
- ```sh
2222
- npm install @kudzujs/core@^0.8.55
2223
- ```
2224
-
2225
- ## 0.8.54 - Inspectable route artifact closure
2226
-
2227
- Kudzu 0.8.54 projects each validated route edge through the final handler and Worker bundle graphs into one inspectable artifact contract.
2228
-
2229
- ### Changed in 0.8.54
2230
-
2231
- - `.kudzu/kudzu-artifacts.json` records every route in deterministic order.
2232
- - Each route receives its exact CapabilityIR manifest, SHA-256 signature, and required runtime families.
2233
- - Handler entry ownership derives from retained RouteBuildRecord references rather than HTML or filename inference.
2234
- - Handler and Worker esbuild metafiles are followed transitively to report route-owned and shared chunks.
2235
- - Chunks reached by multiple routes include a sorted reverse ownership list.
2236
- - `afterBuild()` receives the same JSON-safe report as `artifacts`.
2237
-
2238
- ### Boundaries
2239
-
2240
- - The report distinguishes exact route runtime requirements from the currently site-specialized runtime files.
2241
- - Enhanced-navigation routes still share their existing ESM singleton and lifecycle boundary.
2242
- - Signature-keyed runtime emission remains the next route-closure slice.
2243
- - No runtime loader, manifest fetch, SPA router, or browser behavior is added.
2244
-
2245
- ### Validation
2246
-
2247
- - Focused checks cover route-only and shared handler chunks, external-import exclusion, Worker ownership, shared Worker chunks, deterministic route order, and distinct capability signatures.
2248
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 220 tests and 169 generated pages.
2249
-
2250
- ### Upgrade
2251
-
2252
- ```sh
2253
- npm install @kudzujs/core@^0.8.54
2254
- ```
2255
-
2256
- ## 0.8.53 - Route-aware CSS closure
2257
-
2258
- Kudzu 0.8.53 links source styles only from routes whose reachable TypeScript graph imports them.
2259
-
2260
- ### Changed in 0.8.53
2261
-
2262
- - Relative CSS imports follow each page's runtime import and re-export graph in deterministic source order.
2263
- - RouteBuildRecord receives each route's exact source stylesheet URLs instead of one site-wide CSS list.
2264
- - `kudzu.config styles` remains explicitly global, deduplicated, and excluded from route-managed ownership.
2265
- - CSS `?url` imports emit downloadable assets without creating stylesheet links.
2266
- - Unimported source CSS is no longer implicitly linked; applications import route/layout styles or configure true globals.
2267
-
2268
- ### Enhanced navigation
2269
-
2270
- - Navigable documents mark route-managed source styles separately from configured global links.
2271
- - Destination styles load before route cleanup and DOM replacement.
2272
- - Shared layout stylesheet links retain URL, DOM identity, and cascade order across navigation.
2273
- - Outgoing route styles are removed after successful preparation.
2274
- - Overlapping navigation cancels and rolls back provisional stylesheet transactions without disturbing the newer route.
2275
- - Invalid, duplicate, cross-origin, or failed managed stylesheets fall back to native document navigation.
2276
-
2277
- ### Migration evidence
2278
-
2279
- - The React/Vite static sibling excludes the interactive app stylesheet while retaining zero JavaScript.
2280
- - Independent navigation groups exclude one another's layout and route styles.
2281
- - A delayed stylesheet browser test verifies cancellation rollback, shared-link identity, destination activation, and outgoing-link removal.
2282
- - Global style fixtures prove configured source/URL deduplication, while dynamic routes now import their intended CSS explicitly.
2283
- - The starter imports shared CSS through its common header so both generated routes reach the style intentionally.
2284
-
2285
- ### Output and performance
2286
-
2287
- - Route HTML omits unrelated feature CSS and its cascade effects.
2288
- - Static pages remain JavaScript-free; only configured enhanced-navigation routes receive managed-style reconciliation.
2289
- - No CSS bundler, style runtime, SPA router, or new performance claim is added.
2290
-
2291
- ### Validation
2292
-
2293
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 219 tests and 168 generated pages.
2294
-
2295
- ### Upgrade
2296
-
2297
- ```bash
2298
- npm install @kudzujs/core@^0.8.53
2299
- ```
2300
-
2301
- ## 0.8.52 - Effect-private mutable refs
2302
-
2303
- Kudzu 0.8.52 compiles component-authored mutable refs when one inline effect exclusively owns their complete lifecycle.
2304
-
2305
- ### Changed in 0.8.52
2306
-
2307
- - Top-level `useRef(null)` and `useRef(0)` values lower when every direct `.current` reference belongs to one inline block-bodied effect setup, its nested callbacks, and cleanup.
2308
- - The compiler removes those component declarations and creates fresh mutable objects inside each effect setup invocation.
2309
- - Existing effect ownership handles dependency replacement, stale setter invalidation, conditional/keyed ownership, navigation, document disposal, and BFCache preservation.
2310
- - Animation-frame refs use the same invocation-private lowering while retaining exact scheduler, reset, and cancellation validation.
2311
- - JSX DOM refs remain component-owned; aliases, nonzero initializers, cross-effect/event use, missing cleanup invalidation, and escaped ref objects remain source-diagnosed.
2312
-
2313
- ### Migration evidence
2314
-
2315
- - The E2B terminal fixture now preserves asynchronous generation invalidation, BFCache retain/resume, discard cleanup, and a static sibling without ResourceIR.
2316
- - A native WebSocket fixture verifies dependency replacement, listener removal, stale callback rejection, distinct connection ownership, and one close per connection.
2317
- - Mutable refs shared by multiple effects retain a focused source diagnostic.
2318
-
2319
- ### Output and performance
2320
-
2321
- - Private refs stay inside existing route-specific effect handler ESM and are absent from build-time captures and RouteIR scope.
2322
- - Static sibling routes remain zero JavaScript.
2323
- - No ResourceIR record, component runtime, resource API, scheduler, or new performance claim is added.
2324
-
2325
- ### Validation
2326
-
2327
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 219 tests and 167 generated pages.
2328
-
2329
- ### Upgrade
2330
-
2331
- ```bash
2332
- npm install @kudzujs/core@^0.8.52
2333
- ```
2334
-
2335
- ## 0.8.51 - Owned effect package imports
2336
-
2337
- Kudzu 0.8.51 lets inline owned effect setup and cleanup callbacks reference browser-only package imports directly.
2338
-
2339
- ### Changed in 0.8.51
2340
-
2341
- - Direct package references are accepted inside inline `useEffect` setup callbacks and their directly returned inline cleanup functions.
2342
- - Existing package import records feed the route-specific effect handler ESM and package bundler.
2343
- - Build scratch replaces package-owning effect callbacks with inert functions because build-time rendering records ownership without executing effect code.
2344
- - Render-time, helper-indirect, mixed, side-effect, and dynamic package imports remain source-diagnosed.
2345
-
2346
- ### Output and performance
2347
-
2348
- - Package code is retained only by routes whose effect graph references it.
2349
- - Build-time component modules and static sibling routes omit the package and its JavaScript.
2350
- - No package runtime, ResourceIR, public adapter API, or new performance claim is added.
2351
-
2352
- ### Validation
2353
-
2354
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 217 tests and 166 generated pages.
2355
- - A direct setup/cleanup fixture bundles TypeScript package data into one owned effect handler while its static sibling ships zero JavaScript.
2356
- - Focused negative fixtures retain diagnostics for render-time and helper-indirect package references.
2357
-
2358
- ### Upgrade
2359
-
2360
- ```bash
2361
- npm install @kudzujs/core@^0.8.51
2362
- ```
2363
-
2364
- ## 0.8.50 - Package-neutral shared state IR
2365
-
2366
- Kudzu 0.8.50 contains reduced Zustand migration syntax behind package-neutral shared-state and action records before generic signal and handler consumers.
2367
-
2368
- ### Changed in 0.8.50
2369
-
2370
- - ModuleIR v2 records JSON-safe `SharedStateIR` identities, fields, and initial values.
2371
- - `SharedActionIR` records reference their owning shared state through validated slots.
2372
- - HandlerIR records the shared actions used by route-specific native handlers.
2373
- - The Zustand adapter preserves package-specific source diagnostics while generic compiler and build-time rendering paths consume shared-state metadata.
2374
-
2375
- ### Output and performance
2376
-
2377
- - Existing RouteIR layout state, functional action updates, same-turn behavior, and enhanced-navigation persistence remain unchanged.
2378
- - React, Zustand, subscriptions, and a generic store runtime remain absent from deploy output.
2379
- - No public store or compatibility-adapter API is added, and this release makes no new performance claim.
2380
-
2381
- ### Validation
2382
-
2383
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 215 tests and 165 generated pages.
2384
- - Focused ModuleIR tests validate JSON round-tripping and reject dangling shared-action state references.
2385
- - The maintained Zustand browser journey retains repeated same-turn updates, batched effects, layout identity, navigation persistence, and removal behavior.
2386
-
2387
- ### Upgrade
2388
-
2389
- ```bash
2390
- npm install @kudzujs/core@^0.8.50
2391
- ```
2392
-
2393
- ## 0.8.49 - Setter callback fan-out
2394
-
2395
- Kudzu 0.8.49 lets one component forward the same destructured setter callback directly through multiple child component `on*` props.
2396
-
2397
- ### Changed in 0.8.49
2398
-
2399
- - A specialized component may pass one callback prop directly to multiple child controls.
2400
- - Each child branch specializes independently to the original parent state signal.
2401
- - Fan-out composes with multiple direct intrinsic handlers within the existing three-boundary limit.
2402
- - Aliases, ordinary prop names, spreads, intermediate adapters, and a fourth callback boundary remain source-diagnosed.
2403
-
2404
- ### Output and performance
2405
-
2406
- - Every leaf continues to emit its existing concrete state-operation descriptor.
2407
- - No callback registry, component runtime, browser runtime module, or public Kudzu API is added.
2408
- - This release makes no new performance claim.
2409
-
2410
- ### Validation
2411
-
2412
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 214 tests and 164 generated pages.
2413
- - A relative component fans one callback out to two child controls whose click descriptors target the same parent signal.
2414
- - Existing repeated-call and fourth-boundary negative fixtures retain their source diagnostics.
2415
-
2416
- ### Upgrade
2417
-
2418
- ```bash
2419
- npm install @kudzujs/core@^0.8.49
2420
- ```
2421
-
2422
- ## 0.8.48 - Multi-handler setter callbacks
2423
-
2424
- Kudzu 0.8.48 lets one compiler-specialized setter-callback prop be called once from each of multiple direct intrinsic event handlers.
2425
-
2426
- ### Changed in 0.8.48
2427
-
2428
- - A specialized leaf may call the same setter callback from multiple intrinsic `on*` attributes.
2429
- - Each handler call lowers independently to the same parent state signal.
2430
- - Direct callback forwarding through the existing three-boundary limit remains supported.
2431
- - Repeated calls inside one handler, aliases, non-handler uses, forwarding fan-out, and a fourth callback boundary remain source-diagnosed.
2432
-
2433
- ### Output and performance
2434
-
2435
- - Command-only handlers continue to emit plain state-operation descriptors.
2436
- - No callback registry, component runtime, browser runtime module, or public Kudzu API is added.
2437
- - This release makes no new performance claim.
2438
-
2439
- ### Validation
2440
-
2441
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 213 tests and 163 generated pages.
2442
- - A positive fixture emits two independent click descriptors targeting the same parent signal.
2443
- - A focused negative fixture retains a source diagnostic for calling the callback twice inside one event handler.
2444
-
2445
- ### Upgrade
2446
-
2447
- ```bash
2448
- npm install @kudzujs/core@^0.8.48
2449
- ```
2450
-
2451
- ## 0.8.47 - Direct primitive prop state
2452
-
2453
- Kudzu 0.8.47 lets a compiler-specialized setter-callback child initialize local state directly from one primitive parent state prop without a migration-only wrapper expression.
2454
-
2455
- ### Changed in 0.8.47
2456
-
2457
- - `useState(value)` is accepted when `value` is a direct specialized prop linked to parent state with a proven primitive literal initializer.
2458
- - Build scratch reads the parent signal's initial primitive value while preserving the structural prop signal for handlers and effects.
2459
- - Existing direct `value.toString()` initialization remains supported for string input buffers.
2460
- - Composed expressions, aliases, and object/array state props remain source-diagnosed.
2461
-
2462
- ### Output and performance
2463
-
2464
- - Parent and child retain independent state IDs and JSON-safe initial values.
2465
- - Handler specialization continues to target the same parent and child signals without a component runtime.
2466
- - No browser runtime module, public Kudzu API, or new performance claim is added.
2467
-
2468
- ### Validation
2469
-
2470
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 212 tests and 162 generated pages.
2471
- - A direct string-state prop emits complete initial input HTML and two matching RouteIR state seeds.
2472
- - Focused negative fixtures retain diagnostics for composed initializer expressions and object-state props.
2473
-
2474
- ### Upgrade
2475
-
2476
- ```bash
2477
- npm install @kudzujs/core@^0.8.47
2478
- ```
2479
-
2480
- ## 0.8.46 - Private Context action setters
2481
-
2482
- Kudzu 0.8.46 lets relative Context-hook actions use Provider-owned setters without forcing those implementation-only setters into the authored Provider value or public Context type.
2483
-
2484
- ### Changed in 0.8.46
2485
-
2486
- - An action-required setter may be omitted when its corresponding Provider state value remains exposed.
2487
- - Kudzu adds only the required setter fields to compiler build scratch so existing setter identity and HandlerIR lowering remain unchanged.
2488
- - Consumer scratch receives collision-free private bindings for action lowering without changing authored hook destructuring.
2489
- - Fully hidden action state and Provider setters exposed without their state remain source-diagnosed.
2490
-
2491
- ### Output and performance
2492
-
2493
- - The Notes migration retains the same two RouteIR signals and concrete `notes` and `activeId` state operations.
2494
- - Context objects, Provider trees, action functions, and a setter registry remain absent from browser output; the static sibling remains zero JavaScript.
2495
- - No browser runtime module, public Kudzu API, or new performance claim is added.
2496
-
2497
- ### Validation
2498
-
2499
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 210 tests and 161 generated pages.
2500
- - The maintained Chrome Notes journey passes create, rename, select, delete, list identity, and active-note updates with authored setters omitted.
2501
- - Focused negative fixtures retain diagnostics for fully hidden action state, setter-only exposure, private captures, and indirect action references.
2502
-
2503
- ### Upgrade
2504
-
2505
- ```bash
2506
- npm install @kudzujs/core@^0.8.46
2507
- ```
2508
-
2509
- ## 0.8.45 - Plain TypeScript fast path
2510
-
2511
- Kudzu 0.8.45 reduces large-project compiler work by sending proven plain `.ts` modules through TypeScript transpilation and relative ESM path rewriting without running Kudzu's TSX semantic transformer.
2512
-
2513
- ### Changed in 0.8.45
2514
-
2515
- - The fast path is limited to `.ts` files whose runtime imports and exports are resolvable relative TypeScript modules.
2516
- - TSX, package imports, static assets, unresolved edges, and all uncertain module shapes retain the existing Kudzu transformer.
2517
- - `npm run benchmark:source-scale` deterministically generates 500 reachable modules and supports alternating baseline/candidate measurements with deploy-output equivalence checks.
2518
- - Compiler counters report the number of plain modules selected.
2519
-
2520
- ### Output and performance
2521
-
2522
- - Seven alternating samples against clean `v0.8.44` reduced compile median from 2,323.9 ms to 1,413.2 ms (39.2%) and clean-build median from 3,325.3 ms to 2,382.4 ms (28.4%) on the maintained source-scale fixture.
2523
- - Compiler scratch decreased from 7,328,390 to 1,971,061 bytes and compile peak-RSS median decreased from 571.2 MiB to 552.6 MiB.
2524
- - Both targets emitted the same 50 HTML files, 10,980 deploy bytes, and SHA-256 digest. No browser runtime or public API changed.
2525
-
2526
- ### Validation
2527
-
2528
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 209 tests and 160 generated pages.
2529
- - A reduced deterministic source-scale run remains in the standard suite.
2530
- - The maintained benchmark alternates target order and rejects any deploy digest, file-count, page-count, or byte-count difference.
2531
-
2532
- ### Upgrade
2533
-
2534
- ```bash
2535
- npm install @kudzujs/core@^0.8.45
2536
- ```
2537
-
2538
- ## 0.8.44 - Collision-free Context actions
2539
-
2540
- Kudzu 0.8.44 removes a compiler-only naming restriction from relative Context-hook actions: Provider state and setter fields needed privately by an action may now share names with ordinary consumer locals.
2541
-
2542
- ### Changed in 0.8.44
2543
-
2544
- - Action-required Provider state/setter fields that are not publicly selected receive compiler-owned collision-free aliases in the consumer destructuring.
2545
- - The specialized action AST and its state map use the same aliases before existing HandlerIR lowering.
2546
- - Alias selection checks component parameters and top-level declarations and increments the compiler-owned suffix when necessary.
2547
- - Consumer source keeps its chosen local names and public hook destructuring; no application rename or extra Context field selection is required.
2548
- - Provider state identity, direct state operations, and existing Context action diagnostics remain unchanged.
2549
-
2550
- ### Output and performance
2551
-
2552
- - Context action functions, Context objects, and Provider trees remain absent from browser output.
2553
- - Static siblings remain complete zero-JavaScript documents.
2554
- - No browser runtime module or public API changed. This release makes no new performance claim.
2555
-
2556
- ### Validation
2557
-
2558
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 208 tests and 158 generated pages.
2559
- - The maintained Notes Context fixture now declares a consumer-local `setNotes` while create, rename, delete, select, list identity, and active-note updates continue to pass in Chrome.
2560
- - A focused counter fixture previously rejected for consumer `setCount` collision now builds successfully.
2561
- - Private Provider captures, hidden state pairs, and indirect action references remain source-diagnosed.
2562
-
2563
- ### Upgrade
2564
-
2565
- ```bash
2566
- npm install @kudzujs/core@^0.8.44
2567
- ```
2568
-
2569
- ## 0.8.43 - Three-boundary callback ownership
2570
-
2571
- Kudzu 0.8.43 extends ordinary React-shaped callback and ref composition through one more proven direct forwarding component without adding a callback registry, browser component tree, or runtime module.
2572
-
2573
- ### Changed in 0.8.43
2574
-
2575
- - A direct setter or inline/simple `const` callback may cross a child component and two additional direct forwarding components before one intrinsic handler invokes it.
2576
- - Each forwarding component must destructure the callback and pass it directly exactly once as an `on*` JSX prop.
2577
- - Callback substitution now occurs after recursive component expansion, so each authored forwarding boundary is validated before the original parent callback is specialized into the leaf handler.
2578
- - Parent SignalIR, child state, effects, deterministic IDs, and parent/child object refs retain their existing ownership through the deeper tree.
2579
- - A fourth callback boundary, aliases, spreads, intermediate adapters, repeated callback uses, and dynamic hook paths remain fail-closed.
2580
-
2581
- ### Output and performance
2582
-
2583
- - The forwarding components are specialized away and do not appear as retained browser functions.
2584
- - Static siblings remain complete zero-JavaScript documents.
2585
- - No browser runtime source or public API changed. This release makes no new build or cross-framework performance claim.
2586
-
2587
- ### Validation
2588
-
2589
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 208 tests and 157 generated pages.
2590
- - Chrome coverage proves parent callback updates, leaf local state/effects/IDs, mounted refs, conditional cleanup, null refs after removal, fresh remount state, and prop synchronization across three boundaries.
2591
- - Compiler-result checks retain the original parent signal through imported specialization and prove every forwarding component is erased from emitted JavaScript.
2592
- - A dedicated four-boundary fixture fails at the authored source location.
2593
-
2594
- ### Upgrade
2595
-
2596
- ```bash
2597
- npm install @kudzujs/core@^0.8.43
2598
- ```
2599
-
2600
- ## 0.8.42 - Large-route artifact sharing
2601
-
2602
- Kudzu 0.8.42 reduces generated filesystem work for large static route sets and accelerates one proven hidden query form carry shape without adding a general runtime or changing the native-navigation default.
2603
-
2604
- ### Changed in 0.8.42
2605
-
2606
- - Byte-identical native, parameter, and effect route-entry sources share the first generated route path and one emitted file within the current build.
2607
- - Existing single-route artifact URLs remain stable; deduplication is build-local and does not add a persistent or generalized cache.
2608
- - A read-only literal query shape bound only to matching hidden input `value` and `disabled` properties initializes those controls from `location.search` in a small inline script before deferred parameter ESM arrives.
2609
- - The inline form specialization requires exactly the proven hidden carry shape and falls back to existing parameter capabilities when handlers, effects, conditions, lists, writable query state, or unrelated bindings are present.
2610
- - Static siblings remain complete zero-JavaScript documents.
2611
-
2612
- ### Performance
2613
-
2614
- - On the maintained external 1,000-product fixture, a three-run candidate check reduced cold build time from 13,866 ms to 13,203 ms, warm build time from 13,560 ms to 13,087 ms, and output from 10.48 MB to 9.53 MB.
2615
- - The generated catalog changed from 1,011 native plus 1,011 effect route entries to three native plus five effect files in the 100-product candidate inspection, while route HTML continued to reference valid complete capabilities.
2616
- - Five Slow 4G form sessions reduced hidden query carry readiness from 783 ms to 348 ms, about 56%.
2617
- - These are focused Kudzu before/after measurements, not a cross-framework fastest claim. A seven-run alternating catalog measurement remains the stronger follow-up for precise build attribution.
2618
-
2619
- ### Navigation decision
2620
-
2621
- - A compressed static-catalog same-document navigation experiment was measured and removed rather than released.
2622
- - In three Slow 4G sessions, native navigation beat the enhanced candidate on detail latency (314 ms versus 575 ms), back latency (107 ms versus 297 ms), transfer (322.2 KB versus 511 KB), and degraded-capability survival (15/18 versus 12/18).
2623
- - Native document navigation therefore remains the default for `getStaticPaths()` catalogs; existing explicit exact and `runtimeParams` navigation groups are unchanged.
2624
-
2625
- ### Validation
2626
-
2627
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 208 tests and 156 generated pages.
2628
- - A three-route static-path fixture proves one shared native entry and one shared effect entry.
2629
- - A focused query form fixture proves three hidden fields initialize through the narrow inline path while a static sibling emits no script.
2630
- - Sites whose Content Security Policy forbids inline scripts should not rely on this optional fast path without an allowed policy; existing deferred parameter ESM remains in the document.
2631
-
2632
- ### Upgrade
2633
-
2634
- ```bash
2635
- npm install @kudzujs/core@^0.8.42
2636
- ```
2637
-
2638
- ## 0.8.41 - Two-boundary callback ownership
2639
-
2640
- Kudzu 0.8.41 extends ordinary React-shaped component migration through one additional proven callback/ref forwarding boundary without retaining component functions or adding browser runtime machinery.
2641
-
2642
- ### Changed in 0.8.41
2643
-
2644
- - A direct setter or inline/simple `const` state callback may cross a child component and one additional direct forwarding component before one intrinsic handler invokes it.
2645
- - The forwarding component must destructure the callback and pass it directly once as an `on*` JSX prop; aliases, spreads, intermediate adapters, repeated uses, and a third callback boundary remain fail-closed.
2646
- - Parent SignalIR remains stable through nested specialization, including direct setter input adapters and simple callbacks that capture parent state.
2647
- - Specialized children retain independent local state, effects, deterministic IDs, and `null`-initialized object refs through conditional cleanup and fresh remount.
2648
- - A parent-owned object ref may follow the same proven component tree to one direct intrinsic root.
2649
- - Static siblings still emit complete HTML with zero JavaScript; no callback registry, retained component tree, or browser runtime module was added.
2650
-
2651
- ### Performance
2652
-
2653
- - Seven alternating clean builds measured `v0.8.40` and candidate medians of 3,565.236 ms and 3,470.277 ms. The +59.834 ms paired candidate-minus-baseline median and overlapping ranges establish no material build change.
2654
- - Peak RSS medians were 364.6 MiB and 362.0 MiB.
2655
- - Both targets emit byte-identical 176-file deploy graphs: 3,850,245 raw bytes, 1,984,991 aggregate gzip bytes, and identical route plans and deploy digests.
2656
- - Current maintained Worker, keyed-list, runtime-matrix, and commerce build measurements are recorded in `PERFORMANCE.md`; architecture and timeout limitations are explicit.
2657
-
2658
- ### Validation
2659
-
2660
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 206 tests and 156 generated pages.
2661
- - Browser coverage proves parent updates, child-local state/effects/IDs, parent ref resolution, conditional cleanup, and fresh remount across two boundaries.
2662
- - Compiler-result checks prove nested specializations retain the original parent signal, while a dedicated fixture rejects a third callback boundary at the authored source.
2663
- - Broader prop, callback, ref, and Context graphs remain migration-led work.
2664
-
2665
- ### Upgrade
2666
-
2667
- ```bash
2668
- npm install @kudzujs/core@^0.8.41
2669
- ```
2670
-
2671
- ## 0.8.40 - Property-level effect dependencies
2672
-
2673
- Kudzu 0.8.40 starts the large-application foundation sequence by allowing ordinary object state to expose property-level effect dependencies without artificial primitive-state decomposition.
2674
-
2675
- ### Changed in 0.8.40
2676
-
2677
- - Direct property paths over ordinary object state compile to existing tagged DerivedIR.
2678
- - Top-level immutable primitive locals derived from object properties use the same source subscription and expression evaluator.
2679
- - Source object commits schedule dependency comparison, while `Object.is` prevents cleanup and rerun when the selected property value is unchanged.
2680
- - Whole-object, dynamic-property, object-valued, and mixed whole-object/property dependencies remain fail-closed.
2681
- - The Zustand migration fixture proves property updates, equality across enhanced navigation, persistent layout ownership, and removal.
2682
- - No field signal, proxy, component rerender, RouteIR field, or browser runtime module was added.
2683
-
2684
- ### Performance
2685
-
2686
- - Twenty-one alternating clean builds measured `v0.8.39` and candidate medians of 3,753.276 ms and 3,883.841 ms, with a +103.031 ms paired median.
2687
- - Peak RSS medians were 356.9 MiB and 363.7 MiB. Build and memory deltas remain below the 5% material-regression threshold.
2688
- - Both targets emit 175 files and byte-identical `kudzu-plan.json`; only updated docs add 98 raw and 31 aggregate gzip bytes. Runtime and route JavaScript are unchanged.
2689
- - Seven-build/fresh-profile React, Vue, and Svelte runtime comparisons pass. The matched commerce build matrix records Kudzu output at 14,689 aggregate gzip bytes versus 66,741 for React hydration, 247,612 for Next, 82,075 for Nuxt, and 41,061 for SvelteKit.
2690
-
2691
- ### Validation
2692
-
2693
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 205 tests and 155 generated pages.
2694
- - Focused checks cover direct object-property classification, canonical DerivedIR, whole-object/property ambiguity, RouteIR projection, browser equality behavior, and layout lifetime.
2695
- - The next migration-backed investigation is multi-boundary component/prop/callback/ref/context dataflow.
2696
-
2697
- ### Upgrade
2698
-
2699
- ```bash
2700
- npm install @kudzujs/core@^0.8.40
2701
- ```
2702
-
2703
- ## 0.8.39 - Fail-closed route contracts
2704
-
2705
- Kudzu 0.8.39 completes P0.12 by deeply validating the concrete RouteIR, RouteBuildRecord, and CapabilityIR contracts before artifact selection and browser code generation.
2706
-
2707
- ### Changed in 0.8.39
2708
-
2709
- - RouteIR v1 rejects duplicate state/parameter IDs, missing command targets, unsupported command operations, malformed captures, and invalid effect dependencies.
2710
- - Direct and evaluator bindings validate recursively, including nested scope bindings and every referenced state.
2711
- - Conditions validate identity, kinds, reactive sources, and owned states.
2712
- - Keyed lists validate state/key identity, row ownership templates, child reciprocity, duplicate parents, and ownership cycles.
2713
- - RouteBuildRecord verifies behavior, binding, list, effect, native, and parameter capability reciprocity before artifact planning.
2714
- - CapabilityIR validates standalone event/count/flag implications and exact projection equality from its validated route records before codegen.
2715
- - Strict JSON-safe checks reject cyclic, lossy, nonfinite, BigInt, sparse, accessor, symbol, and non-plain contract data with a deterministic field path.
2716
-
2717
- ### Performance
2718
-
2719
- - Seven alternating clean 153-page builds measured `v0.8.38` and candidate medians of 2,356.477 ms and 2,352.382 ms. The +14.255 ms paired median and overlapping ranges establish no material speedup or regression.
2720
- - Peak RSS medians were 352.7 MiB and 356.8 MiB. Repeated validation of the same immutable contracts is eliminated by identity caching.
2721
- - Both targets emit the same 174 files, 3,840,694 raw bytes, 1,981,560 aggregate gzip bytes, deploy digest, and byte-identical `kudzu-plan.json`.
2722
-
2723
- ### Validation
2724
-
2725
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 203 tests and 154 generated pages.
2726
- - Focused checks cover duplicate/missing identity, malformed commands, effects, captures, bindings, conditions, lists, ownership, capabilities, versions, and JSON safety.
2727
- - Existing static, command, binding, keyed, effect, Worker, package-import, navigation, reducer, and migration fixtures retain browser behavior and zero-unused-runtime checks.
2728
- - The next migration-backed investigation is property-level derived dependencies over ordinary object state.
2729
-
2730
- ### Upgrade
2731
-
2732
- ```bash
2733
- npm install @kudzujs/core@^0.8.39
2734
- ```
2735
-
2736
- ## 0.8.38 - Structural route artifacts
2737
-
2738
- Kudzu 0.8.38 completes P0.11 by replacing serialized route-output searches and parallel route facts with one validated RouteBuildRecord artifact graph.
2739
-
2740
- ### Changed in 0.8.38
2741
-
2742
- - Each emitted route records its RouteIR, capability facts, route-entry paths, styles, and exact handler/effect references.
2743
- - Final event, effect, binding, conditional, and keyed-list descriptors retain handler references only when they are rendered.
2744
- - Handler modules resolve by exact module URL, and Worker references resolve by structural module/handler pairs instead of formatted keys.
2745
- - CSS output, package-client compilation, and bundle entry/chunk closure derive from retained route edges.
2746
- - CapabilityIR now folds RouteBuildRecord values directly; serialized HTML/plan `includes()` searches and parallel route capability/entry arrays are removed.
2747
-
2748
- ### Performance
2749
-
2750
- - Seven alternating clean 152-page builds measured `v0.8.37` and candidate medians of 1,820.186 ms and 1,804.568 ms. The -20.933 ms paired median and overlapping ranges establish no material speedup or regression.
2751
- - Peak RSS medians were 351.6 MiB and 351.4 MiB.
2752
- - Both targets emit the same 173 files, 3,835,970 raw bytes, 1,979,875 aggregate gzip bytes, deploy digest, and byte-identical `kudzu-plan.json`.
2753
-
2754
- ### Validation
2755
-
2756
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 200 tests and 153 generated pages.
2757
- - Focused checks reject unsupported versions, malformed and duplicate references, missing handler modules, inconsistent route entries, and invalid JSON round trips.
2758
- - Existing static, command, binding, keyed, effect, Worker, package-import, navigation, and migration fixtures retain their browser behavior and zero-unused-runtime checks.
2759
- - P0.12 deep RouteIR and CapabilityIR validation is next.
2760
-
2761
- ### Upgrade
2762
-
2763
- ```bash
2764
- npm install @kudzujs/core@^0.8.38
2765
- ```
2766
-
2767
- ## 0.8.37 - Structural ModuleIR references
2768
-
2769
- Kudzu 0.8.37 completes P0.10 by replacing mixed state names, export strings, formatted owner keys, and partial slots with one validated structural reference graph.
2770
-
2771
- ### Changed in 0.8.37
2772
-
2773
- - ModuleIR v2 assigns deterministic slots to symbols, signals, handlers, bindings, derived values, effects, keyed blocks, and imports.
2774
- - ComponentAnalysis v2 assigns deterministic owner, specialization, state, ref, and ID slots.
2775
- - StateRef, OwnerRef, source-local SymbolRef, and stable ModuleSymbol records connect state, capture, import, effect, collection, specialization, prop-signal, and row ownership edges.
2776
- - Descriptor finalization resolves effect handlers and imports structurally instead of searching by export spelling.
2777
- - Readable state and export names remain only as codegen, runtime ABI, and diagnostic metadata.
2778
- - One fail-closed pre-codegen validator rejects unsupported versions, malformed slots, duplicate exports, invalid effect handlers, broken keyed parent-child reciprocity, ownership cycles, and dangling specialization/ref edges.
2779
-
2780
- ### Performance
2781
-
2782
- - The maintained 100-importer fixture retains 103 parse misses, 103 export-summary misses, and 100 importer-local clones.
2783
- - Seven alternating fresh-process samples measured `v0.8.36` and 0.8.37 compiler medians of 224.506 ms and 227.158 ms. The +6.270 ms paired median and overlapping timing/RSS ranges establish no material regression.
2784
- - Source-result size increases from 395,346 B to 460,720 B because ModuleIR and ComponentAnalysis now serialize structural symbol, signal, owner, and slot metadata. This is compiler scratch data, not deployed browser JavaScript.
2785
- - Existing static, command, binding, keyed, effect, Worker, navigation, and migration fixtures retain their browser behavior and zero-unused-runtime checks.
2786
-
2787
- ### Validation
2788
-
2789
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 198 tests and 152 generated pages.
2790
- - Focused checks cover unsupported versions, malformed references, duplicate exports, parent-child reciprocity, cycles, effect-handler roles, specialization ownership, and JSON round trips.
2791
- - Package smoke installation passes from the packed tarball.
2792
- - P0.11 explicit route artifact graph is next.
2793
-
2794
- ### Upgrade
2795
-
2796
- ```bash
2797
- npm install @kudzujs/core@^0.8.37
2798
- ```
2799
-
2800
- ## 0.8.36 - Semantic state operations
2801
-
2802
- Kudzu 0.8.36 completes P0.9 by proving equivalent direct, aliased, and local-helper state updates and lowering them through the existing command HandlerIR path.
2803
-
2804
- ### Changed in 0.8.36
2805
-
2806
- - Direct `setCount(count + 1)`, an immutable result alias, a zero-argument arrow helper, and a one-parameter function helper emit the same structured `add` command.
2807
- - Binding identity proves state, setter, helper, and parameter ownership before specialization.
2808
- - Recursion, helper or alias escape, mutation, optional calls, and object-based dynamic dispatch fail at authored source locations.
2809
- - The existing direct command fast path remains first; whole-handler analysis runs only when direct specialization fails.
2810
- - Quick Start instructions now include an explicit `npm install`, and `create-kudzu@0.1.102` reports install-aware next steps and includes the install command in generated READMEs.
2811
-
2812
- ### Performance
2813
-
2814
- - The maintained 100-importer fixture preserves the same normalized graph, source-result bytes, digest, and 103 / 103 / 100 parse, summary, and clone counts.
2815
- - Twenty-one alternating `v0.8.35`/candidate samples measured compiler medians of 947.100 ms and 942.596 ms. The +1.754 ms paired candidate-minus-baseline median and overlapping RSS ranges establish no material improvement or regression.
2816
- - Alias and helper forms avoid native handler ESM and reuse the existing command runtime; direct command artifacts remain unchanged.
2817
-
2818
- ### Validation
2819
-
2820
- - `npm run check`, `npm test`, and `npm run test:package` pass with all 197 tests and 151 generated pages.
2821
- - Focused coverage proves identical JSON-safe command IR, signal ownership, build-module behavior calls, RouteIR commands, and zero native-handler artifacts for all four source forms.
2822
- - Existing command ABI, synchronous batching, ownership, browser runtime, and unrelated native handlers remain unchanged.
2823
- - P0.10 ModuleIR reference unification is next.
2824
-
2825
- ### Upgrade
2826
-
2827
- ```bash
2828
- npm install @kudzujs/core@^0.8.36
2829
- ```
2830
-
2831
- ## 0.8.35 - Stable module identity
2832
-
2833
- Kudzu 0.8.35 completes P0.8 by giving cross-module declarations and authored compiler sites stable identities that do not depend on transformed TypeScript AST objects or readable names.
2834
-
2835
- ### Changed in 0.8.35
2836
-
2837
- - ProjectSession summarizes declaration, import, named re-export, and `export *` sites as source-local SiteId records.
2838
- - ModuleSymbol identity combines a project-relative module path with the authored declaration SiteId; readable names remain diagnostic metadata.
2839
- - Default and named exports, local aliases, barrel chains, `export *`, cycles, and ambiguous star exports resolve through one cycle-safe symbol graph.
2840
- - Imported semantic consumers resolve ModuleSymbols first, then locate the authored SiteId in their private normalized AST clone instead of rescanning by declaration name.
2841
- - Component owners, component calls, hooks, keyed lists, effects, states, refs, and IDs expose deterministic source-local SiteIds in compiler analysis records.
2842
- - Repeated symbol resolutions are cached against their source dependencies and invalidate when any dependency source changes.
2843
-
2844
- ### Performance
2845
-
2846
- - The 100-importer fixture retains 103 parse and 103 summary misses while removing 100 unnecessary intermediate barrel clones, reducing importer-local clones from 200 to 100.
2847
- - Twenty-one alternating `v0.8.34`/candidate samples measured compiler medians of 760.967 ms and 755.595 ms. The paired candidate-minus-baseline median was -2.971 ms, with the candidate faster in 13/21 pairs; this is a small directional improvement, not a material speedup claim.
2848
- - Peak RSS medians were 256.9 MiB and 257.8 MiB. The 12,743-byte source-result increase is deterministic SiteId metadata in build scratch, not deployed JavaScript.
2849
- - A matched whole-build check measured Kudzu at 495.4 ms, Astro at 974.5 ms, Vue SSR at 1,477.3 ms, React SSR at 1,639.5 ms, and Svelte SSR at 2,033.1 ms. Kudzu shipped less JavaScript gzip than React, Vue, and Svelte; Astro's direct imperative implementation remained much smaller.
2850
-
2851
- ### Validation
2852
-
2853
- - `npm run check`, `npm test`, `npm run test:package`, and all 195 tests pass.
2854
- - Focused coverage verifies default/named exports, aliases, barrel chains, `export *`, ambiguity, cycles, repeated-session IDs, repeated-compilation IDs, resolution-cache invalidation, and clone-local declaration lookup.
2855
- - All five cross-framework device targets pass the same Chrome checks for initial HTML, filtering, empty state, detail fetch, superseded commands, stale-result rejection, and HTTP failures.
2856
- - Existing browser runtime code, route capabilities, source syntax, and deployed JavaScript remain unchanged; the repository build emits 150 pages.
2857
- - P0.9 semantic state operations is next.
2858
-
2859
- ### Upgrade
2860
-
2861
- ```bash
2862
- npm install @kudzujs/core@^0.8.35
2863
- ```
2864
-
2865
- ## 0.8.34 - Session-local module cache
2866
-
2867
- Kudzu 0.8.34 completes P0.7 by making source parsing and supported-export summarization proportional to unique modules within one ProjectSession instead of repeated importer edges.
2868
-
2869
- ### Changed in 0.8.34
2870
-
2871
- - ProjectSession caches one canonical read-only TypeScript AST and one narrow export summary for each file/source-text pair.
2872
- - Reachability, static collection, Zustand, client-helper, style, layout-diagnostic, and Worker graph consumers reuse canonical module records.
2873
- - Importer normalization receives a deep clone of every node with independent parent links; transformed mutable AST is never shared between transformer contexts.
2874
- - Source-text changes invalidate the parsed tree and export summary together, and independent ProjectSessions never share records.
2875
- - Export summaries preserve the existing supported direct, aliased, default, and named re-export forms. Stable ModuleSymbol/SiteId identity and `export *` expansion remain P0.8 work.
2876
- - Optional injected counters expose parse, summary, and clone misses to tests and the maintained benchmark without production logging.
2877
-
2878
- ### Performance
2879
-
2880
- - A 100-importer fixture contains 103 unique page/barrel/component/helper modules. The candidate records exactly 103 parses, 103 export summaries, and 200 importer-local clones.
2881
- - Baseline and candidate produce the same 382,603-byte source-result graph and SHA-256 digest.
2882
- - The 21-pair timing run drifted materially on the measurement host. Paired candidate-minus-baseline differences had a +33.324 ms median, with the candidate faster in 9/21 pairs; no material speedup or regression is claimed.
2883
- - A separate matched SSR/native whole-build check measured Kudzu at 856.2 ms, Astro at 1,482.9 ms, Vue at 2,295.3 ms, React at 2,802.0 ms, and Svelte at 2,972.9 ms. Every target passed the same Chrome behavior validation; this is whole-build context, not a module-cache comparison.
2884
-
2885
- ### Validation
2886
-
2887
- - `npm run check`, `npm test`, `npm run test:package`, and all 193 tests pass.
2888
- - Unit coverage verifies cache hits, source-text invalidation, export summaries, cross-session isolation, independent cloned node identity, and clone-local parent links.
2889
- - Existing imported components, re-export cycles, static collections, Zustand, client helpers, Workers, source diagnostics, and generated artifacts remain covered.
2890
- - The repository build emits 149 pages; unaffected static routes remain complete zero-JavaScript documents.
2891
- - P0.8 stable ModuleSymbol and SiteId is next.
2892
-
2893
- ### Upgrade
2894
-
2895
- ```bash
2896
- npm install @kudzujs/core@^0.8.34
2897
- ```
2898
-
2899
- ## 0.8.33 - Project-scoped compilation
2900
-
2901
- Kudzu 0.8.33 completes P0.6 by replacing import-time project globals with an explicit build-scoped ProjectSession. Independent roots can now compile in one Node process without sharing paths, source records, graph resolution, or Worker compiler ownership.
2902
-
2903
- ### Changed in 0.8.33
2904
-
2905
- - Each `build()` creates a ProjectSession containing the absolute project root, `src`, `src/pages`, `.kudzu`, and `dist` paths.
2906
- - Source graph resolution, source indexes, reachable source sets, source compiler helpers, and Worker compilation are bound to that session instead of the directory where compiler modules were first imported.
2907
- - The internal programmatic build and development entry points accept an explicit `root`; omitted roots still use call-time `process.cwd()`, preserving existing `kudzu build` and `kudzu dev` behavior.
2908
- - Config loading, styles, static assets, route diagnostics, generated modules, output locking, staging, promotion, and development serving all resolve against the selected project.
2909
- - Parsed-module and export-summary caching remains deferred to P0.7; this release establishes ownership without adding speculative shared caches or changing browser output.
2910
-
2911
- ### Validation
2912
-
2913
- - `npm run check`, `npm test`, `npm run test:package`, and all 191 tests pass.
2914
- - One imported `build()` function compiles two roots with identical source filenames in sequence and verifies isolated config metadata, HTML, source results, `.kudzu` modules, and content-distinct Worker bundles.
2915
- - The standard CLI output-safety fixture still verifies staging, collision rejection, lock behavior, recovery, and replacement through call-time CWD.
2916
- - The repository build emits 148 pages, and existing static zero-JavaScript, interactive capability, Worker, navigation, ownership, and migration behavior remains covered.
2917
- - P0.7 parsed module and export summary caching is next.
2918
-
2919
- ### Upgrade
2920
-
2921
- ```bash
2922
- npm install @kudzujs/core@^0.8.33
2923
- ```
2924
-
2925
- ## 0.8.32 - Staged and collision-safe output
2926
-
2927
- Kudzu 0.8.32 completes P0.5 by building production artifacts away from the active deploy tree, rejecting public/generated collisions, and replacing `dist` only after generation and trusted `afterBuild()` work succeed.
2928
-
2929
- ### Changed in 0.8.32
2930
-
2931
- - Route HTML, runtime, handler, chunk, Worker, source CSS, and configured CSS artifacts complete in a project-local staging tree before promotion.
2932
- - Public files merge only into unowned paths. A public file cannot replace a generated file or directory, and duplicate configured stylesheet outputs fail before publication.
2933
- - Ordinary compiler, bundler, public-copy, and `afterBuild()` failures leave the previous successful `dist` unchanged.
2934
- - Same-root builds use an exclusive PID lock. Active overlap and dead/invalid lock files fail closed; after an operator removes a stale lock, the next admitted build recovers a backup left by interrupted promotion. Promotion is a guarded rollback/recovery sequence rather than a lock-free atomic directory exchange.
2935
- - Successful replacement removes stale output and staging/backup artifacts. Development rebuild errors retain the previous on-disk HTML while the existing error overlay reports the source failure.
2936
- - Route HTML writes use bounded batches. Keyed reverse/remove paths avoid repeated root-map work, and binding plus condition updates share one state commit dispatch.
2937
-
2938
- ### Performance
2939
-
2940
- - Before final lock/recovery hardening, twenty-one alternating local replacement builds of the 1,011-page commerce fixture observed a 20,392.7 ms to 19,229.1 ms median change, 5.71% lower, while all 3,056 paths and 11,137,074 deploy bytes retained identical SHA-256 hashes.
2941
- - The optimized 1,000-row browser graph decreased by 194 B raw / 23 B gzip. External exploratory browser comparisons and their non-publication limitations are documented in `PERFORMANCE.md`; they are not a release gate or maintained general ranking.
2942
-
2943
- ### Validation
2944
-
2945
- - `npm run check`, `npm test`, `npm run test:package`, and all 190 tests pass.
2946
- - Focused integration coverage verifies seven public/generated namespaces, configured-style collisions, late hook failure, successful stale-file removal, same-root overlap rejection, stale-lock diagnosis, interrupted-backup recovery after lock removal, and no staging/backup remnants.
2947
- - Existing keyed identity/state, nested lists, reducer rows, SVG, effects, Workers, navigation, async ownership, and static zero-JavaScript behavior remain covered.
2948
- - P0.6 ProjectSession and explicit root is next.
2949
-
2950
- ### Upgrade
2951
-
2952
- ```bash
2953
- npm install @kudzujs/core@^0.8.32
2954
- ```
2955
-
2956
- ## 0.8.31 - Async native-handler ownership
2957
-
2958
- Kudzu 0.8.31 completes P0.4 by tying every mounted native-handler context to its DOM registration lifetime. Async work may finish after route, keyed, or conditional removal, but it cannot write through ownership that no longer exists.
2959
-
2960
- ### Changed in 0.8.31
2961
-
2962
- - Native registrations expose one active lifetime to direct setters, captured setters, queued commits, and captured object refs.
2963
- - `unmountNative()` invalidates the registration before removing its listener. Enhanced navigation, keyed removal, and conditional removal use the shared unmount hook; non-persisted `pagehide` directly releases document registrations.
2964
- - Late state writes become no-ops instead of recreating released state IDs; already queued commits clear without touching replacement DOM.
2965
- - Captured object refs resolve to `null` after release, so a late handler cannot find a replacement node that reused the same compiler-owned ref ID.
2966
- - Application promises are not cancelled, and no scheduler, task registry, component runtime, or public API is added.
2967
-
2968
- ### Performance
2969
-
2970
- - Twenty-one alternating headless Chrome processes measured 5,000 synchronous native event dispatches at a 6.4 ms median for both `0.8.30` and `0.8.31`; the recorded ranges overlap.
2971
- - The maintained `native-bubbling` fixture keeps the same eight JavaScript paths. `kudzu-native.js` and `kudzu-serialization.js` add 209 B raw / 94 B aggregate gzip; the runner rejects any other artifact change.
2972
- - Environment, raw arrays, artifact bytes, methodology, and limitations are recorded in `PERFORMANCE.md`.
2973
-
2974
- ### Validation
2975
-
2976
- - `npm run check`, `npm test`, `npm run test:package`, and all 189 tests pass.
2977
- - Chrome starts async route and keyed-row handlers, releases and recreates their owners, and proves late state writes and refs cannot mutate replacement ownership. A persistent layout handler also proves non-persisted document disposal invalidates pending work.
2978
- - Focused context checks cover queued direct commits and captured setters. The browser suite retains normal synchronous native event semantics; unaffected static routes remain zero JavaScript.
2979
- - P0.5 atomic and collision-safe output is next.
2980
-
2981
- ### Upgrade
2982
-
2983
- ```bash
2984
- npm install @kudzujs/core@^0.8.31
2985
- ```
2986
-
2987
- ## 0.8.30 - Graph failure diagnostics
2988
-
2989
- Kudzu 0.8.30 completes P0.3 by making ordinary source-graph failures stop at the original importer before compilation, generated module loading, or `.kudzu` paths can obscure the source error.
2990
-
2991
- ### Changed in 0.8.30
2992
-
2993
- - Reachability validates every relative runtime import and re-export in an ordinary reachable module instead of silently dropping unresolved edges.
2994
- - Missing bound imports, side-effect imports, reachable helper imports, named/default forwarding, and `export *` report the importer file, line, column, and written specifier.
2995
- - Every ordinary dynamic `import()` form is rejected during graph discovery, including relative, package, template-literal, and computed specifiers.
2996
- - Ordinary and Worker traversal retain separate ownership, so Worker-only modules continue through Worker-specific graph diagnostics and cleanup rules.
2997
- - Type-only edges and unreachable migration source remain excluded and cannot block a build.
2998
-
2999
- ### Compiler Boundary
3000
-
3001
- - `ordinaryRuntimeDependencies()` is the single pre-codegen validator for ordinary runtime graph edges; downstream import rewriting remains a fail-closed assertion.
3002
- - This release validates whether a relative runtime edge resolves to exactly one TypeScript file. Whether an existing target exports a requested name remains deferred to the planned module-symbol graph.
3003
- - P0.3 adds no accepted source syntax, ProjectSession, export cache, public API, browser runtime, or generated capability bytes. P0.4 async native-handler invalidation is next.
3004
-
3005
- ### Validation
3006
-
3007
- - `npm run check`, `npm test`, `npm run test:package`, and all 189 tests pass.
3008
- - Focused in-memory and build fixtures cover missing page imports, reachable helper imports, re-exports, relative/package/computed dynamic imports, type-only exclusion, unreachable exclusion, and absence of generated `.kudzu` paths.
3009
- - Existing Worker graph diagnostics, React/Router/Zustand migrations, keyed ownership, effects, navigation, and static-route zero-JavaScript behavior remain covered.
3010
-
3011
- ### Upgrade
3012
-
3013
- ```bash
3014
- npm install @kudzujs/core@^0.8.30
3015
- ```
3016
-
3017
- ## 0.8.29 - Symbol-aware descriptor discovery
3018
-
3019
- Kudzu 0.8.29 completes P0.2 by moving native handler, effect, binding, and list descriptor decisions from identifier spelling onto the source-local binding index introduced in 0.8.28.
3020
-
3021
- ### Changed in 0.8.29
3022
-
3023
- - Native handlers and effects discover state, setters, reducers, imports, captures, and nested snapshots by lexical reference identity when the complete callback belongs to the source index.
3024
- - Handler lowering consumes the same indexed identity used during discovery, so callback parameters and locals that shadow state, setters, reducers, imports, or captures remain untouched.
3025
- - Reactive conditionals, bindings, keyed-list evaluators, and list state rewrites distinguish outer state from same-named nested callback parameters.
3026
- - The command fast path accepts state and setter references only when they resolve outside the callback, and recognizes `console.log()` only when `console` is the actual browser global.
3027
- - Effect resource validation distinguishes real `IntersectionObserver`, `requestAnimationFrame()`, and `cancelAnimationFrame()` globals from shadowed application bindings and matches cleanup to the exact observer or frame declaration.
3028
-
3029
- ### Compiler Boundary
3030
-
3031
- - The binding index now recognizes normalized and original TypeScript node boundaries and exposes whether it directly owns an AST node.
3032
- - Imported, specialized, or compiler-synthesized trees continue through the established conservative shadow walker rather than borrowing an unrelated source index.
3033
- - P0.2 changes no public API, accepted source syntax, ModuleIR shape, browser runtime, or generated capability contract. P0.3 graph failure diagnostics is next.
3034
-
3035
- ### Validation
3036
-
3037
- - `npm run check`, `npm test`, `npm run test:package`, and all 187 tests pass.
3038
- - Focused tests cover shadowed imports, browser globals, state, setters, list parameters, JSON-safe HandlerIR/BindingIR round trips, and same-named effect resource cleanup.
3039
- - Existing Context actions, keyed component callbacks, React Router search parameters, native events, effects, Workers, navigation, and static-route zero-JavaScript behavior remain covered.
3040
-
3041
- ### Upgrade
3042
-
3043
- ```bash
3044
- npm install @kudzujs/core@^0.8.29
3045
- ```
3046
-
3047
- ## 0.8.28 - Source-local binding index
3048
-
3049
- Kudzu 0.8.28 completes the first large-application compiler foundation by resolving source-local lexical bindings before descriptor discovery and lowering.
3050
-
3051
- ### Changed in 0.8.28
3052
-
3053
- - A source-local binding index classifies value references as local declarations, parameters, imports, outer captures, known globals, or unresolved names with deterministic slots and source ranges.
3054
- - The index models module, function parameter/body, block, loop, catch, switch, class, computed method, namespace, import, destructuring, `var`, `let`, and `const` scopes without adding a TypeScript Program or cross-module graph.
3055
- - Reactive binding capture/import discovery uses lexical identity, so component locals named `document`, `location`, `history`, `navigator`, or `console` no longer become browser globals and shadowed callback parameters no longer become imports.
3056
- - Reactive binding lowering rewrites only the indexed occurrences that resolve to state or capture bindings. Same-named nested parameters remain local.
3057
- - Synthesized keyed expressions use the existing fail-safe path unless the complete expression can be indexed, preserving keyed row state and identity behavior.
3058
-
3059
- ### Performance And Architecture
3060
-
3061
- - A focused 1,000-reference guard verifies one index construction followed by direct indexed lookups and reports construction/lookup timing without making a cross-machine performance claim.
3062
- - The index is constructed after ordered normalization and parent repair, once per compiled source. It adds no public API, browser runtime, client metadata, or JavaScript bytes.
3063
- - Native handler, effect, and remaining descriptor discovery still use the existing analysis path; symbol-aware migration of those consumers remains the next P0.2 scope.
3064
-
3065
- ### Validation
3066
-
3067
- - `npm run check`, `npm run test:package`, and all 185 tests pass.
3068
- - Browser integration verifies shadowed browser-global names through initial HTML and reactive evaluator updates.
3069
- - React, Router, Zustand, keyed row, nested list, effect, Worker, navigation, and static-route zero-JavaScript behavior remain covered.
3070
-
3071
- ### Upgrade
3072
-
3073
- ```bash
3074
- npm install @kudzujs/core@^0.8.28
3075
- ```
3076
-
3077
- ## 0.8.27 - Large-application compiler roadmap
3078
-
3079
- Kudzu 0.8.27 records the evidence-backed path from the current static-first compiler to large production applications without adding a React runtime, generic client framework, or speculative resource API.
3080
-
3081
- ### Changed in 0.8.27
3082
-
3083
- - A reduced fixture from E2B Dashboard preserves a callback-shared terminal handle, asynchronous generation token, BFCache retention, resume, and discard cleanup as the first concrete Goal C resource-ownership boundary.
3084
- - Unsupported page-level mutable value refs now fail during source analysis with the source location and the existing effect-owned animation-frame exception instead of reaching the build-time DOM-ref runtime error.
3085
- - Goal C records independent WebSocket/SSE, shared request, and optimistic transaction candidates while explicitly withholding store, resource, query, cache, Provider, subscription, and scheduler APIs.
3086
- - The new large-application and AI-native execution plan audits the current compiler, IR, runtime, navigation, package, build, fixture, and benchmark boundaries and orders the next twelve independently verifiable PRs.
3087
- - The next implementation is fixed as a source-local binding index followed by symbol-aware descriptor discovery; ecosystem features cannot skip those semantic dependencies.
3088
-
3089
- ### Architecture Boundary
3090
-
3091
- - Existing ComponentAnalysis, ModuleIR, RouteIR, CapabilityIR, complete HTML, direct DOM ownership, native navigation, and capability runtimes remain the incremental foundation.
3092
- - The plan generalizes symbol identity, semantic state operations, component/module dataflow, resource/range ownership, artifact references, code splitting, diagnostics, migration analysis, and application-scale evidence without introducing a browser component tree.
3093
- - React ecosystem support is classified as Native, Compiled, Migrated, Adapter, Partial, or Unsupported so package-specific knowledge can move behind a compatibility boundary instead of accumulating in the core compiler.
3094
-
3095
- ### Validation
3096
-
3097
- - `npm run check`, `npm run test:package`, and all 176 tests pass.
3098
- - The E2B fixture remains an expected failure at its proven source boundary; no browser resource runtime or public API is emitted.
3099
- - Static-route zero JavaScript, existing animation-frame support, keyed-row diagnostics, setter-child diagnostics, and all current browser ownership behavior remain covered.
3100
-
3101
- ### Upgrade
3102
-
3103
- ```bash
3104
- npm install @kudzujs/core@^0.8.27
3105
- ```
3106
-
3107
- ## 0.8.26 - Goal B benchmark hardening
3108
-
3109
- Kudzu 0.8.26 makes the retained Goal B optimizations reproducible and directly regression-tested without changing generated runtime behavior or authoring support.
3110
-
3111
- ### Changed in 0.8.26
3112
-
3113
- - `benchmark:commerce` requires byte-identical candidate output by default; `EXPECTED_CHANGES` explicitly preserves historical comparisons with known artifact deltas.
3114
- - The standard suite verifies that exact route-entry sources transform once per build, distinct sources do not collide, and a new build owns a fresh transform map.
3115
- - List runtime generation tests retain the measured bulk-mount threshold, majority guards, nested/owner exclusions, and per-root fallback.
3116
- - The architecture packet now covers `0.8.25`, records Goal B baseline evidence and deliberate gaps, and closes the retained-experiment checklist.
3117
-
3118
- ### Performance Validation
3119
-
3120
- - Seven alternating `v0.8.24` and current-tree commerce builds emitted 1,011 pages and 3,056 files with no changed deploy hash.
3121
- - The measured medians were 14,766.5 ms and 12,202.4 ms. This validates the maintained runner and release direction but is not attributed to one optimization because the revisions include all `0.8.25` compiler-boundary changes.
3122
- - No new runtime bytes, scheduler, persistent cache, retained tree, or public browser capability was added.
3123
-
3124
- ### Validation
3125
-
3126
- - `npm run check`, `npm run test:package`, and all 175 tests pass.
3127
- - The exact-output commerce runner passed seven alternating 1,011-page builds.
3128
- - No accepted syntax, runtime behavior, DOM ownership, effect cleanup, or `create-kudzu` template changed.
3129
-
3130
- ### Upgrade
3131
-
3132
- ```bash
3133
- npm install @kudzujs/core@^0.8.26
3134
- ```
3135
-
3136
- ## 0.8.25 - Exact route-entry reuse
3137
-
3138
- Kudzu 0.8.25 removes measured repeated esbuild work from large multi-route builds, strengthens compiler boundary validation, and makes package publication gates explicit without changing generated deploy bytes or browser behavior.
3139
-
3140
- ### Changed in 0.8.25
3141
-
3142
- - Generated native, parameter, and effect route entries reuse one build-local esbuild result when their complete source is byte-identical after route-relative URLs are resolved.
3143
- - Normalization passes now declare an immutable-root contract and reject any result that is not a TypeScript `SourceFile`.
3144
- - Finalized ModuleIR rejects invalid local slots and dangling signal, handler, derived, keyed-parent, keyed-child, keyed-selector, and ownership references.
3145
- - CI covers the minimum Node 22 runtime and the Node 24 Chrome suite, while release jobs exercise the packed package and verify package, lockfile, tag, and registry versions.
3146
- - Missing `0.8.21`, `0.8.22`, and `0.8.23` release pages and their canonical sitemap entries are restored.
3147
-
3148
- ### Performance
3149
-
3150
- - Seven alternating clean builds of the public 1,000-product, 1,011-page fixture measured 12,581.4 ms with exact-source reuse versus 13,851.0 ms with repeated transformation, a 9.17% improvement.
3151
- - Every deploy path and SHA-256 hash matched. The map is scoped to one build and only the three generated route-entry families; no persistent or generalized transform cache was added.
3152
- - Raw arrays, environment, fixture revision, methodology, and limitations are recorded in `PERFORMANCE.md`.
3153
-
3154
- ### Validation
3155
-
3156
- - `npm run check`, `npm run test:package`, and all 174 tests pass.
3157
- - The packed-package smoke test installs the produced tarball into a temporary consumer, imports both public entry points, runs the packed CLI, and verifies generated HTML.
3158
- - The external 1,011-page benchmark produced byte-identical deploy manifests across both targets.
3159
- - No accepted syntax, public runtime API, VDOM, hydration, scheduler, retained browser component tree, or `create-kudzu` template change was added.
3160
-
3161
- ### Upgrade
3162
-
3163
- ```bash
3164
- npm install @kudzujs/core@^0.8.25
3165
- ```
3166
-
3167
- ## 0.8.24 - Measured Goal B optimizations
3168
-
3169
- Kudzu 0.8.24 starts the architecture optimization Goal B with two benchmark-proven optimizations for large keyed restoration and large multi-route builds while preserving complete HTML, direct DOM ownership, and existing compiler output. This is distinct from the completed historical Worker capability milestone in `GOAL_B.md`.
3170
-
3171
- ### Changed in 0.8.24
3172
-
3173
- - A maintained `npm run benchmark:keyed` fixture measures 2,000 keyed rows with row-local state, reactive slicing/search, bulk restoration, retained-heavy append, reversal, DOM identity, reset state, and restored handlers across fresh Chrome profiles.
3174
- - Top-level flat lists batch mount-hook discovery through their connected parent only when more than 32 additions dominate both the next list and parent children. Nested lists, shared containers, and small or retained-heavy additions keep per-root mounting.
3175
- - `applyNormalizationPasses()` repairs TypeScript parent pointers only after a pass returns a structurally changed `SourceFile`; validators and no-op passes no longer walk the complete AST again.
3176
- - A focused test proves changed normalization output has repaired parent links before the next pass runs.
3177
- - Goal B records identical generated route entries as the next measured esbuild-transform investigation; no cache or generalized build system was added without isolated evidence.
3178
-
3179
- ### Performance
3180
-
3181
- - Twenty-one fresh Chrome profiles measured 2,000-row restoration at 21.1 ms versus 26.3 ms for `0.8.23`, a 19.77% improvement. A retained-heavy 33-row append showed no material change at 2.7 ms versus 2.6 ms.
3182
- - The keyed route adds 127 B raw / 35 B aggregate gzip JavaScript. Filter, reverse, and clean-build distributions establish no material regression.
3183
- - Twenty-one alternating clean builds of [`SimYunSup/kudzu-based-bench`](https://github.com/SimYunSup/kudzu-based-bench)'s 1,000-product, 1,011-page Kudzu fixture measured 6,266.5 ms versus 6,684.7 ms for `0.8.23`, a 6.26% improvement.
3184
- - Both commerce builds emitted the same 3,056 files. Only `assets/kudzu-list.js` changed for the independently measured runtime optimization; normalization changed no output bytes.
3185
- - Exact keyed worktree setup and the checked-in `benchmark:commerce` paired runner are documented in `PERFORMANCE.md` with raw arrays and limitations.
3186
-
3187
- ### Validation
3188
-
3189
- - `npm run check` and all 172 tests pass, including the new normalization boundary check.
3190
- - Node 22 focused compiler checks and the maintained Worker benchmark pass.
3191
- - Chrome-backed keyed list, selector, row-hook, Worker ownership, and the new large keyed benchmark checks pass.
3192
- - Before release-content updates, the complete site plus representative list, keyed-row-hook, and navigation builds retained identical file lists; only `assets/kudzu-list.js` changed, and normalized `.kudzu` trees remained identical to `v0.8.23`.
3193
- - No accepted syntax, public API behavior, VDOM, hydration, scheduler, cache, retained browser component tree, or `create-kudzu` template change was added.
3194
-
3195
- ### Upgrade
3196
-
3197
- ```bash
3198
- npm install @kudzujs/core@^0.8.24
3199
- ```
3200
-
3201
- ## 0.8.23 - Source compiler boundary
3202
-
3203
- Kudzu 0.8.23 completes the Goal A compiler foundation by moving source normalization, TSX semantic analysis, ModuleIR finalization, handler generation, and build-module generation behind one explicit no-write source compiler result.
3204
-
3205
- ### Changed in 0.8.23
3206
-
3207
- - `compileSource()` returns a JSON-safe source result containing the project-relative build module, component analysis, ModuleIR, optional handler module, and imported assets without writing to `.kudzu` or `dist`.
3208
- - `createKudzuTransformer()` and all TypeScript AST feature analysis moved from `framework/build.mjs` to `framework/compiler/source-compiler.mjs`.
3209
- - Shared source resolution moved to `source-graph.mjs`; shared URL and filesystem path conversion moved to `path-helpers.mjs` and is reused by the development server.
3210
- - Worker graph emission is owned and exported directly by `worker-compiler.mjs`; the source result retains only JSON-safe Worker edges and rewritten source.
3211
- - `build.mjs` decreased from 3,732 to 744 lines and now coordinates discovery, source results, RouteIR, CapabilityIR, and artifact emission.
3212
-
3213
- ### Goal A boundary
3214
-
3215
- - Source analysis consumes all AST-bearing state before returning its result. No `ts.Node`, `Map`, `Set`, function, closure, or Symbol crosses into build orchestration.
3216
- - `compileSource()` returns project-relative generated paths and client import roots. Existing absolute paths remain only in source-located diagnostics and are normalized when comparing detached worktrees.
3217
- - RouteIR v1 and CapabilityIR v1 remain unchanged, and `core.mjs` remains authoritative for complete HTML and browser ownership IDs.
3218
- - Goal B optimization remains deferred; `0.8.23` is the corrected Goal A completion baseline.
3219
- - No accepted syntax, public API behavior, runtime capability, VDOM, hydration, component rerender, or retained browser component tree was added.
3220
-
3221
- ### Validation
3222
-
3223
- - The complete suite passes 171/171 tests, including a direct no-write, project-relative, JSON-round-trippable `compileSource()` boundary check.
3224
- - Node 22 type checks, the 135-page complete-site build, and all 171 tests pass.
3225
- - The complete site and eight representative binding, keyed-row, effect, Worker, parameter, navigation, config, and package-handler deploy trees are byte-identical to `v0.8.22`; their `.kudzu` trees match after normalizing only checkout-root source locations.
3226
- - An invalid reducer fixture retains the same source file, line, column, and diagnostic text.
3227
- - Worker and window graph files remain byte-identical. Seven interleaved clean Node 22 builds measured a 287.0 ms candidate median against 287.7 ms for `v0.8.22`; raw arrays and provenance are recorded in `PERFORMANCE.md`.
3228
- - `create-kudzu` remains 0.1.101 because its unchanged template already accepts `@kudzujs/core@^0.8.15`.
3229
-
3230
- ### Upgrade
3231
-
3232
- ```bash
3233
- npm install @kudzujs/core@^0.8.23
3234
- ```
3235
-
3236
- ## 0.8.22 - Versioned compiler foundation
3237
-
3238
- Kudzu 0.8.22 versions the rendered route plan as RouteIR v1 and the pure capability projection as CapabilityIR v1 while source-local ModuleIR seams and focused artifact generators preserve existing output.
3239
-
3240
- ### Changed in 0.8.22
3241
-
3242
- - The existing `renderPage().plan` is RouteIR v1 rather than a duplicated route representation.
3243
- - Route states add a deterministic route-local numeric `slot`; existing string `id` values remain authoritative browser/DOM identities and `name` remains readable development metadata.
3244
- - The existing pure capability manifest is CapabilityIR v1. Route and capability consumers reject unsupported versions.
3245
- - List, parameter, core, effect, binding, native, and navigation runtime generation moved from `build.mjs` into focused generator modules with narrow inputs and no filesystem ownership.
3246
- - Required authored-runtime source anchors fail closed instead of silently retaining stale branches.
3247
- - `build.mjs` decreased from 3,999 to 3,732 lines and now coordinates generator results and artifact emission rather than containing those feature semantics.
3248
-
3249
- ### Goal A boundary
3250
-
3251
- - ModuleIR slots identify source-local compiler records; RouteIR state slots identify positions in one rendered plan; browser IDs continue to own DOM/runtime behavior. The namespaces are deliberately independent.
3252
- - `core.mjs` remains authoritative for complete HTML, route/layout IDs, conditions, keyed paths, effect lifetimes, and exact cleanup.
3253
- - CapabilityIR selects shared runtime families and branches; RouteIR and ModuleIR references retain route entries, handlers, and Workers. Static pages remain complete documents with zero JavaScript.
3254
- - Goal B optimization remains deferred; the final source compiler boundary and corrected Goal A completion baseline follow in `0.8.23`.
3255
- - No accepted syntax, public API behavior, runtime capability, VDOM, hydration, component rerender, or retained browser component tree was added.
3256
-
3257
- ### Validation
3258
-
3259
- - The complete suite passes 170/170 tests, including RouteIR JSON round-trip and slots, CapabilityIR JSON round-trip/version rejection, fail-closed generator contracts, list/parameter/navigation generation, lifecycle cleanup, and development restoration by readable state name.
3260
- - `npm run check`, focused Node 22 compiler tests, and a Node 22 complete-site build pass.
3261
- - The complete site plus six representative binding, list, effect, Worker, runtime-parameter, and navigation deploy trees are byte-identical to `v0.8.21`; normalized RouteIR meaning is identical in all seven comparisons.
3262
- - Worker and window graph files remain byte-identical. Seven interleaved clean builds measured equal 250.1 ms medians; raw arrays and provenance are recorded in `PERFORMANCE.md`.
3263
- - Release-blocking architecture audits drove full IR schema validation, accurate reachability ownership, and fail-closed source contracts before publication.
3264
- - `create-kudzu` remains 0.1.101 because its unchanged template already accepts `@kudzujs/core@^0.8.15`.
3265
-
3266
- ### Upgrade
3267
-
3268
- ```bash
3269
- npm install @kudzujs/core@^0.8.22
3270
- ```
3271
-
3272
- ## 0.8.21 - Explicit effect ownership
3273
-
3274
- Kudzu 0.8.21 completes the next Goal A source-analysis seam: every supported effect now registers deterministic JSON-safe setup, cleanup, dependency, ownership, source, and Worker-edge data before existing build-time rendering allocates concrete lifecycle IDs.
3275
-
3276
- ### Changed in 0.8.21
3277
-
3278
- - EffectIR links setup to finalized HandlerIR and records cleanup, ordered signal and DerivedIR dependencies, subscriptions, dependency state snapshots, and keyed-item fields.
3279
- - Component and keyed ownership retain lexical component provenance and KeyedBlockIR slots, including specialized imported rows.
3280
- - Relative TypeScript Worker rewriting returns functional callback and edge results; rendered Worker emission derives only from EffectIR rather than a build-wide mutable reference array.
3281
- - Transformed effect calls consume the registered EffectIR dependency and ownership record before final setup HandlerIR slot resolution.
3282
- - Effect dependency classification and cleanup-owned browser resource validation moved to `compiler/effect-analysis.mjs`; transformer-wide component and keyed effect AST side tables were removed.
3283
- - Mixed direct and derived dependencies create DerivedIR only for derived expressions while preserving authored dependency order.
3284
-
3285
- ### Goal A boundary
3286
-
3287
- - `core.mjs` and the existing route plan remain authoritative for concrete route/layout/conditional/keyed effect IDs, mounting, stale-write invalidation, and cleanup order; ModuleIR does not duplicate RouteIR.
3288
- - EffectIR owns source-analysis facts and Worker graph edges. Route-specific effect codegen continues to consume rendered descriptors without rediscovering TSX semantics.
3289
- - No accepted syntax, public API, browser capability, VDOM, hydration, component rerender, or retained browser component tree was added.
3290
- - Goal A continues with the `0.8.22` RouteIR, CapabilityIR, numeric-slot, and final architecture/output audit.
3291
-
3292
- ### Validation
3293
-
3294
- - The complete suite passes 170/170 tests, including EffectIR JSON round-trip, mixed dependencies, imported keyed provenance, Worker rendered exclusion and `about:blank` replacement, conditional/navigation ownership, stale-write isolation, and cleanup.
3295
- - `npm run check`, focused Node 22 compiler tests, and a Node 22 complete-site build pass.
3296
- - Before release-content updates, the complete 135-page site plus `effect-dependencies`, `keyed-effects`, and `worker-effects` output trees were byte-identical to `v0.8.20`.
3297
- - Worker and window graph files remain byte-identical. Seven interleaved clean builds measured a 253.0 ms candidate median against 255.6 ms for `v0.8.20`; raw arrays and provenance are recorded in `PERFORMANCE.md`.
3298
- - A release-blocking architecture audit found no implementation or runtime-correctness blockers.
3299
- - `create-kudzu` remains 0.1.101 because its unchanged template already accepts `@kudzujs/core@^0.8.15`.
3300
-
3301
- ### Upgrade
3302
-
3303
- ```bash
3304
- npm install @kudzujs/core@^0.8.21
3305
- ```
3306
-
3307
- ## 0.8.20 - Explicit keyed ownership
3308
-
3309
- Kudzu 0.8.20 completes the next Goal A source-analysis boundary: keyed collection sites now finalize into deterministic JSON-safe ownership records before the existing build-time renderer allocates DOM identity and lifecycle state.
3310
-
3311
- ### Changed in 0.8.20
3312
-
3313
- - KeyedBlockIR records parent/child slots, collection signal or calculated binding, key/index policy, owner field, selector reference and states, source provenance, and static status.
3314
- - Recursive same-file and imported row expansion records every component-specialization slot, including stateless intermediate components.
3315
- - Row states and refs retain their specialization owner and declaration source.
3316
- - Command, native, effect, list-expression, list-conditional, and calculated-collection HandlerIR/BindingIR records link to their owning keyed block.
3317
- - Transformer-wide keyed value, condition, event, nested-list, effect, rendered-list, and alias AST side tables were removed; temporary AST stays inside immediate source-local validation and lowering.
3318
- - The existing route list descriptor now has an explicit TypeScript shape without changing its serialized data.
3319
-
3320
- ### Goal A boundary
3321
-
3322
- - `core.mjs` remains authoritative for final list IDs, row key paths, route descriptors, complete HTML, SVG context, state/ref/effect allocation, and exact release.
3323
- - Effect setup, cleanup, dependency, Worker, and lifetime ownership remains on the existing path until EffectIR in `0.8.21`.
3324
- - No accepted syntax, public API, browser capability, VDOM, hydration, component rerender, or retained browser component tree was added.
3325
-
3326
- ### Validation
3327
-
3328
- - The complete suite passes 168/168 tests, including deterministic KeyedBlockIR JSON round-trip and calculated, nested, recursive-component, selector, state, ref, handler, binding, effect, and SVG ownership.
3329
- - Before release-content updates, the complete site `dist` and seven representative keyed fixture output trees matched `v0.8.19`; detached-worktree roots were normalized only in existing `.kudzu` source strings.
3330
- - The keyed list runtime remains byte-identical at 21,831 B raw / 6,930 B gzip. A same-volume 21-run interleaved comparison measured a 0.52% lower candidate median; raw arrays and provenance are recorded in `PERFORMANCE.md`.
3331
- - `create-kudzu` remains 0.1.101 because its unchanged template already accepts `@kudzujs/core@^0.8.15`.
3332
-
3333
- ### Upgrade
3334
-
3335
- ```bash
3336
- npm install @kudzujs/core@^0.8.20
3337
- ```
3338
-
3339
- ## 0.8.19 - Handler, binding, and derived IR
3340
-
3341
- Kudzu 0.8.19 completes the next Goal A source-analysis boundary: native callbacks, reactive bindings, list evaluators, imports, and pure derived expressions now finalize into JSON-safe ModuleIR before mechanical artifact codegen.
3342
-
3343
- ### Changed in 0.8.19
3344
-
3345
- - Native and effect callback exports retain explicit roles, signals, setters, captures, snapshot policy, imports, source ranges, and finalized export source in HandlerIR.
3346
- - Reactive bindings, list expressions, and list condition evaluators retain explicit states, captures, parameters, imports, and deterministic module-export slots in BindingIR.
3347
- - Rendered list selectors and derived effect dependencies use the existing tagged collection-expression language as canonical DerivedIR; transformed build source reads back the registered records.
3348
- - Reducer, Context, Zustand, package-import, nested snapshot, and scope semantics finish lowering while source AST and diagnostics are still available.
3349
- - `handler-codegen.mjs` imports no TypeScript or AST helpers. It renders the finalized ordered imports and concatenates generated HandlerIR/BindingIR export source.
3350
- - The previous semantic artifact arrays containing callback/expression AST, `Map`, and `Set` values were deleted. They remain only inside the source-local session until finalization and do not cross the IR boundary.
3351
-
3352
- ### Goal A boundary
3353
-
3354
- - Effect lifetime, cleanup, dependencies, Worker edges, and ownership remain on the existing path until EffectIR in `0.8.21`; only their generated callback exports join HandlerIR now.
3355
- - Keyed DOM ownership remains on the existing path until KeyedBlockIR in `0.8.20`; list evaluators and pure selectors are explicit without moving key-path ownership early.
3356
- - `core.mjs` remains authoritative for complete HTML, final route/layout state IDs, and the serializable route plan.
3357
- - No accepted syntax, public API, runtime capability, VDOM, hydration, component rerender, or retained browser component tree was added.
3358
-
3359
- ### Validation
3360
-
3361
- - The complete suite passes 167/167 tests, including ModuleIR JSON round-trip, command-only exclusion, native async handlers, bindings, package imports, reducer, Context, Zustand, list-derived, and effect-derived contracts.
3362
- - Before release-content updates, the complete site `dist` and nine representative fixture output trees matched `v0.8.18`; detached-worktree roots were normalized only in existing `.kudzu` diagnostic strings.
3363
- - Worker and window graphs remain byte-identical. A same-volume 21-run interleaved comparison measured a 0.32% lower candidate median; raw arrays, file lists, and environment are recorded in `PERFORMANCE.md`.
3364
- - `create-kudzu` remains 0.1.101 because its unchanged template already accepts `@kudzujs/core@^0.8.15`.
3365
-
3366
- ### Upgrade
3367
-
3368
- ```bash
3369
- npm install @kudzujs/core@^0.8.19
3370
- ```
3371
-
3372
- ## 0.8.18 - Explicit component ownership
3373
-
3374
- Kudzu 0.8.18 completes the next Goal A source-analysis seam: state, setters, props, refs, IDs, and supported component specializations now have one ordered JSON-safe ownership result without changing final route allocation or deploy behavior.
3375
-
3376
- ### Changed in 0.8.18
3377
-
3378
- - Every compiled non-Worker source retains component analysis alongside its transformed build module and optional handler module; Worker graphs keep their existing dedicated result.
3379
- - Lexical owners record ordered state and setter slots, destructured prop shape, object refs, deterministic IDs, and honest source ranges.
3380
- - Specialized calls record supplied/defaulted props, generated state/ref/ID ownership, and direct links to parent, reducer, custom-hook, or Context signals.
3381
- - Command IR resolves owner identity per state command instead of assigning one setter-map scope to an entire handler. Mixed parent/child and nested keyed commands remain distinct.
3382
- - Context consumer signals point to a stable Provider source owner; repeated imported and structural specializations retain independent compile-time ownership.
3383
- - AST `WeakMap` indexes remain private to immediate source rewriting. They do not cross the JSON-safe source result or become a runtime component model.
3384
-
3385
- ### Goal A boundary
3386
-
3387
- - `core.mjs` still executes transformed components at build time and allocates final route/layout state, ref, ID, conditional, and keyed ownership in the same order.
3388
- - Initial values, browser state IDs, complete HTML, and the serializable route plan remain authoritative runtime inputs; the component result does not duplicate them.
3389
- - HandlerIR, BindingIR, and DerivedIR are the planned `0.8.19` seam. KeyedBlockIR and EffectIR remain on their existing paths until `0.8.20` and `0.8.21`.
3390
- - No accepted syntax, public API, VDOM, hydration, component rerender, or retained browser component tree was added.
3391
-
3392
- ### Validation
3393
-
3394
- - The complete suite passes 167/167 tests, including JSON round-trip, per-signal owner, repeated/conditional/imported state, setter adapter, ref, ID, Context, reducer, and nested keyed ownership contracts.
3395
- - Before release-content updates, the complete `dist` and `.kudzu` trees were byte-identical to `v0.8.17`.
3396
- - Worker and window graphs remain byte-identical. A same-volume 21-run interleaved comparison measured a 2.43% candidate median difference, below the 5% architecture gate; raw arrays and environment are recorded in `PERFORMANCE.md`.
3397
- - `create-kudzu` remains 0.1.101 because its unchanged template already accepts `@kudzujs/core@^0.8.15`.
3398
-
3399
- ### Upgrade
3400
-
3401
- ```bash
3402
- npm install @kudzujs/core@^0.8.18
3403
- ```
3404
-
3405
- ## 0.8.17 - Command ModuleIR
3406
-
3407
- Kudzu 0.8.17 lands the first real Goal A vertical slice: supported command handlers are recognized as plain JSON-safe data, registered in a sparse per-source ModuleIR, and lowered back through focused source codegen without changing deploy output.
3408
-
3409
- ### Changed in 0.8.17
3410
-
3411
- - Direct setter arithmetic, functional setter arithmetic, primitive setter values, and state logging now produce plain Command IR instead of generated TypeScript array nodes during analysis.
3412
- - ModuleIR assigns deterministic numeric signal and handler slots while retaining readable state names, lexical state-owner keys, and original source ranges when they exist.
3413
- - Command codegen consumes only ModuleIR signal and handler data to reconstruct the existing `__kBehavior()` call; it performs no source analysis.
3414
- - Signed literals preserve unary-plus and negative-zero source semantics through JSON-safe syntax metadata. Non-finite numeric forms stay on the existing generic handler path.
3415
- - Same-named states in independent component owners receive distinct IR slots, while nested handlers sharing one setter environment reuse the same signal identity.
3416
- - Synthetic specialized handlers omit invented source positions; imported/original handlers retain normalized repository-relative source provenance.
3417
-
3418
- ### Goal A boundary
3419
-
3420
- - The first active ModuleIR slice contains lexical signals and command handlers only. `core.mjs` remains authoritative for initial values, final route/layout state IDs, complete HTML, and the serializable route plan.
3421
- - State/props/ref/component specialization is the planned `0.8.18` seam. Bindings, derived values, keyed blocks, and effects remain on their existing paths until their own explicit results replace AST side tables.
3422
- - No VDOM, hydration, component rerender, runtime component tree, public API, or accepted syntax was added.
3423
-
3424
- ### Validation
3425
-
3426
- - The complete suite passes 166/166 tests, including JSON round-trip, numeric edge, lexical owner, command codegen, specialized-component, and existing generic-handler contracts.
3427
- - Before release-content updates, the unchanged source site `dist`, Counter build module, route plan, and command runtime were byte-identical to `v0.8.16`; the final release adds only its expected version, homepage, documentation, and release-page content.
3428
- - The tracked Worker and window graphs remain byte-identical. A same-volume 21-run comparison found no build regression; raw arrays and environment are recorded in `PERFORMANCE.md`.
3429
- - `create-kudzu` remains 0.1.101 because its unchanged template already accepts `@kudzujs/core@^0.8.15`.
3430
-
3431
- ### Upgrade
3432
-
3433
- ```bash
3434
- npm install @kudzujs/core@^0.8.17
3435
- ```
3436
-
3437
- ## 0.8.16 - Compiler analysis boundaries
3438
-
3439
- Kudzu 0.8.16 continues the behavior-preserving compiler decomposition: source-local descriptors, the pure collection language, command fast paths, reduced Zustand migration, and route capability projection now have explicit ownership outside build orchestration.
3440
-
3441
- ### Changed in 0.8.16
3442
-
3443
- - One descriptor session owns deterministic native-handler, effect, reactive-binding, list-evaluator, and client-import registration for each source module.
3444
- - Collection roots, aliases, imported transforms, selector pipelines, and pure expression IR are shared directly by React migration, reactive JSX, effects, and keyed-list discovery.
3445
- - Direct setter arithmetic and literals remain compact command descriptors instead of becoming generic browser handler functions.
3446
- - Reduced Zustand store analysis and normalization now share one focused compiler pass while retaining the existing accepted and rejected migration boundary.
3447
- - Rendered route plans project through one pure capability manifest before runtime specialization and artifact emission.
3448
- - Route capability metadata is keyed by route identity, and effect descriptor registry ownership remains private to the source descriptor session.
3449
-
3450
- ### Architecture continuation
3451
-
3452
- - `docs/next-architecture` records the current compiler responsibility map, Goal A through D decisions, the `0.8.17` through `0.8.22` Goal A sequence, version policy, and performance gates.
3453
- - Goal A proceeds with a sparse JSON-safe ModuleIR and one Counter command vertical slice next; it does not add a VDOM, hydration, component rerender, store/resource runtime, router, or React island.
3454
- - Component specialization, keyed-list ownership, and effect analysis remain in the main transformer until their AST-identity side tables can be replaced by explicit results rather than hidden behind large context objects.
3455
-
3456
- ### Validation
3457
-
3458
- - `build.mjs` is 3,837 lines, down from 4,351 in 0.8.15, while retaining build orchestration and the intentionally coupled semantic transformer.
3459
- - The complete suite passes 163/163 tests, including focused descriptor, collection IR, command, Zustand, and capability-manifest contracts.
3460
- - A 21-run round-robin comparison on the same Apple M3 temp volume retained exact Worker and window graph bytes. The `0.8.16` 816.5 ms median was 3.75% above the `0.8.15` 787.0 ms baseline with overlapping distributions, below the 5% architecture gate; raw arrays and environment are recorded in `PERFORMANCE.md`.
3461
- - `create-kudzu` remains 0.1.101 because its template already accepts `@kudzujs/core@^0.8.15` and did not change.
3462
-
3463
- ### Upgrade
3464
-
3465
- ```bash
3466
- npm install @kudzujs/core@^0.8.16
3467
- ```
3468
-
3469
- ## 0.8.15 - Compiler architecture
3470
-
3471
- Kudzu 0.8.15 makes the compiler's actual architecture explicit in source and public documentation: React-shaped TSX is normalized, analyzed into capability descriptors, and emitted as complete HTML plus route-specific ESM.
3472
-
3473
- ### Changed in 0.8.15
3474
-
3475
- - `build.mjs` now owns build orchestration while focused compiler modules own shared AST scope analysis, ordered normalization, React and React Router migration, browser-signal and resource-lifecycle passes, Worker graphs, and effect/handler code generation.
3476
- - The duplicated page/imported-source normalization sequence is one ordered pipeline that restores TypeScript AST parent pointers after every pass.
3477
- - Private custom-hook timer metadata returns explicitly from its pass instead of relying on a module-global `WeakMap` keyed by transformed AST identity.
3478
- - Worker validation, relative graph checks, content-hashed emission, and placeholder rewriting share one compiler boundary while final rendered-effect gating remains in build orchestration.
3479
- - Effect, native-handler, reactive-binding, and keyed-list evaluator generation consume analyzed descriptors without participating in source analysis.
3480
- - The public homepage, README, and web documentation now describe Kudzu as a compiler that treats supported React-shaped TSX as input rather than as a browser runtime model.
3481
-
3482
- ### Fixed in 0.8.15
3483
-
3484
- - Existing-project installation now states the Node.js 22 requirement and required package scripts.
3485
- - The generator package lock and generated core dependency now match the published package versions.
3486
- - The missing 0.8.2 release page is restored and release routes are included in the sitemap without replacing their page metadata.
3487
- - Documentation tables, code blocks, callouts, navigation, and long inline code remain bounded at a 390px viewport.
3488
- - Package-import handler guidance, serializable array-state guidance, benchmark provenance, and media-query external-store wording now agree with source and tests.
3489
- - Dedicated AST helper and normalization tests raise the complete suite to 153 tests.
3490
-
3491
- ### Boundary
3492
-
3493
- This release does not broaden the accepted React-shaped syntax or add browser runtime capabilities. The main transformer still owns tightly coupled component, state, collection, and ownership analysis; future extraction should follow proven input/output seams rather than create directory structure without reducing coupling.
3494
-
3495
- ### Upgrade
3496
-
3497
- ```bash
3498
- npm install @kudzujs/core@^0.8.15
3499
- ```
3500
-
3501
- ## 0.8.14 - Localized blog migration
3502
-
3503
- Kudzu 0.8.14 proves a localized MDX blog and continuous imperative canvas can migrate without React, request-time i18n, eval, or a canvas runtime.
3504
-
3505
- ### New in 0.8.14
3506
-
3507
- - Build-known MDX emits complete static article HTML without `eval()` or `new Function()`.
3508
- - Locale-prefixed `/ko` and `/en` routes build through `getStaticPaths()`, and relative Link replacements automatically prefix native hrefs from the build-known locale.
3509
- - The root route selects a stored locale or reads `navigator.languages`, then preserves query and hash through native `location.replace()`.
3510
- - MDX copy blocks and tabs compile through existing clipboard, state, binding, and conditional capabilities.
3511
- - One `null`-initialized canvas ref may feed an inline effect whose local state survives recursive animation frames, visibility changes, and native input listeners.
3512
- - Bare `IntersectionObserver` and `performance` remain browser globals in route-specific effect ESM.
3513
- - Static sibling routes remain complete zero-JavaScript HTML.
3514
-
3515
- ### Fixed in 0.8.14
3516
-
3517
- - Effect-owned `IntersectionObserver` instances must disconnect in cleanup.
3518
- - Local animation-frame handles assigned by effects must be cancelled in cleanup.
3519
- - The complete suite passes 151/151 tests.
3520
-
3521
- ### Boundary
3522
-
3523
- This release does not execute `next-intl`, add request-time `Accept-Language` negotiation, general mutable refs, callbacks shared across effects or handlers, a canvas runtime, or arbitrary MDX component execution. Request-time locale redirects remain host/edge configuration; resource-private drawing state and listeners stay inside one owning effect.
3524
-
3525
- ### Upgrade
3526
-
3527
- ```bash
3528
- npm install @kudzujs/core@^0.8.14
3529
- ```
3530
-
3531
- ## 0.8.13 - Browser capability migration
3532
-
3533
- Kudzu 0.8.13 proves browser-owned migration paths from Memos, Excalidraw, and Cal.com without adding React, general external-store compatibility, or browser capability runtimes.
3534
-
3535
- ### New in 0.8.13
3536
-
3537
- - Memos-shaped scroll spies retain an effect-owned `useRef(0)` animation-frame handle with burst coalescing, exact cleanup, smooth navigation, and active-heading ARIA.
3538
- - Excalidraw-shaped `"share" in navigator` conditions emit false static fallback and mount Web Share DOM and handlers only in supporting browsers.
3539
- - Cal.com-shaped static `useSyncExternalStore` media queries emit desktop-first HTML and lower matching `change` subscriptions into owned effects.
3540
- - Direct Web Share and clipboard actions preserve application-owned success and failure state without package adapters.
3541
- - Static sibling routes remain complete zero-JavaScript HTML for every migration fixture.
3542
-
3543
- ### Fixed in 0.8.13
3544
-
3545
- - Build-time Node `navigator` availability can no longer permanently fold browser capability UI to the wrong branch.
3546
- - Optimized state-select text bindings now register the same direct state commit path as optimized attributes.
3547
- - Animation-frame refs reject aliases, shadowed bindings, inverted guards, indirect reset/cancellation, repeated scheduling, and missing cleanup with source locations.
3548
- - The complete suite passes 149/149 tests.
3549
-
3550
- ### Boundary
3551
-
3552
- This release does not add general mutable refs, external stores, media hooks, browser-expression rendering, animation scheduling, collaboration transport, QR generation, or React package execution. Dynamic capability names, `navigator.canShare()`, parameterized/imported media hooks, dynamic queries, and arbitrary store snapshots remain source migration work.
3553
-
3554
- ### Upgrade
3555
-
3556
- ```bash
3557
- npm install @kudzujs/core@^0.8.13
3558
- ```
3559
-
3560
- ## 0.8.12 - Static icon migration
3561
-
3562
- Kudzu 0.8.12 proves a source migration path from Lucide React-shaped icon usage to accessible static SVG without a package factory or browser runtime.
3563
-
3564
- ### New in 0.8.12
3565
-
3566
- - Used icons move into relative TSX components with direct intrinsic SVG roots and familiar size, stroke, class, fill, ARIA, and title props.
3567
- - Meaningful icons retain explicit roles and titles, while decorative icons remain hidden from assistive technology.
3568
- - React-shaped SVG presentation attributes normalize to native output and complete icon routes ship zero JavaScript.
3569
- - Unreachable icon modules are excluded from compilation instead of becoming deploy artifacts.
3570
- - Public documentation records the migration recipe and its deliberate package boundary.
3571
-
3572
- ### Fixed in 0.8.12
3573
-
3574
- - Handler emission now follows references in the final route plan and HTML, removing evaluator modules left behind by build-folded component conditions while preserving list-expression evaluators.
3575
- - The complete suite passes 143/143 tests.
3576
-
3577
- ### Boundary
3578
-
3579
- This release does not execute `lucide-react`. Dynamic icon lookup, `createLucideIcon()`, package-owned factories, and a generic icon runtime remain unsupported source migration work.
3580
-
3581
- ### Upgrade
3582
-
3583
- ```bash
3584
- npm install @kudzujs/core@^0.8.12
3585
- ```
3586
-
3587
- ## 0.8.11 - Stale-safe data migration
3588
-
3589
- Kudzu 0.8.11 proves source migration paths for TanStack Query-shaped data and React Hook Form-shaped forms while strengthening dependency-effect stale-write isolation.
3590
-
3591
- ### New in 0.8.11
3592
-
3593
- - Build-known query data moves to async pages and emits complete zero-JavaScript HTML.
3594
- - Browser-only query data uses one dependency effect with application-owned loading, error, result, and primitive refetch state.
3595
- - Superseded unowned dependency effects invalidate their invocation before cleanup, so late promise or fetch setters cannot overwrite newer state.
3596
- - A deterministic Chrome race verifies that a fast refetch remains visible after a delayed prior response arrives, followed by HTTP failure and recovery.
3597
- - React Hook Form-shaped signup source migrates to native controls, constraint validation, `FormData`, one async submit handler, accessible server errors, and retained uncontrolled values.
3598
- - Static sibling routes remain JavaScript-free, with no TanStack Query or React Hook Form runtime in deploy output.
3599
-
3600
- ### Fixed in 0.8.11
3601
-
3602
- - Mobile documentation now uses a true 100% layout wrapper with explicit inner gutters instead of a reduced outer width.
3603
- - The complete suite passes 142/142 tests.
3604
-
3605
- ### Boundary
3606
-
3607
- This release does not execute TanStack Query or React Hook Form. Query clients, Providers, caches, retries, deduplication, optimistic cache updates, query-key arrays, Suspense, controllers, watchers, resolvers, and dynamic field registration remain source migration work.
3608
-
3609
- ### Upgrade
3610
-
3611
- ```bash
3612
- npm install @kudzujs/core@^0.8.11
3613
- ```
3614
-
3615
- ## 0.8.10 - Native dialog migration
3616
-
3617
- Kudzu 0.8.10 proves a source migration path from a shadcn/Radix-shaped dialog to the native `<dialog>` element without adding package compatibility runtime.
3618
-
3619
- ### New in 0.8.10
3620
-
3621
- - A reduced migration fixture preserves a relative `forwardRef` component, props, children, object refs, and ordinary JSX event handlers.
3622
- - Package-owned Portal and Context behavior becomes native `showModal()`, `close()`, and cancel handling.
3623
- - Complete accessible dialog markup is pre-rendered while route output includes only the `click` and `cancel` events it uses.
3624
- - Chrome coverage verifies modal top-layer behavior, initial focus, confirm and cancel paths, and explicit trigger-focus restoration.
3625
- - Public documentation now includes the migration recipe and its deliberate library boundary.
3626
-
3627
- ### Fixed in 0.8.10
3628
-
3629
- - Mobile documentation code blocks stay within the content grid and scroll horizontally instead of widening the viewport.
3630
- - Browser tests allow slower CI Chrome startup and report process timeouts directly instead of failing later against empty DOM output.
3631
- - The complete suite passes 140/140 tests.
3632
-
3633
- ### Boundary
3634
-
3635
- This release does not execute Radix or arbitrary React UI packages. `Portal`, `asChild`/`Slot`, element cloning, and arbitrary compound-component Context must be removed during source migration. Applications remain responsible for dialog labeling and explicit focus restoration.
3636
-
3637
- ### Upgrade
3638
-
3639
- ```bash
3640
- npm install @kudzujs/core@^0.8.10
3641
- ```
3642
-
3643
- ## 0.8.9 - Context-backed CRUD actions
3644
-
3645
- Kudzu 0.8.9 specializes state-backed actions exposed through one conventional Context Provider and relative custom hook.
3646
-
3647
- ### New in 0.8.9
3648
-
3649
- - A relative zero-argument custom hook may directly return `useContext(ContextIdentifier)` from one local or named relative Context module.
3650
- - One Provider may expose direct shorthand `useState` pairs and synchronous actions that capture only those exposed pairs.
3651
- - Consumers may select state and actions across ordinary component boundaries; direct action calls inline into existing route handler ESM and concrete state operations.
3652
- - CRUD actions over object arrays compose with keyed rows, reactive selection, conditional editors, and guarded local storage effects in the React Notes migration.
3653
- - Unsupported private captures, hidden state dependencies, indirect action references, dynamic Provider values, multiple Providers, and consumer binding collisions fail with source diagnostics.
3654
- - Static sibling routes remain JavaScript-free. No action function, Context runtime, Provider tree, callback registry, VDOM, or hydration is emitted.
3655
- - The complete suite passes 139/139 tests, including Chrome coverage for create, rename, select, and delete behavior.
3656
-
3657
- ### Boundary
3658
-
3659
- The hook must directly return `useContext(ContextIdentifier)`. The Context and exactly one Provider must be declared together in one local or named relative module, and its value must be one direct shorthand object. Actions must be synchronous, called directly in intrinsic handlers, and capture only exposed Provider state pairs.
3660
-
3661
- ### Upgrade
3662
-
3663
- ```bash
3664
- npm install @kudzujs/core@^0.8.9
3665
- ```
3666
-
3667
- ## 0.8.8 - Conditional keyed map roots
3668
-
3669
- Kudzu 0.8.8 compiles ordinary expression-bodied conditional keyed maps through the existing pure collection selector path.
3670
-
3671
- ### New in 0.8.8
3672
-
3673
- - One-parameter keyed maps may return `condition && <Row />` or `condition ? <Row /> : null`.
3674
- - Top-level conditions may combine the current item with direct primitive parent state; nested maps support item-only conditions.
3675
- - Omitted rows own no DOM or hooks. True-to-false transitions release row state, effects, and refs; re-entry creates fresh ownership.
3676
- - Retained siblings preserve keyed DOM identity through condition changes, insertion, and reorder.
3677
- - Same-file and relative row components remain compiler-specialized before the existing list runtime receives the normalized filter.
3678
- - Imported build-known item-only conditions still fold to complete zero-JavaScript HTML.
3679
- - The React Notes migration restores its ordinary `notes.map(note => activeId === note.id && <Editor />)` source shape.
3680
- - Map indexes, alternate JSX fallbacks, block-bodied conditional maps, arbitrary captures, and impure predicates remain diagnosed.
3681
- - The complete suite passes 134/134 tests.
3682
-
3683
- ### Boundary
3684
-
3685
- Conditional map callbacks must be synchronous expression arrows with exactly one item parameter. Indexes are rejected because implicit filtering changes their meaning. The feature adds no runtime capability, VDOM, hydration, or component rerenderer.
3686
-
3687
- ### Upgrade
3688
-
3689
- ```bash
3690
- npm install @kudzujs/core@^0.8.8
3691
- ```
3692
-
3693
- ## 0.8.7 - Reactive keyed row selection
3694
-
3695
- Kudzu 0.8.7 lets a flat keyed row combine its current item or index with direct primitive parent state in pure text and attribute expressions.
3696
-
3697
- ### New in 0.8.7
3698
-
3699
- - Selected-row classes, `aria-current`, `aria-selected`, and similar pure expressions update directly after parent-state commits.
3700
- - Retained rows reevaluate only their expression text and attributes; list structure, handlers, and DOM identity remain untouched.
3701
- - Initial static HTML evaluates the same expression with build-time state values.
3702
- - Calculated SVG coverage verifies focus, Space, click, insertion, reorder, latest handlers, selected classes, ARIA state, and retained node identity.
3703
- - A React Notes migration restores its ordinary `activeId === note.id` selected-row source without imperative DOM code.
3704
- - Object/array parent state, arbitrary captures, nested-row parent state, structural conditions, mutation, and arbitrary calls remain diagnosed.
3705
- - The complete suite passes 134/134 tests.
3706
-
3707
- ### Boundary
3708
-
3709
- This support is limited to pure flat keyed-row text and attribute expressions over the current item/index plus direct primitive parent state. It adds no component rerenderer, VDOM, hydration, or general capture runtime.
3710
-
3711
- ### Upgrade
3712
-
3713
- ```bash
3714
- npm install @kudzujs/core@^0.8.7
3715
- ```
3716
-
3717
- ## 0.8.6 - Responsive list reversals
3718
-
3719
- Kudzu 0.8.6 fixes stale keyed-list bookkeeping after reverse and one-item removal fast paths.
3720
-
3721
- ### Fixed in 0.8.6
3722
-
3723
- - Reverse fast paths now store the latest logical item order after moving existing keyed DOM nodes.
3724
- - One-item removal fast paths update the same baseline before subsequent list actions.
3725
- - Repeated reverse clicks apply on the next microtask instead of requiring another delayed interaction.
3726
- - Existing keyed rows retain DOM identity and uncontrolled input values through every reorder.
3727
- - Chrome coverage verifies `3,2,1 → 1,2,3 → 3,2,1` across rapid actions, and the complete suite passes 134/134 tests.
3728
-
3729
- ### Boundary
3730
-
3731
- This is a bookkeeping correction in the existing keyed-list runtime. It adds no list capability, VDOM, hydration, or component runtime.
3732
-
3733
- ### Upgrade
3734
-
3735
- ```bash
3736
- npm install @kudzujs/core@^0.8.6
3737
- ```
3738
-
3739
- ## 0.8.5 - Owned timer actions
3740
-
3741
- Kudzu 0.8.5 compiles one proven private timeout ref pattern from a returned relative custom-hook action into existing state and effect ownership.
3742
-
3743
- ### New in 0.8.5
3744
-
3745
- - One directly returned relative custom-hook callback may own one `useRef<number | null>(null)`, directly clear its previous timeout, and assign a numeric-literal-delay `setTimeout()` whose callback updates hook state.
3746
- - One empty-dependency effect directly clears the latest timer on cleanup. Conditional unmount cancels pending work, and remount creates fresh ownership.
3747
- - The compiler lowers the private ref to a collision-free hidden state slot shared by existing native-handler and effect contexts; no timer scheduler or runtime is added.
3748
- - Named, default-arrow, and relative re-export hook forms retain the same specialization and independent timer identities.
3749
- - Browser coverage verifies replacement, latest-only firing, unmount cancellation, and fresh remount. Dynamic delays fail with source diagnostics.
3750
- - Static siblings remain JavaScript-free, and the complete suite passes 134/134 tests.
3751
-
3752
- ### Boundary
3753
-
3754
- The hook may own one private timeout ref with one direct returned callback, one literal delay, and one direct cleanup effect. Multiple refs, aliases, dynamic delays, intervals, keyed ownership, indirect callbacks, and arbitrary timed graphs remain unsupported.
3755
-
3756
- ### Upgrade
3757
-
3758
- ```bash
3759
- npm install @kudzujs/core@^0.8.5
3760
- ```
3761
-
3762
- ## 0.8.4 - Browser-native handlers
3763
-
3764
- Kudzu 0.8.4 fixes named event handlers that use standard browser globals during real React application migrations.
3765
-
3766
- ### New in 0.8.4
3767
-
3768
- - Named and inline event handlers keep `localStorage`, `FileReader`, and `alert` in route-specific browser ESM instead of serializing them as component captures during static rendering.
3769
- - FrugalHQ backup export, file import, and reset handlers now build without evaluating browser-only globals in Node.
3770
- - Browser regression coverage verifies that the globals remain absent from SSR capture scope and resolve normally after a real click.
3771
- - The fix adds no runtime, shared bytes, hydration, or browser component tree.
3772
- - The complete suite passes 133/133 tests.
3773
-
3774
- ### Boundary
3775
-
3776
- Application-owned handler captures must still be JSON-safe. This release only corrects classification of the proven standard browser globals; it does not execute browser APIs during static rendering or add arbitrary callback support.
3777
-
3778
- ### Upgrade
3779
-
3780
- ```bash
3781
- npm install @kudzujs/core@^0.8.4
3782
- ```
3783
-
3784
- ## 0.8.3 - Native interaction composition
3785
-
3786
- Kudzu 0.8.3 characterizes ordinary clipboard, debounce, and accessible SVG point interactions through existing route-specific capabilities instead of dedicated browser runtimes.
3787
-
3788
- ### New in 0.8.3
3789
-
3790
- - Direct async handlers and directly returned relative custom-hook callbacks may call native `navigator.clipboard.writeText()` while application state owns success and permission-failure feedback.
3791
- - Dependency effects may own debounced synchronization with `setTimeout()` and directly returned `clearTimeout()` cleanup; dependency changes and conditional unmount cancel pending work.
3792
- - Calculated keyed SVG points may use focus, click, Space, and Enter handlers to update parent state rendered in an external accessible HTML tooltip.
3793
- - Retained SVG rows preserve DOM identity and read the latest point labels after recalculation and reorder.
3794
- - Clipboard, timer, and chart-specific runtimes remain absent, and unaffected static sibling routes continue to ship zero JavaScript.
3795
- - The complete suite passes 133/133 tests with focused Chrome coverage for clipboard success/failure, latest-only debounce, unmount cleanup, fresh remount, accessible tooltip input, and retained SVG identity.
3796
-
3797
- ### Boundary
3798
-
3799
- Debounce requires explicit effect ownership and direct cleanup. Private timer refs, unowned delayed event writes, intervals, arbitrary callback graphs, keyed-item SVG conditions, nested calculated SVG lists, and chart runtimes remain unsupported until a reduced migration fixture proves they are necessary.
3800
-
3801
- ### Upgrade
3802
-
3803
- ```bash
3804
- npm install @kudzujs/core@^0.8.3
3805
- ```
3806
-
3807
- ## 0.8.2 - Calculated keyed collections
3808
-
3809
- Kudzu 0.8.2 lets one direct array field from a synchronous relative calculation result drive an intrinsic keyed list, preserving static HTML and existing DOM ownership while improving list and navigation hot paths.
3810
-
3811
- ### New in 0.8.2
3812
-
3813
- - A top-level `const result = calculate(state)` may feed `result.items.map(...)` when the relative synchronous helper returns a JSON-safe array field.
3814
- - Route-specific evaluator ESM refreshes a compiler-owned array anchor after source-state commits; the existing keyed reconciler retains keys, current handlers, and SVG namespaces.
3815
- - Initial structural rows hydrate list bookkeeping without repeating DOM writes, retained direct attributes skip redundant DOM reads, and stable-list fallback avoids duplicate validation.
3816
- - Immutable local filter sources with unused ordinary `useState` setters use the existing static-filter restoration path while indirect custom-hook and reducer mutation paths remain dynamic.
3817
- - Required route modules emit `modulepreload` hints, and navigation prefetch resolves validated destination capabilities before commit while preserving complete-document fallback and cleanup ordering.
3818
- - Navigation prefetch safely ignores focus and pointer targets outside anchors.
3819
- - Calculated collection fixtures verify insert, reorder, removal, retained identity, latest handlers, scalar bindings, SVG namespace, and zero JavaScript on unaffected static routes.
3820
- - The complete suite passes 133/133 tests, and the FIRE migration retains all chart nodes and acceptance behavior.
3821
-
3822
- ### Boundary
3823
-
3824
- The calculation must be one top-level immutable result from a synchronous relative TypeScript function, and the consumed field must remain a JSON-safe array. Indirect result aliases, dynamic fields, nested calculated SVG lists, package calculations, and asynchronous helpers remain unsupported. Static-filter specialization applies only when an ordinary local setter is provably unused; lifecycle-bearing and indirectly mutable collections retain the general path.
3825
-
3826
- ### Upgrade
3827
-
3828
- ```bash
3829
- npm install @kudzujs/core@^0.8.2
3830
- ```
3831
-
3832
- ## 0.8.1 - Custom-hook reset actions
3833
-
3834
- Kudzu 0.8.1 compiles direct multi-state reset callbacks returned by relative custom hooks into one existing behavior command, keeping conventional hook ownership without adding a callback runtime.
3835
-
3836
- ### New in 0.8.1
3837
-
3838
- - Returned custom-hook callbacks may reset their exposed state/setter pairs to direct string, number, negative-number, boolean, or `null` literals in one batched commit.
3839
- - Imported callback literals are synthesized before command emission, fixing source-range corruption when optimized behavior commands originate in another module.
3840
- - The FIRE Standard calculator now owns its twelve-field reset inside `useStandardParams()`; existing dependency effects update URL parameters and local storage after the same commit.
3841
- - A React/Vite migration fixture verifies exact optimized command output plus browser updates for multiple reset values.
3842
- - Static routes and routes without reset actions add no JavaScript or runtime capability.
3843
-
3844
- ### Boundary
3845
-
3846
- Reset callbacks may capture only directly returned state/setter pairs and use direct literal setter calls. Private defaults, helper-indirect setters, dynamic values, timers, clipboard work, aliases, and arbitrary callback graphs remain unsupported.
3847
-
3848
- ### Upgrade
3849
-
3850
- ```bash
3851
- npm install @kudzujs/core@^0.8.1
3852
- ```
3853
-
3854
- ## 0.8.0 - URL-backed custom hooks
3855
-
3856
- Kudzu 0.8.0 migrates practical relative React custom hooks that combine local state, effects, direct actions, writable URL search parameters, and guarded browser storage while preserving static HTML and route-specific capabilities.
3857
-
3858
- ### New in 0.8.0
3859
-
3860
- - Named or default zero-argument custom hooks imported from relative TypeScript modules can expose direct shorthand `useState` value/setter pairs and callbacks that capture those states.
3861
- - React Router `useSearchParams()` accepts a top-level `[params, setParams]` tuple. Direct browser callbacks may pass one synchronous inline updater and optionally exactly `{ replace: true }`.
3862
- - Query writes use native `URLSearchParams` and History APIs, immediately recommit affected route signals, and follow browser `popstate` without an SPA router.
3863
- - Custom-hook mount and dependency effects can restore validated values from `localStorage`, persist subsequent state, and keep deterministic build-time fallbacks.
3864
- - Page entries now define the compiled TypeScript graph, so unreachable migration modules no longer block a build while reachable invalid imports retain diagnostics.
3865
- - Direct maps over imported immutable JSON-safe arrays fold to static HTML; relative calculation helpers can drive direct reactive result fields through route binding ESM.
3866
- - Package imports referenced directly inside JSX event handlers erase from build modules and bundle only into route handlers, enabling ExcelJS export without package execution during rendering.
3867
- - FIRE migration validation covers all fourteen routes, production Tailwind/Inter assets, URL and storage restoration, reset, presets, native SVG charts, Quiz and keyed Debt flows, and a real Excel workbook buffer.
3868
- - Static sibling routes continue to ship no JavaScript; React, React Router, hydration, a VDOM, and a browser hook dispatcher remain absent.
3869
-
3870
- ### Boundary
3871
-
3872
- Custom hooks must be synchronous zero-argument relative imports with one final direct shorthand object return. Caller destructuring cannot use aliases, defaults, or rest. Writable search parameters require direct inline updater callbacks. Relative calculation results require direct static field reads. Package imports must be referenced directly inside intrinsic JSX event callbacks. Dynamic query reads, direct-value setters, arbitrary options, mutable value refs, generic reactive objects, calculated collection fields, helper-indirect package use, and callback graphs with private captures remain unsupported.
3873
-
3874
- ### Upgrade
3875
-
3876
- ```bash
3877
- npm install @kudzujs/core@^0.8.0
3878
- ```
3879
-
3880
- ## 0.7.30 - Reactive number formatting
3881
-
3882
- Kudzu 0.7.30 supports fixed-locale `Intl.NumberFormat` display chains in reactive JSX locals, restoring conventional comma-formatted controlled inputs while preserving narrow render-call validation.
3883
-
3884
- ### New in 0.7.30
3885
-
3886
- - Reactive text and attributes accept `new Intl.NumberFormat("literal").format(Math.round(expression))` over supported state-derived primitive expressions.
3887
- - Initial HTML is formatted during the build and existing binding ESM reevaluates the same native expression after state changes.
3888
- - No collection selector opcode, shared formatting runtime, hydration, or browser component instance is added.
3889
- - Locale values must be direct string literals; dynamic locales and options remain unsupported.
3890
- - Optional calls, aliases, shadowed `Intl` or `Math`, arbitrary constructors, and other render calls retain source diagnostics.
3891
- - A migration-derived FIRE `CurrencyInput` restores `100,000` annual and `8,333` monthly display while preserving annualized state updates.
3892
- - The complete suite passes 123/123 tests, including emitted evaluator and invalid dynamic-locale coverage.
3893
-
3894
- ### Boundary
3895
-
3896
- This is display formatting only. The accepted expression requires one static locale and exactly `Math.round(expression)` as the format argument. Collection selectors and effect dependency expressions keep their existing pure expression language.
3897
-
3898
- ### Upgrade
3899
-
3900
- ```bash
3901
- npm install @kudzujs/core@^0.7.30
3902
- ```
3903
-
3904
- ## 0.7.29 - Hermetic TypeScript checks
3905
-
3906
- Kudzu 0.7.29 makes project and migration-fixture typechecks independent of unrelated ambient types and package declarations installed in ancestor directories.
3907
-
3908
- ### New in 0.7.29
3909
-
3910
- - The root TypeScript configuration declares an empty ambient `types` set instead of scanning every visible ancestor `node_modules/@types` directory.
3911
- - `create-kudzu` emits the same isolated TypeScript configuration for new projects.
3912
- - Migration fixture checks skip third-party declaration bodies while continuing to typecheck fixture TS and TSX against Kudzu's reduced declarations.
3913
- - A clean `npm ci` checkout nested below conflicting `@types/minimatch`, React, and React Router installations now passes `npm run check`.
3914
- - The complete suite continues to pass 122/122 tests.
3915
-
3916
- ### Upgrade
3917
-
3918
- ```bash
3919
- npm install @kudzujs/core@^0.7.29
3920
- ```
3921
-
3922
- ## 0.7.28 - Nested component specialization
3923
-
3924
- Kudzu 0.7.28 recursively specializes components rendered inside setter-adapter children, allowing conventional optional UI such as an imported hookful Tooltip to remain declarative without adding a browser component runtime.
3925
-
3926
- ### New in 0.7.28
3927
-
3928
- - Setter-adapter children may recursively render synchronous same-file or relative-imported components.
3929
- - Nested component props, defaults, JSX children, static assets, handlers, and relative TypeScript imports reuse the existing call-site specialization path.
3930
- - Nested `useState()`, `useId()`, `useRef()`, and supported effects join the outer generated owner on unconditional or statically truthy paths.
3931
- - Literal `&&` and ternary conditions fold before specialization, so omitted and false optional components allocate no hooks or browser capabilities.
3932
- - Recursive component cycles, namespace/package components, and unresolved component imports retain source diagnostics.
3933
- - Hookful nested components on dynamic paths fail instead of receiving incorrect unconditional ownership.
3934
- - Setter callbacks cannot cross a second component boundary.
3935
- - A migration-derived FIRE `AgeInput` now restores its imported hookful `Tooltip`, including generated ARIA identity and hover/focus state.
3936
- - The complete suite passes 122/122 tests with Chrome coverage for nested tooltip state, omitted optional UI, and existing parent/child lifecycle behavior.
3937
-
3938
- ### Boundary
3939
-
3940
- Nested hooks are accepted only when the nested component is unconditional or guarded by a statically truthy literal after outer prop substitution. Dynamic conditional hook ownership and forwarding the setter through another component remain unsupported. Components still erase to intrinsic HTML and route-specific capabilities; React is never emitted or executed.
3941
-
3942
- ### Upgrade
3943
-
3944
- ```bash
3945
- npm install @kudzujs/core@^0.7.28
3946
- ```
3947
-
3948
- ## 0.7.27 - Stateful component migration
3949
-
3950
- Kudzu 0.7.27 lets ordinary setter-adapter components keep their local hooks and derived render values while compiling them into static HTML plus existing route-specific capabilities, not a browser component runtime.
3951
-
3952
- ### New in 0.7.27
3953
-
3954
- - Same-file and relative-imported children receiving one supported setter callback may own multiple directly serializable `useState()` values.
3955
- - A child string draft may initialize from one direct primitive state prop through zero-argument `.toString()`, covering conventional controlled age and numeric inputs.
3956
- - Setter-adapter children may use deterministic build-time `useId()` values and `null`-initialized object refs.
3957
- - Supported child effects reuse existing route ESM, dependency comparison, cleanup, conditional ownership, and stale-work isolation.
3958
- - Conditional removal deletes child state, resolves refs to `null`, and runs cleanup; remount creates fresh ownership and prop dependency effects synchronize drafts to the latest parent value.
3959
- - Inline and simple `const` parent callbacks continue to specialize into the generated child helper instead of becoming serialized function captures.
3960
- - Reactive JSX text and attributes may read recursively chained top-level immutable locals built from supported pure primitive state expressions.
3961
- - Impure derived render calls, non-null child refs, unsupported dynamic state initializers, repeated callback use, and wider callback forwarding retain source-located diagnostics.
3962
- - React Router normalization now safely ignores local export declarations without module specifiers.
3963
- - A migration-derived FIRE age input verifies local draft editing, parent updates, blur validation, effect synchronization, and remount after a hidden parent update.
3964
- - The complete suite passes 121/121 tests, including same-file/imported hook ownership and Chrome lifecycle coverage.
3965
-
3966
- ### Boundary
3967
-
3968
- This remains one compiler-specialized component boundary with one supported setter callback use. Prop-derived state initialization accepts only a direct primitive state prop's zero-argument `.toString()`; other dynamic initializers remain unsupported. Refs must initialize with `null`, effects must use the existing supported callback and dependency forms, and React is never emitted or executed.
3969
-
3970
- ### Upgrade
3971
-
3972
- ```bash
3973
- npm install @kudzujs/core@^0.7.27
3974
- ```
3975
-
3976
- ## 0.7.26 - React-shaped migration and faster lists
3977
-
3978
- Kudzu 0.7.26 broadens ordinary React-shaped migration input and removes repeated keyed-row cleanup scans, making the matched 500-card search faster than React without adding a VDOM, hydration, or a retained component tree.
3979
-
3980
- ### New in 0.7.26
3981
-
3982
- - JSX typing accepts React 19 `ReactNode`-shaped component output while preserving Kudzu's compile-time element model.
3983
- - Intrinsic DOM handlers retain contextual event typing through migration-compatible JSX declarations.
3984
- - A direct setter or one-call value-adapter callback may cross one supported component boundary, covering ordinary controlled search inputs without serializing a function.
3985
- - Imported static collections wrapped in TypeScript-only assertions such as `as const` remain analyzable and erase normally.
3986
- - Collection selector execution caches state reads and avoids recursive rest-array, `slice()`, and `map()` allocation in hot expression paths.
3987
- - Safe keyed rows with local state but no row effects, nested lists, or shared text targets release binding and condition registrations directly by state ID instead of rescanning every removed subtree.
3988
- - Rows outside that proven boundary continue through the existing DOM-owned unmount path.
3989
- - A 21-run alternating fresh-profile benchmark measured the 500-card filter at 13.5 ms for Kudzu and 13.9 ms for React, making Kudzu 2.88% faster and 52.30% faster than its preserved 28.3 ms baseline.
3990
- - The same benchmark measured Kudzu's build 11.90% faster, keyed row toggle 7.02% faster, and emitted JavaScript 87.29% smaller by aggregate gzip.
3991
- - The complete suite passes 118/118 tests, including remove-all, unseen-key remount, and fresh row-state coverage for the indexed release path.
3992
-
3993
- ### Boundary
3994
-
3995
- Indexed row release is compiler-selected only when cleanup can be proven from row-owned state IDs and the row has no effects, nested lists, or shared text targets. Effectful, nested, and otherwise lifecycle-bearing rows retain the general ownership cleanup path. Setter adapters remain limited to one supported component boundary and one direct intrinsic handler call. React remains migration input only and is never emitted or executed.
3996
-
3997
- ### Upgrade
3998
-
3999
- ```bash
4000
- npm install @kudzujs/core@^0.7.26
4001
- ```
4002
-
4003
- ## 0.7.25 - Router-shaped native navigation
4004
-
4005
- Kudzu 0.7.25 accepts a narrow React Router `useNavigate()` source shape and lowers safe static destinations to native full-document navigation without shipping React Router or adding an SPA runtime.
4006
-
4007
- ### New in 0.7.25
4008
-
4009
- - A named or aliased `useNavigate` import may initialize one top-level `const` identifier in a component.
4010
- - Direct calls from nested browser callbacks with one safe static root-relative destination lower to `globalThis.location.assign()`.
4011
- - Exactly `{ replace: true }` lowers to `globalThis.location.replace()`.
4012
- - Configured `base` is applied while query strings and fragments are preserved.
4013
- - The React Router import and navigate binding are erased from emitted component code.
4014
- - Dynamic or relative destinations, render-time calls, passed aliases, optional calls, and other navigation options fail with source diagnostics.
4015
- - Native document navigation remains deliberate even when enhanced navigation is configured.
4016
- - Unaffected destination routes remain complete static documents with zero JavaScript.
4017
- - The complete suite passes 117/117 tests with Chrome coverage for base-aware full-document navigation.
4018
-
4019
- ### Boundary
4020
-
4021
- The supported migration shape is one top-level `const navigate = useNavigate()` and direct calls from nested browser callbacks. Destinations must be safe static root-relative strings. Only the absent options argument and exactly `{ replace: true }` are supported; dynamic values, relative paths, deltas, state, relative routing, scroll options, aliases, and render-time calls remain unsupported. No SPA router is included.
4022
-
4023
- ### Upgrade
4024
-
4025
- ```bash
4026
- npm install @kudzujs/core@^0.7.25
4027
- ```
4028
-
4029
- ## 0.7.24 - Router-shaped query reads
4030
-
4031
- Kudzu 0.7.24 accepts a narrow read-only React Router `useSearchParams()` shape and lowers each static query read to a nullable route signal backed by native `URLSearchParams`, without adding a router runtime.
4032
-
4033
- ### New in 0.7.24
4034
-
4035
- - A named or aliased `useSearchParams` import may initialize one top-level `const [params]` tuple without a setter.
4036
- - Direct top-level `const value = params.get("literal")` reads lower to cached nullable query signals.
4037
- - The route-specific parameter module uses native `URLSearchParams.get()` semantics for missing, empty, duplicate, plus-encoded, Unicode, and percent-encoded values.
4038
- - Static fallback HTML renders missing query text as blank and omits nullable attributes; browser values initialize before route effects mount.
4039
- - Query signals compose with direct text and attributes, effect dependencies, native handlers, React Router Link lowering, and configured same-document navigation.
4040
- - Routes without query reads emit no parameter module or query branch.
4041
- - Setter tuples, dynamic names, other methods, aliases, wrapped expressions, and indirect reads fail with source diagnostics.
4042
- - The complete suite passes 115/115 tests with Chrome coverage for standalone and navigation-group query initialization.
4043
-
4044
- ### Boundary
4045
-
4046
- The supported migration shape is one top-level `const [params] = useSearchParams()` and one or more top-level direct `const value = params.get("literal")` reads. Query setters, `getAll`, `has`, iteration, dynamic names, aliases, inline JSX calls, fallback wrappers, layout ownership, and general URLSearchParams semantics remain unsupported. Native document navigation remains the default; no SPA router is included.
4047
-
4048
- ### Upgrade
4049
-
4050
- ```bash
4051
- npm install @kudzujs/core@^0.7.24
4052
- ```
4053
-
4054
- ## 0.7.23 - Router-shaped runtime params
4055
-
4056
- Kudzu 0.7.23 accepts the conventional React Router `useParams()` source shape on runtime bracket routes and redirects it to the existing capability-specific pathname reader without shipping React Router.
4057
-
4058
- ### New in 0.7.23
4059
-
4060
- - Named or aliased `useParams` imports from `react-router-dom` may be called directly on bracket pages exporting `runtimeParams = true`.
4061
- - One optional TypeScript type argument is preserved through normalization while the runtime call remains argument-free.
4062
- - The React Router binding is redirected to `@kudzujs/core`; no `react-router-dom` module reference survives emitted code.
4063
- - Mixed `Link` and `useParams` imports lower together: Link becomes a base-aware native anchor and params reuse the pathname reader.
4064
- - Runtime parameter values retain existing secure decoding, direct DOM bindings, effects, handlers, and navigation-group lifecycle behavior.
4065
- - Indirect references, runtime arguments, default/namespace imports, and unsupported router hooks fail with source diagnostics.
4066
- - The complete suite passes 112/112 tests with browser coverage for multi-parameter paths and mixed Link/params migration input.
4067
-
4068
- ### Boundary
4069
-
4070
- React Router `useParams()` lowering requires a direct named or aliased zero-argument call on a bracket route exporting `runtimeParams = true`. Build-known `getStaticPaths()` routes continue to receive params through page props. Catch-all routes, optional segments, indirect calls, runtime arguments, and other router hooks remain unsupported. No SPA router or shared router runtime is added.
4071
-
4072
- ### Upgrade
4073
-
4074
- ```bash
4075
- npm install @kudzujs/core@^0.7.23
4076
- ```
4077
-
4078
- ## 0.7.22 - SVG structures and native links
4079
-
4080
- Kudzu 0.7.22 extends ordinary React-shaped structural authoring into SVG and erases the common React Router `Link` form to native navigation without adding an SVG renderer or router runtime.
4081
-
4082
- ### New in 0.7.22
4083
-
4084
- - Reactive conditional branches inside SVG parse replacement markup in the actual SVG parent context and retain existing DOM ownership semantics.
4085
- - Flat intrinsic keyed lists inside SVG support add, update, reorder, and removal while preserving keyed identity and the SVG namespace.
4086
- - SVG fragment construction is compiled out of HTML-only condition and list builds; the measured matched fixture added 333 B raw / 79 B aggregate gzip JavaScript.
4087
- - A named or aliased `Link` import from `react-router-dom` with one static root-relative `to` lowers to a native `<a href>`, receives the configured `base`, and erases the package import.
4088
- - Dynamic or relative Link destinations, traversal, `NavLink`, router-only props, spreads, default/namespace imports, and non-JSX uses fail with source diagnostics.
4089
- - Effect dependency arrays are explicitly proven for multiple direct primitive states or supported props through existing commit batching and `Object.is` comparison.
4090
- - The complete suite passes 111/111 tests with Chrome coverage for SVG namespace, conditional replacement, keyed identity, Link erasure, and zero-JavaScript static output.
4091
-
4092
- ### Measured fixture
4093
-
4094
- On the recorded Intel i5-9500 / Chrome 142 environment, 1,000-row SVG medians were 0.8 ms conditional, 1.9 ms update, 8.3 ms reverse, 2.4 ms remove, and 3.5 ms add. The matched HTML control measured 0.7, 1.8, 8.3, 2.5, and 3.6 ms. Link and native-anchor controls emitted byte-identical 248 B HTML and zero JavaScript. Full methodology and raw arrays are in `PERFORMANCE.md`.
4095
-
4096
- ### Boundary
4097
-
4098
- Structural SVG currently supports reactive conditionals and flat intrinsic keyed lists. Keyed-item conditions, nested SVG lists, reactive MathML, and namespaced attributes remain unsupported. React Router lowering accepts only direct named or aliased `Link` JSX with one safe static root-relative destination and native anchor props. Native document navigation remains the default; no SPA router is included.
4099
-
4100
- ### Upgrade
4101
-
4102
- ```bash
4103
- npm install @kudzujs/core@^0.7.22
4104
- ```
4105
-
4106
- ## 0.7.21 - Composable collections and effects
4107
-
4108
- Kudzu 0.7.21 expands ordinary React-shaped collection pipelines and effect authoring while preserving keyed identity, derived dependency semantics, and capability-specific browser output.
4109
-
4110
- ### New in 0.7.21
4111
-
4112
- - A relative-imported named or default synchronous one-parameter function may directly return a supported pure collection pipeline; Kudzu composes its selector without executing or shipping the function.
4113
- - Immutable `slice(start, end?)` accepts numeric literals and supported direct primitive state expressions for bounded pagination.
4114
- - Pure `filter` predicates may combine direct primitive state with supported string methods for reactive search.
4115
- - Expression-bodied `toSorted((left, right) => ...)` comparators compile into immutable selector sorting; mutating `sort()` fails with a source diagnostic.
4116
- - A top-level immutable primitive local derived from direct state may appear in an effect dependency array. Source commits schedule comparison, but unchanged derived results do not rerun the effect.
4117
- - Derived expressions are substituted into setup and cleanup handlers, so reruns and final disposal observe the latest value.
4118
- - Same-component top-level simple `const` setup and directly returned cleanup functions are statically substituted into effect handlers; indirect aliases remain unsupported.
4119
- - The complete suite passes 107/107 tests with browser coverage for pagination, search, sorted identity, derived equality, cleanup order, and named effect functions.
4120
-
4121
- ### Boundary
4122
-
4123
- Collection transforms must be relative, synchronous, capture-free, one-parameter functions with one returned supported pipeline. Slice bounds and sort comparators reject arbitrary calls; `sort()` remains unsupported. Derived effect locals must be pure primitive expressions over direct state. Effect function references must be direct top-level `const` functions in the same component; dynamic selection, parameters, and cross-component references remain unsupported.
4124
-
4125
- ### Upgrade
4126
-
4127
- ```bash
4128
- npm install @kudzujs/core@^0.7.21
4129
- ```
4130
-
4131
- ## 0.7.20 - Computed child collections
4132
-
4133
- Kudzu 0.7.20 accepts a common block-bodied keyed `map` callback that computes one direct child collection before returning JSX, without executing arbitrary callback code or adding a browser runtime path.
4134
-
4135
- ### New in 0.7.20
4136
-
4137
- - A keyed `map` callback may contain one top-level `const` declaration followed by its final JSX return.
4138
- - The `const` must start from a direct parent-item child property and may use the existing pure `filter`, direct-property `flatMap`, or `Array.from` selector pipeline.
4139
- - The computed alias feeds exactly one nested keyed list source.
4140
- - The compiler substitutes the proven calculation into the returned JSX before nested-list analysis, then reuses existing selector encoding and keyed ownership.
4141
- - Child insertion, reorder, removal, indexes, and DOM identity retain the existing nested-list behavior.
4142
- - Additional statements, multiple or mixed alias reads, parent capture, mutation, arbitrary calls, and asynchronous callbacks fail during compilation.
4143
- - The complete suite passes 107/107 tests with browser coverage for dynamic computed-child insertion and source-diagnostic coverage for mixed alias use.
4144
-
4145
- ### Boundary
4146
-
4147
- This release supports one direct-child collection `const` in a block-bodied keyed-map callback. Multiple calculations, aliases used outside one nested keyed list, imported transforms, parent captures, mutation, and async work remain unsupported.
4148
-
4149
- ### Upgrade
4150
-
4151
- ```bash
4152
- npm install @kudzujs/core@^0.7.20
4153
- ```
4154
-
4155
- ## 0.7.19 - Reusable collection aliases
4156
-
4157
- Kudzu 0.7.19 lets one immutable local collection alias feed multiple keyed list sites while preserving independent DOM identity, and formalizes setter callback and object-ref ownership across one ordinary component boundary.
4158
-
4159
- ### New in 0.7.19
4160
-
4161
- - A top-level immutable local alias over a supported collection pipeline may be reused by multiple keyed `map` sites.
4162
- - Every alias reference must remain a statically analyzable collection source; mixed reads such as `visible.length` fail with a source-located diagnostic instead of becoming stale build-time values.
4163
- - Each list site retains its own keyed DOM identity through insertion, reorder, and removal while sharing the same state-backed selector.
4164
- - Inline or simple `const` setter callbacks may cross one same-file or relative-imported component boundary to an event on the child's direct intrinsic root.
4165
- - A `null`-initialized object ref may cross the same boundary; conditional removal resolves it to `null`, and remount points it at a fresh element.
4166
- - These paths reuse compiler-owned behavior and ref descriptors without a callback registry, retained component instance, VDOM, or hydration.
4167
- - The complete suite passes 107/107 tests with browser coverage for both reusable list identity and callback/ref conditional ownership.
4168
-
4169
- ### Boundary
4170
-
4171
- Reusable aliases must be top-level immutable locals whose every reference is a supported collection source. Search, slice, pagination, sorting, mutation, imported transforms, arbitrary callbacks, callback refs, and forwarding beyond the proven component boundary remain unsupported.
4172
-
4173
- ### Upgrade
4174
-
4175
- ```bash
4176
- npm install @kudzujs/core@^0.7.19
4177
- ```
4178
-
4179
- ## 0.7.18 - Primitive child prop dependencies
4180
-
4181
- Kudzu 0.7.18 formalizes direct JSON-safe primitive parent state as a reactive child prop across ordinary same-file and relative-imported components, without adding component specialization or a browser component tree.
4182
-
4183
- ### New in 0.7.18
4184
-
4185
- - A direct parent state identifier passed to a destructured child prop remains the same compiler-owned signal.
4186
- - Child text and attribute bindings update directly when the parent primitive changes.
4187
- - Child `useEffect` dependency arrays may reference that destructured prop and reuse the parent state ID.
4188
- - Repeated child calls share the parent signal while retaining independent effect records and captures.
4189
- - Conditional child insertion mounts its effect, parent updates run cleanup before setup, and removal cleans up exactly once.
4190
- - Same-file and relative-imported children receive matching behavior; React and component functions remain absent from browser output.
4191
- - The complete suite passes 106/106 tests with browser coverage for binding updates, dependency order, conditional mount, rerun, and removal.
4192
-
4193
- ### Boundary
4194
-
4195
- The prop must be a direct JSON-safe primitive parent state identifier. Derived expressions, object or array dependencies, computed prop forwarding, and broader callback/ref ownership remain unsupported.
4196
-
4197
- ### Upgrade
4198
-
4199
- ```bash
4200
- npm install @kudzujs/core@^0.7.18
4201
- ```
4202
-
4203
- ## 0.7.17 - Lazy reducer initialization
4204
-
4205
- Kudzu 0.7.17 lowers React-shaped `useReducer(reducer, initialArg, initializer)` calls into existing compiler-owned reducer state when the initializer is statically analyzable, and fixes capability-specialized keyed-list fallback paths.
4206
-
4207
- ### New in 0.7.17
4208
-
4209
- - A synchronous one-parameter initializer may be inline, same-file, or imported from a relative TypeScript module.
4210
- - The initial argument must be directly serializable, and the initializer result must be a primitive, plain-object, or array literal derived only from that argument.
4211
- - The compiler substitutes the argument, emits fresh literal AST, and lowers the call to the existing two-argument reducer ownership path.
4212
- - React migration imports and direct `@kudzujs/core` imports receive matching TypeScript overloads without adding a reducer runtime.
4213
- - Dynamic calls, captures, defaults, rest parameters, async or generator functions, and non-literal results fail with source-located diagnostics.
4214
- - Keyed-list builds now use the template fallback when static collection support is absent and preserve a zero index when index capability code is removed.
4215
- - The complete suite passes 105/105 tests, including browser coverage for ordinary, nested, reducer-owned, effect-owned, and conditional keyed lists.
4216
-
4217
- ### Boundary
4218
-
4219
- Kudzu does not execute initializer functions during compilation. It only substitutes a directly serializable argument into a directly serializable return expression. Reducer factories, package initializers, arbitrary computation, and captured values remain unsupported.
4220
-
4221
- ### Upgrade
4222
-
4223
- ```bash
4224
- npm install @kudzujs/core@^0.7.17
4225
- ```
4226
-
4227
- ## 0.7.16 - Build-time lazy state
4228
-
4229
- Kudzu 0.7.16 accepts the common React-shaped `useState(() => initialValue)` form when the initializer directly returns a serializable literal, lowering it into existing compiler-owned state with no browser component runtime.
4230
-
4231
- ### New in 0.7.16
4232
-
4233
- - Anonymous synchronous zero-argument lazy initializers may directly return primitive, plain-object, or array literals.
4234
- - The compiler lowers those functions before state analysis, so ordinary, repeated, imported, conditional, and keyed-row state reuse existing ownership paths.
4235
- - Conditional removal still deletes owned state, and remount recreates a fresh clone of the serialized object or array initializer.
4236
- - React migration imports and direct `@kudzujs/core` imports receive the same behavior and TypeScript inference.
4237
- - Dynamic calls, captures, parameters, async or generator functions, named function expressions, and multi-statement bodies fail with source-located diagnostics.
4238
- - Static routes remain JavaScript-free; lazy initializer functions are absent from generated component and browser modules.
4239
-
4240
- ### Boundary
4241
-
4242
- This release evaluates no arbitrary user code at build time. Initializers must directly return data the compiler can already serialize. Lazy `useReducer` initialization and dynamic state factories remain unsupported.
4243
-
4244
- ### Upgrade
4245
-
4246
- ```bash
4247
- npm install @kudzujs/core@^0.7.16
4248
- ```
4249
-
4250
- ## 0.7.15 - Child state ownership
4251
-
4252
- Kudzu 0.7.15 gives repeated ordinary child components independent state and adds explicit state ownership to reactive conditional branches without introducing a browser component tree.
4253
-
4254
- ### New in 0.7.15
4255
-
4256
- - Repeated same-file and relative-imported child components receive distinct concrete state IDs.
4257
- - Shared generated handler modules retain per-element state maps and serializable prop captures, so one child update cannot mutate its sibling.
4258
- - Reactive conditional descriptors record only state created directly by each branch.
4259
- - Conditional removal unmounts DOM capabilities and deletes the active branch's owned state slots.
4260
- - Re-entry recreates primitive, object, or array state from serialized initial values instead of restoring stale state.
4261
- - Initially active branches reuse their pre-rendered state IDs rather than executing the child component a second time.
4262
- - Nested condition owners remain independent, and existing route/layout, keyed-row, effect, and navigation ownership behavior is preserved.
4263
- - Static sibling routes remain JavaScript-free; no component registry, hook dispatcher, or generic rerender loop is emitted.
4264
-
4265
- ### Measured fixture
4266
-
4267
- The focused three-route fixture rendered repeated same-file and imported toggles plus conditional removal/re-entry. A clean local build measured approximately 270 ms and emitted 10,815 B raw JavaScript across the two interactive routes; the static sibling route emitted no script. Chrome verified sibling isolation, state deletion on removal, fresh remount values, and stable initial active-branch IDs.
4268
-
4269
- ### Boundary
4270
-
4271
- This release owns direct state created while rendering ordinary conditional branches. Lazy `useState`/`useReducer` initialization, broader primitive prop dependencies, and additional callback/ref ownership remain fixture-driven work. Browser output still contains only state and DOM capabilities, never component functions.
4272
-
4273
- ### Upgrade
4274
-
4275
- ```bash
4276
- npm install @kudzujs/core@^0.7.15
4277
- ```
4278
-
4279
- ## 0.7.14 - Intrinsic forwardRef
4280
-
4281
- Kudzu 0.7.14 preserves conventional direct `forwardRef()` component authoring while erasing the wrapper into build-time intrinsic output.
4282
-
4283
- ### New in 0.7.14
4284
-
4285
- - `forwardRef` may be imported directly or with an alias from `react`, or called as a direct default/namespace React member.
4286
- - One top-level `const` component may wrap one inline synchronous `(props, ref)` render function.
4287
- - The compiler removes `ref` from ordinary props and rest bindings before supplying it as the render function's second parameter.
4288
- - The forwarded object ref must appear exactly once on the direct intrinsic root and reuses Kudzu's existing deterministic ref marker.
4289
- - Components remain valid when the optional ref prop is omitted; `null` and `undefined` intrinsic refs emit no marker.
4290
- - Same-file and relative-imported components compile without React, a wrapper function, hydration, or a browser component runtime.
4291
- - Indirect callbacks, async/generator renders, callback or composed refs, fragments, component roots, nested targets, repeated forwarding, and `memo(forwardRef(...))` fail with source diagnostics.
4292
-
4293
- ### Boundary
4294
-
4295
- This release intentionally supports one direct object-ref boundary. It does not add React ref objects, imperative handles, generic ref composition, or browser component instances. Existing keyed-row ownership checks still require refs used inside keyed lists to originate from that row.
4296
-
4297
- ### Upgrade
4298
-
4299
- ```bash
4300
- npm install @kudzujs/core@^0.7.14
4301
- ```
4302
-
4303
- ## 0.7.13 - Deterministic useId
4304
-
4305
- Kudzu 0.7.13 preserves conventional top-level React `useId()` authoring while emitting deterministic static HTML IDs with no browser runtime.
4306
-
4307
- ### New in 0.7.13
4308
-
4309
- - `useId` may be imported directly or with an alias from `react`, or called as a direct default/namespace React member.
4310
- - Each top-level `const id = useId()` receives a stable build-time ID that can be reused by `id`, `htmlFor`, and ARIA ID-reference attributes.
4311
- - Repeated component calls receive distinct IDs, while unchanged clean builds reproduce the same output.
4312
- - Shared layouts and route content use separate ID namespaces during complete-document and enhanced navigation builds.
4313
- - Static routes remain JavaScript-free; no hook dispatcher, hydration metadata, or browser component function is emitted.
4314
- - Calls with arguments, non-top-level forms, and keyed-row ownership fail with source-located diagnostics.
4315
-
4316
- ### Boundary
4317
-
4318
- `useId()` accepts no arguments and must initialize one top-level `const` identifier in an ordinary component. Keyed rows remain unsupported because cloned row templates require key-scoped rewriting of `id`, `for`, ARIA IDREF, and fragment-reference attributes; Kudzu rejects the unsafe shape instead of emitting duplicate IDs.
4319
-
4320
- ### Upgrade
4321
-
4322
- ```bash
4323
- npm install @kudzujs/core@^0.7.13
4324
- ```
4325
-
4326
- ## 0.7.12 - Exported row reuse
4327
-
4328
- Kudzu 0.7.12 lets directly exported same-file row components remain ordinary reusable source while every supported call still specializes to intrinsic DOM.
4329
-
4330
- ### New in 0.7.12
4331
-
4332
- - Same-file keyed rows may use direct `export function Row` declarations.
4333
- - Function-valued `export const Row = ...` declarations receive the same specialization.
4334
- - One exported row may be reused across multiple keyed maps and ordinary static JSX sites.
4335
- - Every discovered JSX call specializes independently; the exported declaration remains build-only and no component function or name enters browser assets.
4336
- - Existing keyed identity, event handlers, conditions, styles, static callbacks, reorder, and removal behavior remain unchanged.
4337
- - Non-JSX references and dynamic component aliases continue to fail with a source-located `may only be referenced as JSX` diagnostic.
4338
- - Export-list and default-export aliases, exported state-backed wrappers, and exported reducer-dispatch components remain outside this direct-row fixture.
4339
-
4340
- ### Boundary
4341
-
4342
- This release supports direct export modifiers on same-file keyed row function declarations and function-valued constants. Every local reference must remain a JSX call, and effectful row components may still only run at keyed sites. Imported rows retain their existing default, named, aliased, and direct named re-export support.
4343
-
4344
- ### Upgrade
4345
-
4346
- ```bash
4347
- npm install @kudzujs/core@^0.7.12
4348
- ```
4349
-
4350
- ## 0.7.11 - Serializable defaults and rest props
4351
-
4352
- Kudzu 0.7.11 preserves common non-primitive defaults and direct rest forwarding across existing compiler-specialized component boundaries.
4353
-
4354
- ### New in 0.7.11
4355
-
4356
- - Specialized collection wrappers, keyed rows, and reducer components accept directly serializable primitive, plain-object, and array literal prop defaults.
4357
- - One final identifier rest binding may be forwarded exactly once to the component's direct intrinsic root.
4358
- - Rest props expand into ordinary JSX attributes before existing event, binding, style, and keyed-row analysis, preserving source-order overrides without a runtime rest object.
4359
- - Calling-component `const` prop spreads now resolve through lexical function scopes, including keyed row calls nested inside `map` callbacks.
4360
- - Dynamic defaults, indirect or repeated rest use, rest-forwarded children, and prototype-sensitive rest properties fail with source-located diagnostics.
4361
- - A React-shaped keyed row fixture proves object and array defaults, ARIA and event rest props, style output, and component erasure.
4362
- - The repository README is now a concise project entry point; detailed APIs, limits, and benchmarks link to the maintained web documentation.
4363
-
4364
- ### Boundary
4365
-
4366
- Defaults must be directly serializable literals. Rest must be one final identifier binding used exactly once as a spread on the direct intrinsic root. State collections still cross specialized wrapper boundaries as direct props. Exported reusable specialized rows, `forwardRef`, and `useId` remain fixture-driven work.
4367
-
4368
- ### Upgrade
4369
-
4370
- ```bash
4371
- npm install @kudzujs/core@^0.7.11
4372
- ```
4373
-
4374
- ## 0.7.10 - Component composition
4375
-
4376
- Kudzu 0.7.10 preserves common component composition across existing compiler-specialized collection boundaries.
4377
-
4378
- ### New in 0.7.10
4379
-
4380
- - State-backed collection wrappers, keyed rows, and reducer specializations accept prop spreads from direct inline object literals or one direct `const` object literal declared in the calling component.
4381
- - Spread and explicit props apply in source order, preserving ordinary override behavior.
4382
- - Specialized components accept forwarded JSX children, including mixed text and element children, while still lowering to intrinsic DOM.
4383
- - Non-self-closing specialized component tags are counted as one JSX use instead of treating the closing tag as another reference.
4384
- - A conventional React-shaped landing fixture proves imported layout children, component spreads, keyed row children, interaction output, and a zero-JavaScript static route.
4385
- - Dynamic, computed, circular, prototype-sensitive, and method/accessor spread shapes fail with source-located diagnostics.
4386
-
4387
- ### Boundary
4388
-
4389
- Spread sources must be inline object literals or one direct `const` object literal declared in the calling component. State collections still cross the specialization boundary as direct props. Rest bindings, non-primitive defaults, exported reusable specialized rows, `forwardRef`, and `useId` remain fixture-driven work.
4390
-
4391
- ### Upgrade
4392
-
4393
- ```bash
4394
- npm install @kudzujs/core@^0.7.10
4395
- ```
4396
-
4397
- ## 0.7.9 - Keyed-row prop defaults
4398
-
4399
- Kudzu 0.7.9 lets ordinary keyed row components retain destructured primitive literal prop defaults instead of restructuring every call site.
4400
-
4401
- ### New in 0.7.9
4402
-
4403
- - Same-file and relative-imported keyed row components accept string, finite-number, boolean, and `null` defaults.
4404
- - Missing props receive their default literals during existing component specialization.
4405
- - The component call lowers to intrinsic keyed JSX; React imports and the component call do not enter browser output.
4406
- - Rest and nested destructuring remain source-diagnosed, while object, array, computed, and call defaults remain rejected.
4407
- - No browser runtime branch or shared asset bytes are added.
4408
- - The product documents now define commerce and realtime dashboards as validation fixtures under one general React migration roadmap, not separate product verticals.
4409
-
4410
- ### Boundary
4411
-
4412
- This release supports primitive literal defaults on compiler-specialized keyed rows. General prop spreads, rest bindings, non-primitive defaults, specialized `children`, `forwardRef`, and `useId` remain fixture-driven composition work.
4413
-
4414
- ### Upgrade
4415
-
4416
- ```bash
4417
- npm install @kudzujs/core@^0.7.9
4418
- ```
4419
-
4420
- ## 0.7.8 - Static collection fast paths
4421
-
4422
- Kudzu 0.7.8 specializes compiler-owned static `filter` collections so repeated category changes avoid general keyed-list validation and reconciliation.
4423
-
4424
- ### New in 0.7.8
4425
-
4426
- - Static source items, unique keys, source positions, and reference entries validate and cache once when the list mounts.
4427
- - Structural rows removed by a filter become detached prototypes; restoration clones fresh DOM, preserving remount semantics without moving retained keys.
4428
- - Interleaved additions insert only new contiguous runs instead of attaching additions and then reordering the complete list.
4429
- - General local-state lists, dynamic selectors, indexed rows, handlers, effects, refs, and row state retain their existing reconciliation paths.
4430
- - The capability is route-specific and compiles out when no compiler-owned static collection is rendered.
4431
- - The matched route adds 648 B gzip compared with 0.7.7's initial implementation while reducing 500-row restoration from 13.2 ms to 3.6 ms.
4432
-
4433
- ### Benchmark
4434
-
4435
- The matched fixture imports 1,000 alternating products, filters to 500, then restores all 1,000 while checking retained and remounted DOM identity. Thirty-one rotating fresh Chrome 150 profiles on an Apple M3 used 4x CPU throttling. Median visible/filter/restore times were Kudzu 37.8/8.4/3.6 ms, React 86.3/12.9/6.2 ms, Vue 54.1/8.4/4.3 ms, and Svelte 61.4/11.7/8.3 ms. React, Vue, and Svelte used Vite CSR shells while Kudzu emitted initial HTML, so visible-row and artifact comparisons are architecture-dependent.
4436
-
4437
- ### Boundary
4438
-
4439
- The fast path requires a compiler-owned static source, field keys, filter-only selection, and structural rows without handlers, effects, refs, row state, or index dependencies. It is intended for ordinary catalog-sized collections, not direct rendering of 100,000 or 1,000,000 DOM rows; use pagination or windowing for those workloads.
4440
-
4441
- ### Upgrade
4442
-
4443
- ```bash
4444
- npm install @kudzujs/core@^0.7.8
4445
- ```
4446
-
4447
- ## 0.7.7 - Imported memo collections
4448
-
4449
- Kudzu 0.7.7 lets ordinary React migration source filter an imported static catalog through state-dependent `useMemo` while reusing existing keyed-list reconciliation.
4450
-
4451
- ### New in 0.7.7
4452
-
4453
- - Named relative imports of exported JSON-safe `const` arrays can anchor analyzable collection pipelines.
4454
- - Direct local-state reads in collection selectors invalidate the list when their declared state dependencies change.
4455
- - Existing keys retain DOM identity through filtering and restoration; removed keys remount when restored.
4456
- - Compiler-owned static collection state is excluded from development snapshot restoration.
4457
- - Static routes remain JavaScript-free, and interactive routes ship no React runtime or browser memo cache.
4458
- - Focused fixtures verify dependency diagnostics, static output, generated selectors, and browser DOM identity.
4459
-
4460
- ### Boundary
4461
-
4462
- Static collections must be named relative imports of exported JSON-safe `const` arrays. Package, namespace, default, dynamic, mutable, and non-serializable collection sources remain unsupported, as do arbitrary callbacks and general-purpose memo caching.
4463
-
4464
- ### Upgrade
4465
-
4466
- ```bash
4467
- npm install @kudzujs/core@^0.7.7
4468
- ```
4469
-
4470
- ## 0.7.6 - Zustand-shaped shared stores
4471
-
4472
- Kudzu 0.7.6 lets reduced React migration source retain a Zustand `create(set => ...)` store across an explicitly configured shared-layout navigation group.
4473
-
4474
- ### New in 0.7.6
4475
-
4476
- - One exported store with one directly serializable data property and synchronous capture-free actions compiles to one ordinary layout-lifetime Kudzu state slot.
4477
- - Components select the data or an action with direct forms such as `state => state.quantities` and `state => state.add`.
4478
- - Selected actions inline through existing functional state updates, so repeated same-turn calls observe current logical state and DOM writes still batch.
4479
- - Same-group navigation retains the store and layout DOM while incoming route bindings mount against the current value.
4480
- - Neither React, Zustand, a subscription runtime, nor a generic external-store capability enters the deploy output.
4481
- - The shopping fixture verifies two same-turn additions, product-to-cart retention, removal, layout DOM identity, package erasure, and source diagnostics in Chrome.
4482
-
4483
- ### Boundary
4484
-
4485
- The shared layout must initialize the store before route consumers. Derived selectors, multiple data properties, middleware, `get`, subscriptions, equality functions, persist/devtools wrappers, async actions, helper captures, replacement updates, keyed-row initialization, and indirect action forwarding remain unsupported.
4486
-
4487
- ### Upgrade
4488
-
4489
- ```bash
4490
- npm install @kudzujs/core@^0.7.6
4491
- ```
4492
-
4493
- ## 0.7.5 - Class composition migration
4494
-
4495
- Kudzu 0.7.5 lets ordinary React source retain common direct `clsx` calls while compiling them to existing static and reactive class paths.
4496
-
4497
- ### New in 0.7.5
4498
-
4499
- - Default and named `clsx` imports lower at build time for string and number literals, literal arrays, literal object conditions, and conditional expressions.
4500
- - Dynamic object conditions reuse existing reactive class bindings without serializing or shipping the `clsx` function.
4501
- - Static uses add no browser JavaScript, and the package import is erased from compiled modules.
4502
- - Mixed React imports such as `import { useState, type ReactNode } from "react"` now erase type-only specifiers before runtime module rewriting.
4503
- - The React/Vite fixture verifies initial class output, state-driven class updates in Chrome, package erasure, and mixed type imports.
4504
-
4505
- ### Boundary
4506
-
4507
- `clsx` spreads, computed object keys, arbitrary calls, and indirect references remain unsupported. This is source lowering for a proven migration pattern, not package execution or a general React ecosystem runtime.
4508
-
4509
- ### Upgrade
4510
-
4511
- ```bash
4512
- npm install @kudzujs/core@^0.7.5
4513
- ```
4514
-
4515
- ## 0.7.4 - Memoized collection pipelines
4516
-
4517
- Kudzu 0.7.4 lets ordinary React/Vite source retain analyzable collection work inside `useMemo` while reusing the existing keyed-list selector and DOM identity model.
4518
-
4519
- ### New in 0.7.4
4520
-
4521
- - Inline `useMemo` callbacks accept collection pipelines rooted in direct local array state.
4522
- - Existing `filter`, direct-property `flatMap`, and `Array.from` selector analysis is reused without a browser memo cache.
4523
- - Intermediate `.map()` calls lower to the existing `Array.from(source, mapper)` selector operation.
4524
- - Memo locals are removed from emitted server modules after their uses are inlined, so state signals never execute array methods during rendering.
4525
- - State updates preserve keyed row DOM identity while adding, removing, filtering, mapping, and reordering selected values.
4526
- - Collection callbacks must be synchronous arrows with plain `(item)` or `(item, index)` identifier parameters; async, rest, default, and optional parameters fail with source locations.
4527
- - The React/Vite fixture verifies `filter + map`, selector generation, browser updates, and retained identity for an existing row.
4528
-
4529
- ### Boundary
4530
-
4531
- Memoized collections use the existing statically analyzable collection subset. Arbitrary callbacks, external captures, asynchronous transforms, getters, and general-purpose memo caching remain unsupported. React, a VDOM, hydration, and a retained browser component tree are not emitted.
4532
-
4533
- ### Upgrade
4534
-
4535
- ```bash
4536
- npm install @kudzujs/core@^0.7.4
4537
- ```
4538
-
4539
- ## 0.7.3 - React memo normalization
4540
-
4541
- Kudzu 0.7.3 accepts common React memo authoring forms while preserving build-time components, direct state bindings, static HTML, and capability-only JavaScript.
4542
-
4543
- ### New in 0.7.3
4544
-
4545
- - `memo(Component)` and aliased or direct-member equivalents lower to same-file build-time function components.
4546
- - Inline `useCallback` wrappers continue to lower directly to analyzable handler functions without a browser memo cache.
4547
- - Inline synchronous `useMemo` callbacks may return one expression over primitive literals and direct local state.
4548
- - Memoized state expressions are inlined at same-component JSX uses so existing bindings update them without component rerenders.
4549
- - Static pages wrapped in `memo` remain JavaScript-free.
4550
- - Component shadowing, impure expressions, incomplete state dependencies, duplicate memo locals, and nested memo-local captures fail with source locations.
4551
- - The React/Vite app fixture verifies repeated counter updates, derived `Double 2`/`Double 4` output, CSS and SVG assets, mount effects, and a zero-JavaScript static route.
4552
-
4553
- ### Boundary
4554
-
4555
- `memo` identifiers must name unshadowed same-file top-level function components. `useMemo` locals must use unique `const` declarations, may reference only direct local state and primitive literals, and cannot cross nested function boundaries. No browser component cache, React runtime, VDOM, hydration, or retained component tree is emitted.
4556
-
4557
- ### Upgrade
4558
-
4559
- ```bash
4560
- npm install @kudzujs/core@^0.7.3
4561
- ```
4562
-
4563
- ## 0.7.2 - React hook normalization
4564
-
4565
- Kudzu 0.7.2 accepts more ordinary React/Vite hook syntax while compiling through the existing static HTML and direct DOM capability paths.
4566
-
4567
- ### New in 0.7.2
4568
-
4569
- - Supported hooks imported from `react` may retain aliases such as `useState as useMenuState` and `useEffect as runEffect`.
4570
- - Default and namespace imports may use direct supported members such as `React.useState(...)`.
4571
- - Inline React `useCallback` wrappers with literal inert dependencies are erased to their callback before Kudzu specialization.
4572
- - Captured local state must appear in the callback dependency array, preserving an actionable boundary around stale React closures.
4573
- - Unsupported members, indirect hook references, computed React members, and effectful dependency expressions fail with source locations.
4574
- - Type-only React namespaces remain available to TypeScript and do not trigger runtime migration diagnostics.
4575
- - A React/Vite-shaped app fixture verifies CSS, SVG assets, a non-root base, aliased state/effects, member state, repeated callback updates, browser interaction, and a zero-JavaScript static route.
4576
-
4577
- ### Boundary
4578
-
4579
- `useCallback` requires an inline function and a literal array containing only identifiers or primitive literals. `memo`, `useMemo`, React classes, indirect hook references, side-effect React imports, and dynamic React imports remain unsupported. React, a VDOM, hydration, and a retained browser component tree are never emitted.
4580
-
4581
- ### Upgrade
4582
-
4583
- ```bash
4584
- npm install @kudzujs/core@^0.7.2
4585
- ```
4586
-
4587
- ## 0.7.1 - Vite-style landing assets
4588
-
4589
- Kudzu 0.7.1 lets ordinary React/Vite landing-page source retain its common local stylesheet and static asset imports while preserving static HTML output and capability-only JavaScript.
4590
-
4591
- ### New in 0.7.1
4592
-
4593
- - Relative side-effect CSS imports are validated and erased before server module evaluation.
4594
- - Default CSS Module imports compile to deterministic scoped class maps with no client runtime.
4595
- - Relative image, SVG, and font imports compile to base-aware URL strings; supported assets also accept `?url`.
4596
- - Relative CSS `url(...)` references are rewritten to base-aware emitted URLs, preserving query and hash suffixes.
4597
- - Referenced asset bytes are copied under deterministic source-relative `dist/assets` paths.
4598
- - Static assets and CSS Modules work inside specialized relative keyed-row components.
4599
- - Declaration files under `src` remain available to TypeScript but are excluded from executable module compilation.
4600
- - The migration fixture verifies a non-root base, byte-identical assets, scoped classes, browser interaction, and zero JavaScript on its static route.
4601
-
4602
- ### Boundary
4603
-
4604
- CSS Module `composes`, arbitrary import queries, import hashes/attributes, and named or namespace asset bindings fail at build time with source locations. React, a VDOM, hydration, and a retained browser component tree remain absent.
4605
-
4606
- ### Upgrade
4607
-
4608
- ```bash
4609
- npm install @kudzujs/core@^0.7.1
4610
- ```
4611
-
4612
- ## 0.7.0 - React-source migration preview
4613
-
4614
- Kudzu 0.7.0 begins the migration track for ordinary React-shaped landing pages. Existing source may retain conventional supported imports from `react`; Kudzu rewrites those imports to compile-time APIs, pre-renders complete HTML, and emits only the route capabilities that are actually used. React, a virtual DOM, hydration, and a browser component tree are never emitted or executed.
4615
-
4616
- ```tsx
4617
- import React, { useState } from "react"
4618
-
4619
- export default function Header() {
4620
- const [open, setOpen] = useState(false)
4621
-
4622
- return <React.Fragment>
4623
- <button onClick={() => setOpen(!open)}>{open ? "Close" : "Menu"}</button>
4624
- {open && <nav>Navigation</nav>}
4625
- </React.Fragment>
4626
- }
4627
- ```
4628
-
4629
- ### New in 0.7.0
4630
-
4631
- - Conventional unaliased named imports of supported hooks from `react` compile through Kudzu without loading React.
4632
- - Default, namespace, and named `Fragment` imports are accepted for migration source.
4633
- - Relative function components, props, children, conditions, attributes, text, and event handlers keep their familiar TSX shape.
4634
- - Static routes using the accepted React import forms still ship zero JavaScript.
4635
- - Interactive routes ship direct DOM capabilities only; the landing-page acceptance fixture adds state, text, attribute, condition, and menu-handler capabilities.
4636
- - Emitted modules are checked for surviving runtime React references, and side-effect React imports fail with a source location.
4637
- - Keyed collections now support analyzable `filter`, direct-property `flatMap`, `Array.from`, positional keys, recursively deep sibling child maps, nested conditions, latest-item handlers, multiple serializable row states, effects, and `null` object refs.
4638
-
4639
- ### Current boundary
4640
-
4641
- This is source migration support, not a React compatibility runtime. Aliased hooks, member hook calls such as `React.useState`, `memo`, `useMemo`, `useCallback`, React classes, React Router, Next-specific components, React UI packages, side-effect imports, and dynamic React imports remain unsupported. Migrate a real route, reduce the first unsupported pattern to a fixture, and extend the compiler one proven blocker at a time.
4642
-
4643
- ### Measured fixture
4644
-
4645
- The two-route landing fixture retains React imports across relative components. Its static route has no script, while its interactive mobile-menu route emitted 10,245 B raw / 5,030 B aggregate gzip JavaScript across seven capability files in the 0.7.0 release snapshot. Seven clean builds after one warm-up measured a 310.0 ms median in that historical development environment; the original runner and raw array are not tracked in the current repository.
4646
-
4647
- ### Upgrade
4648
-
4649
- ```bash
4650
- npm install @kudzujs/core@^0.7.0
4651
- ```
4652
-
4653
- New Kudzu source should continue importing APIs from `@kudzujs/core`. Retaining `react` imports is intended for migration input where minimizing source edits matters.