@kudzujs/core 0.16.18 → 0.16.22

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.
@@ -57,7 +57,7 @@ Syntax compatibility does not mean reproducing React wholesale. Kudzu accepts th
57
57
  - stronger JavaScript failure resilience;
58
58
  - no remaining material large-route build-scaling weakness.
59
59
 
60
- The completed 0.9 plan defines the cross-framework comparison and release gate. The active application packet is `0.21.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.
60
+ The completed 0.9 plan defines the cross-framework comparison and release gate. Packet `0.21.4` is measured at Kudzu 11/25 attributable successes versus React + Vite 24/25 and blocks `1.0.0`; subsequent work must come from those recorded failures. Benchmark-only feature omission, unmatched accessibility, weighted scores that hide losses, and unrecorded environment differences do not count as proof.
61
61
 
62
62
  ### 0.10.0 Through 0.21.x: Application Capability Release Train
63
63
 
package/PERFORMANCE.md CHANGED
@@ -1,6 +1,80 @@
1
1
  # Performance Records
2
2
 
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`, `npm run benchmark:source-scale`, and `npm run benchmark:ai-delivery` 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.
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`, `npm run benchmark:source-scale`, `npm run benchmark:ai-delivery`, and `npm run benchmark:ai-delivery-production` 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
+
5
+ ## 0.21.4 Corrected AI Delivery Proof
6
+
7
+ Measured 2026-09-03 on Linux x64 with Node 24.14.0, Chrome 152.0.7977.64,
8
+ OpenCode 1.18.27, and `openai/gpt-5.6-sol`. Each of five production-shaped task
9
+ classes ran five predeclared interleaved attempts per framework with identical
10
+ model, tools, public-context, 300-second, 400,000-input-token, and 40-tool-call
11
+ limits. Failed and incomplete attempts remain in success and cost denominators.
12
+ Provider-reported subscription cost was zero, so tokens are the cost comparator.
13
+
14
+ | Task | Kudzu success | React + Vite success | Kudzu tokens / success | React tokens / success |
15
+ |---|---:|---:|---:|---:|
16
+ | Content search | 0/5 | 5/5 | unavailable | 99,779 |
17
+ | Password confirmation | 5/5 | 5/5 | 85,821 | 116,307 |
18
+ | CRUD/shared filter | 1/5 | 5/5 | 2,088,870 | 119,430 |
19
+ | Commerce-derived shipping | 0/5 | 5/5 | unavailable | 57,979 |
20
+ | Realtime ownership | 5/5 | 4/5 | 261,327 | unavailable |
21
+ | **Overall** | **11/25 (44%)** | **24/25 (96%)** | **unavailable** | **unavailable** |
22
+
23
+ All final builds passed. Browser acceptance passed for 17/25 Kudzu attempts and
24
+ 24/25 React attempts; six otherwise-correct Kudzu attempts lost only on frozen
25
+ budgets. The one remaining React attempt timed out in the adapter at 300 seconds,
26
+ produced no attribution trace, and is retained as incomplete rather than
27
+ selectively replaced. Therefore the failure-inclusive realtime and aggregate
28
+ React cost claims are unavailable. No successful retained source used imperative
29
+ DOM replacement, changed dependencies, or embedded acceptance-specific shortcuts.
30
+
31
+ | Task with accepted output | Kudzu median raw / gzip artifact | React median raw / gzip artifact | Kudzu / React median transferred JS |
32
+ |---|---:|---:|---:|
33
+ | Content | 91,681 / 34,905 B | 206,483 / 66,401 B | 36,114 / 199,137 B |
34
+ | Forms | 24,238 / 9,801 B | 202,702 / 64,305 B | 15,328 / 198,467 B |
35
+ | CRUD | 49,526 / 16,860 B | 203,412 / 64,483 B | 36,127 / 198,495 B |
36
+ | Realtime | 45,854 / 16,138 B | 202,520 / 64,245 B | 36,111 / 199,043 B |
37
+
38
+ Kudzu retained complete zero-JavaScript static siblings in every accepted output.
39
+ Commerce has no accepted Kudzu output and therefore no Kudzu byte comparison.
40
+ Lower browser output does not offset the failed success-rate and task-cost gate.
41
+
42
+ The corrected revision-2 protocol SHA-256 values are:
43
+
44
+ - content `773ac7cf998006bc54f66a6fa278d4f40a2905a558f7c309acf632f201d532a0`;
45
+ - forms `a004d6a65d6a255ba93965f208ca9afe834c8abeeb6ed0f8234a8b01435d55a1`;
46
+ - CRUD `371f491984c582802452f85d3c2c5cca147f74f34197495627369092e87535f5`;
47
+ - commerce `d1b670d72ebadbfc0b2a9a1f9060574fa10d742f99629aadc031c0133726197f`;
48
+ - realtime `c6ae3dfbac72ca07b5e7a95e0e55282aa8a8c2624c391395886376e2b210bf66`.
49
+
50
+ The first batch, Kudzu 8/25 versus React 16/25, is invalid for ranking. Its
51
+ acceptance SHA changed from
52
+ `78478ae8ae141d7c787b930ce345bf7d4cf62142c64a3b3a5e495149adc14c30`
53
+ to `c1320b8c87c1d3c2303ac20a5385fae9c3935d121ff31aab4bb9a899bd7e7a06`
54
+ after correcting React controlled-input dispatch, hidden live-region and form
55
+ field selectors, incomplete CRUD/realtime journeys, one broken Kudzu CRUD
56
+ starter behavior, and inconsistent React versions. Revision 2 also hashes the
57
+ written acceptance contracts. Both batches remain in the release archive
58
+ [`kudzu-ai-delivery-0.21.4-gpt-5.6-sol.tar.gz`](https://github.com/kudzujs/kudzu/releases/download/v0.16.19/kudzu-ai-delivery-0.21.4-gpt-5.6-sol.tar.gz),
59
+ SHA-256 `4e37d15b4c4b0cf88720a3a7743996794b2e0172dbc43d40514f944fb01bd0f8`.
60
+
61
+ The measured next blockers are ordinary reactive collection normalization and
62
+ count reuse, plus reactive text ownership inside selected conditional branches.
63
+ Kudzu does not have the highest or tied success rate or a valid lowest aggregate
64
+ cost, so this proof does not authorize `1.0.0`. This evidence packet changes no
65
+ compiler, runtime, public API, dependency, generated application, or browser
66
+ artifact.
67
+
68
+ The 2026-09-04 collection follow-up removes the first blocker for one ordinary
69
+ immutable filtered alias reused by keyed rendering, a top-level count, reactive
70
+ text, and a count-selected branch. It adds no primitive, pass, runtime concept,
71
+ API, dependency, or shared-runtime byte; net production compiler growth is 37
72
+ lines across two existing files. The maintained positive and negative fixtures
73
+ pass all 302 tests with Chrome required. Their exercised interactive route uses
74
+ the unchanged 36,219 B shared runtime closure and 37,870 B total JavaScript with
75
+ route handlers. Benchmark contract and budget deltas are zero; the production AI
76
+ comparison is not rerun until selected-branch reactive text is also addressed.
77
+ This follow-up ships as `@kudzujs/core@0.16.22`.
4
78
 
5
79
  ## 0.21.2 Browser Performance And Memory
6
80
 
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.18 - AI attribution integrity.** Kudzu's delivery harness now rejects successful-looking attempts that omit their raw attribution trace instead of counting them as zero-cost successes. No framework ranking is claimed; the production-shaped `0.21.4` comparison remains active. Read the [release notes](./RELEASES.md#01618---ai-attribution-integrity), open the [release page](https://github.com/kudzujs/kudzu/releases/tag/v0.16.18), or follow the [architecture packet](./docs/next-architecture/README.md).
17
+ **Latest release: 0.16.22 - reactive collection count reuse.** Filtered collection aliases now feed keyed rendering, top-level counts, reactive text, and count-selected branches without duplicated state. This removes the first blocker selected by the failed `0.21.4` AI delivery gate; `1.0.0` remains blocked. Read the [release notes](./RELEASES.md#01622---reactive-collection-count-reuse), open the [release page](https://github.com/kudzujs/kudzu/releases/tag/v0.16.22), 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,124 @@
1
1
  # Kudzu Releases
2
2
 
3
+ ## 0.16.22 - Reactive Collection Count Reuse
4
+
5
+ Kudzu 0.16.22 removes the first compiler blocker selected by the corrected
6
+ `0.21.4` AI delivery evidence: an ordinary filtered collection alias can now
7
+ feed keyed rendering, a top-level count, reactive text, and a count-selected
8
+ conditional branch without duplicating state or restructuring the component.
9
+
10
+ ### Changed in 0.16.22
11
+
12
+ - Normalizes supported collection alias `.length` reads through existing
13
+ collection analysis and reactive binding compilation.
14
+ - Expands count aliases before conditional compilation while preserving initial
15
+ server-rendered values and keyed DOM ownership across filter changes.
16
+ - Verifies reactive count updates, empty-branch unmount, keyed remount, and the
17
+ retained diagnostic for unsupported collection alias consumers in Chrome.
18
+ - Adds no semantic primitive, compiler pass, runtime concept, public API,
19
+ dependency, or shared-runtime byte; `1.0.0` remains unauthorized.
20
+ - Updates `create-kudzu@0.1.147` to generate projects on
21
+ `@kudzujs/core@^0.16.22`.
22
+
23
+ ### Upgrade
24
+
25
+ ```sh
26
+ npm install @kudzujs/core@^0.16.22
27
+ ```
28
+
29
+ ## 0.16.21 - AI Evidence npm Recovery
30
+
31
+ Kudzu 0.16.21 retries npm publication of the unchanged corrected `0.21.4` AI
32
+ delivery evidence after npm rejected the `0.16.20` trusted-publishing signing
33
+ certificate with HTTP 403.
34
+
35
+ ### Changed in 0.16.21
36
+
37
+ - Preserves the corrected protocols, 11/25 Kudzu versus 24/25 React + Vite
38
+ result, failed `1.0.0` gate, and `v0.16.19` raw evidence archive unchanged.
39
+ - Preserves the public `v0.16.20` tag and records its failed npm transaction
40
+ rather than moving or reusing it.
41
+ - Adds no compiler, runtime, public API, dependency, generated behavior, or
42
+ browser byte.
43
+ - Updates `create-kudzu@0.1.146` to generate projects on
44
+ `@kudzujs/core@^0.16.21`.
45
+
46
+ ### Upgrade
47
+
48
+ ```sh
49
+ npm install @kudzujs/core@^0.16.21
50
+ ```
51
+
52
+ ## 0.16.20 - AI Evidence Forward Release
53
+
54
+ Kudzu 0.16.20 forward-publishes the unchanged `0.16.19` AI delivery evidence
55
+ packet after that GitHub release's npm workflow stopped on an unrelated flaky
56
+ project browser journey before either package was published.
57
+
58
+ ### Changed in 0.16.20
59
+
60
+ - Preserves the corrected `0.21.4` protocols, 11/25 Kudzu versus 24/25 React +
61
+ Vite result, failed `1.0.0` gate, and raw evidence archive byte-for-byte.
62
+ - Moves no tag and republishes no npm version; `0.16.19` remains the immutable
63
+ GitHub evidence release.
64
+ - Adds no compiler, runtime, public API, dependency, generated behavior, or
65
+ browser byte.
66
+ - Updates `create-kudzu@0.1.145` to generate projects on
67
+ `@kudzujs/core@^0.16.20`.
68
+ - Its npm workflow passed every repository gate, then npm rejected the core
69
+ trusted-publishing signing certificate with HTTP 403 before either package
70
+ was published. The immutable recovery release is `0.16.21` with generator
71
+ `0.1.146`.
72
+
73
+ ### Upgrade
74
+
75
+ ```sh
76
+ npm install @kudzujs/core@^0.16.20
77
+ ```
78
+
79
+ ## 0.16.19 - Corrected AI Delivery Evidence
80
+
81
+ Kudzu 0.16.19 publishes the corrected five-task `0.21.4` AI delivery proof and
82
+ records that the `1.0.0` gate did not pass.
83
+
84
+ ### Changed in 0.16.19
85
+
86
+ - Adds five paired production-shaped Kudzu and React + Vite starters, frozen
87
+ prompts, independently hashed acceptance contracts, an OpenCode adapter, and
88
+ browser acceptance for content, forms, CRUD/shared state, commerce-derived
89
+ state, and realtime resource ownership.
90
+ - Excludes the first diagnostic batch after finding hidden content/form selector
91
+ assumptions and inconsistent React versions; retains that batch in the raw
92
+ archive instead of presenting it as framework evidence.
93
+ - Records the corrected result: Kudzu 11/25 attributable successes (44%) and
94
+ React + Vite 24/25 (96%), with one React realtime adapter timeout correctly
95
+ retained as incomplete.
96
+ - Records that Kudzu has no successful task-level result for content or commerce,
97
+ so its aggregate median token cost per successful task is unavailable and the
98
+ `1.0.0` success-and-cost gate is not authorized.
99
+ - Keeps React's aggregate failure-inclusive cost unavailable because its timed-out
100
+ realtime attempt has no attribution trace.
101
+ - Names the measured blockers: excessive correction cost for ordinary reactive
102
+ content search, filtered-collection count reuse in CRUD, and reactive text
103
+ frozen inside the selected commerce conditional branch.
104
+ - Publishes both batches as the release asset
105
+ `kudzu-ai-delivery-0.21.4-gpt-5.6-sol.tar.gz` with SHA-256
106
+ `4e37d15b4c4b0cf88720a3a7743996794b2e0172dbc43d40514f944fb01bd0f8`.
107
+ - Adds no semantic primitive, compiler pass, runtime concept, public API,
108
+ dependency, generated application behavior, or browser byte.
109
+ - Updates `create-kudzu@0.1.144` to generate projects on
110
+ `@kudzujs/core@^0.16.19`.
111
+ - The GitHub release and raw asset were published, but its npm workflow stopped
112
+ before publication on an unrelated project browser-test failure. The immutable
113
+ forward chain starts at `0.16.20` with generator `0.1.145`; npm recovery is
114
+ `0.16.21` with generator `0.1.146`.
115
+
116
+ ### Upgrade
117
+
118
+ ```sh
119
+ npm install @kudzujs/core@^0.16.19
120
+ ```
121
+
3
122
  ## 0.16.18 - AI Attribution Integrity
4
123
 
5
124
  Kudzu 0.16.18 makes the AI delivery evidence boundary fail closed before the
@@ -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.21.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. Its `0.21.4` AI delivery proof is measured at Kudzu 11/25 versus React + Vite 24/25 and blocks `1.0.0`; the next packet must be selected from those measured failures. The plan 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
 
@@ -2128,6 +2128,47 @@ and complete acceptance journeys for those five classes, then run at least five
2128
2128
  interleaved attempts per framework and task under one model, tool, context, and
2129
2129
  time contract.
2130
2130
 
2131
+ The corrected production comparison was recorded in GitHub release `v0.16.19`.
2132
+ Its npm workflow stopped before publication on an unrelated flaky project browser
2133
+ journey. The `v0.16.20` forward release passed every repository gate, but npm
2134
+ rejected its trusted-publishing signing certificate with HTTP 403. The immutable
2135
+ recovery release `@kudzujs/core@0.16.21` carries the unchanged evidence and
2136
+ `create-kudzu@0.1.146` targets it.
2137
+ The first batch is retained but excluded from ranking after hidden content/form
2138
+ selector assumptions and inconsistent React versions were found. Revision 2
2139
+ hashes the written contracts and executable acceptance, uses React 19.2.8 in all
2140
+ five task classes, and records Kudzu 11/25 attributable successes (44%) against
2141
+ React + Vite 24/25 (96%). One React realtime adapter exceeded 300 seconds without
2142
+ a trace and correctly remains incomplete; it was not selectively replaced.
2143
+
2144
+ The gate fails: Kudzu has no successful task result for content or commerce, so
2145
+ its aggregate task-token median is unavailable. React's incomplete realtime
2146
+ attempt also leaves its aggregate failure-inclusive cost unavailable. Kudzu keeps lower accepted browser artifacts and zero-JavaScript static
2147
+ siblings, but does not meet the required success-rate or cost criteria. The raw
2148
+ invalid and corrected attempts are published as
2149
+ `kudzu-ai-delivery-0.21.4-gpt-5.6-sol.tar.gz`, SHA-256
2150
+ `4e37d15b4c4b0cf88720a3a7743996794b2e0172dbc43d40514f944fb01bd0f8`.
2151
+ The next evidence-selected work must address reactive collection normalization
2152
+ and count reuse, then reactive text inside selected conditional branches.
2153
+ `1.0.0` remains unauthorized. This packet adds no semantic primitive, compiler
2154
+ pass, runtime concept, public API, dependency, generated behavior, or browser
2155
+ byte.
2156
+
2157
+ The first evidence-selected follow-up now normalizes one supported collection
2158
+ alias across a keyed map, a top-level `.length` count, reactive text, and a
2159
+ count-selected JSX branch. It reuses collection analysis plus existing binding,
2160
+ conditional, and keyed ownership: no semantic primitive, compiler pass, runtime
2161
+ concept, API, dependency, or shared-runtime byte was added. The implementation
2162
+ changes two existing compiler files by net 37 lines and extends one positive and
2163
+ one negative fixture. Required Chrome verifies count updates, empty-branch
2164
+ unmount, keyed remount, and retained source diagnostics; all 302 tests, package
2165
+ smoke, and `npm run check` pass. The exercised route ships the unchanged 36,219
2166
+ B shared runtime closure and 37,870 B total JavaScript including its existing
2167
+ route handlers. No benchmark contract or budget changes; the production AI
2168
+ comparison must be rerun only after the remaining selected-branch reactive-text
2169
+ blocker is addressed. This follow-up is released as `@kudzujs/core@0.16.22`
2170
+ with `create-kudzu@0.1.147`. `1.0.0` remains unauthorized.
2171
+
2131
2172
  ## `1.0.0`: Stable Application Model
2132
2173
 
2133
2174
  `1.0.0` is authorized only after every required `0.21.x` gate passes. It means:
@@ -2273,4 +2314,4 @@ release transaction where possible or document and publish a forward-fix patch.
2273
2314
  | `0.21.1` | Released as `0.16.16` | Preserve 100/1,000/10,000-route phase, RSS, output, digest, incremental-equivalence, recovery, and bounded canonical-AST retention evidence. | Full 10,000-route report has one complete measured run after two measured-stage diagnostics; no projection used |
2274
2315
  | `0.21.2` | Closed by existing semantics | Preserve initial/session/lazy bytes, keyed/range/navigation median alarms, and bounded endurance ownership evidence. | Same-revision absolute gates; structural artifact bytes are not compressed network transfer |
2275
2316
  | `0.21.3` | Released as `0.16.17` | Preserve exact package, browser, benchmark, registry, and fresh-install evidence. | One initial navigation benchmark invocation stalled at the outer timeout; its clean seven-profile rerun passed all alarms |
2276
- | `0.21.4` | Active; attribution prerequisite released as `0.16.18` | Freeze paired production starters and complete acceptance for the five required task classes, then run at least five interleaved attempts per framework and task. | No local complete React + Vite starter set; derive four pairs from maintained complete fixtures and pin the public commerce pair |
2317
+ | `0.21.4` | Measured gate failed; first blocker released as `0.16.22` | Preserve both raw batches, the corrected revision-2 protocols, the failed success/cost decision, and collection count reuse; keep `1.0.0` blocked. | Kudzu 11/25 versus React + Vite 24/25; next evidence work is conditional-branch reactive text |
@@ -1,6 +1,6 @@
1
1
  # Current Compiler Architecture
2
2
 
3
- This maps the current `0.16.18` 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.21.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.22` architecture, built on the completed `0.9.0` semantic-compression release and `0.8.23` Goal A compiler foundation. The `0.21.4` AI delivery gate is measured and blocked; 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.21.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 [`application-capability-release-plan.md`](./application-capability-release-plan.md) records the measured and blocked `0.21.4` AI delivery gate. 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.21.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 the measured `0.21.4` result and the next evidence-selected work; 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.21.4` AI delivery proof 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. The `0.21.4` AI delivery proof failed its success-and-cost gate; select subsequent work only from its measured content, CRUD, and commerce failures 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.21.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); its `0.21.4` AI delivery gate is measured and blocked. 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.143` retains the explicit install instructions and generates projects with `@kudzujs/core@^0.16.18`.
69
+ `create-kudzu@0.1.147` retains the explicit install instructions and generates projects with `@kudzujs/core@^0.16.22`.
70
70
 
