@kudzujs/core 0.16.3 → 0.16.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -51,7 +51,7 @@ Syntax compatibility does not mean reproducing React wholesale. Kudzu accepts th
51
51
  - stronger JavaScript failure resilience;
52
52
  - no remaining material large-route build-scaling weakness.
53
53
 
54
- The completed 0.9 plan defines the cross-framework comparison and release gate. The active application packet is `0.16.4` in the capability release plan below. Benchmark-only feature omission, unmatched accessibility, weighted scores that hide losses, and unrecorded environment differences do not count as proof.
54
+ The completed 0.9 plan defines the cross-framework comparison and release gate. The active application packet is `0.18.0` in the capability release plan below. Benchmark-only feature omission, unmatched accessibility, weighted scores that hide losses, and unrecorded environment differences do not count as proof.
55
55
 
56
56
  ### 0.10.0 Through 0.21.x: Application Capability Release Train
57
57
 
package/PERFORMANCE.md CHANGED
@@ -2,6 +2,39 @@
2
2
 
3
3
  Reproducibility classes: `npm run benchmark`, `npm run benchmark:keyed`, `npm run benchmark:native`, `npm run benchmark:module-cache`, `npm run benchmark:project-navigation`, `npm run benchmark:project-state`, and `npm run benchmark:source-scale` are maintained in this repository; `npm run benchmark:commerce` is a maintained paired runner over the public external storefront; older excluded-workspace sections are historical provenance only and are not current framework rankings.
4
4
 
5
+ ## 0.16.5 Bounded Navigation Cache
6
+
7
+ Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. Before the
8
+ production fix, five held-prefetch races increased retained CDP documents from 8
9
+ to 16 after a newer canonical navigation had pruned those URLs. Moving the
10
+ existing revision check before the cache write restores the exact bound without
11
+ adding an LRU, cancellation registry, runtime file, or cache abstraction.
12
+
13
+ The default endurance gate runs ten batched cache races and 30 ownership cycles
14
+ in one Chrome profile. Across 101 navigations, baseline/final documents remain
15
+ 8, browser state entries 0, DOM nodes 174, listeners 7, and editor
16
+ mounts/disposals 71/71. Forced-GC heap moves from 1,826,244 to 2,022,160 bytes,
17
+ below the larger of the declared 2 MiB or 15% alarm.
18
+
19
+ The maintained Worker benchmark remains 907 raw / 477 gzip B for the Worker
20
+ graph and 14,456 raw / 6,160 gzip B for the window graph. Seven clean builds
21
+ record a 795.3 ms median on this host; timing is not compared because concurrent
22
+ host load differs. Production runtime LOC, concepts, and files remain unchanged.
23
+
24
+ ## 0.16.4 Scoped GSAP Animation Lifecycle
25
+
26
+ Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. The real GSAP
27
+ fixture emits 8 JavaScript files totaling 94,110 raw / 37,819 aggregate gzip
28
+ bytes, while its static sibling emits zero JavaScript. Required Chrome proves
29
+ scoped presentation, native reduced-motion fallback, dependency replacement,
30
+ conditional and enhanced-route disposal, retained structure, and fresh remount.
31
+
32
+ The maintained Worker benchmark remains byte-identical at 907 raw / 477 gzip B
33
+ for the Worker graph and 14,456 raw / 6,159 gzip B for the window graph. Seven
34
+ clean builds record a 625.9 ms median on this host. Timing is not compared with
35
+ the prior sweep. The change adds no runtime file or animation abstraction; one
36
+ existing package-reference ancestry helper shrinks by two lines.
37
+
5
38
  ## 0.16.3 State-Owned Drag And Drop
6
39
 
7
40
  Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. The real
package/README.md CHANGED
@@ -14,7 +14,7 @@ Kudzu compiles ordinary React-shaped TypeScript and TSX into complete static HTM
14
14
 
15
15
  > Experimental `0.16.x`: the compiler API and supported TSX surface may change.
16
16
 
