@kudzujs/core 0.16.25 → 0.16.27

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