71
71
  ## Release Boundary
72
72
 
@@ -102,11 +102,11 @@ export function createDescriptorSession({ semantic, handlerUrl, factory, context
102
102
  }
103
103
  }
104
104
 
105
- function compileConditional(kind, expression, truthy, falsy, setters) {
105
+ function compileConditional(kind, expression, truthy, falsy, setters, importBindings = new Map()) {
106
106
  const state = directStateIdentifier(expression, setters, bindingIndex)
107
107
  const thunk = branch => factory.createArrowFunction(undefined, undefined, [], undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), branch)
108
108
  if (state) return factory.createCallExpression(factory.createIdentifier("__kStateConditional"), undefined, [factory.createStringLiteral(kind), state, thunk(truthy), thunk(falsy)])
109
- const [initial, ...descriptor] = compileReactiveExpression(expression, setters)
109
+ const [initial, ...descriptor] = compileReactiveExpression(expression, setters, importBindings)
110
110
  return factory.createCallExpression(factory.createIdentifier("__kConditional"), undefined, [factory.createStringLiteral(kind), initial, thunk(truthy), thunk(falsy), ...descriptor])
111
111
  }
112
112
 
@@ -1107,7 +1107,7 @@ function createKudzuTransformer({ semantic, handlerUrl, file, sourceFiles, sourc
1107
1107
  visit(calculation.body)
1108
1108
  validatedEffectCalculations.add(calculation)
1109
1109
  }
1110
- const validateReactiveJsxExpression = (expression, allowedNames) => {
1110
+ const validateReactiveJsxExpression = (expression, allowedNames, setters) => {
1111
1111
  const value = unwrapExpression(expression)
1112
1112
  const formatAccess = ts.isCallExpression(value) && !value.questionDotToken && ts.isPropertyAccessExpression(value.expression) && !value.expression.questionDotToken && value.expression.name.text === "format" ? value.expression : undefined
1113
1113
  const formatter = formatAccess && unwrapExpression(formatAccess.expression)
@@ -1115,6 +1115,17 @@ function createKudzuTransformer({ semantic, handlerUrl, file, sourceFiles, sourc
1115
1115
  if (!constructor) {
1116
1116
  const validate = node => {
1117
1117
  const current = unwrapExpression(node)
1118
+ if (ts.isPropertyAccessExpression(current) && current.name.text === "length") {
1119
+ const collection = analyzeCollectionPipeline(current.expression, {
1120
+ setters,
1121
+ declarations: jsxLocalDeclarations.get(nearestFunction(expression)),
1122
+ fail,
1123
+ importedCollections,
1124
+ stateNames: allowedNames,
1125
+ importedCollectionTransforms
1126
+ })
1127
+ if (collection?.state || collection?.calculation) return factory.createNumericLiteral(0)
1128
+ }
1118
1129
  if (ts.isPropertyAccessExpression(current) && ts.isCallExpression(unwrapExpression(current.expression))) {
1119
1130
  const call = unwrapExpression(current.expression)
1120
1131
  if (ts.isIdentifier(call.expression) && importBindings.has(call.expression.text) && importBindings.get(call.expression.text).kind !== "namespace") {
@@ -1175,7 +1186,7 @@ function createKudzuTransformer({ semantic, handlerUrl, file, sourceFiles, sourc
1175
1186
  if (!usedStates.size) return expression
1176
1187
  const captures = captureNames(expanded, expanded, setters, bindingIndex)
1177
1188
  const allowedNames = new Set([...setters.values(), ...captures])
1178
- validateReactiveJsxExpression(expanded, allowedNames)
1189
+ validateReactiveJsxExpression(expanded, allowedNames, setters)
1179
1190
  return expanded
1180
1191
  }
1181
1192
  const componentSpecializations = new WeakMap()
@@ -1684,9 +1695,22 @@ function createKudzuTransformer({ semantic, handlerUrl, file, sourceFiles, sourc
1684
1695
  collectRenderedLists(sourceFile)
1685
1696
  const collectionAliasUses = rawRenderedLists.flatMap(({ parts }) => parts.aliasUses ?? [])
1686
1697
  const collectionAliasDeclarations = new Set(rawRenderedLists.flatMap(({ parts }) => parts.aliasDeclarations ?? []))
1698
+ const collectionLengthDeclarations = new Set()
1687
1699
  for (const declaration of collectionAliasDeclarations) {
1688
1700
  const owner = nearestFunction(declaration)
1689
- const unsupported = identifierReferences(owner.body, declaration.name.text).find(reference => !collectionAliasUses.includes(reference))
1701
+ const unsupported = identifierReferences(owner.body, declaration.name.text).find(reference => {
1702
+ if (collectionAliasUses.includes(reference)) return false
1703
+ if (!ts.isPropertyAccessExpression(reference.parent) || reference.parent.expression !== reference || reference.parent.name.text !== "length") return true
1704
+ for (let current = reference.parent; current && current !== owner; current = current.parent) {
1705
+ if (isFunctionLike(current)) return true
1706
+ if (ts.isVariableDeclaration(current) && current.initializer && current.parent?.parent?.parent === owner.body && isLocalConst(current)) {
1707
+ collectionLengthDeclarations.add(current)
1708
+ return false
1709
+ }
1710
+ if (ts.isJsxExpression(current) && current.initializer === undefined) return false
1711
+ }
1712
+ return true
1713
+ })
1690
1714
  if (unsupported) fail(unsupported, `Rendered collection alias "${declaration.name.text}" may only be used as a rendered collection source`)
1691
1715
  }
1692
1716
  const rejectUnsupportedRenderControl = node => {
@@ -1850,17 +1874,19 @@ function createKudzuTransformer({ semantic, handlerUrl, file, sourceFiles, sourc
1850
1874
  const parts = conditionalParts(expression)
1851
1875
  if (!parts) return ts.visitNode(expression, visitor)
1852
1876
  const setters = settersForNode(anchor, settersByFunction)
1853
- const usedStates = referencedStateNames(parts.condition, setters, parts.condition, bindingIndex)
1854
- const captures = captureNames(parts.condition, parts.condition, setters, bindingIndex)
1877
+ const condition = resolveReactiveJsxExpression(parts.condition, nearestFunction(anchor), setters)
1878
+ const usedStates = referencedStateNames(condition, setters, condition, bindingIndex)
1879
+ const captures = captureNames(condition, condition, setters, bindingIndex)
1855
1880
  if (!usedStates.size && !captures.size) return ts.visitEachChild(expression, visitor, context)
1856
1881
  usesBehavior = true
1857
1882
  usesConditional = true
1858
1883
  return descriptors.compileConditional(
1859
1884
  parts.kind,
1860
- parts.condition,
1885
+ condition,
1861
1886
  compileRenderExpression(parts.truthy, anchor),
1862
1887
  compileRenderExpression(parts.falsy, anchor),
1863
- setters
1888
+ setters,
1889
+ importBindings
1864
1890
  )
1865
1891
  }
1866
1892
 
@@ -2192,6 +2218,17 @@ function createKudzuTransformer({ semantic, handlerUrl, file, sourceFiles, sourc
2192
2218
  return factory.updateVariableDeclaration(node, node.name, node.exclamationToken, node.type, factory.createIdentifier("undefined"))
2193
2219
  }
2194
2220
 
2221
+ if (ts.isVariableDeclaration(node) && collectionLengthDeclarations.has(node) && node.initializer) {
2222
+ const setters = settersForNode(node, settersByFunction)
2223
+ const expression = resolveReactiveJsxExpression(node.initializer, nearestFunction(node), setters)
2224
+ const stateNames = new Set(setters.values())
2225
+ const rewrite = current => {
2226
+ if (ts.isIdentifier(current) && stateNames.has(current.text) && isReferenceIdentifier(current)) return factory.createPropertyAccessExpression(current, "value")
2227
+ return ts.visitEachChild(current, rewrite, context)
2228
+ }
2229
+ return factory.updateVariableDeclaration(node, node.name, node.exclamationToken, node.type, ts.visitNode(expression, rewrite))
2230
+ }
2231
+
2195
2232
  if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer && ts.isCallExpression(node.initializer) && ts.isIdentifier(node.initializer.expression) && importBindings.has(node.initializer.expression.text)) {
2196
2233
  if (parameterizedDebounceCalls.has(node.initializer)) return node
2197
2234
  const setters = settersForNode(node, settersByFunction)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kudzujs/core",
3
- "version": "0.16.18",
3
+ "version": "0.16.22",
4
4
  "description": "HTML-first TSX framework with synchronous state semantics and no virtual DOM",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -66,6 +66,7 @@
66
66
  "benchmark:project-state": "node test/project-state-performance.mjs",
67
67
  "benchmark:source-scale": "node test/source-scale-performance.mjs",
68
68
  "benchmark:ai-delivery": "node test/ai-delivery-runner.mjs",
69
+ "benchmark:ai-delivery-production": "node test/ai-delivery-production-suite.mjs",
69
70
  "prepublishOnly": "npm run check && npm test",
70
71
  "deploy": "wrangler deploy",
71
72
  "preview": "wrangler dev"