17
- **Latest release: 0.16.3 - State-owned drag and drop.** A real SortableJS effect may move DOM during a gesture while keyed Kudzu state remains the durable order and identity owner, with keyboard parity, exact disposal, and static exclusion. Read the [release notes](./RELEASES.md#0163---state-owned-drag-and-drop), open the [release page](https://github.com/kudzujs/kudzu/releases/tag/v0.16.3), or follow the [architecture packet](./docs/next-architecture/README.md).
17
+ **Latest release: 0.16.5 - Bounded navigation cache.** Superseded navigations can no longer resurrect pruned prefetched documents, and the maintained endurance gate now covers cache races, route ownership, keyed state, dialogs, and external editors. Read the [release notes](./RELEASES.md#0165---bounded-navigation-cache), open the [release page](https://github.com/kudzujs/kudzu/releases/tag/v0.16.5), or follow the [architecture packet](./docs/next-architecture/README.md).
18
18
 
19
19
  - [Documentation](https://kudzujs.cloud/docs)
20
20
  - [Installation guide](https://kudzujs.cloud/docs#install)
package/RELEASES.md CHANGED
@@ -1,5 +1,85 @@
1
1
  # Kudzu Releases
2
2
 
3
+ ## 0.16.5 - Bounded Navigation Cache
4
+
5
+ Kudzu 0.16.5 prevents superseded enhanced navigations from resurrecting pruned
6
+ prefetched documents and adds a reproducible long-session ownership gate.
7
+
8
+ ### Changed in 0.16.5
9
+
10
+ - Checks the navigation revision before writing a completed prefetched document
11
+ back into the route cache.
12
+ - Prevents stale slow navigations from retaining parsed documents after a newer
13
+ route has committed and pruned their URLs.
14
+ - Adds a dedicated Chrome endurance harness with machine-readable heap, DOM,
15
+ listener, logical-state, resource, and navigation counters.
16
+ - Exercises ten deterministic stale-prefetch races followed by 30 route,
17
+ conditional, keyed, dialog, and real CodeMirror ownership cycles.
18
+ - Proves a layout-owned project notification WebSocket journey with validated
19
+ keyed updates, reconnect, stale-callback rejection, offline recovery, retained
20
+ navigation lifetime, and exact cleanup.
21
+ - Adds no cache abstraction, LRU, transport runtime, ResourceIR, VDOM, hydration,
22
+ React runtime, or retained component tree.
23
+ - Updates `create-kudzu@0.1.130` to generate projects on
24
+ `@kudzujs/core@^0.16.5`.
25
+
26
+ ### Output And Browser Evidence
27
+
28
+ - Before the fix, five stale-prefetch races increased retained CDP documents
29
+ from 8 to 16 while logical state remained empty.
30
+ - With the fix, the default 101-navigation run keeps documents at 8,
31
+ `browserState.size` at 0, DOM nodes at 174, listeners at 7, and editor
32
+ mounts/disposals balanced at 71/71.
33
+ - Forced-GC heap moves from 1,826,244 to 2,022,160 bytes, below the declared
34
+ larger-of-2-MiB-or-15% alarm.
35
+ - The maintained Worker graph remains 907 raw / 477 gzip bytes; the window graph
36
+ remains 14,456 raw / 6,160 gzip bytes. Static routes remain zero JavaScript.
37
+
38
+ ### Upgrade
39
+
40
+ ```sh
41
+ npm install @kudzujs/core@^0.16.5
42
+ ```
43
+
44
+ ## 0.16.4 - Scoped GSAP Animation Lifecycle
45
+
46
+ Kudzu 0.16.4 lets inline GSAP callbacks remain inside one owned effect while
47
+ Kudzu retains structural DOM and exact route, conditional, and dependency
48
+ lifetime ownership.
49
+
50
+ ### Changed in 0.16.4
51
+
52
+ - Accepts package references inside an unbroken chain of inline callbacks passed
53
+ directly within an owned effect setup or cleanup.
54
+ - Keeps named, local, imported, render-time, and mixed package indirection
55
+ unsupported.
56
+ - Preserves deterministic visible HTML before GSAP applies bounded opacity and
57
+ transform presentation.
58
+ - Uses native `prefers-reduced-motion` detection for a static presentation with
59
+ no residual inline opacity, transform, or visibility.
60
+ - Reverts the previous GSAP context before dependency replacement and on
61
+ conditional or enhanced-route disposal; remount creates a fresh owner.
62
+ - Adds no animation IR, scheduler, runtime concept, React, VDOM, hydration, or
63
+ retained component tree.
64
+ - Updates `create-kudzu@0.1.129` to generate projects on
65
+ `@kudzujs/core@^0.16.4`.
66
+
67
+ ### Output And Browser Evidence
68
+
69
+ - The GSAP fixture emits 8 JavaScript files totaling 94,110 raw / 37,819
70
+ aggregate gzip bytes; its static sibling emits zero JavaScript.
71
+ - Required Chrome proves scoped mount, dependency replacement, reduced-motion
72
+ fallback, conditional and route disposal, retained structure, and fresh
73
+ remount.
74
+ - The maintained Worker and window graphs remain 907 raw / 477 gzip bytes and
75
+ 14,456 raw / 6,159 gzip bytes respectively.
76
+
77
+ ### Upgrade
78
+
79
+ ```sh
80
+ npm install @kudzujs/core@^0.16.4
81
+ ```
82
+
3
83
  ## 0.16.3 - State-Owned Drag And Drop
4
84
 
5
85
  Kudzu 0.16.3 proves that a real SortableJS drag engine can remain a bounded
@@ -15,7 +15,7 @@ The completed `0.9.0` milestone is recorded in [`0.9-semantic-compression.md`](.
15
15
 
16
16
  [`1.0-large-application-compatibility-audit.md`](./1.0-large-application-compatibility-audit.md) records the first post-0.9 probes against Memos, Apache Answer, and Actual Budget. The audit finds that reduced slices build but whole-application source retention and behavior parity do not yet pass.
17
17
 
18
- [`application-capability-release-plan.md`](./application-capability-release-plan.md) is the authoritative post-0.9 execution queue, currently at `0.16.4`. It assigns one application-capability section to each minor release and one independently accepted evidence packet to each patch release from `0.10.0` through the `1.0.0` gate. It supersedes the provisional 0.10/0.11/0.12 tool-first ordering in the completed 0.9 handoff without rewriting that historical record.
18
+ [`application-capability-release-plan.md`](./application-capability-release-plan.md) is the authoritative post-0.9 execution queue, currently at `0.18.0`. It assigns one application-capability section to each minor release and one independently accepted evidence packet to each patch release from `0.10.0` through the `1.0.0` gate. It supersedes the provisional 0.10/0.11/0.12 tool-first ordering in the completed 0.9 handoff without rewriting that historical record.
19
19
 
20
20
  ## Required Invariants
21
21
 
@@ -1277,9 +1277,32 @@ differs from the published baseline.
1277
1277
  - **Done condition:** GSAP owns only bounded presentation changes and exact
1278
1278
  cleanup while Kudzu retains document structure and lifetime ownership.
1279
1279
 
1280
- ## `0.17.x`: Long-Lived Applications
1280
+ **Result:** complete. A reduction of the MIT-licensed
1281
+ Magic Modal landing page at revision
1282
+ `ab3df864de5b01d604d26345165ea5f7900eae14` reproduced one compiler failure:
1283
+ GSAP's root-scoped `context()` receives an inline callback whose direct package
1284
+ calls were rejected because package-reference validation stopped at the nearest
1285
+ function. The existing ancestry check now accepts only an unbroken chain of
1286
+ inline call arguments back to the owned effect; named, local, and imported helper
1287
+ indirection remains rejected. Required Chrome proves deterministic visible HTML,
1288
+ root-scoped presentation, native reduced-motion fallback without residual inline
1289
+ opacity/transform, dependency replacement with retained DOM identity,
1290
+ conditional and enhanced-route disposal, and fresh remount. GSAP owns only
1291
+ bounded opacity and transform changes; Kudzu retains structural DOM and lifetime
1292
+ ownership. The interactive graph is 94,110 raw / 37,819 aggregate gzip bytes
1293
+ across eight JavaScript files; the static sibling emits zero. Its normalized
1294
+ deploy archive SHA-256 is
1295
+ `2b6467f04452c51878ea81d5e80db21c60286e191e1e49ac482556dbf7c713c3`.
1296
+ Semantic primitives, IR kinds, compiler passes, normalization rules, runtime
1297
+ concepts, runtime files, animation abstractions, schedulers, and public APIs
1298
+ change by zero; one existing compiler ancestry helper shrinks by two LOC. One
1299
+ positive fixture and one two-scenario browser contract were added. The maintained
1300
+ Worker/effect benchmark remains 907 raw / 477 gzip bytes for the Worker graph and
1301
+ 14,456 raw / 6,159 gzip bytes for the window graph; its seven-run Linux median was
1302
+ 625.9 ms, recorded without a timing comparison because the host differs from the
1303
+ published baseline.
1281
1304
 
1282
- ### `0.17.0`: Endurance Harness
1305
+ ### `0.16.5`: Endurance Harness
1283
1306
 
1284
1307
  - **Purpose:** make long-session correctness locally reproducible.
1285
1308
  - **Expected files:** a dedicated browser soak harness and machine-readable heap,
@@ -1289,7 +1312,30 @@ differs from the published baseline.
1289
1312
  - **Stop condition:** only a short synthetic timing loop is measured.
1290
1313
  - **Done condition:** failures identify the owner that retained memory or work.
1291
1314
 
1292
- ### `0.17.1`: WebSocket Application Journey
1315
+ **Result:** closed through existing document, route, conditional, keyed, and
1316
+ effect ownership. A dedicated application fixture repeatedly opens and closes a
1317
+ native dialog, removes and recreates keyed row state, conditionally disposes and
1318
+ remounts a real CodeMirror editor, and navigates to a canonical released route.
1319
+ The standalone Chrome harness keeps one browser profile alive, runs five warm-up
1320
+ and 30 measured cycles by default, forces GC only before five-cycle checkpoints,
1321
+ and retains machine-readable `samples.jsonl`, `summary.json`, and
1322
+ `environment.json` artifacts under the ignored `test-results/endurance/` path.
1323
+ The required default run completed 71 enhanced navigations with 71 editor mounts
1324
+ and 71 disposals. Every released checkpoint had zero active editors, dialogs,
1325
+ and keyed rows, 29 route elements, six documents, 141 DOM nodes, and seven event
1326
+ listeners. Forced-GC heap moved from 1,820,132 to 2,005,572 bytes, below the
1327
+ larger of the declared 2 MiB or 15% observation alarm. A deterministic failure
1328
+ reports `route:/plain` and the mismatched counters; browser exceptions and failed
1329
+ requests are retained with the same owner. The interactive route graph is
1330
+ 242,928 raw / 81,792 aggregate gzip bytes across 11 JavaScript files. Semantic
1331
+ primitives, IR kinds, compiler passes, core/compiler LOC, runtime concepts,
1332
+ runtime files, and public APIs change by zero; one test fixture and one browser
1333
+ harness were added. This evidence changed no production source by itself and was
1334
+ published with the later stale-prefetch fix in the actual `0.16.5` patch.
1335
+
1336
+ ## `0.17.x`: Long-Lived Applications
1337
+
1338
+ ### `0.17.0`: WebSocket Application Journey
1293
1339
 
1294
1340
  - **Purpose:** move from isolated fake socket ownership to project notifications.
1295
1341
  - **Acceptance:** connect, message, keyed update, reconnect, stale socket
@@ -1298,7 +1344,31 @@ differs from the published baseline.
1298
1344
  - **Done condition:** repeated navigation balances every listener, timer, and
1299
1345
  socket handle.
1300
1346
 
1301
- ### `0.17.2`: Shared SSE/Transport Decision
1347
+ **Result:** closed through existing layout state, `EffectIR`, keyed-list, and
1348
+ enhanced-navigation ownership. The first project-application browser extension
1349
+ failed at `websocket-connect`; one inline layout effect now owns a native
1350
+ WebSocket, four socket listeners, native online/offline listeners, generation
1351
+ and socket-identity stale guards, and one 50 ms reconnect timer. Incoming
1352
+ snapshots are validated before replacing the existing notification array, so a
1353
+ same-key server update retains its DOM node and live-region ownership. Required
1354
+ Chrome proves connect, message, keyed update, visible error, reconnect, stale
1355
+ message/error rejection, offline cancellation, online recovery, and eight
1356
+ list/detail enhanced transitions with one retained layout socket. The journey
1357
+ creates three sockets total; while connected it has one active socket, four
1358
+ socket listeners, and two online/offline listeners. Of two reconnect timers,
1359
+ one fires and one is cleared. Final document disposal leaves zero active sockets,
1360
+ socket listeners, window listeners, and reconnect timers, and repeated disposal
1361
+ changes no counter. The project deploy grows by 2,908 raw / 652 aggregate gzip
1362
+ bytes; the list-route JavaScript graph grows by 1,755 raw / 460 aggregate gzip
1363
+ bytes, while `/help` remains zero JavaScript. Semantic primitives, IR kinds,
1364
+ compiler passes, core/compiler LOC, runtime concepts, runtime files, transport
1365
+ abstractions, and public APIs change by zero; one existing application fixture
1366
+ and one browser scenario grow. The maintained Worker/effect graph remains 907
1367
+ raw / 477 gzip bytes for Worker and 14,456 raw / 6,159 gzip bytes for window;
1368
+ its seven-run Linux median was 605.6 ms. No production source changed, so no
1369
+ release was consumed.
1370
+
1371
+ ### `0.17.1`: Shared SSE/Transport Decision
1302
1372
 
1303
1373
  - **Purpose:** test multiple independently mounted consumers, replay, and
1304
1374
  reconnect against existing layout effects/shared state.
@@ -1309,7 +1379,20 @@ differs from the published baseline.
1309
1379
  - **Done condition:** existing composition passes or a minimal transport owner is
1310
1380
  architecture-approved.
1311
1381
 
1312
- ### `0.17.3`: Memory And Disposal Gate
1382
+ **Result:** closed by the stop condition with zero qualifying applications.
1383
+ Mattermost and Twenty remain external research candidates, but neither has a
1384
+ repository-owned reduction proving the complete shared-consumer, ordered replay,
1385
+ reconnect, independent removal, final close, and bounded-history contract. The
1386
+ project application has one layout consumer; all Lupin reductions belong to one
1387
+ application and each owns its socket in one page effect; the route WebSocket,
1388
+ navigation telemetry, Worker dashboard, Memos audit, and development EventSource
1389
+ also lack the complete shared transport shape. Existing layout state and
1390
+ independent `EffectIR` owners remain authoritative. Semantic primitives, IR
1391
+ kinds, compiler passes, core/compiler LOC, runtime concepts, runtime files,
1392
+ fixtures, browser bytes, and public APIs change by zero. No production source
1393
+ changed, so no release was consumed.
1394
+
1395
+ ### `0.17.2`: Memory And Disposal Gate
1313
1396
 
1314
1397
  - **Purpose:** close document/layout/route/range/external-instance memory risks.
1315
1398
  - **Acceptance:** long repeated journeys show bounded heap, DOM, prefetch cache,
@@ -1318,6 +1401,29 @@ differs from the published baseline.
1318
1401
  - **Done condition:** retained growth has a declared bound and repeated samples
1319
1402
  pass the agreed threshold.
1320
1403
 
1404
+ **Result:** complete with one navigation-cache ownership fix. A deterministic
1405
+ race holds unique prefetched documents, starts navigation to each, commits a
1406
+ canonical route that prunes them, and then releases the stale responses. Before
1407
+ the fix, five races left `browserState.size` at zero but increased CDP documents
1408
+ from 8 to 16 under owner `navigation:documents`: stale `navigate()` calls wrote
1409
+ their parsed documents back into the cache before checking the navigation
1410
+ revision. `navigation-runtime.js` now checks revision before the existing cache
1411
+ write; no cache type, LRU, cancellation registry, or public instrumentation was
1412
+ added. The default gate batches ten races within browser connection limits, then
1413
+ runs 30 route, conditional, keyed, dialog, and editor cycles in one Chrome
1414
+ profile. Across 101 navigations, baseline/final documents remain 8, browser state
1415
+ entries 0, DOM nodes 174, listeners 7, and editor mounts/disposals 71/71. Forced-
1416
+ GC heap moves from 1,826,244 to 2,022,160 bytes, below the declared larger-of-2-
1417
+ MiB-or-15% alarm. Semantic primitives, IR kinds, compiler passes, runtime
1418
+ concepts, runtime files, cache abstractions, and public APIs change by zero; one
1419
+ production runtime reorders one existing statement with zero LOC growth. The
1420
+ maintained Worker graph remains 907 raw / 477 gzip bytes and the window graph
1421
+ remains 14,456 raw bytes with gzip moving from 6,159 to 6,160 bytes; its seven-
1422
+ run Linux median was 795.3 ms, recorded without a timing comparison because the
1423
+ host load differs. One endurance fixture and browser gate grow, while static
1424
+ routes remain zero JavaScript. This packet ships as the actual `0.16.5` patch to
1425
+ retain the public `0.16.x` version line.
1426
+
1321
1427
  ## `0.18.x`: Lazy Loading And Code Splitting
1322
1428
 
1323
1429
  ### `0.18.0`: Route And Feature Artifact Baseline
@@ -1653,4 +1759,9 @@ release transaction where possible or document and publish a forward-fix patch.
1653
1759
  | `0.16.1` | Released | Preserve the retained CodeMirror instance boundary, bidirectional updates, error recovery, accessibility, and exact cleanup. | None |
1654
1760
  | `0.16.2` | Closed by existing effect ownership | Preserve retained Chart.js data/resize updates, listener and route cleanup, fresh remount, accessibility, and static exclusion. | No production change; no release consumed |
1655
1761
  | `0.16.3` | Released | Preserve state-owned order, keyed identity, keyboard parity, invalid-input recovery, package disposal, and static exclusion. | None |
1656
- | `0.16.4` | Active | Validate one real GSAP landing-page animation through bounded effect ownership. | None |
1762
+ | `0.16.4` | Released | Preserve scoped GSAP presentation, reduced-motion fallback, dependency/owner cleanup, fresh remount, and static exclusion. | None |
1763
+ | `0.16.5` | Released | Preserve the reproducible endurance evidence, project notification ownership, and bounded stale-prefetch cache disposal. | None |
1764
+ | `0.17.0` | Closed by existing layout effect ownership | Preserve project notification connect, keyed update, reconnect, stale rejection, offline recovery, retained navigation, and exact cleanup evidence. | No production change; no release consumed |
1765
+ | `0.17.1` | Closed by stop condition | Preserve independent effect ownership until three applications prove the complete shared transport and bounded replay contract. | Zero qualifying applications; no release consumed |
1766
+ | `0.17.2` | Released as `0.16.5` | Preserve stale-prefetch rejection and bounded document, state, resource, listener, DOM, and external-instance ownership. | Patch release retained the `0.16.x` public version line |
1767
+ | `0.18.0` | Active | Record exact current route and feature artifact ownership before adding lazy loading. | None |
@@ -1,6 +1,6 @@
1
1
  # Current Compiler Architecture
2
2
 
3
- This maps the current `0.16.3` architecture, built on the completed `0.9.0` semantic-compression release and `0.8.23` Goal A compiler foundation. The active application packet is `0.16.4`; file and function names are the stable references, while line numbers are intentionally omitted because later work may still move code.
3
+ This maps the current `0.16.5` architecture, built on the completed `0.9.0` semantic-compression release and `0.8.23` Goal A compiler foundation. The active application packet is `0.18.0`; file and function names are the stable references, while line numbers are intentionally omitted because later work may still move code.
4
4
 
5
5
  ## Responsibility Map
6
6
 
@@ -2,9 +2,9 @@
2
2
 
3
3
  ## Status
4
4
 
5
- Completed compiler-foundation record and longer-term plan after `0.8.35`. The [`0.9-semantic-compression.md`](./0.9-semantic-compression.md) execution queue is complete. The active queue for current work is [`application-capability-release-plan.md`](./application-capability-release-plan.md) at packet `0.16.4`. This document does not mark any remaining planned capability as supported and does not authorize a React runtime, VDOM, hydration, retained browser component tree, generic rerenderer, public store/query/resource API, SPA router, or islands.
5
+ Completed compiler-foundation record and longer-term plan after `0.8.35`. The [`0.9-semantic-compression.md`](./0.9-semantic-compression.md) execution queue is complete. The active queue for current work is [`application-capability-release-plan.md`](./application-capability-release-plan.md) at packet `0.18.0`. This document does not mark any remaining planned capability as supported and does not authorize a React runtime, VDOM, hydration, retained browser component tree, generic rerenderer, public store/query/resource API, SPA router, or islands.
6
6
 
7
- [`MIGRATION_ROADMAP.md`](../../MIGRATION_ROADMAP.md) remains the product authority for product invariants and fixture-driven feature selection. [`application-capability-release-plan.md`](./application-capability-release-plan.md) is authoritative for current work order and evidence at packet `0.16.4`; this plan retains the completed foundation, deferred program, and long-term production gates. If implementation evidence changes either boundary, update the relevant document before broadening a patch.
7
+ [`MIGRATION_ROADMAP.md`](../../MIGRATION_ROADMAP.md) remains the product authority for product invariants and fixture-driven feature selection. [`application-capability-release-plan.md`](./application-capability-release-plan.md) is authoritative for current work order and evidence at packet `0.18.0`; this plan retains the completed foundation, deferred program, and long-term production gates. If implementation evidence changes either boundary, update the relevant document before broadening a patch.
8
8
 
9
9
  ## Product Outcome
10
10
 
@@ -483,4 +483,4 @@ The first comparison is Kudzu versus React + Vite using the same agent, model, t
483
483
 
484
484
  ## Immediate Decision
485
485
 
486
- All listed foundation and `0.9` slices are complete. Current work continues at `0.16.4` GSAP Animation Lifecycle under the [`application-capability-release-plan.md`](./application-capability-release-plan.md); keep ResourceIR limited to qualifying independent fixtures, and do not add range ownership, virtualization, optimistic transactions, a public adapter/store API, or a router before evidence justifies them.
486
+ All listed foundation and `0.9` slices are complete. Current work continues at `0.18.0` Route And Feature Artifact Baseline under the [`application-capability-release-plan.md`](./application-capability-release-plan.md); keep ResourceIR limited to qualifying independent fixtures, and do not add range ownership, virtualization, optimistic transactions, a public adapter/store API, or a router before evidence justifies them.
@@ -1,6 +1,6 @@
1
1
  # Planned Version Sequence
2
2
 
3
- This is an execution sequence, not release history. `0.8.16` through `0.8.62` are completed scopes represented by package/release records. The `0.10.0` through `1.0.0` minor/patch sequence is maintained in [`application-capability-release-plan.md`](./application-capability-release-plan.md), currently at `0.16.4`; that plan supersedes the provisional tool-first 0.10/0.11/0.12 ordering in the completed 0.9 handoff.
3
+ This is an execution sequence, not release history. `0.8.16` through `0.8.62` are completed scopes represented by package/release records. The `0.10.0` through `1.0.0` minor/patch sequence is maintained in [`application-capability-release-plan.md`](./application-capability-release-plan.md), currently at `0.18.0`; that plan supersedes the provisional tool-first 0.10/0.11/0.12 ordering in the completed 0.9 handoff.
4
4
 
5
5
  Keep each patch behavior-preserving and independently reviewable. If a boundary proves inseparable, revise this plan before combining releases; do not silently broaden a patch.
6
6
 
@@ -66,7 +66,7 @@ Keep each patch behavior-preserving and independently reviewable. If a boundary
66
66
 
67
67
  ## Generator Versions
68
68
 
69
- `create-kudzu@0.1.128` retains the explicit install instructions and generates projects with `@kudzujs/core@^0.16.3`.
69
+ `create-kudzu@0.1.130` retains the explicit install instructions and generates projects with `@kudzujs/core@^0.16.5`.
70
70
 
71
71
  ## Release Boundary
72
72
 
@@ -2630,19 +2630,17 @@ function insideJsxEventHandler(node, root) {
2630
2630
  }
2631
2631
 
2632
2632
  function insideOwnedEffectCallback(node, root) {
2633
- let callback
2634
2633
  for (let current = node.parent; current && current !== root.parent; current = current.parent) {
2635
2634
  if (!isFunctionLike(current)) continue
2636
- callback = current
2637
- break
2638
- }
2639
- if (!callback) return false
2640
- if (ts.isCallExpression(callback.parent) && callback.parent.arguments[0] === callback && ts.isIdentifier(callback.parent.expression) && callback.parent.expression.text === "useEffect") return true
2641
- const returned = callback.parent
2642
- if (!ts.isReturnStatement(returned)) return false
2643
- for (let current = returned.parent; current && current !== root.parent; current = current.parent) {
2644
- if (!isFunctionLike(current)) continue
2645
- return ts.isCallExpression(current.parent) && current.parent.arguments[0] === current && ts.isIdentifier(current.parent.expression) && current.parent.expression.text === "useEffect"
2635
+ if (ts.isCallExpression(current.parent) && current.parent.arguments[0] === current && ts.isIdentifier(current.parent.expression) && current.parent.expression.text === "useEffect") return true
2636
+ if (ts.isReturnStatement(current.parent)) {
2637
+ for (let owner = current.parent.parent; owner && owner !== root.parent; owner = owner.parent) {
2638
+ if (!isFunctionLike(owner)) continue
2639
+ return ts.isCallExpression(owner.parent) && owner.parent.arguments[0] === owner && ts.isIdentifier(owner.parent.expression) && owner.parent.expression.text === "useEffect"
2640
+ }
2641
+ return false
2642
+ }
2643
+ if (!ts.isCallExpression(current.parent) || !current.parent.arguments.includes(current)) return false
2646
2644
  }
2647
2645
  return false
2648
2646
  }
@@ -129,9 +129,9 @@ async function navigate(url, push, source) {
129
129
  try { documentResult = await cached }
130
130
  catch { documentResult = await fetchDocument(url, record, request.signal) }
131
131
  } else documentResult = await fetchDocument(url, record, request.signal)
132
- documents.set(url.href, Promise.resolve(documentResult))
133
132
  const { incoming, parsed, capabilities } = documentResult
134
133
  if (current !== revision) return
134
+ documents.set(url.href, Promise.resolve(documentResult))
135
135
  styleUpdate = prepareStyles(parsed.styles)
136
136
  pendingStyleUpdate = styleUpdate
137
137
  await styleUpdate.ready
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kudzujs/core",
3
- "version": "0.16.3",
3
+ "version": "0.16.5",
4
4
  "description": "HTML-first TSX framework with synchronous state semantics and no virtual DOM",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -53,7 +53,8 @@
53
53
  "build": "node ./bin/kudzu.mjs build",
54
54
  "dev": "node ./bin/kudzu.mjs dev",
55
55
  "check": "tsc --noEmit && tsc -p test/fixtures/tsconfig.json --noEmit && node ./bin/kudzu.mjs build",
56
- "test": "node --test test/project-application.test.mjs && node --test --test-skip-pattern='^establishes the 0\\.15\\.2 notification ownership contract$' test/*.test.mjs",
56
+ "test": "node --test test/project-application.test.mjs && node --test --test-skip-pattern='^establishes the 0\\.17\\.0 notification WebSocket ownership contract$' test/*.test.mjs",
57
+ "test:endurance": "node test/endurance.mjs",
57
58
  "test:package": "node test/package-smoke.mjs",
58
59
  "benchmark": "node test/performance.mjs",
59
60
  "benchmark:keyed": "node test/keyed-performance.mjs",
@@ -76,6 +77,7 @@
76
77
  "@codemirror/view": "^6.43.9",
77
78
  "@types/sortablejs": "^1.15.9",
78
79
  "chart.js": "^3.8.2",
80
+ "gsap": "^3.15.0",
79
81
  "sortablejs": "^1.15.7",
80
82
  "typed.js": "^3.0.0",
81
83
  "wrangler": "^4.112.0"