@kudzujs/core 0.16.25 → 0.16.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/README.md +47 -5
  2. package/package.json +2 -7
  3. package/GOAL_A.md +0 -116
  4. package/GOAL_B.md +0 -121
  5. package/MIGRATION_ROADMAP.md +0 -457
  6. package/PERFORMANCE.md +0 -2478
  7. package/RELEASES.md +0 -4686
  8. package/docs/next-architecture/0.9-baseline.md +0 -1199
  9. package/docs/next-architecture/0.9-benchmark-contracts.md +0 -507
  10. package/docs/next-architecture/0.9-component-property-contract.md +0 -89
  11. package/docs/next-architecture/0.9-compression-ledger.md +0 -227
  12. package/docs/next-architecture/0.9-final-proof-audit.md +0 -176
  13. package/docs/next-architecture/0.9-implementation-plan.md +0 -1819
  14. package/docs/next-architecture/0.9-resource-lifecycle.md +0 -118
  15. package/docs/next-architecture/0.9-semantic-compression.md +0 -384
  16. package/docs/next-architecture/1.0-large-application-compatibility-audit.md +0 -372
  17. package/docs/next-architecture/README.md +0 -56
  18. package/docs/next-architecture/application-capability-release-plan.md +0 -2445
  19. package/docs/next-architecture/compiler-current-architecture.md +0 -97
  20. package/docs/next-architecture/goal-a-compiler-foundation.md +0 -151
  21. package/docs/next-architecture/goal-b-optimization-benchmarks.md +0 -86
  22. package/docs/next-architecture/goal-c-state-resource-research.md +0 -88
  23. package/docs/next-architecture/goal-d-routing-compatibility-decisions.md +0 -52
  24. package/docs/next-architecture/large-application-ai-native-roadmap.md +0 -486
  25. package/docs/next-architecture/performance-gates.md +0 -50
  26. package/docs/next-architecture/versioning.md +0 -91
  27. package/framework/README.md +0 -105
package/PERFORMANCE.md DELETED
@@ -1,2478 +0,0 @@
1
- # Performance Records
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`, `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.16.25 Release Scope
6
-
7
- The following r5 compiler follow-up and future-only r6 acceptance alignment ship
8
- as `@kudzujs/core@0.16.25` with `create-kudzu@0.1.150`. The session records below
9
- retain their original pre-release scope and verification counts. Publication
10
- does not rerun a model, rescore r5, upload its local raw archive, or establish a
11
- timing/cost improvement. Frozen r6 starters remain pinned to released 0.16.24;
12
- benchmarking the new compiler requires a separately frozen revision and full run.
13
-
14
- ## r5 Compiler Follow-Up (2026-09-07)
15
-
16
- This is compiler regression work and deterministic source replay against
17
- `5ed0f9bc875691e4e86e2fab832491c78c2f0c69` (`0.16.24`), not a model rerun,
18
- release, or replacement benchmark score. The dirty r5 results and separately
19
- prepared r6 acceptance/protocol changes remain intact. Historical r5 stays
20
- Kudzu 18/25 versus React + Vite 23/25, with two partial traces; `1.0.0` remains
21
- blocked. No production prompt, protocol, contract, or acceptance script was
22
- edited by this compiler follow-up.
23
-
24
- ### Evidence And Reduction
25
-
26
- Authorizing batch:
27
- `test-results/ai-delivery-production/0.21.4-gpt-5.6-sol-r5-kudzu-0.16.24-20260907-01/`.
28
- The reduced checks were run red before their respective compiler edits.
29
-
30
- | Evidence | Confirmed problem | Existing path used |
31
- |---|---|---|
32
- | `content-kudzu-1/adapter.stdout:35`, first patch; build failure at line 42 | `normalizedQuery = query.trim().toLowerCase()` survives in build scratch when `filteredArticles.length` is read directly in JSX rather than through a count local. It calls a string method on the signal object. | Collection-alias count validation now registers its substituted dependencies in the existing build-value declaration set. Existing binding/conditional/list consumers still subscribe to `query`; build scratch reads `query.value`. |
33
- | Unchanged content starter `src/pages/topics/performance.tsx:13`, including historically accepted attempts 0/1/4 | A direct imported static `filter().map()` unnecessarily creates list state, prototypes, handler ESM, and a runtime family. | After existing collection/predicate/key analysis, direct imported pipelines with no selector states and no collection aliases remain ordinary build-time map execution. Local state and reactive selectors retain keyed ownership. |
34
- | `realtime-kudzu-0` and `realtime-kudzu-3`, `src/pages/index.tsx:16` | Zero-initialized version refs have no cleanup reset and are intended to survive `[paused]` effect replacements. | Existing effect-private cleanup diagnostic is correct and remains unchanged. Making the ref invocation-private would reset the version and violate the authored lifetime. No persistent-ref support is added. |
35
- | `realtime-kudzu-1`, `src/pages/index.tsx:16-17` | An unattached null ref is assigned `1` during render, then mutated by snapshot callbacks. Compilation previously accepted it as a DOM ref. `core.mjs` serializes ref captures by ID, not by numeric `.current`; this does not provide a retained version cell. | Existing ref normalization now rejects render-time writes at the authored source, recommending component state for retained values or cleanup-owned private refs for invocation-local values. This closes a diagnostic gap, not a resource-lifetime extension. |
36
-
37
- The historical realtime timeout did not record an exact browser exception, so
38
- none is asserted retroactively. The new negative reduction proves the null-ref
39
- shape compiled before the guard and is diagnosed afterward. Replays of original
40
- realtime sources 0/3 retain the cleanup diagnostic, source 1 receives the new
41
- render-write diagnostic, and unchanged state-based sources 2/4 still build and
42
- pass the realtime browser journey. Their authoring compromises remain explicit;
43
- this is not a claim of persistent React ref compatibility.
44
-
45
- ### Output And Browser Proof
46
-
47
- The new direct-alias-count case uses the existing imported article fixture and
48
- Chrome journey. All four source variants emit byte-identical JavaScript:
49
- 9 files, 32,190 raw / 12,324 aggregate gzip B. Search by title/topic, whitespace
50
- and case normalization, singular/plural status, empty branches, retained keys,
51
- and fresh restored rows pass. The new static topic reduction emits matching
52
- HTML, no excluded article seed, no state markers, and zero JavaScript files.
53
- The six existing unsafe collection forms remain source-located diagnostics.
54
-
55
- The original failing article source was recovered from the first patch event,
56
- not reconstructed from the agent's final workaround. Recovered page SHA-256:
57
- `915d825d15d1799b2a6fc891e12e1e84ca366df5a00a7721bd83d1b0f33db4d2`.
58
- It and all five final content sources pass the separately prepared r6 acceptance
59
- with all ten static siblings checked. The two combined polite-region sources
60
- also pass its corrected semantic count check. These source-only results do not
61
- erase historical budget failures or change model success/cost denominators.
62
-
63
- | Output | Before raw / gzip B | After raw / gzip B | Delta raw / gzip B |
64
- |---|---:|---:|---:|
65
- | Complete content JavaScript, attempts 0/1/2/4 | 55,447 / 20,976 | 34,908 / 13,677 | -20,539 / -7,299 |
66
- | Complete content JavaScript, attempt 3 | 55,440 / 20,987 | 34,901 / 13,688 | -20,539 / -7,299 |
67
- | Content runtime files only, all five attempts | 51,357 / 19,100 | 30,895 / 11,896 | -20,462 / -7,204 |
68
- | `/topics/performance/` JavaScript graph | 20,539 / 7,299 | 0 / 0 | -20,539 / -7,299 |
69
- | Existing reduced search graph | 32,190 / 12,324 | 32,190 / 12,324 | 0 / 0 |
70
-
71
- Each content build changes from 11 pages / 2 interactive / 13 JavaScript files
72
- to 11 pages / 1 interactive / 9 JavaScript files. Removed paths are
73
- `assets/handlers/pages/topics/performance.js` and the `kudzu.js`, `kudzu-list.js`,
74
- and `kudzu-collection-selector.js` files in runtime family `432dc692688d09a1`.
75
- Every retained JavaScript path and byte is identical to its archived r5 output.
76
- The recovered source emits the same graph as final attempts 0/1/2/4, SHA-256
77
- `34a34339db48a3da01f67b41fa5a5b0f50ea4d1854e3c30a1569e8e32b2c5270`
78
- (sorted relative JavaScript paths followed by their bytes). Gzip is summed per
79
- artifact with Node `gzipSync`, not a compressed archive or network measurement.
80
-
81
- ### Accounting And Verification
82
-
83
- | Metric | Delta |
84
- |---|---:|
85
- | Semantic primitives / ModuleIR kinds / core passes | 0 / 0 / 0 |
86
- | Core semantic LOC (`source-compiler.mjs`, including comment) | +5 |
87
- | Focused normalization LOC (`effect-private-ref-pass.mjs`) | +2 |
88
- | Production compiler LOC total | +7 |
89
- | Ordered normalization entries / transform rules / adapters | 0 / 0 / 0 |
90
- | Source diagnostic guards | +1 |
91
- | Runtime concepts / runtime source LOC / dependencies / public APIs | 0 / 0 / 0 / 0 |
92
- | Positive reduced cases / negative reduced cases | +2 / +2 |
93
- | AI score, build-speed, interaction-timing, CPU, heap claims | None |
94
-
95
- The positive cases extend the existing isolated fixture generator; the two
96
- negative source fixtures live in `test/realtime-version-ref.test.mjs`. No new
97
- runtime or generic compiler abstraction was introduced. Static collection
98
- aliases and cross-invocation mutable refs are not broadened by this change.
99
-
100
- ```bash
101
- KUDZU_REQUIRE_CHROME=1 node --test test/imported-article-search.test.mjs
102
- node --test test/realtime-version-ref.test.mjs
103
- node /tmp/opencode/r5-compiler-followup.mjs
104
- node /tmp/opencode/verify-r5-compiler-output.mjs
105
- npm run check
106
- KUDZU_REQUIRE_CHROME=1 npm test
107
- npm run test:package
108
- ```
109
-
110
- All pass on the same Linux x64 / Node 24.14.0 / Chrome 152.0.7977.64 host as r5.
111
- Check builds 224 pages, two interactive. The final full run passes the standalone
112
- project ownership gate plus 315/315 tests, including the preserved r6 acceptance
113
- tests; package smoke installs four packages and builds one zero-JavaScript page.
114
- Full commands use a 1,200,000 ms timeout. Local replay sources, artifacts, full
115
- acceptance JSON, errors, path lists, and raw/gzip totals are retained separately
116
- at `/tmp/opencode/r5-compiler-followup-EQOrpR/report.json` and adjacent directories.
117
- No model, commit, version bump, publication, or release was run. Build/browser
118
- timings were not sampled under an interleaved performance protocol, so no timing
119
- improvement is claimed.
120
-
121
- ## 0.21.4 Released 0.16.24 Rerun (2026-09-07)
122
-
123
- All 50 scheduled attempts executed, without selective retries, from
124
- `2026-09-07T04:18:00.678Z` through `2026-09-07T05:36:06.037Z` (78 minutes
125
- 5 seconds). The frozen scorer reports **Kudzu 18/25 (72%) versus React + Vite
126
- 23/25 (92%)**. Execution finished, but `suite.json` correctly says `incomplete`:
127
- two Kudzu realtime attempts retain partial attribution after their deadlines.
128
- This is a new local r5 observation, not a rewrite of the published r2 result,
129
- proof of a statistically significant improvement, or authorization for `1.0.0`.
130
- The acceptance/prompt and output-contract gaps below also prevent treating this
131
- score as a clean production-framework ranking.
132
-
133
- ### Protocol And Execution
134
-
135
- Base revision: `5ed0f9bc875691e4e86e2fab832491c78c2f0c69`, released
136
- `@kudzujs/core@0.16.24`; no compiler changes during this packet. Although no r4
137
- execution was found in the local evidence inventory, r4's `0.16.23` pins were
138
- already release-documented. Revision 5 therefore explicitly changes all five
139
- Kudzu manifests, lock root dependencies, resolved core versions/tarball URLs,
140
- registry integrity values, and canonical starter digests. Historical r2/r3 raw
141
- directories and release records remain untouched. The r4 lifecycle adapter is
142
- unchanged, SHA-256
143
- `91c0db691c2f7a7d5c40122e86b2ac7b928e3016a80a202f8c079c2013b3eb0e`.
144
-
145
- Model remains `openai/gpt-5.6-sol`; exact OpenCode `1.18.27` is selected with
146
- `OPENCODE_BIN` rather than the host default `1.18.29`. Node `24.14.0`, npm
147
- `11.9.0`, Chrome `152.0.7977.64`, Linux x64 `7.0.0-30-generic`, Intel i5-9500
148
- (6 logical CPUs), and 33,491,050,496 bytes RAM were recorded. OAuth presence was
149
- checked without reading credentials. A separate tool-free model preflight
150
- returned `READY`; its 6,755 tokens are excluded from task accounting.
151
-
152
- The model, budgets, tools, prompts, public context, executable acceptance,
153
- written contracts, all React starters, and alternating schedules are identical
154
- to r4. Each adapter has a setup-inclusive 300,000 ms deadline and limits of
155
- 400,000 input, 20,000 output, 20,000 reasoning tokens, 40 tool calls, 20 files
156
- read, 8 files modified, and 5 builds. Tasks execute serially in content, forms,
157
- CRUD, commerce, realtime order; model processes never run in parallel.
158
-
159
- ```bash
160
- OPENCODE_BIN=/home/kft/.npm/_npx/3fe6b69ccd55ed58/node_modules/.bin/opencode CHROME_BIN=/usr/bin/google-chrome npm run benchmark:ai-delivery-production -- --out test-results/ai-delivery-production/0.21.4-gpt-5.6-sol-r5-kudzu-0.16.24-20260907-01 > test-results/ai-delivery-production/0.21.4-gpt-5.6-sol-r5-kudzu-0.16.24-20260907-01/suite.stdout 2> test-results/ai-delivery-production/0.21.4-gpt-5.6-sol-r5-kudzu-0.16.24-20260907-01/suite.stderr
161
- ```
162
-
163
- The command exits 0 after all schedules finish; that is not a passing benchmark
164
- gate. The output directory contains `suite.json`, all five `run.json` and copied
165
- protocols, 50 attempt results, raw adapter output/traces, build/acceptance logs,
166
- retained source and deploy artifacts, preflight logs, test logs, and `audit.json`
167
- (all source diffs, raw-trace review extracts, and artifact/token aggregates).
168
- The complete local archive is
169
- `test-results/ai-delivery-production/0.21.4-gpt-5.6-sol-r5-kudzu-0.16.24-20260907-01.tar.gz`,
170
- SHA-256 `d0190c9c4d6da0bd9676365037cf1a1def72e808010e3b03a94a701138a31205`.
171
- Gzip integrity passes; all 50 schedule entries, 50 pinned-model attribution
172
- traces, and 300 recorded command-stream SHA-256 values were verified. The archive
173
- is local evidence only and was not uploaded or released.
174
-
175
- | Task | r5 protocol SHA-256 | Kudzu starter SHA-256 |
176
- |---|---|---|
177
- | Content | `f63c11e20e21659c25ef99498e13085054565382af9a500e7aa6e6520968b1ec` | `6b56448eb0b9179183aeb433bd3e52538749f1a2e609c37c5a8bdf8e479ccd92` |
178
- | Forms | `967335af955b23c23e8ce81eed35b3a9426c08047b4286a5328e144f30b6e9aa` | `0a762afe93c77cec2137e956796f47a944b9222e3dcff1178462665cf995291b` |
179
- | CRUD | `063625fd48442c639a059c240d1edaef63f54176f921dcd297c8daf97086430d` | `1e349e2deb163b8bc52fb8844a989e8f29f1ed12a2857da86119bf89ffa3e5c2` |
180
- | Commerce | `c35cb1801f5a4b98a644f6f48f7c02b2168ebc9ce901b0b8e74fcf792c3d2e0b` | `d2b6e8d926b3e55d0e3e47c0647fdd75f01b46e3dc4ac705108974c7d3e186b3` |
181
- | Realtime | `bda2526c95862b8d55045018da70370b9dd9a36d4e7ccfe56b3af56f06dbad10` | `f5adc4cf163a8e9cb838173d718fd21302a474fd70920167c12d64518890b218` |
182
-
183
- The starter digest is SHA-256 over recursively locale-sorted file names, each
184
- relative slash-normalized path followed by NUL and file bytes, matching the
185
- integrity test. Every core lock entry uses registry integrity
186
- `sha512-qLcVItXkI7vI5ktOC16+87uQ4BqQTQOVrFqR4AK7gz4eMN4imL7o+ocUBc7znuVsMML98ChKLRgMSsUot7GUhg==`.
187
-
188
- ### Scores And Attribution
189
-
190
- | Task | Kudzu success | React success | Kudzu tokens / success | React tokens / success |
191
- |---|---:|---:|---:|---:|
192
- | Content | 3/5 | 5/5 | 591,903 | 77,522 |
193
- | Forms | 5/5 | 5/5 | 92,087 | 81,111 |
194
- | CRUD | 3/5 | 3/5 | 250,028 | 197,556 |
195
- | Commerce | 5/5 | 5/5 | 68,746 | 57,756 |
196
- | Realtime | 2/5 | 5/5 | unavailable | 142,071 |
197
- | Overall | 18/25 | 23/25 | unavailable | task median 81,111 |
198
-
199
- Tokens per success include failed attempts, cache-read input, output, and
200
- reasoning, following the existing runner's accounting. Recorded totals are
201
- 4,279,911 Kudzu tokens (a lower bound because two traces are partial) and
202
- 2,384,962 React tokens. There are 48 complete and 2 incomplete traces; no raw
203
- model error event was found. Both timed-out model sessions had already produced
204
- source and a compiler diagnostic, so they are not model-unavailability failures.
205
- Provider-reported subscription cost is zero, not a market-price cost comparison.
206
- Kudzu's aggregate failure-inclusive task cost remains unavailable, not zero.
207
- Successful-attempt elapsed medians are 69,363/65,918 ms, tool calls 12/10, files
208
- read 5/4, files modified 2/2, builds 1/1, and correction cycles 0/0 for
209
- Kudzu/React. These are descriptive scorer subsets, not speed or cost wins.
210
-
211
- Final builds passed 23/25 Kudzu and 25/25 React; complete executable acceptance
212
- passed 18/25 and 23/25. Against historical r2's 11/25 and 24/25, the observed
213
- counts change by +7 and -1, with content and commerce now having scored Kudzu
214
- successes. Different stochastic runs, compiler pins, lifecycle accounting, and
215
- the limitations below prevent attributing that entire change to the compiler.
216
-
217
- ### Every Failure
218
-
219
- | Attempts | Observed failure | Attribution / limitation |
220
- |---|---|---|
221
- | `content-kudzu-2`, `content-kudzu-3` | Empty-state live-region text is `0 articlesNo articles match your search.` rather than exactly `0 articles`; all filtering/count transitions otherwise match. Attempt 2 also uses 497,474 input tokens, over 400,000. | Both place separate count and empty-message paragraphs inside one polite region. The grader assumes the entire first live region is the count. Preserve failures, but do not call this broken filtering; the prompt does not explicitly require a count-only region. |
222
- | `crud-kudzu-1`, `crud-kudzu-3`, `crud-react-vite-2`, `crud-react-vite-4` | Only `initial.group` fails; keyed retention, filters, create/edit/delete, counts, focus, and empty state pass. | All use `role="group" aria-label="Filter memos by status"`. The grader requires exact `Filter memos`. That name exists in the written contract and starter, but the supplied prompt asks only for a named group. The adapter does not supply the written contract. This is a prompt/acceptance alignment gap, not a compiler or missing-group failure. |
223
- | `realtime-kudzu-0`, `realtime-kudzu-3` | Adapter SIGKILL at about 300,011 ms; final build rejects `src/pages/index.tsx:16:9`: effect-private refs require cleanup that resets or invalidates `.current`. No deploy output. | Version refs initialized with zero are intended to survive pause/resume; current effect-private ownership cannot provide that lifetime. Atomic partial traces retain 117,447 and 175,039 recorded tokens, respectively. No retry or synthetic completion. |
224
- | `realtime-kudzu-1` | Build passes after changing `useRef(1)` to an unattached `useRef(null)` plus render-time initialization; acceptance times out waiting for the first four-row snapshot. | Generated handler still reads `scope("version").current`. The runtime-ref workaround is not proven safe by its successful build. The frozen timeout path does not serialize browser exception details; do not invent an exact exception or claim a diagnosed compiler fix. |
225
-
226
- Raw content traces also retain a residual `query.trim is not a function`
227
- build failure in attempts 1 and 3 when a normalized query alias feeds a filtered
228
- array whose `.length` is consumed directly. Both agents inline the query
229
- expression to recover. Attempts 0/2/4 retain the normalized query with a separate
230
- count local and build. These exact sources, plus the realtime ref cases, are
231
- future reduced-fixture inputs; this rerun makes no speculative compiler change.
232
-
233
- ### Output And Source
234
-
235
- | Executable-accepted subset | Kudzu median artifact raw / gzip B | React median artifact raw / gzip B | Kudzu / React median transferred JS B |
236
- |---|---:|---:|---:|
237
- | Content (3 / 5 attempts) | 93,274 / 35,226 | 206,504 / 66,425 | 37,608 / 199,132 |
238
- | Forms (5 / 5) | 23,832 / 9,771 | 202,704 / 64,305 | 15,147 / 198,469 |
239
- | CRUD (3 / 3) | 48,490 / 16,727 | 203,383 / 64,471 | 35,542 / 198,476 |
240
- | Commerce (5 / 5) | 53,886 / 21,871 | 201,055 / 64,188 | 30,214 / 197,976 |
241
- | Realtime (2 / 5) | 45,555 / 16,150 | 202,524 / 64,244 | 36,012 / 199,043 |
242
-
243
- Artifact totals include every deploy file; gzip is summed per file. Transferred
244
- JS sums `.js` resource entries from the frozen journey, including protocol
245
- overhead, not CPU time or a complete multi-route session. All 18 scored Kudzu
246
- successes have the designated complete, script/marker-free static sibling.
247
- Content emits 11 HTML pages but only nine are script/marker-free: besides the
248
- search route, `/topics/performance/` loads a list capability. Its source was not
249
- edited by the agents, but this violates the broader written content static-route
250
- expectation and is not checked by executable acceptance. React's
251
- `staticZeroJavaScript: true` is a bypass in the checker, not evidence of zero
252
- React JavaScript. No complete 0.9 performance, memory, resilience, or all-route
253
- accessibility parity claim follows from these artifact observations.
254
-
255
- All 50 retained source inventories were compared with their starters. Only
256
- authored TSX/CSS changed (one to three files); manifests, locks, seeded data,
257
- fake transport, and test infrastructure remain unchanged. Search preserves
258
- `ArticleCard`/`Shell` composition and imported data; CRUD preserves its shared
259
- Provider and keyed declarative rows. No imperative list/DOM replacement was
260
- found. Native form refs, focus, and validity calls are ordinary form behavior.
261
- Maintainability is not uniformly equivalent: commerce Kudzu attempt 4 adds
262
- derived display state after a formatting diagnostic; realtime Kudzu attempt 2
263
- calls `setMemos` inside a version-state updater, while attempt 4 carries version
264
- through state plus an effect-local copy instead of React's persistent ref.
265
- These are explicit authoring compromises, not proof of abstraction parity.
266
- The runner's byte-identical-file retention metric includes lockfile bytes and
267
- is not a semantic source-retention percentage.
268
-
269
- Next prerequisite is an acceptance/prompt alignment review, preserving this raw
270
- batch and changing no scores retroactively. The retained direct-count query and
271
- cross-invocation version-ref failures then provide concrete compiler intake;
272
- the static topic output also needs a separately scoped check. `1.0.0` remains
273
- blocked. This packet adds zero semantic primitives, compiler passes/LOC, runtime
274
- concepts, or dependencies, and makes no release, speed, price, or superiority claim.
275
-
276
- Verification: six protocol/runner/lifecycle tests pass; before execution and
277
- again after the results documentation, `npm run check` builds 224 pages, two
278
- interactive, and `npm test` passes the standalone project ownership test plus
279
- 308/308 tests. Final logs are `final-check.log` and `final-test.log` in the raw
280
- directory. `git diff --check` passes. The final archive/checksum metadata update
281
- does not change model inputs or any recorded artifact.
282
-
283
- ## 0.21.4 Corrected AI Delivery Proof
284
-
285
- Measured 2026-09-03 on Linux x64 with Node 24.14.0, Chrome 152.0.7977.64,
286
- OpenCode 1.18.27, and `openai/gpt-5.6-sol`. Each of five production-shaped task
287
- classes ran five predeclared interleaved attempts per framework with identical
288
- model, tools, public-context, 300-second, 400,000-input-token, and 40-tool-call
289
- limits. Failed and incomplete attempts remain in success and cost denominators.
290
- Provider-reported subscription cost was zero, so tokens are the cost comparator.
291
-
292
- | Task | Kudzu success | React + Vite success | Kudzu tokens / success | React tokens / success |
293
- |---|---:|---:|---:|---:|
294
- | Content search | 0/5 | 5/5 | unavailable | 99,779 |
295
- | Password confirmation | 5/5 | 5/5 | 85,821 | 116,307 |
296
- | CRUD/shared filter | 1/5 | 5/5 | 2,088,870 | 119,430 |
297
- | Commerce-derived shipping | 0/5 | 5/5 | unavailable | 57,979 |
298
- | Realtime ownership | 5/5 | 4/5 | 261,327 | unavailable |
299
- | **Overall** | **11/25 (44%)** | **24/25 (96%)** | **unavailable** | **unavailable** |
300
-
301
- All final builds passed. Browser acceptance passed for 17/25 Kudzu attempts and
302
- 24/25 React attempts; six otherwise-correct Kudzu attempts lost only on frozen
303
- budgets. The one remaining React attempt timed out in the adapter at 300 seconds,
304
- produced no attribution trace, and is retained as incomplete rather than
305
- selectively replaced. Therefore the failure-inclusive realtime and aggregate
306
- React cost claims are unavailable. No successful retained source used imperative
307
- DOM replacement, changed dependencies, or embedded acceptance-specific shortcuts.
308
-
309
- | Task with accepted output | Kudzu median raw / gzip artifact | React median raw / gzip artifact | Kudzu / React median transferred JS |
310
- |---|---:|---:|---:|
311
- | Content | 91,681 / 34,905 B | 206,483 / 66,401 B | 36,114 / 199,137 B |
312
- | Forms | 24,238 / 9,801 B | 202,702 / 64,305 B | 15,328 / 198,467 B |
313
- | CRUD | 49,526 / 16,860 B | 203,412 / 64,483 B | 36,127 / 198,495 B |
314
- | Realtime | 45,854 / 16,138 B | 202,520 / 64,245 B | 36,111 / 199,043 B |
315
-
316
- Kudzu retained complete zero-JavaScript static siblings in every accepted output.
317
- Commerce has no accepted Kudzu output and therefore no Kudzu byte comparison.
318
- Lower browser output does not offset the failed success-rate and task-cost gate.
319
-
320
- The corrected revision-2 protocol SHA-256 values are:
321
-
322
- - content `773ac7cf998006bc54f66a6fa278d4f40a2905a558f7c309acf632f201d532a0`;
323
- - forms `a004d6a65d6a255ba93965f208ca9afe834c8abeeb6ed0f8234a8b01435d55a1`;
324
- - CRUD `371f491984c582802452f85d3c2c5cca147f74f34197495627369092e87535f5`;
325
- - commerce `d1b670d72ebadbfc0b2a9a1f9060574fa10d742f99629aadc031c0133726197f`;
326
- - realtime `c6ae3dfbac72ca07b5e7a95e0e55282aa8a8c2624c391395886376e2b210bf66`.
327
-
328
- The first batch, Kudzu 8/25 versus React 16/25, is invalid for ranking. Its
329
- acceptance SHA changed from
330
- `78478ae8ae141d7c787b930ce345bf7d4cf62142c64a3b3a5e495149adc14c30`
331
- to `c1320b8c87c1d3c2303ac20a5385fae9c3935d121ff31aab4bb9a899bd7e7a06`
332
- after correcting React controlled-input dispatch, hidden live-region and form
333
- field selectors, incomplete CRUD/realtime journeys, one broken Kudzu CRUD
334
- starter behavior, and inconsistent React versions. Revision 2 also hashes the
335
- written acceptance contracts. Both batches remain in the release archive
336
- [`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),
337
- SHA-256 `4e37d15b4c4b0cf88720a3a7743996794b2e0172dbc43d40514f944fb01bd0f8`.
338
-
339
- The measured next blockers are ordinary reactive collection normalization and
340
- count reuse, plus reactive text ownership inside selected conditional branches.
341
- Kudzu does not have the highest or tied success rate or a valid lowest aggregate
342
- cost, so this proof does not authorize `1.0.0`. This evidence packet changes no
343
- compiler, runtime, public API, dependency, generated application, or browser
344
- artifact.
345
-
346
- The 2026-09-04 collection follow-up removes the first blocker for one ordinary
347
- immutable filtered alias reused by keyed rendering, a top-level count, reactive
348
- text, and a count-selected branch. It adds no primitive, pass, runtime concept,
349
- API, dependency, or shared-runtime byte; net production compiler growth is 37
350
- lines across two existing files. The maintained positive and negative fixtures
351
- pass all 302 tests with Chrome required. Their exercised interactive route uses
352
- the unchanged 36,219 B shared runtime closure and 37,870 B total JavaScript with
353
- route handlers. Benchmark contract and budget deltas are zero; the production AI
354
- comparison is not rerun until selected-branch reactive text is also addressed.
355
- This follow-up ships as `@kudzujs/core@0.16.22`.
356
-
357
- The 2026-09-04 selected-branch follow-up lowers a reactive scalar branch through
358
- the existing text-binding compiler path. It adds no semantic primitive,
359
- compiler pass, runtime concept, API, dependency, or shared-runtime source byte;
360
- net production growth is 11 lines in one existing compiler file. The focused
361
- fixture covers an update that remains in the selected branch and a later branch
362
- replacement. Required Chrome, all 302 tests, `npm run check`, and package smoke
363
- pass. Rebuilding the five retained commerce sources against this tree changes
364
- their frozen `below` check from false to true, so all five pass build, behavior,
365
- accessibility, browser, and output acceptance while retaining the zero-JavaScript
366
- static sibling. The existing checkout handler grows by 147-154 transferred bytes
367
- across those authored variants; no shared runtime module was added. Benchmark
368
- contracts and budgets are unchanged. This is a same-source compiler follow-up,
369
- not a new equal-condition model run, so the published 11/25 versus 24/25 result
370
- and the `1.0.0` block remain unchanged pending the complete production rerun.
371
- This follow-up ships as `@kudzujs/core@0.16.23`.
372
-
373
- ### Imported Search Source Replay (2026-09-07)
374
-
375
- Compiler follow-up shipping as `0.16.24` to `f88279024e68c875ea35592a1ab363bde1cec9d0`
376
- (`0.16.23`), on Linux x64, Node 24.14.0 and Chrome 152.0.7977.64. Authorizing
377
- evidence is the initial aliased search patch at line 50 of
378
- `test-results/ai-delivery-production/0.21.4-gpt-5.6-sol-r3-kudzu-0.16.23-continuation-20260907/content/attempts/content-kudzu-0/adapter.stdout`.
379
- The reduced fixture first reproduced both the source-located generic expression
380
- diagnostic and the direct-filter-count `query.trim is not a function` build error.
381
-
382
- Imported collection discovery now follows top-level const selector aliases from
383
- map/count uses. Filter predicates encode proven pure query locals using the
384
- existing expression language, and count dependencies use signal build values in
385
- scratch rather than invoking string methods on signal objects. Existing binding,
386
- selector, keyed, and conditional consumers remain authoritative.
387
-
388
- | Metric | Result |
389
- |---|---|
390
- | Semantic primitives / IR kinds / runtime concepts / APIs | +0 / +0 / +0 / +0 |
391
- | Core passes / ordered normalization entries / adapters | +0 / +0 / +0 |
392
- | Existing normalization/proof boundaries extended | 3: import roots, pure filter locals, count build values |
393
- | Core semantic LOC, unchanged 0.9 file set | +39, 5,466 -> 5,505; source compiler +26, collection analysis +13 |
394
- | Regression evidence | 1 reduced fixture; 3 positive source variants, 6 negative forms, 4 tests |
395
- | Reduced route JS | 9 files; 32,190 raw / 12,324 aggregate gzip B in every variant |
396
- | Delta from fully inlined control | 0 raw / 0 gzip B; identical JS paths and contents |
397
- | Reduced static sibling | Complete HTML, 0 B JavaScript |
398
- | Full retained application replay | 11 pages, 2 interactive; build and existing content acceptance pass |
399
- | Full application JS vs earlier retained inlined artifacts | 13 files; 55,447 raw / 20,976 aggregate gzip B; all paths/bytes identical |
400
- | Build/browser timing and AI-cost delta | Not measured; no fresh model benchmark or ranking claim |
401
-
402
- The full replay restores the initial page and stylesheet patch over the content
403
- starter while preserving the retained application's other source. It uses the
404
- current workspace compiler and the unchanged existing content acceptance runner,
405
- not a new adapter invocation. It passes search/count/empty/restore, accessibility,
406
- zero-JavaScript static output, and no browser exceptions or failed requests.
407
- Raw build/acceptance output and `replay.json` are retained separately under
408
- `test-results/ai-delivery-production/imported-article-search-source-replay-20260907/`. Its sorted
409
- HTML/CSS/JS path-plus-NUL-plus-content SHA-256 is
410
- `92d96f7cfdd4535de28ff9b7665aa241815ed2649e6db14fc22c5eadc8258904`.
411
- The original attempt and earlier benchmark results are not rewritten.
412
-
413
- Release verification: `npm run check` (224 pages, 2 interactive),
414
- `KUDZU_REQUIRE_CHROME=1 npm test` (standalone project ownership gate, then
415
- 308/308 tests), `npm run test:package` (4 installed packages, one static page),
416
- and both package dry-runs pass. The release gates ran sequentially with a
417
- 1,200-second tool limit, avoiding overlapping fixture tests.
418
- Chrome regression checks also prove retained rows and fresh remounts; they are
419
- correctness checks, not latency samples. Mutable aliases, impure calls, cycles,
420
- collection escapes, mutating sort, and predicate-parameter state collisions remain
421
- diagnosed. No general local/callback graph or effect cleanup claim is added.
422
- The same release includes separate r4 benchmark lifecycle integrity changes:
423
- atomic partial-usage checkpoints, bounded incremental stdout/stderr evidence,
424
- setup-inclusive deadlines, owned process-tree termination, and incomplete timeout
425
- attribution. Two Linux lifecycle regressions cover setup and model timeouts,
426
- partial usage, descendant termination, and passing acceptance after adapter timeout.
427
- The Windows `taskkill` path remains untested. Future r4 protocols pin published
428
- `0.16.23` starters; historical raw evidence remains untouched. The published
429
- 11/25 versus 24/25 comparison and `1.0.0` block remain unchanged.
430
-
431
- ## 0.21.2 Browser Performance And Memory
432
-
433
- Measured 2026-09-03 at revision
434
- `fcb42ae388c733ff9098f8c4a059690a21a56ed3` on Linux x64 with Node 24.14.0,
435
- Chrome 152.0.7977.64, an Intel i5-9500, six logical CPUs, and 31.2 GiB RAM.
436
- These are same-revision application gates, not cross-framework or historical
437
- regression claims. Each timing benchmark ran alone with seven fresh Chrome
438
- profiles; the list decision rotates strategies. Median browser budgets are 100
439
- ms for measured interactions and enhanced navigation, 1,000 ms for bounded-list
440
- load, and 2,000 ms for the complete static 10,000-row document.
441
-
442
- | Fixture | Metric | Raw samples | Median / budget |
443
- |---|---|---|---:|
444
- | 2,000 keyed rows | Append 33 | `[9.6, 13.9, 10.8, 12.3, 8.6, 8.8, 7.0]` ms | 9.6 / 100 ms |
445
- | 2,000 keyed rows | Filter to one | `[16.0, 17.6, 20.4, 21.1, 17.6, 16.3, 16.9]` ms | 17.6 / 100 ms |
446
- | 2,000 keyed rows | Restore 1,999 | `[66.9, 84.5, 95.3, 78.5, 94.6, 76.4, 98.1]` ms | 84.5 / 100 ms |
447
- | 2,000 keyed rows | Reverse 2,000 | `[19.4, 18.8, 19.4, 18.7, 18.8, 27.3, 19.6]` ms | 19.4 / 100 ms |
448
- | Project application | Table save | `[0.8, 0.9, 0.9, 0.9, 0.8, 2.8, 1.0]` ms | 0.9 / 100 ms |
449
- | Project application | List-to-detail navigation | `[4.2, 9.5, 4.9, 4.2, 6.4, 11.7, 4.1]` ms | 4.9 / 100 ms |
450
- | 10,000-row direct | Complete load | `[999.8, 1030.9, 982.2, 1070.1, 1047.2, 939.0, 994.3]` ms | 999.8 / 2,000 ms |
451
- | 100-row pagination | Complete load | `[327.3, 133.9, 163.1, 145.1, 150.5, 417.1, 190.1]` ms | 163.1 / 1,000 ms |
452
- | 100-row pagination | Next range | `[39.3, 13.3, 14.1, 22.1, 14.6, 18.1, 22.3]` ms | 18.1 / 100 ms |
453
- | 100-row window | Complete load | `[185.1, 472.8, 247.9, 315.0, 251.7, 148.4, 260.6]` ms | 251.7 / 1,000 ms |
454
- | 100-row window | Next range | `[23.7, 14.4, 14.0, 48.5, 19.5, 50.5, 26.7]` ms | 23.7 / 100 ms |
455
-
456
- The keyed graph is nine JavaScript files totaling 30,048 raw / 11,748
457
- aggregate gzip B. The project list/detail session owns 17 unique JavaScript
458
- files totaling 81,200 raw / 27,885 aggregate gzip B; its initial list and
459
- concrete detail route graphs are 69,178 / 24,183 and 67,702 / 23,556 raw/gzip B.
460
- These are structural route/session artifact bytes from the exact ownership
461
- report, not compressed network-transfer measurements from the local uncompressed
462
- server.
463
-
464
- The lazy editor initially owns 12,982 raw / 6,153 gzip B and defers one 250,086
465
- raw / 80,890 gzip B CodeMirror chunk. Two route owners share that one deferred
466
- chunk while owning 21,599 / 9,466 and 21,609 / 9,468 eager raw/gzip B; the static
467
- sibling owns zero JavaScript. Focused required-Chrome tests pass 3/3, proving no
468
- deferred request before activation, one native module request, reuse by later
469
- owners, and exact conditional/document cleanup.
470
-
471
- The 10,000-row static control retains 10,000 rows, 50,015 elements, 90,023 DOM
472
- nodes, zero listeners, 534,292 forced-GC heap bytes, and zero JavaScript. Both
473
- bounded strategies retain exactly 100 rows: pagination records 1,467 nodes, one
474
- listener, and 1,423,560 median heap bytes; windowing records 1,468 nodes, two
475
- listeners, and 1,528,288 median heap bytes. Off-range state is released and
476
- recreated while retained-row identity remains correct.
477
-
478
- The default endurance gate passes five warm-ups, ten stale-prefetch races, and
479
- 30 ownership cycles in one profile. Across 101 navigations, editor
480
- mounts/disposals balance at 71/71, browser state remains zero, documents remain
481
- six, listeners remain seven, nodes move 164 to 165, and forced-GC heap moves
482
- 1,969,344 to 2,049,332 bytes: a 79,988 B increase under the existing 2 MiB or
483
- 15% alarm. No browser exception or failed request occurs. The raw ignored
484
- artifacts are under
485
- `test-results/endurance/2026-09-02T23-54-34-324Z/`.
486
-
487
- The packet adds median alarms to three existing browser benchmarks and permits
488
- the existing artifact collector to name the active packet. It changes no
489
- production source, semantic primitive, compiler pass, runtime concept, deploy
490
- artifact, public API, or browser byte.
491
-
492
- ## 0.21.1 Compiler And Route Scale
493
-
494
- Measured 2026-09-01 on Linux x64 with Node 24.14.0, an Intel i5-9500, six
495
- logical CPUs, and 31.2 GiB RAM. The 100- and 1,000-route scales use one warm-up
496
- and three measured fresh-process samples. The 10,000-route scale records one
497
- complete full-contract run with no warm-up after two diagnostic runs completed
498
- the measured stages but exposed cleanup and recovery-timeout harness defects.
499
- The generated topology contains nine imported modules plus one page per route
500
- and 1,011 lines per route. Fixture generation is excluded. These are absolute
501
- candidate measurements, not cross-framework claims.
502
-
503
- | Routes | Modules / lines | Graph median | TypeScript parse median | Normalize median | Compile/transform median | Render median | Write median | Clean median / RSS | Incremental median / retained-session peak RSS |
504
- |---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
505
- | 100 | 1,000 / 101,100 | 1,184.4 ms | 1,796.7 ms | 37.9 ms | 2,428.1 ms | 456.5 ms | 70.4 ms | 7,444.3 ms / 672.3 MiB | 1,838.0 ms / 680.9 MiB |
506
- | 1,000 | 10,000 / 1,011,000 | 12,152.6 ms | 18,717.6 ms | 302.9 ms | 23,681.5 ms | 4,919.4 ms | 521.7 ms | 77,515.9 ms / 3,182.3 MiB | 18,132.1 ms / 3,281.1 MiB |
507
- | 10,000 | 100,000 / 10,110,000 | 103,200.9 ms | 232,840.3 ms | 2,350.3 ms | 244,578.3 ms | 44,885.7 ms | 6,690.1 ms | 1,117,753.0 ms / 5,461.0 MiB | 643,697.2 ms / 8,266.9 MiB |
508
-
509
- The exact 100-route runs are source read `[30.5, 30.3, 24.7]`, graph
510
- `[1273.8, 1138.8, 1184.4]`, parse `[1749.8, 1911.6, 1796.7]`, normalize
511
- `[37.2, 37.9, 41.4]`, compile/transform `[2428.1, 2828.6, 2381.1]`, render
512
- `[516.7, 416.9, 456.5]`, write `[95.3, 53.1, 70.4]`, clean build
513
- `[7444.3, 7269.2, 8156.1]`, and incremental build
514
- `[1631.9, 1907.7, 1838.0]` ms. Clean-build RSS is
515
- `[672.3, 658.6, 675.1]` MiB and retained-session peak RSS is
516
- `[707.1, 673.9, 680.9]` MiB.
517
-
518
- The exact 1,000-route runs are source read `[296.7, 315.7, 271.2]`, graph
519
- `[12152.6, 12308.1, 10011.3]`, parse `[19099.5, 18717.6, 16398.2]`,
520
- normalize `[259.6, 302.9, 315.8]`, compile/transform
521
- `[27200.6, 23681.5, 21608.7]`, render `[4919.4, 4454.6, 5238.7]`, write
522
- `[748.6, 521.7, 487.8]`, clean build `[77515.9, 70196.9, 82980.2]`, and
523
- incremental build `[22359.7, 18132.1, 17097.2]` ms. Clean-build RSS is
524
- `[3181.5, 3182.3, 3188.5]` MiB and retained-session peak RSS is
525
- `[3281.0, 3281.1, 3284.5]` MiB.
526
-
527
- The complete 10,000-route run records source read `17077.4`, graph `103200.9`,
528
- TypeScript parse `232840.3`, normalize `2350.3`, compile/transform `244578.3`,
529
- render `44885.7`, write `6690.1`, clean build `1117753.0`, and incremental
530
- build `643697.2` ms. Compile-only RSS is 5,561.4 MiB, clean-build RSS is
531
- 5,461.0 MiB, and retained-session peak RSS is 8,266.9 MiB under
532
- `--max-old-space-size=10240`.
533
-
534
- Graph time excludes measured TypeScript parsing. Compile/transform excludes
535
- measured TypeScript parse and Kudzu normalization, but includes the indivisible
536
- esbuild parse/transform call for proven import-free modules. Render includes
537
- provisional page materialization; write includes artifact finalization and
538
- staged-output promotion. Clean build is an end-to-end wall clock and is not the
539
- sum of the reported phase boundaries.
540
-
541
- Every incremental sample recompiles exactly 10 modules, renders one page,
542
- matches a clean build of the changed source byte-for-byte, rejects invalid
543
- source in the retained session without changing output, and recovers in that
544
- same session after source restoration.
545
- At 100 routes, clean output is 100 files / 21,980 B with digest
546
- `61525962c70c5e69a975a656781e598cf6665137d648be82f1c3d5e73f0b1b48`;
547
- the source change produces digest
548
- `4c7e0f098f3f3236b6e04fa96e8057341c3aa8bdb35a72fe701e78be06160154`.
549
- At 1,000 routes, clean output is 1,000 files / 221,780 B with digest
550
- `ccdd2630bcaf9fac4a481b64c69982c341e4798205bb9fbb4cac67d528246635`;
551
- the source change produces digest
552
- `024811a5f4598d5025abc57320695503b2d63d0fd6aa54bcf79efde848c2a94e`.
553
- At 10,000 routes, clean output is 10,000 files / 2,237,780 B with digest
554
- `7a48bc40ff33c4faaef8a01ab90fcfe611a4bada5364a6fedca42f80ad5070d3`;
555
- the source change emits 2,237,788 B with digest
556
- `09a42f84b4ce16c994a8bd55b92e5b645c716168f9290d241cfe27903ccfe98f`.
557
- Both clean and retained-session failure probes reject invalid source without
558
- changing the prior deploy and recover to the expected digest.
559
-
560
- The first full 10,000-route attempt exhausted a 10,240 MiB V8 heap while the
561
- unbounded canonical module cache retained roughly 90,000 parent-linked
562
- TypeScript ASTs. Bounding complete canonical records to 1,024 retains stable
563
- position-based symbols while allowing old ASTs to be collected. The identical
564
- 100,000-module / 10,110,000-line topology then completed under the same heap cap.
565
- This adds eight net production compiler lines, no semantic primitive, compiler
566
- pass, runtime concept, public API, deploy file, or browser byte.
567
-
568
- ## 0.21.0 Functional Parity Matrix
569
-
570
- Measured 2026-09-01 on Linux x64 with Node 24.14.0 and required Chrome. The
571
- 300-test suite passes the maintained content, authentication, forms, CRUD,
572
- shared-data, large-list, overlay, editor, lazy-load, realtime, error,
573
- accessibility, and navigation browser journeys. Greenfield `/help`, Apache
574
- Answer and Memos `/public`, editor `/static`, and the direct 10,000-row route
575
- remain the corresponding static exclusion controls.
576
-
577
- The previously benchmark-only 10,000-item pagination decision now runs once as
578
- ordinary browser acceptance. Enter advances the native control to rows 101-200,
579
- focus remains on the control, returning to rows 1-100 releases the old row and
580
- restores fresh input state, the DOM remains bounded to 100 rows, and no browser
581
- exception occurs. Its deploy contains 19 files totaling 1,900,048 raw / 242,968
582
- aggregate gzip B with digest
583
- `1bbaf3479ac90f923deb469c73eb93c0dd7364e7fe906919b167f2f854deda70`.
584
- The selected pagination route owns 30,143 raw / 11,193 gzip B JavaScript; the
585
- complete direct 10,000-row HTML control owns 0 B JavaScript. This freezes
586
- behavior rather than making a new timing claim.
587
-
588
- No fixture source, compiler, IR, normalization pass, runtime concept, public API,
589
- or browser artifact changed. One focused browser acceptance test and one
590
- artifact-baseline entry were added. `npm run check`, required-Chrome 300/300,
591
- package smoke, and the artifact inventory pass, so no release version is
592
- consumed.
593
-
594
- ## 0.20.5 Tooling Cost Validation
595
-
596
- Measured 2026-09-01 on Linux x64 with Node 24.14.0, OpenCode 1.18.25, and
597
- `openai/gpt-5.6-sol`. Five interleaved attempts per condition repaired the same
598
- Apache Answer-derived static React Bootstrap breakpoint under one prompt,
599
- budget, public context, starter, and acceptance digest. Baseline exposed plain
600
- `build`; tool-assisted exposed structured `build`, `inspect`, and `explain`.
601
- Both conditions passed 5/5 with the same 234 raw / 181 gzip B HTML artifact,
602
- 98.94% byte-identical source retention, and zero browser JavaScript.
603
-
604
- Baseline total-token samples were `[75485, 75459, 66141, 60644, 61570]`: a
605
- 66,141 median, 60,644/75,485 range, and 67,860 failure-inclusive tokens per
606
- success. Tool-assisted samples were `[75983, 87615, 108588, 75828, 75950]`: a
607
- 75,983 median, 75,828/108,588 range, and 84,793 tokens per success. Structured
608
- tools therefore cost 16,933 more tokens per success on this task. Monetary cost
609
- was reported as zero by the subscription provider in every attempt.
610
-
611
- Baseline versus tool-assisted medians and ranges were: file reads 2 (1/3)
612
- versus 2 (1/3), tool calls 8 (5/9) versus 9 (8/12), builds 2 (2/2) versus 2
613
- (2/3), correction cycles 1 (1/1) versus 1 (1/2), and completion time 45,811 ms
614
- (43,194/46,390) versus 60,736 ms (52,313/76,963). There were no failed
615
- attempts. This rejects an AI cost-reduction claim for the structured tool bundle
616
- on this task; it does not remove the independently useful machine-readable
617
- commands or claim results for other tasks.
618
-
619
- ## 0.16.14 Fair AI Delivery Evidence
620
-
621
- Measured 2026-09-01 on Linux x64 with Node 24.14.0. The deterministic protocol
622
- fixture records two interleaved attempts per variant, including one success and
623
- one retained failure each. Both variants therefore report a 50% fixture success
624
- rate, 50 nanos median successful cost, and 100 nanos total cost per success when
625
- failed attempts remain in the numerator. Successful artifacts are one 63 raw /
626
- 66 gzip B HTML file with digest
627
- `0d22f579d793d0034c967c7ffa08e0b2c377bc36c959c7b4bafab587fd5dda60`.
628
- This validates evidence accounting only and is not a model-driven framework
629
- comparison. Compiler passes, runtime concepts, representative deploy output, and
630
- browser bytes are unchanged. Browser-disabled and required-Chrome suites pass
631
- 297/297 tests, package smoke passes, and the runner adds no dependency.
632
-
633
- ## 0.16.13 Route Artifact Explanations
634
-
635
- Measured 2026-09-01 on Linux x64 with Node 24.14.0. Route explanation is a
636
- build-time projection over existing route, source, compatibility, ownership,
637
- capability, and artifact records. Representative deploy manifests and hashes
638
- remain unchanged. The maintained Worker graph remains 907 raw / 477 gzip B and
639
- the window graph remains 14,456 raw / 6,160 gzip B. Seven clean builds record a
640
- 605 ms median on this host without a timing comparison. Browser-disabled and
641
- required-Chrome suites pass 296/296 tests, package smoke passes, and focused CLI
642
- coverage includes an effect-owned Worker route, configured base, exact missing
643
- route diagnostic, deterministic output, artifact hashes, and zero-JavaScript
644
- static exclusion.
645
-
646
- ## 0.16.12 Bounded Application Inspection
647
-
648
- Measured 2026-08-31 on Linux x64 with Node 24.14.0. Inspection is a build-time
649
- projection over existing source, compatibility, ownership, capability, and
650
- artifact records. Representative deploy manifests and hashes remain unchanged.
651
- The maintained Worker graph remains 907 raw / 477 gzip B and the window graph
652
- remains 14,456 raw / 6,160 gzip B. Seven clean builds record a 648.7 ms median
653
- on this host without a timing comparison. Browser-disabled and required-Chrome
654
- suites pass 295/295 tests, package smoke passes, and bounded deterministic CLI
655
- coverage includes reachable-source filtering and structured blocker output.
656
-
657
- ## 0.16.11 Structured Compiler Diagnostics
658
-
659
- Measured 2026-08-31 on Linux x64 with Node 24.14.0. Structured diagnostics are
660
- compiler and CLI output only; all representative deploy manifests, route bytes,
661
- and hashes remain unchanged. The maintained Worker graph remains 907 raw / 477
662
- gzip B and the window graph remains 14,456 raw / 6,160 gzip B. Seven clean
663
- release-candidate builds record a 1,034.4 ms median on this loaded host; timing is
664
- not compared.
665
- The complete browser-disabled and required-Chrome suites pass 293/293 tests,
666
- focused JSON CLI and human diagnostic tests pass, and package smoke builds one
667
- static page with zero interactive pages.
668
-
669
- ## 0.16.10 Apache Answer Authentication Journey
670
-
671
- Measured 2026-08-31 on Linux x64 with Node 24.14.0 and required Chrome. The
672
- existing authentication fixture remains 17 deploy files and 36,441 raw / 15,598
673
- aggregate gzip B. The login route owns 25,684 raw / 11,372 gzip B, settings owns
674
- 26,818 raw / 11,319 gzip B, and the public sibling owns zero JavaScript. Required
675
- Chrome verifies anonymous, invalid and valid login, token restore, shared
676
- header/settings state, 401 clearing, and replacement navigation against a
677
- deterministic server. No production source or deploy artifact changed. The
678
- maintained Worker graph remains 907 raw / 477 gzip B and the window graph remains
679
- 14,456 raw / 6,160 gzip B. Seven clean builds record a 674.7 ms median on this
680
- loaded host; timing is not compared.
681
-
682
- ## 0.16.9 Compatibility Boundary And Inventory
683
-
684
- Measured 2026-08-31 on Linux x64 with Node 24.14.0 and required Chrome. The
685
- compatibility inventory is compiler scratch generated from reachable original
686
- source before normalization; it emits no deploy file or browser capability.
687
- Existing project-output baselines and package-specific diagnostics pass without
688
- change. The maintained Worker graph remains 907 raw / 477 gzip B and the window
689
- graph remains 14,456 raw / 6,160 gzip B. Seven clean builds record a 532.6 ms
690
- median on this loaded host; timing is not compared.
691
-
692
- ## 0.16.8 Shared Lazy Capability Graph
693
-
694
- Measured 2026-08-31 on Linux x64 with Node 24.14.0 and Chrome. Two route owners
695
- share one deferred CodeMirror chunk measuring 250,086 raw / 80,890 aggregate
696
- gzip B. Their eager graphs are 21,599 raw / 9,466 gzip B and 21,609 raw / 9,468
697
- gzip B. The static sibling remains complete HTML with zero JavaScript.
698
-
699
- Required Chrome proves zero deferred requests before interaction, one request on
700
- the first owner, no navigation-triggered prefetch, no duplicate request for the
701
- second owner, and exact owner/document cleanup. Native ESM supplies the
702
- document-lifetime cache; no loader, prefetch registry, cache, or runtime concept
703
- was added. The maintained Worker benchmark remains 907 raw / 477 gzip B for the
704
- Worker graph and 14,456 raw / 6,160 gzip B for the window graph. Seven clean
705
- builds record a 696.6 ms median on this loaded host; timing is not compared.
706
-
707
- ## 0.16.7 Lazy Retained Editor Lifecycle
708
-
709
- Measured 2026-08-30 on macOS arm64 with Node 24.14.0 and Chrome. The existing
710
- eager real CodeMirror editor owns 214,968 raw / 71,607 aggregate gzip B. The
711
- lazy retained journey initially owns 15,896 raw / 7,230 gzip B and defers
712
- 250,086 raw / 80,890 gzip B, reducing initial gzip by 64,377 B (89.9%). Its
713
- static sibling remains complete HTML with zero JavaScript.
714
-
715
- Required Chrome proves zero initial deferred requests, one activation request,
716
- bidirectional updates, accessible update-error recovery, retained editor DOM,
717
- conditional cleanup, cached fresh remount, and document disposal. The maintained
718
- Worker benchmark remains 907 raw / 477 gzip B for the Worker graph and 14,456
719
- raw / 6,160 gzip B for the window graph. Seven clean builds record a 230.5 ms
720
- median. No browser runtime file or concept was added.
721
-
722
- ## 0.16.6 Owner-Triggered Capability Imports
723
-
724
- Measured 2026-08-29 on macOS arm64 with Node 24.14.0 and Chrome. The existing
725
- eager CodeMirror route owns 214,968 raw / 71,607 aggregate gzip B. Its guarded
726
- lazy counterpart initially owns 12,982 raw / 6,153 gzip B and defers 250,086
727
- raw / 80,890 gzip B, reducing initial gzip by 65,454 B (91.4%). Its static
728
- sibling remains complete HTML with zero JavaScript.
729
-
730
- Required Chrome proves zero initial deferred requests, one request on owner
731
- activation, mount, exact cleanup, cached remount without another request, and
732
- document disposal. The maintained Worker benchmark remains 907 raw / 477 gzip B
733
- for the Worker graph and 14,456 raw / 6,160 gzip B for the window graph. Seven
734
- clean builds record a 222.8 ms median. No browser runtime file or concept was
735
- added.
736
-
737
- ## 0.16.5 Bounded Navigation Cache
738
-
739
- Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. Before the
740
- production fix, five held-prefetch races increased retained CDP documents from 8
741
- to 16 after a newer canonical navigation had pruned those URLs. Moving the
742
- existing revision check before the cache write restores the exact bound without
743
- adding an LRU, cancellation registry, runtime file, or cache abstraction.
744
-
745
- The default endurance gate runs ten batched cache races and 30 ownership cycles
746
- in one Chrome profile. Across 101 navigations, baseline/final documents remain
747
- 8, browser state entries 0, DOM nodes 174, listeners 7, and editor
748
- mounts/disposals 71/71. Forced-GC heap moves from 1,826,244 to 2,022,160 bytes,
749
- below the larger of the declared 2 MiB or 15% alarm.
750
-
751
- The maintained Worker benchmark remains 907 raw / 477 gzip B for the Worker
752
- graph and 14,456 raw / 6,160 gzip B for the window graph. Seven clean builds
753
- record a 795.3 ms median on this host; timing is not compared because concurrent
754
- host load differs. Production runtime LOC, concepts, and files remain unchanged.
755
-
756
- ## 0.16.4 Scoped GSAP Animation Lifecycle
757
-
758
- Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. The real GSAP
759
- fixture emits 8 JavaScript files totaling 94,110 raw / 37,819 aggregate gzip
760
- bytes, while its static sibling emits zero JavaScript. Required Chrome proves
761
- scoped presentation, native reduced-motion fallback, dependency replacement,
762
- conditional and enhanced-route disposal, retained structure, and fresh remount.
763
-
764
- The maintained Worker benchmark remains byte-identical at 907 raw / 477 gzip B
765
- for the Worker graph and 14,456 raw / 6,159 gzip B for the window graph. Seven
766
- clean builds record a 625.9 ms median on this host. Timing is not compared with
767
- the prior sweep. The change adds no runtime file or animation abstraction; one
768
- existing package-reference ancestry helper shrinks by two lines.
769
-
770
- ## 0.16.3 State-Owned Drag And Drop
771
-
772
- Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. The real
773
- SortableJS fixture emits 10 JavaScript files totaling 72,251 raw / 26,603
774
- aggregate gzip bytes, while its static sibling emits zero JavaScript. Required
775
- Chrome proves drag and keyboard reorder, retained row/input identity, invalid
776
- package-index recovery, conditional and document disposal, and fresh remount.
777
-
778
- The maintained Worker benchmark remains byte-identical at 907 raw / 477 gzip B
779
- for the Worker graph and 14,456 raw / 6,159 gzip B for the window graph. Seven
780
- clean builds record a 999.7 ms median on this host. Timing is not compared with
781
- the prior macOS sweep. The change adds no runtime file or drag/drop abstraction;
782
- it classifies `HTMLElement` with the existing browser globals used by bundled
783
- effect callbacks.
784
-
785
- ## 0.16.1 Retained Editor Ownership
786
-
787
- Measured 2026-08-28 on Linux x64 with Node 24.14.0 and Chrome. The new
788
- CodeMirror fixture emits 7 JavaScript files totaling 214,968 raw / 71,607
789
- aggregate gzip bytes, while its static sibling emits zero JavaScript. These
790
- bytes belong to the real editor package and existing selected effect/runtime
791
- capabilities; no retained-ref runtime file or shared widget runtime was added.
792
-
793
- Required Chrome proves initial content, retained package DOM across application
794
- updates, editor-to-state updates, accessible error recovery, conditional
795
- disposal/remount, and document disposal. The maintained Worker benchmark remains
796
- byte-identical to 0.15.1 at 907 raw / 477 gzip B for the Worker graph and 14,456
797
- raw / 6,159 gzip B for the window graph. The generated 50-route, 500-module
798
- source-scale fixture retains compiler digest
799
- `7c366079a984b3d62fb19a26305326d3278f029d2193d39340ddd3a4be5adc6e` and
800
- output digest `e107d78a7f55bc8a1af0ea6e53efeffa19b3d44d21c892484d103fa346e7ba7b`.
801
- Timing from this Linux host is recorded only as a local check and is not compared
802
- with the prior macOS release sweep.
803
-
804
- ## 0.15.1 Maintained Benchmark Sweep
805
-
806
- Remeasured 2026-08-27 on macOS arm64 with Node 24.14.0, Apple M4 hardware,
807
- 16 GiB RAM, and Chrome 151.0.7922.174. Candidate comparisons use clean
808
- `v0.14.3` except project-state scale, whose maintained contract compares the
809
- published `0.10.0` baseline. Every paired compiler/native/commerce output digest
810
- or manifest is identical unless the row below records route-specific `0.15.1`
811
- output.
812
-
813
- | Maintained runner | Current `0.15.1` result |
814
- |---|---|
815
- | `npm run benchmark` | Worker-effects clean-build median 220.1 ms; Worker graph 907 raw / 477 gzip B; window graph 14,456 / 6,159 B. |
816
- | `npm run benchmark:keyed` | 2,000-row build 233.2 ms; append 2.2 ms, filter 3.9 ms, restore 15.6 ms, reverse 5.3 ms medians; 30,048 raw / 11,748 gzip B JavaScript. |
817
- | `RUNS=7 npm run benchmark:native` | `v0.14.3` / `0.15.1` dispatch medians 3.5 / 3.4 ms for 5,000 clicks; identical 14,354 raw / 6,470 gzip B JavaScript and zero changed files. |
818
- | `RUNS=7 WARMUPS=1 npm run benchmark:module-cache` | `v0.14.3` / `0.15.1` medians 248.338 / 249.692 ms and 296.9 / 296.8 MiB peak RSS; identical 454,007-byte result and digest. |
819
- | `npm run benchmark:source-scale` | 50 routes, 500 modules, 50,550 lines: `v0.14.3` / `0.15.1` compile medians 499.3 / 498.9 ms and clean builds 851.5 / 853.8 ms; identical compiler and output digests. |
820
- | `RUNS=7 npm run benchmark:commerce` | 1,011-page storefront: `v0.14.3` / `0.15.1` clean-build medians 1,854.6 / 1,822.1 ms; all 1,053 files and 10,140,618 output bytes match. |
821
- | `npm run benchmark:project-navigation` | Seven-profile table update median 0.4 ms and navigation median 2.3 ms; 17 session JavaScript files total 77,779 raw / 27,050 gzip B. |
822
- | `npm run benchmark:project-state` | One-, eight-, and 32-state commit medians 0.2, 0.3, and 0.4 ms; deploy digest `3f83712254d95f1cf59c5034f363ea906406efa1bd9539f3bb8b9a0d54a3fdc5`. |
823
- | `npm run benchmark:project-list-decision` | Direct load 138.2 ms with 90,023 nodes; pagination load/range 39.6/5.8 ms with 2,867 nodes; window load/range 40.7/5.8 ms with 2,868 nodes. |
824
-
825
- The paired timing ranges overlap at module-cache and source-scale granularity,
826
- so no compiler regression or improvement is claimed. Native output is byte
827
- identical. Pagination remains selected over the timing-tied authored window: it
828
- uses one listener instead of two, has lower median heap (1,485,168 versus
829
- 1,586,528 B), and preserves native page, focus, keyboard, and variable-row-height
830
- behavior without fixed-height range policy.
831
-
832
- ## 0.15.1 Public Cross-Framework Commerce Fixture
833
-
834
- Measured 2026-08-27 from public fixture commit
835
- `f2d5be1a516c539e30f7125f6870d42b1dd02ecd` with 1,000 products and Kudzu
836
- linked to this `0.15.1` checkout. The matched variants use Astro 7.1.3 with
837
- React 19.2.8, React Router 8.3.0, TanStack Start 1.168.32, and Next.js 16.2.11.
838
- All five builds completed before the same asset and browser harnesses ran.
839
-
840
- | Variant | Initial JavaScript across six routes, gzip | Total output | First reliable click after first paint | Degraded capabilities |
841
- |---|---:|---:|---:|---:|
842
- | Kudzu 0.15.1 | 4.2-9.9 KiB | 9.42 MiB | 300 ms | 15 / 18 |
843
- | Astro 7.1.3 + React | 60.6-61.1 KiB | 13.95 MiB | 1,500 ms | 12 / 18 |
844
- | React Router 8.3.0 | 103.8-104.6 KiB | 7.04 MiB | 2,000 ms | 8 / 18 |
845
- | TanStack Start 1.168.32 | 103.5-104.1 KiB | 9.87 MiB | 2,000 ms | 9 / 18 |
846
- | Next.js 16.2.11 | 144.2-146.2 KiB | 35.76 MiB | 3,000 ms | 8 / 18 |
847
-
848
- The initial-JavaScript column records what Chrome actually received for home,
849
- search, collection, product, policy, and checkout routes. Browser results are
850
- medians from seven fresh sessions under 4x CPU slowdown and Chrome Slow 4G.
851
- Reliable click is the first tested delay with zero lost add-to-cart attempts in
852
- seven isolated sessions. The resilience score covers six matched capabilities
853
- under blocked JavaScript, a two-second script delay, and one missing script.
854
- Pre-rendered content and native links remain usable without JavaScript in every
855
- variant; the score does not treat read-only fallback as full interactivity.
856
-
857
- This is the current executable public commerce comparison, not a replacement
858
- for the broader historical 0.9 C1/C2/C5 contracts. That ignored local workspace
859
- is unavailable in current checkouts, so its React, Vue, Svelte, and Astro result
860
- remains provenance rather than a current ranking. The public commerce fixture
861
- does not contain Vue or Svelte variants.
862
-
863
- ## 0.15.1 Key-Scoped Native Popover Intake
864
-
865
- Measured 2026-08-27 on macOS arm64 with Node 24.14.0 and Chrome
866
- 151.0.7922.174. The maintained project fixture uses native Popover with one
867
- key-scoped `useId()` relationship per project row. Required Chrome verifies
868
- Escape, light dismiss, trigger focus restoration, reorder identity, inserted
869
- and remounted IDs, and enhanced-navigation cleanup.
870
-
871
- The application emits 44 files totaling 171,202 raw / 53,629 aggregate gzip
872
- bytes with deploy SHA-256
873
- `46ba45b4a423b9627c6ede5f8dd3a667f593cb5401454ae42ecc66207b07b323`.
874
- The maintained two-route session contains 17 JavaScript files totaling 77,779
875
- raw / 27,050 aggregate gzip bytes. `/help` remains 0 B JavaScript.
876
-
877
- Seven fresh Chrome profiles record table update samples of `[0.4, 0.4, 0.5,
878
- 0.4, 0.5, 0.5, 0.5]` ms, a 0.5 ms median and 0.4/0.5 ms range. Navigation
879
- samples are `[4, 2.4, 2.6, 2.5, 2.5, 2.8, 2.4]` ms, a 2.5 ms median and 2.4/4
880
- ms range. These ranges overlap prior retained-path evidence; no timing
881
- improvement or regression is claimed.
882
-
883
- ## 0.14.3 10,000-Item Browser Decision Intake
884
-
885
- Measured 2026-08-27 on Linux x64 with Node 24.14.0 and Chrome
886
- 142.0.7444.175 using `RUNS=7 npm run benchmark:project-list-decision`.
887
- The tracked fixture rotates three fresh-profile routes, forces garbage collection,
888
- and records navigation completion, range replacement, DOM counters, JavaScript
889
- heap, native edit identity, and bounded-row release.
890
-
891
- | Strategy | Load median | Range median | Rows | DOM nodes median | JS heap median |
892
- |---|---:|---:|---:|---:|---:|
893
- | Direct DOM | 806.6 ms | n/a | 10,000 | 90,023 | 535,572 B |
894
- | Pagination | 165.4 ms | 12.1 ms | 100 | 1,470 | 1,407,412 B |
895
- | Scroll window | 161.2 ms | 16.5 ms | 100 | 1,471 | 1,507,712 B |
896
-
897
- Direct load samples are `[767, 790.1, 882.8, 908.8, 753, 826.7, 806.6]`
898
- ms. Pagination load/range samples are `[253.6, 138.6, 157, 133.7, 181.9,
899
- 202, 165.4]` / `[10.8, 22.1, 15.8, 13.7, 12.1, 10.5, 11]` ms. Scroll
900
- window load/range samples are `[156.7, 154.6, 163.4, 161.2, 175.9, 203.5,
901
- 137.1]` / `[21.3, 16.4, 14.6, 17.1, 15.9, 16.5, 20.4]` ms.
902
-
903
- The direct route is static and therefore has the lowest JavaScript heap; that
904
- does not offset its 61.2x DOM-node count and 4.9x load median. Pagination and the
905
- scroll window have overlapping load ranges, while pagination has the lower range
906
- median, lower JavaScript heap, no scroll listener, native focus/page semantics,
907
- and no fixed-row-height policy. Pagination is selected for 10,000-item project
908
- tables. The window experiment adds no framework primitive and does not authorize
909
- `0.14.4`; three independent failing fixtures remain required.
910
-
911
- ## 0.14.2 Infinite Loading Composition
912
-
913
- Measured 2026-08-26 on macOS arm64 with Node 24.14.0 and Chrome
914
- 151.0.7922.174.
915
-
916
- The project route adds one intrinsic sentinel, an owned `IntersectionObserver`,
917
- cursor fetch, duplicate suppression, error/retry/end state, and immutable keyed
918
- append. Required Chrome proves a three-request bound across two successful pages,
919
- at most six retained projects, retained existing-row identity, observer cleanup,
920
- and route-owned fetch abort. `/help` remains 0 B JavaScript.
921
-
922
- The application emits 44 files totaling 168,037 raw / 52,955 aggregate gzip
923
- bytes with deploy SHA-256
924
- `230dea098442275e42a966ca595743a4da9c832327ba52d4d09de663c68f8f1a`.
925
- The two-route session remains 17 JavaScript files and totals 76,889 raw / 26,750
926
- aggregate gzip bytes. The authored application composition adds 3,732 raw / 770
927
- gzip deploy bytes and 2,063 raw / 546 gzip session bytes over `0.14.1`; no
928
- semantic primitive, IR kind, compiler pass, production compiler/runtime line,
929
- runtime concept, or public API was added.
930
-
931
- Table update samples are `[0.4, 0.5, 0.5, 0.3, 0.5, 0.4, 0.6]` ms, with a 0.5
932
- ms median and 0.3/0.6 ms minimum/maximum. Navigation samples are
933
- `[2.3, 2.3, 2.2, 2.6, 2.5, 2.5, 2.3]` ms, with a 2.3 ms median and 2.2/2.6 ms
934
- minimum/maximum. The environment differs from the `0.14.1` release evidence, so
935
- no improvement or regression claim is made.
936
-
937
- ## 0.14.1 Nested Object-State Collections
938
-
939
- Measured 2026-08-26 on Linux x64 with Node 24.14.0 and Chrome
940
- 142.0.7444.175.
941
-
942
- The project route now roots its selected project table and nested issue rows in
943
- one direct `projectData.projects` field. Required Chrome proves immutable
944
- whole-object replacement, nested insert/update/reorder/remove/re-add, retained
945
- identity, latest handlers, descendant state release, and fresh remount. `/help`
946
- remains 0 B JavaScript.
947
-
948
- The application emits 44 files totaling 164,305 raw / 52,185 aggregate gzip
949
- bytes with deploy SHA-256
950
- `0a3b7e10b3447a76a9c04ef34ad7c2bfa30400ea53c9d16fc85b1c7cbf2ea203`.
951
- The two-route session remains 17 JavaScript files and totals 74,826 raw / 26,204
952
- aggregate gzip bytes. The delta from `0.14.0` includes the authored nested issue
953
- controls and handlers plus one build-time validation-line edit and one production
954
- list-runtime line; no semantic primitive, IR kind, compiler pass, runtime concept,
955
- or public API was added.
956
-
957
- Table update samples are
958
- `[0.8, 0.8, 0.7, 0.8, 0.9, 0.8, 0.8]` ms, with a 0.8 ms median and 0.7/0.9 ms
959
- minimum/maximum. Navigation samples are
960
- `[3.7, 4.1, 4.5, 3.9, 4.2, 3.9, 4.3]` ms, with a 4.1 ms median and 3.7/4.5 ms
961
- minimum/maximum. The navigation ranges overlap the `0.14.0` release evidence;
962
- no improvement or regression claim is made.
963
-
964
- `npm run benchmark:source-scale` generates its fixture outside the repository so 50,000 lines of synthetic source are not tracked. The default topology is 50 pages plus 450 route-owned imported modules. Generation is excluded from timing; fresh-process samples separately report source reads, reachable-graph discovery, source compilation, clean production build, compiler-result and deploy digests, output files/bytes, cache counters, and peak RSS. `ROUTES`, `MODULES_PER_ROUTE`, `FILLER_LINES`, `WARMUPS`, and `RUNS` may reduce or expand the fixture without changing the default acceptance floor. `TARGET_ROOT` measures another checkout; `BASELINE_ROOT` alternates that checkout with the current tree and requires identical deploy output.
965
-
966
- The maintained 2026-08-13 comparison used Node 24.14.0 and an Intel Core i5-9500 Linux x64 host, one warm-up, and seven alternating fresh-process samples against clean `v0.8.44`. A narrow fast path skips Kudzu semantic transformation for 450 plain `.ts` modules whose runtime edges are exclusively resolvable relative TypeScript imports or exports; all other modules retain the existing transformer. Compile median fell 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%); every paired sample improved. Compile peak-RSS median fell from 571.2 MiB to 552.6 MiB, while build peak RSS was 570.9 MiB versus 568.8 MiB. Compiler scratch fell from 7,328,390 to 1,971,061 bytes. Both targets emitted the same 50 static HTML files, 10,980 bytes, and deploy SHA-256 `e107d78a7f55bc8a1af0ea6e53efeffa19b3d44d21c892484d103fa346e7ba7b`. This is a source-scale compiler comparison, not a cross-framework result.
967
-
968
- ## 0.14.0 Project Table CRUD And Identity
969
-
970
- Measured 2026-08-26 on Linux x64 with Node 24.14.0 and Chrome
971
- 142.0.7444.175. Required Chrome proves native table insert, update, delete,
972
- reorder, sort, filter, selection, keyboard focus, row-local edit state, and
973
- retained keyed DOM identity.
974
-
975
- The application emits 44 files totaling 159,258 raw / 51,627 aggregate gzip
976
- bytes with deploy SHA-256
977
- `ebb3358e7a03612459e723ae765c39d105498db9d293415b924f1066cddf4793`.
978
- The two-route session remains 17 JavaScript files and totals 73,304 raw / 25,930
979
- aggregate gzip bytes, 2,273 raw / 626 gzip bytes above `0.13.3`. `/help`
980
- remains 0 B JavaScript. The added bytes are route-specific authored table
981
- handlers, bindings, selectors, and keyed row state; there is no data-grid
982
- runtime.
983
-
984
- Table update samples are `[0.7, 0.8, 1.0, 0.7, 1.1, 0.7, 0.8]` ms, with a 0.8
985
- ms median and 0.7/1.1 ms minimum/maximum. Navigation samples are
986
- `[3.9, 3.9, 5.5, 4.2, 6.1, 3.5, 3.4]` ms, with a 3.9 ms median and 3.4/6.1 ms
987
- minimum/maximum. Table update is a new measurement, so no same-content latency
988
- delta is claimed.
989
-
990
- Core semantic LOC remains 5,682 with zero new semantic primitives, IR kinds,
991
- compiler passes, production compiler/runtime lines, normalization rules,
992
- adapters, runtime concepts, public APIs, or data-grid runtimes. Infinite loading,
993
- windowing, and the 10,000-row strategy remain later measured decisions.
994
-
995
- ## 0.13.3 File Upload Boundary
996
-
997
- Measured 2026-08-25 on Linux x64 with Node 24.14.0 and Chrome
998
- 142.0.7444.175. Required Chrome proves plain-text type and 1 KiB size
999
- validation before any request, native file reading, `FormData`/fetch upload,
1000
- user cancellation, delayed failure and retry, route-departure abort, and
1001
- successful keyed attachment mutation.
1002
-
1003
- The application emits 44 files totaling 150,023 raw / 50,240 aggregate gzip
1004
- bytes with deploy SHA-256
1005
- `a16fd5dbc08086aa6a7c0ec0aba3a38fbe2a63b96005a81e8747a7f4e45e214e`.
1006
- The two-route session remains 17 JavaScript files and totals 71,031 raw / 25,304
1007
- aggregate gzip bytes, 2,367 raw / 557 gzip bytes above `0.13.2`. `/help`
1008
- remains 0 B JavaScript. The added bytes are route-specific authored file
1009
- validation, multipart upload, effect cleanup, and keyed attachment behavior;
1010
- there is no upload runtime.
1011
-
1012
- Navigation samples are `[3.7, 5.0, 3.5, 3.7, 3.8, 3.8, 4.0]` ms, with a 3.8
1013
- ms median and 3.5/5.0 ms minimum/maximum. This changes the destination, so no
1014
- same-content runtime regression or improvement claim is made.
1015
-
1016
- Core semantic LOC remains 5,682 with zero new semantic primitives, IR kinds,
1017
- compiler passes, production compiler/runtime lines, normalization rules,
1018
- adapters, runtime concepts, public APIs, upload schedulers, or transfer
1019
- runtimes. Fetch does not expose upload progress, so the application states that
1020
- boundary instead of fabricating progress. Chunking, resume, background sync,
1021
- and files above the authored 1 KiB in-memory text limit remain unsupported.
1022
-
1023
- ## 0.13.2 Multistep Draft And Autosave
1024
-
1025
- Measured 2026-08-25 on Linux x64 with Node 24.14.0 and Chrome
1026
- 142.0.7444.175. Required Chrome proves native step validation, debounced save,
1027
- server rejection of an older in-flight version, ignored stale completion,
1028
- enhanced-navigation and reload restoration, retained input on conflict, and
1029
- reset with timer and storage cleanup.
1030
-
1031
- The application emits 44 files totaling 144,633 raw / 49,217 aggregate gzip
1032
- bytes with deploy SHA-256
1033
- `06a35341c5e70bfec48c46ad767ac351326b39ba701f5c1f1d03992a65ec8b9e`.
1034
- The two-route session remains 17 JavaScript files and totals 68,664 raw / 24,747
1035
- aggregate gzip bytes, 3,260 raw / 848 gzip bytes above `0.13.1`. `/help`
1036
- remains 0 B JavaScript. The added bytes are route-specific authored state,
1037
- conditions, handlers, and effects; there is no wizard or autosave runtime.
1038
-
1039
- Navigation samples are `[10.7, 7.4, 3.7, 7.9, 6.1, 4.0, 5.4]` ms, with a 6.1
1040
- ms median and 3.7/10.7 ms minimum/maximum. This changes the destination and the
1041
- range is noisy, so no same-content runtime regression or improvement claim is
1042
- made.
1043
-
1044
- Core semantic LOC remains 5,682 with zero new semantic primitives, IR kinds,
1045
- compiler passes, production compiler/runtime lines, normalization rules,
1046
- adapters, runtime concepts, public APIs, wizard schedulers, or autosave
1047
- schedulers. One real application fixture closes the packet through existing
1048
- state, conditional ownership, dependency-effect cleanup, owned fetch, and
1049
- versioned storage semantics.
1050
-
1051
- ## 0.13.1 Nested Form Metadata
1052
-
1053
- Measured 2026-08-25 on Linux x64 with Node 24.14.0 and Chrome
1054
- 142.0.7444.175. Required Chrome proves conditional assignee fields, dynamic
1055
- checklist rows, explicit dirty/touched display, stable-key reorder, removal,
1056
- native reset, exact retained/released DOM identity, and the preserved keyboard
1057
- constraint and server retry journey.
1058
-
1059
- The application emits 44 files totaling 138,064 raw / 47,964 aggregate gzip
1060
- bytes with deploy SHA-256
1061
- `f0d96cfd5dee2cf3fa67f4ebe25d8b32cbb1bf66e72ed5ca1c29bd06fdcc0a33`.
1062
- The two-route session remains 17 JavaScript files and totals 65,404 raw / 23,899
1063
- aggregate gzip bytes, 3,286 raw / 803 gzip bytes above `0.13.0`. `/help`
1064
- remains 0 B JavaScript. The added bytes are route-specific authored handlers,
1065
- bindings, conditionals, and keyed-list descriptors; there is no shared form
1066
- runtime.
1067
-
1068
- Navigation samples are `[3.5, 3.3, 4.4, 3.3, 3.2, 4.7, 3.3]` ms, with a 3.3
1069
- ms median and 3.2/4.7 ms minimum/maximum. The range overlaps `0.13.0`, and the
1070
- destination now contains dynamic nested form behavior, so no same-content
1071
- runtime regression or improvement claim is made.
1072
-
1073
- Core semantic LOC remains 5,682 with no semantic primitive, IR kind, compiler
1074
- pass, production compiler/runtime line, normalization rule, adapter, runtime
1075
- concept, public API, registration function, proxy metadata graph, schema
1076
- adapter, or form runtime.
1077
-
1078
- ## 0.13.0 Production Form And Server Validation
1079
-
1080
- Measured 2026-08-24 on Linux x64 with Node 24.14.0 and Chrome
1081
- 142.0.7444.175. Required Chrome uses real Enter key input to prove native empty
1082
- and minimum-length constraints, then executes delayed field-error, form-error,
1083
- and successful issue-creation responses. Pending state, focused and ARIA-linked
1084
- field feedback, alert/status roles, exact requests, retry, and retained valid
1085
- input all pass.
1086
-
1087
- The application emits 44 files totaling 127,343 raw / 46,261 aggregate gzip
1088
- bytes with deploy SHA-256
1089
- `183f5a7ca081f99ae38de6974e61fdcb32ca49de699359aac053d0154ae38036`.
1090
- The two-route session uses 17 JavaScript files totaling 62,118 raw / 23,096
1091
- aggregate gzip bytes. Compared with `0.12.4`, the authored form, three primitive
1092
- states, one ref, and one route-specific handler add 992 raw / 433 aggregate gzip
1093
- session bytes and one browser file. `/help` remains 0 B JavaScript.
1094
-
1095
- Navigation samples are `[3.8, 5.6, 4.3, 2.6, 2.9, 3.6, 3.1]` ms, with a 3.6 ms
1096
- median and 2.6/5.6 ms minimum/maximum. The range does not overlap the `0.12.4`
1097
- 1.5/2.4 ms range. This is a changed-content application measurement: the
1098
- destination now parses and mounts the complete issue form and route handler.
1099
- Production compiler/runtime source is unchanged, so no same-content runtime
1100
- regression or improvement claim is made.
1101
-
1102
- Core semantic LOC remains 5,682 with no semantic primitive, IR kind, compiler
1103
- pass, production compiler/runtime line, runtime concept, public API, form
1104
- registry, metadata proxy, schema adapter, or form runtime.
1105
-
1106
- ## 0.12.4 Nested Layout Evidence Decision
1107
-
1108
- Verified 2026-08-24 on Linux x64 with Node 24.14.0 and Chrome
1109
- 142.0.7444.175. Six executable route sets fit the existing ownership model: one
1110
- retained layout owner around one replaceable route owner, followed by existing
1111
- conditional, keyed, effect, and DOM ownership. Zero routes prove an intermediate
1112
- retained layout lifetime, so the packet closes by its stop condition without an
1113
- owner chain.
1114
-
1115
- Generated output is byte-identical to `0.12.3`: 43 deploy files totaling 123,835
1116
- raw / 45,379 aggregate gzip bytes with SHA-256
1117
- `fb9d24cc01791bf80b67b659738ba62beded6ff6ce14a86a278fa4b34d088acf`.
1118
- The two-route session remains 16 JavaScript files totaling 61,126 raw / 22,663
1119
- aggregate gzip bytes, and `/help` remains 0 B JavaScript.
1120
-
1121
- Core semantic LOC remains 5,682 with zero semantic primitives, IR kinds,
1122
- compiler passes, production compiler/runtime lines, runtime concepts, layout
1123
- registries, disposal paths, public APIs, browser files, or browser bytes added.
1124
- No benchmark rerun or latency comparison applies because production and
1125
- generated code are unchanged; the published `0.12.3` 1.8 ms median and 1.5-2.4
1126
- ms range remain provenance rather than a new claim.
1127
-
1128
- ## 0.12.3 Route Failure And Restoration Policy
1129
-
1130
- Measured 2026-08-24 on Linux x64 with Node 24.14.0 and Chrome
1131
- 142.0.7444.175. Required Chrome proves current-document retention for fetch and
1132
- response-body transport failures, accessible failure status, restored link
1133
- focus, retry after a failed pending prefetch, invalid-document fallback,
1134
- capability-module fallback, stylesheet fallback, and no pre-commit route
1135
- removal. The maintained application-owned HTTP 500 alert and explicit data
1136
- retry continue to pass.
1137
-
1138
- The two-route session uses 16 JavaScript files totaling 61,126 raw / 22,663
1139
- aggregate gzip bytes, an increase of 359 raw bytes from `0.12.2` for
1140
- transport-error classification, status, and focus restoration. The 102-byte
1141
- gzip difference is unpaired and environment-sensitive, so it is not attributed
1142
- to the patch. Navigation
1143
- samples are `[1.5, 1.6, 2.0, 1.7, 1.8, 2.4, 1.8]` ms, with a 1.8 ms median and
1144
- 1.5/2.4 ms minimum/maximum. The environment differs from the macOS arm64 Chrome
1145
- 151 `0.12.2` measurement, so no latency comparison is claimed.
1146
-
1147
- The application emits 43 files totaling 123,835 raw / 45,379 aggregate gzip
1148
- bytes with deploy SHA-256
1149
- `fb9d24cc01791bf80b67b659738ba62beded6ff6ce14a86a278fa4b34d088acf`.
1150
- Core semantic LOC remains 5,682 with no semantic primitive, compiler pass, core
1151
- compiler line, runtime concept, or public API. Navigation runtime source grows
1152
- from 351 to 374 lines. `/help` remains 0 B JavaScript.
1153
-
1154
- ## 0.12.2 Authentication And Permission Boundary
1155
-
1156
- Measured 2026-08-23 on macOS arm64 with Node 25.6.1 and Chrome
1157
- 151.0.7922.172. Required Chrome proves invalid and valid login, token-backed
1158
- reload restoration, anonymous and rejected direct entry, role-aware controls,
1159
- server-enforced API and admin authorization, token clearing, and logout.
1160
-
1161
- The two-route session uses 16 JavaScript files totaling 60,767 raw / 22,561
1162
- aggregate gzip bytes, an increase of 1,793 raw / 432 gzip bytes from `0.12.1`
1163
- for authored session state, restoration, and authorization headers. Navigation
1164
- samples are `[1.3, 1.5, 1.5, 1.2, 1.3, 1.4, 1.4]` ms, with a 1.4 ms median and
1165
- 1.2/1.5 ms minimum/maximum. The range overlaps `0.12.1`, so no latency change
1166
- is claimed.
1167
-
1168
- The application emits 43 files totaling 123,476 raw / 45,305 aggregate gzip
1169
- bytes with deploy SHA-256
1170
- `81d0b3c5e0d1d1f72f29d219647601463f5317f215274e14a45fe5ba92eb033e`.
1171
- The login route uses 12,093 raw / 5,795 aggregate gzip JavaScript bytes. Core
1172
- semantic LOC remains 5,682 with no pass, primitive, production compiler/runtime
1173
- change, or runtime-concept change. `/help` remains 0 B JavaScript.
1174
-
1175
- ## 0.12.1 Shared Layout, History, Focus, And Scroll
1176
-
1177
- Measured 2026-08-23 on macOS arm64 with Node 25.6.1 and Chrome
1178
- 151.0.7922.172. `RUNS=7 npm run benchmark:project-navigation` uses fresh Chrome
1179
- profiles after the required browser journey proves hash and non-hash focus,
1180
- explicit hash/top scroll, title/live announcements, back/forward, retained
1181
- layout state, fresh route state, and native navigation outside the route group.
1182
-
1183
- The two-route session uses 16 JavaScript files totaling 58,974 raw / 22,129
1184
- aggregate gzip bytes, an increase of 4 raw / 5 gzip bytes from `0.12.0` for the
1185
- correct non-hash focus fallback. Navigation samples are
1186
- `[1.5, 1.4, 1.3, 1.3, 1.3, 1.3, 1.4]` ms, with a 1.3 ms median and 1.3/1.5 ms
1187
- minimum/maximum. The range overlaps `0.12.0`, so no latency change is claimed.
1188
-
1189
- The application emits 36 files totaling 106,096 raw / 38,201 aggregate gzip
1190
- bytes with deploy SHA-256
1191
- `4f1ce541af0794fcb17458ad37db7b32beb434f3a83cb7f949f13b3e4536fe1c`.
1192
- Core semantic LOC remains 5,682 with no pass, primitive, or runtime-concept
1193
- change. `/help` remains 0 B JavaScript. No AI-delivery cost comparison applies
1194
- to this browser correctness patch.
1195
-
1196
- ## 0.12.0 Project Route Shell And Runtime Parameters
1197
-
1198
- Measured 2026-08-23 on macOS arm64 with Node 25.6.1 and Chrome
1199
- 151.0.7922.172. `RUNS=21 npm run benchmark:project-navigation` retains the same
1200
- fetch-complete list-to-detail interval while the application also emits
1201
- standalone runtime project and issue routes.
1202
-
1203
- The maintained enhanced session is unchanged at 16 JavaScript files totaling
1204
- 58,970 raw / 22,124 aggregate gzip bytes. Navigation samples are
1205
- `[1.3, 1.4, 1.2, 1.4, 1.4, 1.4, 1.3, 1.3, 1.2, 1.4, 1.4, 1.3, 1.1, 1.2, 1.2, 1.2, 1.6, 1.3, 1.4, 1.4, 1.4]`
1206
- ms, with a 1.3 ms median and 1.1/1.6 ms minimum/maximum. The range overlaps
1207
- `0.11.4`, so no latency change is claimed.
1208
-
1209
- The runtime project route uses 17,905 raw / 8,455 aggregate gzip JavaScript
1210
- bytes; its issue route uses 18,002 raw / 8,474 aggregate gzip bytes. Complete
1211
- deploy output grows by 16 files and 28,314 raw / 11,911 aggregate gzip bytes.
1212
- These routes reuse existing pathname parameters, layout effects, bindings, and
1213
- native anchors. No compiler or browser-runtime source changed, and `/help`
1214
- remains 0 B JavaScript.
1215
-
1216
- ## 0.11.4 Project Pagination And Polling Policy
1217
-
1218
- Measured 2026-08-23 on macOS arm64 with Node 25.6.1 and Chrome
1219
- 151.0.7922.172. `RUNS=21 npm run benchmark:project-navigation` retains the same
1220
- fetch-complete list-to-detail interval. Required Chrome separately proves URL
1221
- page/filter push and back synchronization, explicit refresh, hidden-page polling
1222
- suppression, one visible refresh, exact cleanup, and results bounded to two rows.
1223
-
1224
- The two-route session uses 16 unique JavaScript files totaling 58,970 raw /
1225
- 22,124 aggregate gzip bytes. Navigation samples are
1226
- `[1.3, 1.6, 1.3, 1.3, 1.3, 1.3, 1.2, 1.2, 1.2, 1.4, 1.3, 1.3, 1.3, 1.4, 1.3, 1.3, 1.3, 1.3, 1.2, 1.5, 1.4]`
1227
- ms, with a 1.3 ms median and 1.2/1.6 ms minimum/maximum.
1228
-
1229
- Compared with `0.11.3`, the authored query controls, query-backed fetch
1230
- dependencies, polling state/effect, and native timer/listener cleanup add 2,652
1231
- raw / 913 aggregate gzip session bytes. The prior 0.8 ms median and 0.7/1.0 ms
1232
- range do not overlap, so the measured 0.5 ms median increase is disclosed. No
1233
- compiler or browser-runtime source changed, and `/help` remains 0 B JavaScript.
1234
-
1235
- ## 0.11.3 Project Optimistic Mutation
1236
-
1237
- Measured 2026-08-22 on macOS arm64 with Node 25.6.1 and Chrome
1238
- 151.0.7922.172. `RUNS=21 npm run benchmark:project-navigation` retains the same
1239
- fetch-complete list-to-detail interval; the required application journey
1240
- separately executes optimistic failure, rollback, retry, and success.
1241
-
1242
- The two-route session uses 15 unique JavaScript files totaling 56,318 raw /
1243
- 21,211 aggregate gzip bytes. Navigation samples are
1244
- `[0.7, 0.7, 0.8, 0.8, 0.9, 0.7, 0.8, 0.8, 0.8, 0.8, 0.7, 0.8, 0.9, 0.7, 0.8, 0.9, 0.8, 0.9, 1.0, 0.9, 0.7]`
1245
- ms, with a 0.8 ms median and 0.7/1.0 ms minimum/maximum.
1246
-
1247
- Compared with `0.11.2`, the authored mutation status/error state, conditional
1248
- UI, and async handler add 582 raw / 3 aggregate gzip session bytes. The prior
1249
- 0.9 ms median and 0.7/1.2 ms range overlap, so no latency change is claimed. No
1250
- compiler or browser-runtime source changed, and `/help` remains 0 B JavaScript.
1251
-
1252
- A clean homepage verification rerun on the same environment recorded
1253
- `[0.9, 0.7, 0.8, 0.9, 0.9, 0.7, 0.8, 0.9, 0.7, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9, 0.8, 0.8, 0.9, 0.8, 0.9]`
1254
- ms, with a 0.9 ms median and 0.7/0.9 ms range. It reproduces the release result's
1255
- overlapping range and does not change the no-regression conclusion.
1256
-
1257
- ## 0.11.1 Project List/Detail Consistency
1258
-
1259
- Measured 2026-08-22 on macOS arm64 with Node 25.6.1 and Chrome
1260
- 151.0.7922.172. `RUNS=21 npm run benchmark:project-navigation` waits for both
1261
- route-owned list data and the layout-owned project record before measuring
1262
- list-to-detail completion across fresh Chrome profiles.
1263
-
1264
- The two-route session uses 16 unique JavaScript files totaling 55,736 raw /
1265
- 21,208 aggregate gzip bytes. Navigation samples are
1266
- `[1.0, 0.7, 0.7, 1.0, 0.9, 0.9, 0.9, 0.9, 0.8, 0.9, 0.8, 0.9, 0.9, 1.2, 0.8, 0.9, 1.1, 1.0, 1.0, 0.8, 0.8]`
1267
- ms, with a 0.9 ms median and 0.7/1.2 ms minimum/maximum.
1268
-
1269
- Compared with `0.11.0`, the authored shared record effect, list/detail outputs,
1270
- and mutation handler add 966 raw / 445 aggregate gzip session bytes. The prior
1271
- 0.8 ms median and 0.6/1.3 ms range overlap, so no latency change is claimed.
1272
- No compiler or browser-runtime source changed, and `/help` remains 0 B
1273
- JavaScript.
1274
-
1275
- ## 0.11.0 Project Owned Fetch Lifecycle
1276
-
1277
- Measured 2026-08-22 on macOS arm64 with Node 25.6.1 and Chrome
1278
- 151.0.7922.172. `RUNS=21 npm run benchmark:project-navigation` uses fresh Chrome
1279
- profiles, waits for the initial project fetch and persisted workspace update,
1280
- then measures list-to-detail completion including route-effect cancellation.
1281
-
1282
- The two-route session uses 15 unique JavaScript files totaling 54,770 raw /
1283
- 20,763 aggregate gzip bytes. Navigation samples are
1284
- `[1.1, 0.8, 0.7, 0.8, 0.7, 0.8, 0.8, 0.7, 0.7, 0.9, 0.9, 0.9, 0.7, 0.8, 0.7, 1.3, 0.8, 0.8, 0.6, 0.9, 0.9]`
1285
- ms, with a 0.8 ms median and 0.6/1.3 ms minimum/maximum.
1286
-
1287
- Compared with the `0.10.3` release, the authored fetch effect, loading/error
1288
- conditions, and refetch state add 1,208 raw / 440 aggregate gzip session bytes.
1289
- `/help` remains 0 B JavaScript. The measured interval is unchanged, but the new
1290
- fetch-completion prerequisite makes this an acceptance-safe no-regression check,
1291
- not a latency improvement claim. No compiler or browser-runtime source changed.
1292
-
1293
- ## 0.10.3 Project Persistence Recipe
1294
-
1295
- Measured 2026-08-22 on macOS arm64 with Node 25.6.1 and Chrome
1296
- 151.0.7922.172. `RUNS=21 npm run benchmark:project-navigation` uses fresh Chrome
1297
- profiles and exact extensionless application routes. Every accepted sample
1298
- updates workspace state, verifies layout identity and persisted state, then
1299
- measures list-to-detail completion.
1300
-
1301
- The 0.10.2 release baseline and 0.10.3 candidate were measured with the same
1302
- 21-profile timing protocol and host; the candidate additionally verifies its
1303
- persistence write before timing:
1304
-
1305
- | Revision | Session JS raw/gzip | Navigation median | Min/max |
1306
- |---|---:|---:|---:|
1307
- | `0.10.2` | 46,418 / 17,045 B | 1.9 ms | 1.3 / 5.5 ms |
1308
- | `0.10.3` candidate | 53,562 / 20,323 B | 1.5 ms | 1.3 / 5.6 ms |
1309
-
1310
- Baseline samples:
1311
- `[1.3, 1.8, 1.6, 1.9, 1.3, 1.3, 1.9, 5.1, 1.7, 1.4, 1.9, 5.0, 4.7, 1.9, 1.7, 5.5, 2.2, 1.7, 1.5, 2.0, 5.2]`.
1312
-
1313
- Candidate samples:
1314
- `[2.6, 1.5, 1.8, 1.3, 1.5, 1.4, 1.7, 1.3, 1.5, 1.5, 1.9, 1.7, 1.6, 5.6, 1.5, 1.6, 1.5, 1.5, 1.5, 1.5, 1.6]`.
1315
-
1316
- The +7,144 raw / +3,278 aggregate gzip bytes are the measured cost of two
1317
- authored layout effects, their route-owned entries, and one native clear
1318
- handler. The median changes from 1.9 to 1.5 ms with overlapping ranges, so no
1319
- latency improvement or regression is claimed. No compiler or browser-runtime
1320
- source changed. `/help` remains 0 B JavaScript, so unused routes pay no
1321
- persistence cost.
1322
-
1323
- ## 0.10.2 Project Shared-Layout Navigation
1324
-
1325
- Measured 2026-08-22 on macOS arm64 with Node 25.6.1 and Chrome
1326
- 151.0.7922.172. `npm run benchmark:project-navigation` builds the tracked
1327
- project application, updates the layout-owned workspace state, and measures
1328
- list-to-detail completion across seven fresh Chrome profiles. Every accepted
1329
- sample verifies retained layout identity and the shared workspace value before
1330
- reporting timing.
1331
-
1332
- The two-route session uses 10 unique JavaScript files totaling 46,418 raw /
1333
- 17,045 aggregate gzip bytes. Navigation samples are
1334
- `[2.3, 6.5, 1.4, 1.3, 5.1, 1.3, 4.0]` ms, with a 2.3 ms median and 1.3/6.5 ms
1335
- minimum/maximum. Both routes use the existing shared runtime family;
1336
- `workspace` has layout lifetime while summary, collection, filter, conditional,
1337
- saved-filter, row, and detail-draft states retain route lifetime. No compiler or
1338
- browser runtime source changed, so no revision-to-revision performance claim is
1339
- made.
1340
-
1341
- ## 0.10.1 Project State Scale
1342
-
1343
- Measured 2026-08-22 on macOS arm64 with Node 25.6.1 and Chrome
1344
- 151.0.7922.172. `npm run benchmark:project-state` generates 1/8/32-state pages,
1345
- requires a clean `v0.10.0` checkout through `BASELINE_ROOT`, and verifies that
1346
- baseline and candidate deploy output is byte-identical before timing seven fresh
1347
- headless Chrome processes per scale. The shared deploy contains 10 files,
1348
- 18,780 bytes, and digest
1349
- `3f83712254d95f1cf59c5034f363ea906406efa1bd9539f3bb8b9a0d54a3fdc5`.
1350
-
1351
- | States / derived dependency edges | JavaScript raw / gzip | Commit runs (ms) | Median |
1352
- |---:|---:|---|---:|
1353
- | 1 / 0 | 768 / 441 B | 0.4, 0.4, 0.4, 0.5, 0.6, 0.6, 0.6 | 0.5 ms |
1354
- | 8 / 8 | 10,935 / 4,789 B | 0.6, 0.7, 0.6, 0.6, 0.7, 0.6, 0.6 | 0.6 ms |
1355
- | 32 / 32 | 11,341 / 4,841 B | 0.8, 0.8, 1.0, 0.9, 0.8, 1.0, 1.0 | 0.9 ms |
1356
-
1357
- The 1-state command-only page needs only the existing command runtime. The
1358
- larger pages reuse the existing binding, serialization, style, and command
1359
- runtime modules. No normalized-state runtime, new runtime family, or generic
1360
- rerender path is added.
1361
-
1362
- ## 0.9 Shared State And Actions
1363
-
1364
- Measured 2026-08-19 on Linux x64 with Node 24.14.0 and Chrome 142.0.7444.175. Baseline `abe87ceafbf70ed8eb2618976e2d1e18c378126f` and the candidate built identical final Context/Zustand cart source.
1365
-
1366
- | Fixture | Deploy files | Baseline and candidate JS raw / gzip | Baseline and candidate digest |
1367
- |---|---:|---:|---|
1368
- | Context cart | 18 | 29,951 / 13,065 B | `66897dce8fffd9e6bfb8b6a65ffba922a9f19d47dbb12c2a613dfb4b5685ee93` |
1369
- | Zustand cart | 18 | 30,291 / 13,193 B | `9c157adc2ff9afef1c282d50cecf77f6c0d8be2251d996298155ffb396e50211` |
1370
-
1371
- The maintained Worker/effect graph also remains byte-identical at 907 raw / 477 gzip B for the Worker and 13,786 raw / 5,931 gzip B for the window graph. One warm-up and seven clean builds measured `[651.6,643.9,596.7,631.5,613.3,634.0,555.0]` for the baseline and `[456.6,441.3,450.2,461.8,445.7,466.8,457.5]` for the final candidate, with medians 631.5 and 456.6 ms. Targets ran sequentially at different times rather than interleaved, so this is only an artifact-size and build-completion diagnostic, not a timing comparison or claim. Required Chrome proves same-turn updates, dependency cleanup, navigation persistence, and exact layout disposal for both source models; static siblings remain zero JavaScript.
1372
-
1373
- ## 0.9 Resource Lifecycle Evidence
1374
-
1375
- Measured 2026-08-19 on Linux x64 with Node 24.14.0 and Chrome 142.0.7444.175. Required-Chrome journeys execute terminal async acquisition/discard/late resolution, WebSocket dependency replacement/navigation release/stale callbacks, and package-backed effect cleanup. These are correctness journeys, not browser timing benchmarks.
1376
-
1377
- | Fixture graph | JavaScript raw / aggregate gzip | Static sibling |
1378
- |---|---:|---:|
1379
- | E2B-shaped terminal | 2,634 / 1,495 B | 0 B |
1380
- | Route WebSocket with navigation | 15,872 / 7,163 B | 0 B |
1381
- | Package-owned effect | 3,562,795 / 1,025,300 B | 0 B |
1382
-
1383
- No resource runtime, registry, or shared capability bytes were added. The package graph intentionally bundles TypeScript as isolation evidence; it is not a recommended payload and creates no package resource handle.
1384
-
1385
- The maintained Worker/effect benchmark remains 907 raw / 477 gzip B for the Worker graph and 13,786 raw / 5,931 gzip B for the window graph. One warm-up and seven final-candidate builds measured `[686.6,606.6,707.7,615.3,512.8,504.2,536.7]`, median 606.6 ms. This is a same-target completion diagnostic, not a revision comparison or timing claim.
1386
-
1387
- ## 0.9 Component Object Properties
1388
-
1389
- Measured 2026-08-19 on Linux x64 with Node 24.14.0 and Chrome 142.0.7444.175. The WorkLedger-derived route emits 11 JavaScript files totaling 37,302 raw / 14,083 aggregate gzip B; its static sibling emits zero JavaScript. The route composes existing binding, list, native-handler, and effect families. No runtime family, browser component function, field state, or shared browser bytes were added.
1390
-
1391
- Required Chrome proves three repeated/conditional owners, selected array `Object.is` effect suppression, keyed identity, exact replacement cleanup/setup, conditional release/remount, and idempotent disposal. The maintained Worker/effect graph remains 907 raw / 477 gzip B for Worker and 13,786 raw / 5,931 gzip B for window output. One warm-up and seven same-target completion builds measured `[1162.6,1505.3,1140.8,938.0,758.9,753.8,717.3]`, median 938.0 ms; no comparative timing claim is made.
1392
-
1393
- ## 0.9 Semantic Compression
1394
-
1395
- Measured 2026-08-19 on Linux x64 with Node 24.14.0 and Chrome 142.0.7444.175. The first 06B deletion replaces duplicated object-property and setter-callback compiler helper materialization with one internal function. Core semantic source falls from 5,296 to 5,271 lines. It adds no pass, IR kind, runtime concept, accepted source, or browser bytes.
1396
-
1397
- The WorkLedger deploy remains 13 files with digest `31886797161a33150afb3bcbf697545afd9d2041a4968decd33146e68d4b7595` and 37,302 raw / 14,083 aggregate gzip JavaScript bytes. The array-prop effect-sync deploy remains 10 files with digest `5e3bd8413e3d42c54e5c50d7098aa5c383e73846f7ad80201c663eae92393ec5` and 21,172 raw / 8,251 aggregate gzip JavaScript bytes.
1398
-
1399
- The maintained Worker/effect graph remains 907 raw / 477 gzip B for Worker and 13,786 raw / 5,931 gzip B for window output. One warm-up and seven same-target completion builds measured `[439.4,438.7,438.6,464.9,491.6,479.7,444.7]`, median 444.7 ms. No comparative timing claim is made.
1400
-
1401
- The second independent deletion removes primitive- and array-specific component-body scans in favor of the existing direct serializable state initializer lookup. Core semantic source falls another 7 lines to 5,264, for 32 lines removed in Session 06B. Parameterized-debounce output remains 13 files, 16,053 raw / 7,735 aggregate gzip JavaScript bytes, and deploy SHA-256 `b7106651c6a619b01a3e98101df4ac68f9262803e6729451ef03ed3971b36dc7`. Array-prop effect-sync output remains unchanged at the values above.
1402
-
1403
- The maintained Worker/effect graph again remains byte-identical. One warm-up and seven same-target completion builds measured `[584.0,521.7,552.6,496.7,481.4,507.7,494.2]`, median 507.7 ms. Host load differs from the first run, so no timing comparison is made.
1404
-
1405
- ### 0.9 Final-Proof Candidate Diagnostics
1406
-
1407
- Measured 2026-08-19 on Linux x64, Node 24.14.0, Chrome 142.0.7444.175, and an Intel Core i5-9500. Local benchmark source and raw files remain ignored; accepted medians, artifact values, environment, candidate revision, and deploy digests are recorded in the final-proof audit.
1408
-
1409
- The five-target content application first exposed an 11,348 B Kudzu state-backed disclosure versus 410 B Astro inline JavaScript. Native `<details>/<summary>` preserves accessibility, disabled-JavaScript, native-navigation, and missing-script acceptance while reducing every target's route/session JavaScript to 0 B. Kudzu emits 8,441 total bytes and no deployed JavaScript; Astro emits 8,680 total bytes and no deployed JavaScript.
1410
-
1411
- Five-target runtime and capability matrices each used one warm-up, seven rotating clean builds, and seven fresh rotating Chrome profiles. Kudzu emits 33,831 raw / 13,236 gzip B JavaScript for the stateful matrix versus 193,685 / 60,035 B React, 64,023 / 24,772 B Vue, 40,726 / 15,659 B Svelte, and 195,371 / 61,352 B Astro+React. Median Kudzu scalar, row update, append, effect, and async operations are 0.9, 2.4, 3.2, 1.2, and 0.6 ms. Worker and navigation medians plus limitations are in the final-proof audit.
1412
-
1413
- The completed frozen C2 rerun expands that stateful matrix to immutable object replacement, multi-state derived output, keyed row-local state/effect/ref ownership, filter/restore, conditional cleanup/fresh remount, accessible SVG keyboard state, a static sibling, and blocked/delayed/missing-JavaScript acceptance. Across 21 fresh rotating profiles every target passes all 19 operations and ownership checks. Kudzu emits 43,567 raw / 16,408 gzip B deploy JavaScript and transfers 45,721 B in the session versus 196,089 / 60,661 B and 196,287 B React, 66,620 / 25,624 B and 66,817 B Vue, 44,046 / 16,818 B and 44,243 B Svelte, and 197,771 / 61,994 B and 198,361 B Astro+React. Fresh-process build RSS, deterministic digests, preload graphs, script CPU, and load/journey heap are recorded. Row-local ref resolution, synchronous cleanup, per-list lifecycle gating, shared list-item and ownership-path maps, item-dependency transport gating, structural row fill/ID plans, row-state release cleanup, and boolean-toggle specialization reduce Kudzu's row filter, row restore, and search restore medians from 34.6, 208.6, and 77.5 ms to 12.0, 62.6, and 51.6 ms. Row filter is faster than Vue's 13.3 ms; row restore and search restore are within 3.5% and 1.8% of their nearest comparator medians of 60.5 and 50.7 ms. C2 passes.
1414
-
1415
- The completed C5 rerun records 32 balanced Worker starts, invalidations, listener removals, terminations, and ignored late callbacks after replacement plus 30 mount/dispose cycles for every target, with zero stale mutations and zero final active handles. Kudzu emits 17,639 raw / 8,189 gzip B and transfers 19,402 B for that Worker session versus 193,422 / 60,159 B and 193,607 B React and 195,108 / 61,493 B and 195,685 B Astro+React. Uniform build RSS, deterministic digests, preload graphs, script CPU, load/journey/disposal heap, and active balances are recorded. Chrome reports zero `V8CompileDuration` for most targets, so `ScriptDuration` is the maintained uniform execution measure unless a later trace separates parse cost.
1416
-
1417
- The public commerce fixture prepares generated source and identical assets once per size outside the timed framework interval, then compares Kudzu and Astro with acceptance before timing and rotating cold/warm samples. Its Kudzu adapter now emits only the flattened page props and bounded collection rows actually compiled instead of a 37 MiB nested catalog literal. At 1,000 products and seven rotating runs, Kudzu cold/warm medians are 2,948.9 / 2,964.3 ms and peak RSS is 264,600 KiB versus Astro 3,835.3 / 3,845.0 ms and 408,100 KiB. Kudzu is 23.1% / 22.9% faster and uses 35.2% less peak RSS; it emits 1,011 pages, 10,057,806 B, and digest `468800762dd6977644e9d3f2bf018bd951cf08487fe42f99360d3b55db567cc9`.
1418
-
1419
- At 10,000 products, both targets pass sampled-product acceptance and emit 10,011 pages. Kudzu cold/warm medians are 22,614.0 / 22,150.6 ms versus Astro 23,198.1 / 23,438.2 ms, so Kudzu is 2.5% / 5.5% faster. One-shot CLI builds intern repeated RouteIR descriptors, update validated records in place, spool rendered HTML to staging until runtime families are known, stream the unchanged pretty plan in 64-route batches, and release standalone route plans after serialization; dev, incremental, navigation, and `afterBuild` retain their plans. Peak RSS falls 71.0% from 1,870,904 to 542,484 KiB, 11.4% below Astro's 612,412 KiB, while output remains 96,379,876 B with digest `811234693329ebd61eeceb6cd05e5d52473e5c81972a820253bf1aea664a0910`. The 10,000-route build-time and RSS gates pass.
1420
-
1421
- The final 2026-08-20 completion run passes `npm run check`, all 246 required-Chrome tests, fresh-install package smoke, and the maintained Worker benchmark. The Worker graph is 907 raw / 477 gzip B and the window graph is 14,093 raw / 6,037 gzip B; seven clean builds after one warm-up have a 535.9 ms median. This is a same-target completion diagnostic, not a revision timing claim.
1422
-
1423
- The public `kudzu-based-bench` storefront then received one warm-up and seven alternating clean builds at 100, 1,000, and 10,000 generated products against the preceding `bb7fdc5` commit. Baseline and candidate output is byte-identical at every size. Timing distributions overlap and no build improvement or regression is claimed.
1424
-
1425
- | Products | Pages / files | Output bytes | Baseline median | Candidate median |
1426
- |---:|---:|---:|---:|---:|
1427
- | 100 | 111 / 148 | 1,368,823 | 2,767.3 ms | 2,755.4 ms |
1428
- | 1,000 | 1,011 / 1,048 | 10,164,835 | 8,407.7 ms | 8,190.3 ms |
1429
- | 10,000 | 10,011 / 10,048 | 97,521,905 | 63,966.5 ms | 64,217.4 ms |
1430
-
1431
- ```text
1432
- 100 baseline: [2671.0,2768.9,2881.5,2845.5,2767.3,2561.2,2705.8]
1433
- 100 candidate: [2746.4,2796.4,2755.4,2812.7,2590.6,2494.1,2767.2]
1434
- 1000 baseline: [8733.3,8059.4,8444.8,7923.9,7947.1,8407.7,8666.0]
1435
- 1000 candidate: [8048.9,7927.7,8711.0,8640.6,8190.3,8171.3,8746.9]
1436
- 10000 baseline: [65514.0,62738.0,64195.7,63610.6,63966.5,66885.2,63434.2]
1437
- 10000 candidate: [62222.9,63710.3,64217.4,64236.1,63288.2,65652.3,64977.8]
1438
- ```
1439
-
1440
- ## Historical 0.8.59 Release Snapshot
1441
-
1442
- Kudzu 0.8.59 broadens existing compile-time setter-child specialization to one direct parent array-state prop and one direct `set*` setter prop in that prop-derived state shape. It adds no browser runtime code and makes no timing claim.
1443
-
1444
- ## Maintained 0.8.58 Release Snapshot
1445
-
1446
- Kudzu 0.8.58 adds one narrow keyed-item initializer descriptor to the existing complex row-state path. Routes without that descriptor, including static siblings, retain their existing capability output. This release makes no timing claim.
1447
-
1448
- ## Maintained 0.8.57 Release Snapshot
1449
-
1450
- Kudzu 0.8.57 broadens an existing compiler proof from direct primitive parent state to direct JSON-safe plain-object parent state for specialized child draft initialization. It adds no browser runtime code and makes no timing claim.
1451
-
1452
- ## Maintained 0.8.56 Release Snapshot
1453
-
1454
- Kudzu 0.8.56 avoids unaffected source compilation and build-time JSX execution during development. The focused two-route correctness fixture recompiles two of four modules and rerenders one of two pages after a route-owned helper edit; this is a work-reduction assertion, not a timing claim.
1455
-
1456
- ## Maintained 0.8.55 Release Snapshot
1457
-
1458
- Kudzu 0.8.55 replaces site-wide runtime specialization with deterministic route or navigation-group capability families. Unrelated standalone capabilities no longer change another route's loaded runtime bytes or cache URL; no new timing claim is made.
1459
-
1460
- ## Maintained 0.8.54 Release Snapshot
1461
-
1462
- Kudzu 0.8.54 retains esbuild output metadata and writes one compiler-scratch artifact report after bundling. Deploy runtime behavior and output selection are unchanged, and no new performance claim is made.
1463
-
1464
- ## Maintained 0.8.53 Release Snapshot
1465
-
1466
- Kudzu 0.8.53 removes unrelated source stylesheet links from route HTML and reuses shared layout links during enhanced navigation. Static routes add no JavaScript, and no new performance claim is made.
1467
-
1468
- ## Maintained 0.8.52 Release Snapshot
1469
-
1470
- Kudzu 0.8.52 moves proven effect-private mutable refs from component scope into existing setup-invocation closures. The refs add no serialized route scope, shared runtime, or static-sibling JavaScript; no new performance claim is made.
1471
-
1472
- ## Maintained 0.8.51 Release Snapshot
1473
-
1474
- Kudzu 0.8.51 broadens compiler-only package-reference routing into existing owned effect ESM and bundling. Static siblings and routes without the effect retain zero package bytes; no new performance claim is made.
1475
-
1476
- ## Maintained 0.8.50 Release Snapshot
1477
-
1478
- Kudzu 0.8.50 changes compiler and build-time shared-state metadata while retaining existing RouteIR state ownership, action handler output, and browser runtimes. No new performance claim is made.
1479
-
1480
- ## Maintained 0.8.49 Release Snapshot
1481
-
1482
- Kudzu 0.8.49 broadens compiler-only setter-callback validation to direct child fan-out while retaining the existing command descriptors and browser runtimes. No new performance claim is made.
1483
-
1484
- ## Maintained 0.8.48 Release Snapshot
1485
-
1486
- Kudzu 0.8.48 broadens compiler-only setter-callback validation to multiple direct intrinsic handlers while retaining the existing command descriptors and browser runtimes. No new performance claim is made.
1487
-
1488
- ## Maintained 0.8.47 Release Snapshot
1489
-
1490
- Kudzu 0.8.47 changes compiler-only specialized child initialization and retains existing parent/child state ownership, handler capabilities, and browser runtimes. No new performance claim is made.
1491
-
1492
- ## Maintained 0.8.46 Release Snapshot
1493
-
1494
- Kudzu 0.8.46 changes compiler-only Context Provider scratch and retains the same concrete Notes state operations, RouteIR signals, runtime modules, and static sibling output. No new performance claim is made.
1495
-
1496
- ## Maintained 0.8.45 Optimization Snapshot
1497
-
1498
- Kudzu 0.8.45 adds the plain TypeScript fast path and maintained paired source-scale runner described above. It changes compiler scratch only: the measured deploy graph is byte-identical to `v0.8.44`, and no browser runtime or public API changed.
1499
-
1500
- ## Maintained 0.8.44 Release Snapshot
1501
-
1502
- Kudzu 0.8.44 changes compiler-only naming for action-private Context state and setters. The maintained Context browser fixture retains the same emitted concrete state operations and CRUD behavior while a same-named consumer local remains ordinary static content. No browser runtime module or public API changed, and no new performance claim is made.
1503
-
1504
- ## Maintained 0.8.43 Release Snapshot
1505
-
1506
- Kudzu 0.8.43 extends compiler-only callback/ref specialization from two to three direct component boundaries. The maintained browser fixture retains the same parent state operations, child state/effect/ref ownership, conditional cleanup, and static zero-JavaScript sibling while the added forwarding component is absent from emitted JavaScript. No browser runtime module or public API changed, and no new performance ranking is claimed.
1507
-
1508
- ## Maintained 0.8.42 Optimization Snapshot
1509
-
1510
- Kudzu 0.8.42 retains the tracked 0.8.41 runtime and six-route commerce matrices below and adds two focused external-fixture optimizations. Those focused samples compare Kudzu before and after the patch; they do not establish a current cross-framework ranking.
1511
-
1512
- The maintained external 1,000-product fixture exposed 1,011 byte-identical native route entries and 1,011 byte-identical effect route entries. A three-run check against clean `v0.8.41` produced:
1513
-
1514
- | Target | Cold build | Warm build | Output |
1515
- |---|---:|---:|---:|
1516
- | `v0.8.41` | 13,866 ms | 13,560 ms | 10.48 MB |
1517
- | Route-entry sharing candidate | 13,203 ms | 13,087 ms | 9.53 MB |
1518
-
1519
- Cold build is 4.8% lower, warm build is 3.5% lower, and output is 9.1% smaller in this sample. A 100-product artifact inspection reduced 101 native and 101 effect route files to three native and five effect files because only byte-identical generated sources share paths. Single-route URLs and nonidentical entries retain their existing route paths. A seven-run alternating measurement is still required before making a stronger build-time attribution claim.
1520
-
1521
- The external form fixture then replaced effect-delayed query carry with direct read-only query bindings on hidden `value` and `disabled` properties. Five Slow 4G sessions measured readiness at 348 ms versus the prior 783 ms, a 55.6% reduction. This is a narrow critical form path, not a general inline-capability policy; writable search state, handlers, effects, conditions, lists, unrelated bindings, and nonmatching markup retain the existing parameter capability path.
1522
-
1523
- A static-catalog same-document navigation experiment was rejected. After compressing concrete route records to remove the first implementation's payload blowup, three Slow 4G sessions still favored native document navigation:
1524
-
1525
- | Navigation | Detail | Back | Session transfer | Degraded capabilities |
1526
- |---|---:|---:|---:|---:|
1527
- | Native document | 314 ms | 107 ms | 322.2 KB | 15/18 |
1528
- | Enhanced candidate | 575 ms | 297 ms | 511 KB | 12/18 |
1529
-
1530
- The static `getStaticPaths()` pattern expansion was removed. Existing exact and `runtimeParams` enhanced-navigation groups are unchanged, and native document navigation remains the default.
1531
-
1532
- ## Maintained 0.8.41 Cross-Framework Snapshot
1533
-
1534
- Measured UTC 2026-08-12 on the Intel Core i5-9500 Linux x64 host, Node 24.14.0, and Chrome 142.0.7444.175. The tracked runtime matrix used one warm-up, seven interleaved clean builds, and seven rotating fresh Chrome profiles. Every correctness, accessibility, identity, effect-cleanup, and browser-error gate passed. Kudzu emits complete initial HTML while React, Vue, and Svelte start from client-rendered shells, so initial delivery and artifact totals are not architecture-equivalent.
1535
-
1536
- | Runtime matrix target | Build median | HTML raw / gzip B | JS raw / gzip B | Total raw / gzip B | Complete initial DOM |
1537
- |---|---:|---:|---:|---:|---:|
1538
- | Kudzu `0.8.41` release tree | 1,475.480 ms | 179,388 / 37,008 | 33,575 / 12,928 | 212,963 / 49,936 | 532.9 ms |
1539
- | React 19.2.8 + Vite 8.1.5 | 856.231 ms | 282 / 219 | 193,685 / 60,043 | 193,967 / 60,262 | 510.6 ms |
1540
- | Vue 3.5.40 + Vite 8.1.5 | 1,053.062 ms | 281 / 221 | 64,023 / 24,772 | 64,304 / 24,993 | 357.6 ms |
1541
- | Svelte 5.56.7 + Vite 8.1.5 | 1,733.637 ms | 281 / 219 | 40,726 / 15,659 | 41,007 / 15,878 | 401.1 ms |
1542
-
1543
- Raw runtime arrays, quartiles, checkout metadata, source hash, and validation results are checked in at `benchmarks/runtime-matrix/results/raw.json`. The maintained 2,000-row keyed run used one warm-up, seven clean builds, and seven fresh Chrome profiles: build 901.4 ms, append 14.7 ms, filter 25.4 ms, restore 126.2 ms, reverse 25.1 ms, and JavaScript 28,450 B raw / 11,036 B gzip. A requested 21-profile keyed run exceeded the 600-second limit and produced no result.
1544
-
1545
- The maintained Worker benchmark recorded a 1,823.2 ms build median, 907 B raw / 477 B gzip Worker graph, and 12,148 B raw / 5,411 B gzip aggregate window graph. The tracked six-route commerce sources used one warm-up and seven rotating clean builds:
1546
-
1547
- | Commerce target | Build median | Files | HTML raw / gzip B | JS raw / gzip B | Total raw / gzip B |
1548
- |---|---:|---:|---:|---:|---:|
1549
- | Kudzu | 867.188 ms | 17 | 17,123 / 5,376 | 18,428 / 8,261 | 37,434 / 14,689 |
1550
- | React 19.2.8 SSR + Vite hydration | 859.125 ms | 10 | 9,304 / 4,265 | 198,261 / 61,464 | 209,270 / 66,741 |
1551
- | Next.js 16.2.11 static export | 7,290.533 ms | 74 | 72,890 / 19,857 | 643,484 / 191,844 | 814,186 / 247,596 |
1552
- | Nuxt 4.5.0 generation | 7,334.287 ms | 26 | 17,557 / 7,850 | 191,758 / 70,925 | 215,851 / 82,067 |
1553
- | SvelteKit 2.70.1 static export | 4,725.279 ms | 19 | 15,832 / 6,511 | 85,095 / 33,477 | 102,659 / 41,047 |
1554
-
1555
- The commerce targets share initial content and behavior contracts but use materially different architectures. The browser suite timed out in Kudzu's existing in-flight rejection-navigation wait before cross-target sampling, so no commerce browser timing is claimed.
1556
-
1557
- ## P1 Direct Two-Boundary Callback And Ref Dataflow
1558
-
1559
- Measured UTC 2026-08-12 on the Intel Core i5-9500 Linux x64 host with 6 physical cores, Node 24.14.0, and npm 11.9.0. The baseline was clean tag `v0.8.40` at `c88b94f91b40d76fad58a208f3261de399c6d2b4`. The compiler and migration checks had SHA-256 `f80ec9c532376a90805c6d99b8cbfa162578592c71c5e62f1cb92e16a64a5ba3`.
1560
-
1561
- One warm-up and seven alternating clean fresh-process builds produced byte-identical 176-file deploy graphs, 3,850,245 raw bytes, 1,984,991 aggregate gzip bytes, deploy SHA-256 `d24f9d4608b9ae096fa5e334cf8c6556e51d8588bff02d15e3eacf0c6711db81`, and `kudzu-plan.json` SHA-256 `302d75dac6f58306c139b398a436480cf60cdd5743e6100ab1c728bd255e16be`.
1562
-
1563
- | Target | Clean build median | Range | Peak RSS median |
1564
- |---|---:|---:|---:|
1565
- | `v0.8.40` | 3,565.236 ms | 2,960.844-3,995.094 ms | 364.6 MiB |
1566
- | Two-boundary candidate | 3,470.277 ms | 3,099.259-3,842.591 ms | 362.0 MiB |
1567
-
1568
- The candidate unpaired median is 2.66% lower; round-paired candidate-minus-baseline differences have a +59.834 ms median. Peak RSS is 0.74% lower. Ranges overlap and no material performance change is claimed.
1569
-
1570
- ```text
1571
- v0.8.40: [3671.298,3995.094,3776.594,3295.688,2960.844,3565.236,3563.737]
1572
- candidate: [3099.259,3674.641,3842.591,3400.780,3418.781,3470.277,3623.571]
1573
- paired candidate-baseline: [-572.039,-320.453,65.997,105.092,457.937,-94.959,59.834]
1574
- ```
1575
-
1576
- The FIRE-derived callback/ref fixture now forwards both a direct setter adapter and a simple state callback through one imported presentation component. Browser checks preserve parent state updates, child-local state/effects/IDs, parent ref resolution, conditional cleanup, fresh remount, and a zero-JavaScript static sibling. ComponentAnalysis retains the same parent SignalIR on each nested specialization. A third callback-carrying boundary remains rejected. No browser runtime, callback registry, component function, route artifact, or deploy byte was added.
1577
-
1578
- ## P1 Property-Level Object-State Effect Dependencies
1579
-
1580
- Measured UTC 2026-08-12 on the Intel Core i5-9500 Linux x64 host with 6 physical cores, Node 24.14.0, npm 11.9.0, and Chrome 142.0.7444.175. The baseline was clean tag `v0.8.39` at `090b42124d596260bdd6a0814c014e5b906dc0eb`. The focused implementation and migration checks had SHA-256 `c097c10e786ff5d09537b52384c1bf3d32cb46998ef62125c23dda3355b62277`, produced by:
1581
-
1582
- ```bash
1583
- sha256sum framework/compiler/effect-analysis.mjs framework/core.mjs test/compiler-passes.test.mjs test/fixtures/zustand-migration/src/Shell.tsx test/framework.test.mjs | sha256sum
1584
- ```
1585
-
1586
- The complete 154-page repository build used one warm-up and 21 alternating clean fresh-process samples. Both targets emit 175 files and byte-identical `kudzu-plan.json` (`be842101f08aab2d8b3af5daa3ed0539a6a08ea8c3cba15cd25f3a36d53ef61f`). The only deploy difference is the updated public explanation in `docs/index.html`: candidate output adds 98 raw bytes and 31 aggregate gzip bytes. Compiler, effect runtime, route JavaScript, and all other artifacts are byte-identical.
1587
-
1588
- | Target | Clean build median | Range | Peak RSS median | Deploy raw / gzip bytes |
1589
- |---|---:|---:|---:|---:|
1590
- | `v0.8.39` | 3,753.276 ms | 3,097.211-5,294.316 ms | 356.9 MiB | 3,845,393 / 1,983,262 B |
1591
- | Property dependency candidate | 3,883.841 ms | 3,533.936-4,919.378 ms | 363.7 MiB | 3,845,491 / 1,983,293 B |
1592
-
1593
- The candidate unpaired median is 3.48% higher and the round-paired candidate-minus-baseline median is +103.031 ms. Peak RSS is 1.92% higher. Timing ranges overlap substantially and both changes remain below the 5% material-regression threshold, so no material build or memory regression is established.
1594
-
1595
- ```text
1596
- v0.8.39: [5294.316,4885.317,4462.086,3696.012,3105.264,3491.623,3852.100,3414.218,3753.276,3854.507,4311.174,3833.095,3097.211,3669.963,3567.084,3399.614,3626.351,3687.408,3883.556,4104.665,3880.847]
1597
- candidate: [4919.378,4548.065,4236.325,3752.842,3788.156,3738.609,3883.841,4110.706,4055.150,4116.317,3710.973,4016.578,3533.936,3625.603,3670.115,3840.795,4045.689,3988.434,3619.226,3944.068,3760.976]
1598
- paired candidate-baseline: [-374.938,-337.252,-225.761,56.830,682.892,246.986,31.741,696.488,301.874,261.810,-600.201,183.483,436.725,-44.360,103.031,441.181,419.338,301.026,-264.330,-160.597,-119.871]
1599
- ```
1600
-
1601
- The tracked runtime matrix then ran one warm-up, seven interleaved clean builds, and seven rotating fresh Chrome profiles for matched Kudzu, React/Vite, Vue/Vite, and Svelte/Vite workloads. Every correctness, accessibility, identity, effect-cleanup, and browser-error gate passed. This matrix uses a primitive effect dependency, so it is broad regression evidence rather than a property-dependency-specific framework claim.
1602
-
1603
- | Runtime matrix target | Build median | JS raw / gzip B | Total raw / gzip B | Initial DOM | Effect update + cleanup |
1604
- |---|---:|---:|---:|---:|---:|
1605
- | Kudzu `0.8.39` candidate | 862.432 ms | 33,575 / 12,928 | 212,963 / 49,936 | 363.4 ms | 1.9 ms |
1606
- | React 19.2.8 + Vite 8.1.5 | 498.572 ms | 193,685 / 60,043 | 193,967 / 60,262 | 355.7 ms | 4.4 ms |
1607
- | Vue 3.5.40 + Vite 8.1.5 | 655.787 ms | 64,023 / 24,772 | 64,304 / 24,993 | 283.0 ms | 1.9 ms |
1608
- | Svelte 5.56.7 + Vite 8.1.5 | 907.584 ms | 40,726 / 15,659 | 41,007 / 15,878 | 307.9 ms | 2.5 ms |
1609
-
1610
- The tracked six-route commerce sources also completed seven rotating clean builds for Kudzu, React SSR + Vite hydration, Next.js static export, Nuxt generation, and SvelteKit adapter-static. These targets have matched initial content and behavior contracts but materially different architectures.
1611
-
1612
- | Commerce target | Build median | Files | HTML raw / gzip B | JS raw / gzip B | Total raw / gzip B |
1613
- |---|---:|---:|---:|---:|---:|
1614
- | Kudzu | 1,062.059 ms | 17 | 17,123 / 5,376 | 18,428 / 8,261 | 37,434 / 14,689 |
1615
- | React 19.2.8 SSR + Vite hydration | 1,020.288 ms | 10 | 9,304 / 4,265 | 198,261 / 61,464 | 209,270 / 66,741 |
1616
- | Next.js 16.2.11 static export | 7,939.352 ms | 74 | 72,890 / 19,860 | 643,484 / 191,844 | 814,186 / 247,612 |
1617
- | Nuxt 4.5.0 generation | 8,566.437 ms | 26 | 17,557 / 7,857 | 191,758 / 70,925 | 215,851 / 82,075 |
1618
- | SvelteKit 2.70.1 static export | 5,778.467 ms | 19 | 15,832 / 6,520 | 85,095 / 33,482 | 102,659 / 41,061 |
1619
-
1620
- Kudzu commerce output is 4.54x-16.86x smaller in aggregate gzip than the compared hydrated/client-navigation outputs. React's clean build median is 3.9% lower than Kudzu's on this small fixture; Kudzu builds 5.4x-8.1x faster than the three full static-export frameworks. The full commerce browser command was attempted twice, but both runs timed out in Kudzu's existing in-flight rejection-navigation wait before cross-target browser sampling; no commerce browser timing result is claimed. The complete runtime matrix browser run above passed. Property-path effects reuse existing DerivedIR, source subscriptions, expression evaluation, and `Object.is`; no runtime module or field-signal mechanism was added.
1621
-
1622
- ## P0.12 Deep RouteIR And CapabilityIR Validation
1623
-
1624
- Measured UTC 2026-08-12 on the Intel Core i5-9500 Linux x64 host with 6 physical cores, Node 24.14.0, and npm 11.9.0. The baseline was clean tag `v0.8.38` at `918f721d369fed486c5ff04a7423f79563e1c42e`. The focused implementation files had SHA-256 `f8f58432f264d5df12cadfba07986712cecf148be300b6071c03adaf42fd6594`, produced by:
1625
-
1626
- ```bash
1627
- sha256sum framework/compiler/route-ir.mjs framework/compiler/route-build-record.mjs framework/compiler/route-capability-planner.mjs framework/core.mjs test/compiler-passes.test.mjs | sha256sum
1628
- ```
1629
-
1630
- The repository's 153-page build used one warm-up and seven alternating clean fresh-process samples. Every sample produced the same 174-file deploy graph, 3,840,694 raw bytes, 1,981,560 aggregate gzip bytes, and SHA-256 `6c37ee550a217f4cf78494662e1e1ab4533582f031a2422b07eec74ed50eae74`. Baseline and candidate `kudzu-plan.json` files are byte-identical.
1631
-
1632
- | Target | Clean build median | Range | Peak RSS median | Deploy bytes |
1633
- |---|---:|---:|---:|---:|
1634
- | `v0.8.38` | 2,356.477 ms | 2,159.934-2,389.644 ms | 352.7 MiB | 3,840,694 B |
1635
- | P0.12 candidate | 2,352.382 ms | 2,193.576-2,527.911 ms | 356.8 MiB | 3,840,694 B |
1636
-
1637
- The candidate's unpaired median is 0.17% lower. Round-paired candidate-minus-baseline differences had a +14.255 ms median, with the candidate faster in one of seven pairs and the baseline faster in six. Timing ranges overlap and remain below the 5% material-regression threshold; candidate peak-RSS median is 4.1 MiB higher.
1638
-
1639
- ```text
1640
- v0.8.38: [2159.934,2223.405,2313.086,2378.192,2356.477,2380.726,2389.644]
1641
- candidate: [2193.576,2223.644,2317.685,2410.142,2352.382,2394.981,2527.911]
1642
- paired candidate-baseline: [33.642,0.239,4.599,31.950,-4.095,14.255,138.267]
1643
- ```
1644
-
1645
- RouteIR v1 now validates concrete state and parameter IDs, commands, native/effect captures, dependencies, reactive descriptors, conditions, keyed-list identity and ownership, marker fields, and strict JSON safety. RouteBuildRecord validates those references before artifact selection, while CapabilityIR validates standalone implications and exact projection from its route records before codegen. Repeated checks of the same immutable in-memory contracts are cached by identity. No runtime source, accepted TSX, deploy artifact, or browser behavior changes.
1646
-
1647
- ## P0.11 Structural Route Artifact Graph
1648
-
1649
- Measured UTC 2026-08-11 on the Intel Core i5-9500 Linux x64 host with 6 physical cores, Node 24.14.0, and npm 11.9.0. The baseline was clean tag `v0.8.37` at `8b4e8850c40f2856216e43f23ad02ada8434eb37`. The focused implementation files had SHA-256 `1a93b7fff5d80f271c588f89486a47dc262427195a6a768fe392be949eb99b5e`, produced by:
1650
-
1651
- ```bash
1652
- sha256sum framework/build.mjs framework/compiler/route-build-record.mjs framework/compiler/route-capability-planner.mjs framework/core.mjs framework/core.d.ts test/compiler-passes.test.mjs | sha256sum
1653
- ```
1654
-
1655
- The repository's 152-page build used one warm-up and seven alternating clean fresh-process samples. Every sample produced the same 173-file deploy graph, 3,835,970 raw bytes, 1,979,875 aggregate gzip bytes, and SHA-256 `c1f95f25d43589b61d1abe7ecf256e5b5e9dddd5647fbcf6368c08cc5ae3ee20`. Baseline and candidate `kudzu-plan.json` files are byte-identical.
1656
-
1657
- | Target | Clean build median | Range | Peak RSS median | Deploy bytes |
1658
- |---|---:|---:|---:|---:|
1659
- | `v0.8.37` | 1,820.186 ms | 1,769.592-1,910.670 ms | 351.6 MiB | 3,835,970 B |
1660
- | P0.11 candidate | 1,804.568 ms | 1,756.849-1,843.941 ms | 351.4 MiB | 3,835,970 B |
1661
-
1662
- The candidate's unpaired median is 0.86% lower. Round-paired candidate-minus-baseline differences had a -20.933 ms median, with the candidate faster in five of seven pairs and the baseline faster in two. Timing ranges overlap, so no material improvement is claimed; peak-RSS medians differ by 0.3 MiB.
1663
-
1664
- ```text
1665
- v0.8.37: [1786.548,1834.792,1910.670,1853.493,1820.186,1769.592,1778.201]
1666
- candidate: [1756.849,1804.568,1843.941,1832.560,1811.390,1798.756,1782.132]
1667
- paired candidate-baseline: [-29.698,-30.225,-66.729,-20.933,-8.796,29.164,3.930]
1668
- ```
1669
-
1670
- RouteBuildRecord now owns each rendered route's RouteIR, capabilities, entry paths, styles, and exact handler/effect edges. Handler, Worker, package-client, and chunk closure starts from those structural edges instead of serialized HTML/plan searches or formatted effect keys. This changes build-scratch orchestration only; browser runtime source, RouteIR v1, CapabilityIR v1, emitted files, and deploy bytes remain unchanged.
1671
-
1672
- ## P0.10 Structural ModuleIR References
1673
-
1674
- Measured UTC 2026-08-11 on an Apple M4 macOS arm64 host with 10 logical CPUs, 16 GiB RAM, Node 24.14.0, and npm 11.9.0. The baseline was clean tag `v0.8.36` at `268cd9023c9f47a912601f298963a9ffe9c00da2`. The compiler and focused-check patch had SHA-256 `f684c79027b290bc8c7d549667ef0d7f21a9d0057b5d6291fcce18b91947eff2`, produced by:
1675
-
1676
- ```bash
1677
- git diff --binary v0.8.36 -- framework/compiler/analysis/binding-index.mjs framework/compiler/analysis/component-analysis.mjs framework/compiler/descriptor-session.mjs framework/compiler/ir/module-ir.mjs framework/compiler/source-compiler.mjs test/compiler-passes.test.mjs test/framework.test.mjs | shasum -a 256
1678
- ```
1679
-
1680
- The maintained 100-importer fixture used one warm-up and seven alternating fresh-process samples. Both targets retain 103 parse misses, 103 export-summary misses, and 100 importer-local clones. ModuleIR and ComponentAnalysis v2 intentionally change the serialized compiler graph, so the previous equal-digest gate correctly rejects direct v1/v2 comparison: normalized result size changes from 382,603 B to 447,977 B and source-result size changes from 395,346 B to 460,720 B. The additional 65,374 B is deterministic structural slot, signal, symbol, and ownership metadata in compiler scratch; it is not deployed browser JavaScript.
1681
-
1682
- | Target | Compiler median | Range | Peak RSS median | Source-result bytes |
1683
- |---|---:|---:|---:|---:|
1684
- | `v0.8.36` | 224.506 ms | 220.888-313.782 ms | 281.6 MiB | 395,346 B |
1685
- | `0.8.37` | 227.158 ms | 224.744-272.594 ms | 282.9 MiB | 460,720 B |
1686
-
1687
- The candidate's unpaired median is 1.18% higher. Round-paired candidate-minus-baseline differences had a +6.270 ms median, with the candidate faster in two of seven pairs and the baseline faster in five. Timing ranges overlap, peak RSS differs by 1.3 MiB, and neither result crosses the 5% material-regression threshold.
1688
-
1689
- ```text
1690
- v0.8.36: [220.888,222.461,313.782,224.506,249.086,222.746,242.721]
1691
- candidate: [227.158,224.744,225.098,236.027,225.158,239.672,272.594]
1692
- paired candidate-baseline: [6.270,2.283,-88.684,11.521,-23.928,16.926,29.873]
1693
- ```
1694
-
1695
- ModuleIR and ComponentAnalysis are build-scratch contracts. Runtime-facing state names and export spellings remain only where generated module and browser ABIs require them. The standard suite verifies static zero-JavaScript output, capability exclusion, keyed identity, effect cleanup, Workers, navigation, and migration behavior; no browser runtime source was added for P0.10.
1696
-
1697
- ## P0.9 Semantic State Operations
1698
-
1699
- Measured UTC 2026-08-11 on the Intel Core i5-9500 Linux x64 host with Node 24.14.0. The baseline was clean tag `v0.8.35` at `f25700d9d2b247c01db19f0e8c95f16cb1fa81a5`. The compiler and focused-check patch had SHA-256 `4c3c8a3de18b1e792ea84cf7608a89971850195036a58f37dd76e359bfc8a58d`, produced by:
1700
-
1701
- ```bash
1702
- git diff --binary v0.8.35 -- framework/compiler/optimize/command-specialization.mjs framework/compiler/descriptor-session.mjs test/compiler-passes.test.mjs test/fixtures/effect-isolation/src/pages/command.tsx test/framework.test.mjs | sha256sum
1703
- ```
1704
-
1705
- The maintained 100-importer fixture used three warm-ups and 21 alternating fresh-process samples. P0.9 keeps the existing direct command fast path first and invokes whole-handler semantic analysis only after direct specialization fails. Baseline and candidate produced the same normalized 382,603-byte graph, SHA-256 `8c35b3f6d2c571306bd97c4d51d4af76ca244badd36c57363bf579ef961f41aa`, 395,346-byte source result, and 103 / 103 / 100 parse, summary, and clone counts.
1706
-
1707
- | Target | Compiler median | Range | Peak RSS median | Source-result bytes |
1708
- |---|---:|---:|---:|---:|
1709
- | `v0.8.35` | 947.100 ms | 839.270-1,064.444 ms | 258.0 MiB | 395,346 B |
1710
- | P0.9 candidate | 942.596 ms | 849.656-1,215.997 ms | 258.1 MiB | 395,346 B |
1711
-
1712
- The candidate's unpaired median is 0.48% lower. Round-paired candidate-minus-baseline differences had a +1.754 ms median with the candidate faster in 10/21 pairs and the baseline faster in 11/21. Timing and peak-RSS ranges overlap, so no material improvement or regression is claimed. An initial implementation that routed every direct handler through whole-handler analysis measured a +12.584 ms paired median and 10.6 MiB higher RSS median; restoring the direct fast path and narrowing the analyzer removed that regression before this final record.
1713
-
1714
- ```text
1715
- v0.8.35: [955.382,927.389,935.312,852.622,839.270,918.424,943.013,1026.033,936.514,1019.725,921.591,1064.444,949.671,975.729,933.380,896.773,949.751,951.418,947.100,998.950,1041.266]
1716
- candidate: [942.596,1215.997,965.312,849.656,877.468,928.334,971.812,966.482,938.268,1016.268,932.327,939.217,928.284,1082.782,1086.319,976.534,881.665,915.266,962.642,905.596,1000.939]
1717
- paired candidate-baseline: [-12.786,288.608,30.000,-2.966,38.198,9.910,28.799,-59.551,1.754,-3.457,10.736,-125.227,-21.387,107.053,152.939,79.761,-68.086,-36.152,15.542,-93.354,-40.327]
1718
- ```
1719
-
1720
- The four required source forms lower to the same existing command HandlerIR and command-only browser path. Alias/helper forms therefore avoid the native handler module and native runtime they previously required; no command ABI, state batching, ownership, runtime source, or unaffected route artifact changes.
1721
-
1722
- ## P0.8 Stable ModuleSymbol And SiteId
1723
-
1724
- Measured UTC 2026-08-11 on the same Intel Core i5-9500 Linux x64 host with Node 24.14.0. The baseline was clean tag `v0.8.34` at `007fcb6e23c7d5bc742fa37c28388d070da9f598`. The compiler and maintained-check patch had SHA-256 `10ed6beb448b9e86961afab0b798f010932b8a29f98475d41f7bd8cfad04a872`, produced by:
1725
-
1726
- ```bash
1727
- git diff --binary v0.8.34 -- framework/compiler/project-session.mjs framework/compiler/source-compiler.mjs framework/compiler/analysis/component-analysis.mjs test/compiler-passes.test.mjs test/module-cache-performance.mjs | sha256sum
1728
- ```
1729
-
1730
- The maintained 100-importer fixture used three warm-ups and 21 alternating fresh-process samples. Because P0.8 intentionally adds source-local `site` metadata, the runner removes only `site` keys for output-equivalence hashing and reports the unmodified source-result size separately. The normalized 382,603-byte graph retained SHA-256 `8c35b3f6d2c571306bd97c4d51d4af76ca244badd36c57363bf579ef961f41aa`; parse and summary misses remained 103 each. Stable symbol traversal removed unnecessary normalization of intermediate barrel modules, reducing importer-local clones from 200 to 100.
1731
-
1732
- | Target | Compiler median | Range | Peak RSS median | Source-result bytes | Parse / summary / clone misses |
1733
- |---|---:|---:|---:|---:|---:|
1734
- | `v0.8.34` | 760.967 ms | 696.626-796.908 ms | 256.9 MiB | 382,603 B | not instrumented |
1735
- | `0.8.35` | 755.595 ms | 692.365-804.376 ms | 257.8 MiB | 395,346 B | 103 / 103 / 100 |
1736
-
1737
- The candidate's unpaired median is 0.71% lower. Round-paired candidate-minus-baseline differences had a -2.971 ms median with the candidate faster in 13/21 pairs and the baseline faster in 8/21. This is a small directional improvement, not a material speedup claim. Peak RSS differs by 0.9 MiB and ranges overlap. The 12,743-byte source-result increase is deterministic SiteId metadata in build scratch, not deployed browser JavaScript.
1738
-
1739
- Two measurements before removing intermediate barrel clones showed paired medians of +12.142 ms and +21.954 ms and RSS medians 11.7-12.3 MiB above baseline. Removing those clones reduced the paired median to +4.951 ms; caching repeated ModuleSymbol resolutions produced the final -2.971 ms result. The earlier measurements are not the final candidate record.
1740
-
1741
- ```text
1742
- v0.8.34: [791.247,780.543,796.908,783.896,786.968,790.739,784.589,753.377,697.477,696.626,701.336,718.764,709.913,743.865,749.294,791.943,743.784,758.566,783.665,763.691,760.967]
1743
- candidate: [783.482,799.855,760.681,768.299,804.376,802.390,783.124,799.484,692.365,720.229,708.652,707.073,712.554,708.853,750.750,756.400,742.668,755.595,776.556,747.370,751.392]
1744
- paired candidate-baseline: [-7.765,19.312,-36.227,-15.597,17.408,11.651,-1.465,46.107,-5.112,23.603,7.316,-11.691,2.641,-35.012,1.456,-35.543,-1.116,-2.971,-7.109,-16.321,-9.575]
1745
- ```
1746
-
1747
- ```bash
1748
- git worktree add --detach /tmp/opencode/kudzu-v0.8.34 v0.8.34
1749
- ln -s "$PWD/node_modules" /tmp/opencode/kudzu-v0.8.34/node_modules
1750
- BASELINE_ROOT=/tmp/opencode/kudzu-v0.8.34 CANDIDATE_ROOT="$PWD" WARMUPS=3 RUNS=21 npm run benchmark:module-cache
1751
- ```
1752
-
1753
- ## P0.7 Parsed Module And Export Summary Cache
1754
-
1755
- Measured UTC 2026-08-11 on an Intel Core i5-9500 with 6 physical/logical cores, 31.2 GiB RAM, Linux 6.17.0-19-generic x64, Node 24.14.0, and npm 11.9.0. The baseline was clean tag `v0.8.33` at `65c96b13802c73e9c9a109cebbaac88bae7704a7`; both targets used the same installed dependencies. The implementation and maintained benchmark patch had SHA-256 `bca61b37f14c77488c4a35b62856faa6b471dd01081abcb69c47027b3b4615d9`, produced by:
1756
-
1757
- ```bash
1758
- git diff --binary v0.8.33..v0.8.34 -- framework/compiler/project-session.mjs framework/compiler/source-compiler.mjs framework/compiler/worker-compiler.mjs test/compiler-passes.test.mjs test/module-cache-performance.mjs package.json | sha256sum
1759
- ```
1760
-
1761
- The maintained in-memory fixture has 100 page importers sharing one barrel component and helper, for 103 unique modules. Each sample starts a fresh Node process; fixture generation and result hashing occur outside timing. Three warm-ups followed by 21 alternating samples compiled every reachable module. The candidate parsed and summarized each unique module once and created 200 importer-local normalization clones. Baseline and candidate produced the same 382,603-byte serialized source-result graph with SHA-256 `8c35b3f6d2c571306bd97c4d51d4af76ca244badd36c57363bf579ef961f41aa`.
1762
-
1763
- | Target | Compiler median | Range | Peak RSS median | Parse / summary / clone misses |
1764
- |---|---:|---:|---:|---:|
1765
- | `v0.8.33` | 2,386.735 ms | 1,183.385–3,249.719 ms | 261.3 MiB | not instrumented |
1766
- | P0.7 candidate | 2,188.745 ms | 1,321.352–2,957.883 ms | 257.1 MiB | 103 / 103 / 200 |
1767
-
1768
- Both timing arrays drifted upward during the run, making their raw 8.29% median difference unsuitable as an improvement claim. Round-paired candidate-minus-baseline differences had a +33.324 ms median, with the candidate faster in 9/21 pairs and the baseline faster in 12/21. Peak RSS ranges also overlap. This establishes bounded parse/summary work and identical compiler output with no material performance conclusion on this machine; it does not establish a speedup.
1769
-
1770
- ```text
1771
- v0.8.33: [1512.096,1244.231,1183.385,1655.352,1669.380,2033.448,1820.868,1774.702,1847.652,1889.290,2386.735,2926.474,2853.159,3249.719,2716.963,2569.254,2531.427,2727.951,2483.411,2492.172,2597.774]
1772
- candidate: [1943.630,1416.969,1321.352,1603.967,1340.557,1440.993,1913.509,2060.240,1796.133,2011.796,2188.745,2888.145,2957.883,2947.417,2750.287,2745.883,2799.166,2620.866,2499.916,2541.054,2530.391]
1773
- paired candidate-baseline: [431.534,172.738,137.967,-51.385,-328.823,-592.455,92.641,285.538,-51.519,122.506,-197.990,-38.329,104.724,-302.302,33.324,176.629,267.739,-107.085,16.505,48.882,-67.383]
1774
- ```
1775
-
1776
- ```bash
1777
- git worktree add --detach /tmp/opencode/kudzu-v0.8.33 v0.8.33
1778
- ln -s "$PWD/node_modules" /tmp/opencode/kudzu-v0.8.33/node_modules
1779
- BASELINE_ROOT=/tmp/opencode/kudzu-v0.8.33 CANDIDATE_ROOT="$PWD" WARMUPS=3 RUNS=21 npm run benchmark:module-cache
1780
- ```
1781
-
1782
- ### Current Cross-Framework Whole-Build Context
1783
-
1784
- Measured again after the P0.8 optimization on 2026-08-11. This separate local check is not a parsed-module-cache comparison or maintained ranking. The external `/tmp/opencode/kudzu-dependency-benchmark` workspace is not Git-provenanced. It used Kudzu 0.8.35, React 19.2.7, Vue 3.5.40, Svelte 5.56.6, Astro 7.1.1, and Vite 7.3.6. Every target emitted matched initial device content, and fresh headless Chrome runs passed detail fetch, list filters, empty state, superseded async command, stale-result rejection, and HTTP error behavior. One warm-up preceded seven rotated clean builds. React, Vue, and Svelte perform separate client, SSR, and prerender builds; Astro uses its native build and an application-specific imperative script; Kudzu runs one static compiler build, so build stages and artifact architectures differ.
1785
-
1786
- | Target | Build median | HTML raw / gzip | JavaScript raw / gzip | Total output |
1787
- |---|---:|---:|---:|---:|
1788
- | Kudzu | 495.4 ms | 5,647 B / 1,324 B | 30,712 B / 12,233 B | 36,359 B |
1789
- | React SSR | 1,639.5 ms | 1,338 B / 562 B | 195,864 B / 61,488 B | 197,202 B |
1790
- | Vue SSR | 1,477.3 ms | 1,348 B / 567 B | 69,643 B / 27,756 B | 70,991 B |
1791
- | Svelte SSR | 2,033.1 ms | 1,399 B / 582 B | 40,781 B / 15,898 B | 42,180 B |
1792
- | Astro native | 974.5 ms | 3,307 B / 1,229 B | 2,201 B / 883 B | 3,307 B |
1793
-
1794
- ```text
1795
- Kudzu: [474.3,482.6,493.4,495.4,498.0,503.5,504.9]
1796
- React SSR: [1589.6,1617.1,1638.4,1639.5,1640.7,1662.7,1667.5]
1797
- Vue SSR: [1433.8,1448.2,1450.0,1477.3,1486.0,1498.2,1500.5]
1798
- Svelte SSR: [1956.3,1993.7,2025.4,2033.1,2036.9,2060.2,2072.8]
1799
- Astro native: [943.3,945.9,964.7,974.5,988.8,996.4,999.5]
1800
- ```
1801
-
1802
- ```bash
1803
- node /tmp/opencode/kudzu-dependency-benchmark/device-run.mjs
1804
- node /tmp/opencode/kudzu-dependency-benchmark/device-verify.mjs
1805
- ```
1806
-
1807
- Kudzu's build median was 69.8% lower than React SSR, 66.5% lower than Vue SSR, 75.6% lower than Svelte SSR, and 49.2% lower than Astro native in this protocol. Kudzu shipped 80.1%, 55.9%, and 23.1% less JavaScript gzip than React, Vue, and Svelte respectively. Astro shipped only 883 B JavaScript gzip and a 3,307 B single-file output, so Kudzu's JavaScript gzip was 13.9 times and total output 11.0 times larger than Astro's direct imperative implementation. Kudzu's larger HTML carries static content and capability descriptors; its 1,324 B gzip was close to Astro's 1,229 B but larger than the hydrated SSR controls' 562-582 B HTML.
1808
-
1809
- The cross-framework result provides current whole-build and deploy-artifact context only. It does not show that Kudzu's ModuleSymbol cache is faster than another framework's module cache: this fixture has one application module per target and exposes no equivalent parser/cache counters. A cache-specific cross-framework claim would require matched 100-importer module graphs, equivalent output, equal cold/warm policy, and framework-specific cache instrumentation. The browser run verifies behavior rather than interaction latency; the maintained larger keyed benchmarks below remain the runtime-performance evidence.
1810
-
1811
- ## 2026-08-11 React, Vue, And Svelte Check
1812
-
1813
- This is a current local check, not a maintained framework ranking. The external `/home/kft/Documents/etc/demo/benchmarks` workspace is not Git-provenanced, but its matched fixtures, validators, dependencies, and raw result files were present and reused without source changes. The Kudzu target used this P0.5 candidate with `0.8.31` package metadata; controls were React 19.2.7, Vue 3.5.40, Svelte 5.56.6, and Vite 7.3.6 on Node 24.14.0, Linux x64, and Chrome 142.0.7444.175.
1814
-
1815
- Each fixture received one warm-up and seven rotating clean production builds. Seven fresh headless Chrome profiles per target validated exact row count/order/text, retained and released DOM identity, fresh state on re-entry, and effect lifecycle counts before recording MutationObserver completion. React, Vue, and Svelte are CSR controls with no initial rows in HTML; Kudzu emits all initial rows, so total deploy size is reported but is not architecture-equivalent.
1816
-
1817
- | Fixture | Framework | Build median | Initial JS gzip | Total deploy raw |
1818
- |---|---|---:|---:|---:|
1819
- | 1,000 keyed rows with local state | Kudzu | 1,212 ms | 10.2 KB | 576.0 KB |
1820
- | | Svelte | 1,745 ms | 13.1 KB | 33.8 KB |
1821
- | | Vue | 1,584 ms | 24.4 KB | 61.6 KB |
1822
- | | React | 1,939 ms | 59.4 KB | 189.5 KB |
1823
- | 1,000 keyed effects | Kudzu | 735 ms | 9.8 KB | 226.0 KB |
1824
- | | Svelte | 1,554 ms | 12.5 KB | 32.4 KB |
1825
- | | Vue | 1,444 ms | 24.5 KB | 61.9 KB |
1826
- | | React | 1,741 ms | 59.5 KB | 189.7 KB |
1827
- | 100 parents x 10 keyed children | Kudzu | 732 ms | 8.2 KB | 354.6 KB |
1828
- | | Svelte | 1,613 ms | 13.1 KB | 33.8 KB |
1829
- | | Vue | 1,437 ms | 24.6 KB | 62.1 KB |
1830
- | | React | 1,718 ms | 59.5 KB | 190.0 KB |
1831
-
1832
- Kudzu's build medians were 23% to 58% lower and its initial JavaScript gzip was 21% to 86% lower than the three CSR controls. A separate seven-run GNU `time` check on the keyed-row fixture measured median build peak RSS of 157.4 MiB for Kudzu, 209.2 MiB for Svelte, 208.0 MiB for Vue, and 281.3 MiB for React.
1833
-
1834
- | Fixture operation | Kudzu | Svelte | Vue | React |
1835
- |---|---:|---:|---:|---:|
1836
- | Row edit | 5.6 ms | 4.9 ms | 5.7 ms | 11.9 ms |
1837
- | Reverse 1,000 rows | 28.2 ms | 94.3 ms | 23.2 ms | 51.8 ms |
1838
- | Remove row | 5.0 ms | 8.7 ms | 7.6 ms | 15.6 ms |
1839
- | Re-add row | 7.7 ms | 16.8 ms | 8.1 ms | 18.5 ms |
1840
- | Effect dependency update | 4.8 ms | 9.8 ms | 10.0 ms | 14.9 ms |
1841
- | Effect-unrelated update | 2.8 ms | 7.3 ms | 2.7 ms | 10.1 ms |
1842
- | Reverse effect rows | 11.7 ms | 71.5 ms | 13.4 ms | 29.5 ms |
1843
- | Nested child update | 2.7 ms | 3.4 ms | 6.5 ms | 12.0 ms |
1844
- | Reverse 10 children | 0.7 ms | 1.1 ms | 3.1 ms | 9.0 ms |
1845
- | Reverse 100 parents | 6.8 ms | 7.7 ms | 7.3 ms | 11.1 ms |
1846
- | Remove parent | 1.1 ms | 1.5 ms | 3.4 ms | 6.7 ms |
1847
-
1848
- These initial browser runs were grouped by target and some seven-sample ranges were wide, so they were treated as directional rather than a framework ranking. The candidate then removed repeated keyed-root lookups and redundant removal-map reconstruction across the generic, nested, and reducer list paths, and merged binding/condition state dispatch into one committer. The keyed-row JavaScript graph decreased from 26,962 B raw / 10,508 B gzip to 26,768 B raw / 10,485 B gzip.
1849
-
1850
- A 31-round rotating follow-up ran fresh Chrome profiles in alternating and periodically reversed framework order. Its full-list completion predicate retained the exact 1,000-row content and identity checks inside timing:
1851
-
1852
- | Framework | Edit | Reverse | Remove | Re-add |
1853
- |---|---:|---:|---:|---:|
1854
- | Kudzu | 5.9 ms | 23.4 ms | 5.6 ms | 8.0 ms |
1855
- | Svelte | 5.5 ms | 97.0 ms | 9.2 ms | 14.7 ms |
1856
- | Vue | 6.8 ms | 26.6 ms | 9.6 ms | 10.0 ms |
1857
- | React | 14.7 ms | 51.0 ms | 20.2 ms | 14.3 ms |
1858
-
1859
- Paired sign tests established Kudzu's reverse, remove, and re-add advantage over Vue at 6.0 ms (`p=0.00143`), 4.1 ms (`p=0.000192`), and 2.1 ms (`p=0.0107`) median differences. Kudzu also beat Svelte for those operations in 31/31, 28/31, and 27/31 rounds. The full-list edit result remained dominated by the validator: Kudzu versus Svelte had a 0.8 ms directional loss with `p=0.281`, while Kudzu versus Vue had a 0.4 ms directional gain with `p=0.720`.
1860
-
1861
- A final edit-only protocol kept complete 1,000-row correctness validation after each measurement but used only the edited row's class/input identity as the completion signal. Over 31 rotating rounds, Kudzu measured 0.7 ms versus Svelte 1.4 ms and Vue 1.8 ms. Paired differences favored Kudzu by 0.7 ms in 30/31 rounds (`p=2.98e-8`) versus Svelte and by 0.9 ms in 31/31 rounds (`p=9.31e-10`) versus Vue. Complete seven-run suite samples remain in the external workspace's `benchmarks/results/*-current.{json,md}` files; rotating raw samples are temporary measurement artifacts and this section remains a current local check rather than a maintained general ranking.
1862
-
1863
- ## 0.8.32 Staged Output Emission
1864
-
1865
- Measured UTC 2026-08-11 on an Intel Core i5-9500 with 6 cores, Linux 6.17.0-19-generic, Node 24.14.0, and npm 11.9.0. The baseline was clean tag `v0.8.31` at `06b436e`; baseline and the pre-release P0.5 candidate used the same installed dependencies and the public 1,000-product storefront fixture at `f2d5be1a516c539e30f7125f6870d42b1dd02ecd`. The later same-root lock and interrupted-backup recovery hardening was correctness-tested but not included in this timing array.
1866
-
1867
- One warm-up followed by 21 alternating replacement builds preserved the preceding output so the candidate exercised staging, promotion, and prior-tree removal on every run. Generated `.kudzu` scratch was cleaned outside timing. The candidate folds collision validation into one public copy traversal and writes the already-rendered route HTML in bounded batches of 64.
1868
-
1869
- | Target | Build median | Output |
1870
- |---|---:|---:|
1871
- | `v0.8.31` | 20,392.7 ms | 3,056 files / 11,137,074 B |
1872
- | P0.5 candidate | 19,229.1 ms | 3,056 files / 11,137,074 B |
1873
-
1874
- The candidate median is 5.71% lower. Every relative artifact path and SHA-256 hash matched, so deploy raw and gzip sizes are unchanged and no browser bytes are added.
1875
-
1876
- ```text
1877
- v0.8.31: [20868.5,19436.9,22023.6,21433.5,20634.0,20410.1,20392.7,21408.8,20252.0,19858.3,20489.9,20835.2,20450.2,18727.3,17239.1,17578.2,17672.1,17465.1,21087.0,18892.8,18727.9]
1878
- candidate: [20481.6,18692.6,21060.7,19881.9,19510.8,20844.1,20348.6,19229.1,20304.8,19852.9,18929.3,20472.5,17384.9,18628.6,17890.2,18841.0,19755.6,17805.9,18282.5,17770.5,17370.3]
1879
- ```
1880
-
1881
- ```bash
1882
- APP_ROOT=/tmp/opencode/kudzu-based-bench/apps/shop-kudzu \
1883
- BASELINE_ROOT=/tmp/opencode/kudzu-p05-profile \
1884
- PRESERVE_OUTPUT=1 RUNS=21 npm run benchmark:commerce
1885
- ```
1886
-
1887
- ## 0.8.31 Async Native Handler Ownership
1888
-
1889
- Measured UTC 2026-08-10 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 25.6.1, npm 11.18.0, and Chrome 151.0.7922.76. The baseline was clean tag `v0.8.30` at `9bb5ce8`; baseline and candidate used the same installed dependencies.
1890
-
1891
- The implementation and maintained-check patch over `v0.8.30` had SHA-256 `c67956b67b558052885dd48a9dbe35f238b8ce042876537952355aa05b8cdc10`, produced by:
1892
-
1893
- ```bash
1894
- git diff --binary v0.8.30 -- framework/native-runtime.js framework/serialization.js test/fixtures/navigation/src/Shell.tsx test/fixtures/navigation/src/pages/product.tsx test/fixtures/navigation/public/browser-test.js test/framework.test.mjs test/native-performance.mjs package.json | shasum -a 256
1895
- ```
1896
-
1897
- The maintained browser runner built the same `test/fixtures/native-bubbling` source with each framework root. After one warm-up, 21 alternating headless Chrome processes dispatched 5,000 synchronous clicks through the real DOM listener, handler-module lookup, generated handler, state context, and queued-flush scheduling path. Both medians were 6.4 ms; the 6.1-6.8 ms baseline and 6.2-6.7 ms candidate ranges overlap, so no dispatch regression is established.
1898
-
1899
- ```bash
1900
- git worktree add --detach /tmp/kudzu-v0.8.30 v0.8.30
1901
- ln -s "$PWD/node_modules" /tmp/kudzu-v0.8.30/node_modules
1902
- BASELINE_ROOT=/tmp/kudzu-v0.8.30 RUNS=21 ITERATIONS=5000 \
1903
- CHROME_BIN="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
1904
- npm run benchmark:native
1905
- ```
1906
-
1907
- ```text
1908
- 0.8.30: [6.6,6.3,6.4,6.3,6.3,6.8,6.3,6.6,6.3,6.4,6.5,6.4,6.5,6.5,6.4,6.1,6.3,6.2,6.5,6.4,6.4]
1909
- 0.8.31: [6.4,6.7,6.2,6.4,6.6,6.6,6.5,6.4,6.5,6.4,6.4,6.4,6.6,6.5,6.4,6.3,6.4,6.4,6.6,6.2,6.4]
1910
- ```
1911
-
1912
- The maintained `native-bubbling` fixture retained the same eight JavaScript paths. The browser runner hashes every file and permits only the ownership-bearing native and capture-deserialization runtimes to change:
1913
-
1914
- | Artifact | 0.8.30 raw / gzip | 0.8.31 raw / gzip | Delta raw / gzip |
1915
- |---|---:|---:|---:|
1916
- | `assets/kudzu-native.js` | 1,528 B / 842 B | 1,715 B / 925 B | +187 B / +83 B |
1917
- | `assets/kudzu-serialization.js` | 675 B / 381 B | 697 B / 392 B | +22 B / +11 B |
1918
- | Complete native fixture JavaScript | 13,629 B / 6,177 B | 13,838 B / 6,271 B | +209 B / +94 B |
1919
-
1920
- The timing is a focused synchronous event-dispatch measurement, not a general interaction or asynchronous task benchmark. The runtime does not cancel application promises or arbitrary browser API work; it invalidates Kudzu state writes, queued commits, and captured ref resolution after the listener's DOM ownership is released.
1921
-
1922
- ## 0.8.26 Goal B Benchmark Hardening
1923
-
1924
- The checked-in `benchmark:commerce` runner now requires byte-identical candidate output by default. `EXPECTED_CHANGES` is reserved for explicitly recorded historical comparisons; the route-entry reuse path also has a focused transform-count regression test in the ordinary suite.
1925
-
1926
- After that runner update, seven alternating `v0.8.24` versus current-tree builds on the same Linux machine verified 1,011 pages, 3,056 files, and no changed deploy hash. The 14,766.5 ms and 12,202.4 ms medians validate the maintained runner and released-tree direction, but are not attributed to route-entry reuse alone because the compared revisions include all `0.8.25` compiler-boundary changes.
1927
-
1928
- ```text
1929
- v0.8.24: [14311.1,14766.5,15294.2,14718.0,13440.6,15245.2,15007.0]
1930
- current: [12202.4,12243.2,11701.2,12320.8,11994.6,12461.4,12073.3]
1931
- ```
1932
-
1933
- ## 0.8.25 Route Entry Transform Reuse
1934
-
1935
- Measured UTC 2026-08-10 on an Intel Core i5-9500 with 6 cores, Linux 6.17.0-19-generic, Node 24.14.0, and npm 11.9.0. The public 1,000-product storefront fixture at `f2d5be1` generated 1,011 pages against the `0.8.24` tree plus the same compiler-boundary safety changes in both targets.
1936
-
1937
- One warm-up followed by seven alternating clean builds compared repeated esbuild transformation with a build-local exact-source result map used only by generated native, parameter, and effect route entries. The median decreased from 13,851.0 ms to 12,581.4 ms, a 9.17% improvement. Every emitted path and SHA-256 hash matched. The catalog was generated once before timing; `dist` and `.kudzu` cleanup and manifest hashing remained outside timing.
1938
-
1939
- ```text
1940
- repeated transform: [13437.4,13851.0,13844.9,13440.8,13906.1,14310.0,14901.0]
1941
- exact-source reuse: [12480.2,12826.9,12777.9,12615.9,11869.7,12121.3,12581.4]
1942
- ```
1943
-
1944
- The map lasts for one build and keys the complete generated source after route-relative URLs are resolved. It is not a persistent or generalized JavaScript transform cache. The result measures the large repeated-route fixture on this Linux machine and is not directly comparable to the Apple M3 `0.8.24` build medians below.
1945
-
1946
- ## 0.8.24 Measured Goal B Optimizations
1947
-
1948
- Measured UTC 2026-08-09 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 25.6.1, npm 11.18.0, and Chrome 151.0.7922.76. Baseline tag `v0.8.23` at `39a065b` and the `0.8.24` candidate used the same local volume and dependencies.
1949
-
1950
- The implementation and maintained benchmark patch over `v0.8.23` had SHA-256 `c6c39b0c64f7a5d3271cb9f0286a4c6787aaf7e293744457629e6ea249e9ef76`, produced by:
1951
-
1952
- ```bash
1953
- git diff --binary v0.8.23 -- framework/compiler/normalization-pipeline.mjs framework/list-runtime.js test/compiler-passes.test.mjs test/keyed-performance.mjs test/fixtures/keyed-performance/src/pages/index.tsx test/commerce-build-performance.mjs package.json | shasum -a 256
1954
- ```
1955
-
1956
- Twenty-one fresh profiles measured 2,000-row restoration at 21.1 ms versus 26.3 ms, a 19.77% improvement. Twenty-one alternating clean builds of the external 1,000-product fixture measured 6,266.5 ms versus 6,684.7 ms, a 6.26% improvement. The keyed route adds 127 B raw / 35 B aggregate gzip JavaScript; the normalization optimization adds no output bytes. Complete methodology, arrays, artifacts, correctness checks, and limitations are in [Goal B Measurement Details](#goal-b-measurement-details).
1957
-
1958
- Before release-content updates, the complete site plus `lists`, `keyed-row-hooks`, and `navigation` retained identical deploy file lists. Only `assets/kudzu-list.js` changed; every other deploy file was byte-identical. Their normalized `.kudzu` trees were identical to `v0.8.23`.
1959
-
1960
- ## 0.8.23 Source Compiler Boundary
1961
-
1962
- Measured UTC 2026-08-09 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 22.23.2, and npm 11.18.0. Baseline tag `v0.8.22` at `60b9bff` and the current `0.8.23` compiler candidate used the same local volume and identical installed dependencies.
1963
-
1964
- The candidate implementation patch over `v0.8.22` had SHA-256 `cfa25426f630f3d5d75a788f9ef8c63c48531c74ffc58727437890c47c511945`, produced by:
1965
-
1966
- ```bash
1967
- git diff --binary v0.8.22 -- framework/build.mjs framework/compiler/source-compiler.mjs framework/compiler/source-graph.mjs framework/compiler/path-helpers.mjs framework/compiler/worker-compiler.mjs framework/dev-server.mjs test/compiler-passes.test.mjs test/framework.test.mjs | shasum -a 256
1968
- ```
1969
-
1970
- Both targets received one warm-up followed by seven clean `worker-effects` production builds in alternating round-robin order. Cleanup remained outside timing. The ranges overlap; the 0.24% lower candidate median does not establish a material change.
1971
-
1972
- | Target | Build median | Worker raw / gzip | Window raw / gzip |
1973
- |---|---:|---:|---:|
1974
- | 0.8.22 baseline | 287.7 ms | 907 B / 477 B | 12,148 B / 5,411 B |
1975
- | 0.8.23 candidate | 287.0 ms | 907 B / 477 B | 12,148 B / 5,411 B |
1976
-
1977
- ```text
1978
- 0.8.22: [287.3,288.1,287.7,289.3,285.7,286.8,289.1]
1979
- 0.8.23: [289.2,283.7,287.4,287.0,293.8,287.0,285.4]
1980
- ```
1981
-
1982
- Before release-content updates, the complete 135-page site and the `bindings`, `keyed-row-hooks`, `effect-dependencies`, `worker-effects`, `runtime-params`, `navigation`, `config-authoring`, and `event-package` deploy trees had identical file lists and bytes. Their `.kudzu` trees also matched after replacing only each checkout root in existing source-location strings. The invalid-reducer fixture retained the same source file, line, column, and diagnostic text. `build.mjs` decreased from 3,732 to 744 lines; this source-organization metric is not a runtime performance claim.
1983
-
1984
- ## Goal B Measurement Details
1985
-
1986
- Goal B started from clean commit `39a065b4284c74e7bf8ee5e39647ef771f2ba6f6`. On the same Apple M3 environment with Node 22.23.2, the maintained `worker-effects` benchmark measured a 289.9 ms clean-build median, 907 B raw / 477 B gzip Worker graph, and 12,148 B raw / 5,411 B gzip window graph:
1987
-
1988
- ```text
1989
- build: [284.3,287.1,293.6,289.9,291.3,286.4,290.7]
1990
- ```
1991
-
1992
- After the two candidate optimizations, the same maintained benchmark measured a 286.2 ms median and identical graph sizes. This is a regression check rather than evidence for either optimization:
1993
-
1994
- ```text
1995
- build: [286.2,282.1,287.1,286.4,285.4,284.4,287.2]
1996
- ```
1997
-
1998
- Chrome 151.0.7922.76 passed the tracked throughput, cadence, bounded-history, stale-write, and 30-cycle ownership checks. The first Node 22 browser attempt returned no Worker data; immediate Node 25 and Node 22 retries passed, so this is recorded as a startup flake rather than a performance result.
1999
-
2000
- The preserved external cross-framework workspace then rebuilt its 1,000-row Kudzu fixture against clean `0.8.23` to locate a possible keyed-list loss. This exploratory harness is not maintained in the repository and its historical framework results were not reused. Seven fresh unthrottled Chrome profiles all passed row visibility, retained identity, removal, and fresh re-add checks:
2001
-
2002
- | Operation | Median | Raw runs |
2003
- |---|---:|---|
2004
- | Edit row 500 | 0.5 ms | 1.1, 0.6, 0.5, 0.5, 0.6, 0.5, 0.5 |
2005
- | Reverse 1,000 rows | 4.0 ms | 4.8, 3.8, 3.8, 4.2, 4.0, 4.1, 3.8 |
2006
- | Remove row 500 | 1.2 ms | 1.5, 1.1, 1.1, 1.3, 1.2, 1.2, 1.2 |
2007
- | Re-add row 500 | 1.3 ms | 2.3, 1.0, 1.3, 1.5, 1.1, 1.2, 1.4 |
2008
-
2009
- That fixture's seven clean builds were `[390.891,389.698,393.034,390.798,389.477,390.258,388.714]` ms for a 390.258 ms median. It emitted 28,243 B raw / 9,245 B aggregate gzip initial JavaScript across eight files and 943,075 B total output across nine files. The absolute build result has no current matched control and does not establish a regression. No browser operation in this exploratory fixture established a material loss.
2010
-
2011
- #### Maintained Keyed Restoration Benchmark
2012
-
2013
- The repository-owned `npm run benchmark:keyed` fixture renders 2,000 keyed rows with row-local state, a reactive slice, and a reactive string filter. Each revision received one clean build warm-up, 21 measured clean builds, and 21 unthrottled fresh Chrome 151.0.7922.76 profiles. In-page `MutationObserver` completion includes the synchronous state commit and terminal DOM mutation. Every run retained row 1000 and its selected state, appended 33 rows beside 1,967 retained rows, filtered to one row, released row 1, restored row 1 with fresh identity/state and a working handler, and retained row 1000 through reversal.
2014
-
2015
- The baseline uses the identical `0.8.24` benchmark harness and fixture copied into a clean `v0.8.23` worktree; only compiler/runtime source differs:
2016
-
2017
- ```bash
2018
- git worktree add --detach /tmp/kudzu-0.8.23 v0.8.23
2019
- mkdir -p /tmp/kudzu-0.8.23/test/fixtures/keyed-performance/src/pages
2020
- cp test/keyed-performance.mjs /tmp/kudzu-0.8.23/test/keyed-performance.mjs
2021
- cp test/fixtures/keyed-performance/src/pages/index.tsx /tmp/kudzu-0.8.23/test/fixtures/keyed-performance/src/pages/index.tsx
2022
- ln -s "$PWD/node_modules" /tmp/kudzu-0.8.23/node_modules
2023
- RUNS=21 CHROME_BIN="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" node /tmp/kudzu-0.8.23/test/keyed-performance.mjs
2024
- RUNS=21 CHROME_BIN="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" npm run benchmark:keyed
2025
- ```
2026
-
2027
- The measured loss was restoration from one retained row to 2,000 rows. The baseline called `mountDom()` separately for 1,999 connected additions. For top-level flat lists, the candidate calls it once on the connected list parent when more than 32 additions are a majority of both the next rows and their parent children. Nested/parent lists, shared containers dominated by unrelated siblings, and small or retained-heavy updates keep per-root mounting. This reduces repeated mount-hook selector traversal without adding a scheduler, cache, tree, or public API.
2028
-
2029
- | Target | Build median | Append 33 | Filter median | Restore median | Reverse median | JavaScript raw / gzip |
2030
- |---|---:|---:|---:|---:|---:|---:|
2031
- | `0.8.23` baseline | 263.0 ms | 2.6 ms | 4.6 ms | 26.3 ms | 6.2 ms | 28,308 B / 10,937 B |
2032
- | Goal B candidate | 265.6 ms | 2.7 ms | 4.6 ms | 21.1 ms | 6.1 ms | 28,435 B / 10,972 B |
2033
-
2034
- Restore improved 19.77%, and its 20.4-21.9 ms candidate range did not overlap the 25.7-27.3 ms baseline range. Append, filter, and reverse distributions overlap; no change is claimed. Build distributions overlap; no build improvement is claimed. The deterministic cost is 127 B raw / 35 B aggregate gzip in `kudzu-list.js`.
2035
-
2036
- ```text
2037
- baseline build: [261.7,265.9,263.0,263.9,259.4,265.5,261.5,263.4,260.4,261.8,264.7,263.4,260.7,262.7,263.6,264.4,261.5,264.0,261.7,263.5,262.3]
2038
- candidate build: [265.4,271.2,265.2,263.6,266.1,266.7,264.4,317.3,298.2,269.4,269.2,264.1,266.9,268.9,273.6,265.5,262.4,259.4,262.1,265.6,262.0]
2039
- baseline append: [2.8,2.5,2.5,3.0,2.5,2.6,2.8,2.7,2.7,2.8,2.8,2.5,2.6,2.9,2.7,2.6,2.5,2.4,2.7,2.4,2.4]
2040
- candidate append: [2.8,3.0,2.7,2.5,2.7,2.6,2.8,2.8,2.7,2.6,2.8,2.8,3.0,2.8,2.4,2.4,2.4,2.9,2.9,2.7,2.6]
2041
- baseline filter: [4.5,4.5,5.0,4.6,4.5,4.5,4.9,4.8,4.5,4.6,4.7,4.3,4.7,4.8,4.7,4.7,4.6,4.5,4.9,4.4,4.2]
2042
- candidate filter: [4.7,4.8,4.6,4.6,4.7,4.4,4.7,4.5,4.6,4.4,4.7,4.9,4.9,4.6,4.4,4.6,4.6,4.8,4.8,4.3,4.4]
2043
- baseline restore: [26.5,27.3,26.5,26.5,25.8,26.7,26.3,26.4,26.2,26.4,26.6,26.2,27.0,26.6,25.9,25.7,25.9,26.3,26.0,25.9,26.3]
2044
- candidate restore: [21.3,21.7,21.8,21.6,20.4,20.8,20.6,21.5,20.4,20.8,21.8,21.4,21.9,21.0,21.5,20.9,20.8,21.0,21.1,21.1,21.2]
2045
- baseline reverse: [6.2,6.3,6.0,6.4,6.6,7.1,6.4,6.0,6.8,6.3,5.8,5.8,6.4,5.8,6.2,7.1,5.7,6.1,5.8,6.0,5.5]
2046
- candidate reverse: [5.8,6.0,6.2,5.8,5.8,6.1,6.2,6.2,6.3,6.0,6.1,6.2,6.2,6.0,6.3,6.2,5.9,6.3,6.0,5.9,6.3]
2047
- ```
2048
-
2049
- #### External 1,000-Product Build
2050
-
2051
- The public [`SimYunSup/kudzu-based-bench`](https://github.com/SimYunSup/kudzu-based-bench) commerce fixture at `f2d5be1` generated 1,000 deterministic products and 1,011 complete Kudzu pages. On the same Apple M3 / Node 25.6.1 machine, clean `0.8.23` and the Goal B candidate received one warm-up and 21 alternating clean builds. Output and `.kudzu` cleanup remained outside timing.
2052
-
2053
- The paired runner generates the catalog once, alternates the two compiler roots, cleans `dist` and `.kudzu` outside timing, compares relative output manifests and hashes, permits only the explicitly configured historical `assets/kudzu-list.js` delta, and restores the external app's package symlink afterward:
2054
-
2055
- ```bash
2056
- git clone https://github.com/SimYunSup/kudzu-based-bench.git /tmp/kudzu-based-bench
2057
- git -C /tmp/kudzu-based-bench checkout --detach f2d5be1a516c539e30f7125f6870d42b1dd02ecd
2058
- pnpm --dir /tmp/kudzu-based-bench install --force
2059
- pnpm --dir /tmp/kudzu-based-bench run build:commerce
2060
- git worktree add --detach /tmp/kudzu-0.8.23 v0.8.23
2061
- ln -s "$PWD/node_modules" /tmp/kudzu-0.8.23/node_modules
2062
- APP_ROOT=/tmp/kudzu-based-bench/apps/shop-kudzu \
2063
- BASELINE_ROOT=/tmp/kudzu-0.8.23 \
2064
- CANDIDATE_ROOT="$PWD" RUNS=21 CATALOG_SIZE=1000 \
2065
- EXPECTED_CHANGES=assets/kudzu-list.js \
2066
- npm run benchmark:commerce
2067
- ```
2068
-
2069
- `applyNormalizationPasses()` previously called TypeScript's recursive parent-pointer repair after every pass, including validators and no-op passes returning the identical `SourceFile`. Every current pass was audited to use immutable factory updates for structural changes. Repairing only a changed root reduced the build median from 6,684.7 ms to 6,266.5 ms, a 6.26% improvement. Both builds emitted 3,056 files; only `assets/kudzu-list.js` differed because of the independently measured keyed restoration optimization. The normalization change itself adds no browser bytes.
2070
-
2071
- ```text
2072
- baseline: [6488.0,7095.6,6861.0,6647.7,6563.4,6613.3,6536.1,6529.2,6462.6,6655.9,6684.7,6623.2,6504.9,7618.5,8174.5,9309.1,7611.4,7942.3,8148.2,7191.0,7380.7]
2073
- candidate: [5898.6,5903.9,6108.5,6088.1,5966.4,5913.8,6266.5,6115.1,6014.6,6022.0,6223.1,6357.5,6429.5,6950.8,7887.1,8275.9,7208.9,7306.3,7861.9,6798.8,6859.3]
2074
- ```
2075
-
2076
- This external fixture is a candidate-finding and paired Kudzu regression benchmark, not a framework leaderboard result. It uses Kudzu-authored source; the catalog is generated once before timing and both revisions run the same complete Kudzu build. Its published cross-framework runs are sequential with only three build samples, and none of those framework numbers are used for this optimization claim. The paired command requires an existing symlink at `apps/shop-kudzu/node_modules/@kudzujs/core`. The external commit's pnpm 10.20 lock cannot install with `--frozen-lockfile`; `--force` accepts the unchanged lock and is a reproducibility limitation, although baseline and candidate use the same resulting dependency graph.
2077
-
2078
- ## 0.8.22 Versioned Compiler Foundation
2079
-
2080
- Measured UTC 2026-08-09 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 25.6.1, and npm 11.18.0. Baseline tag `v0.8.21` at `ff38092` and the then-current `0.8.22` compiler candidate used the same local volume and identical installed dependencies.
2081
-
2082
- The final `v0.8.21` to `v0.8.22` tagged implementation patch has reproducible SHA-256 `5fbdc3658b8c0d4d568c7ccdbf89c2c1c20c3a275ff9d0fd20e439b479d60530`, produced by:
2083
-
2084
- ```bash
2085
- git diff --binary v0.8.21 v0.8.22 -- framework/build.mjs framework/compiler/list-runtime-codegen.mjs framework/compiler/param-codegen.mjs framework/compiler/route-capability-planner.mjs framework/compiler/runtime-codegen.mjs framework/core.mjs framework/core.d.ts | shasum -a 256
2086
- ```
2087
-
2088
- The previously recorded candidate hash does not match this tagged patch, and no intermediate commit exists between the two release tags. The measured candidate is therefore not independently identifiable as the final `v0.8.22` tree from repository history.
2089
-
2090
- Both targets received one warm-up followed by seven clean `worker-effects` production builds in alternating round-robin order. Cleanup remained outside timing. Both medians were exactly 250.1 ms; the distributions overlap and establish no material change.
2091
-
2092
- | Target | Build median | Worker raw / gzip | Window raw / gzip |
2093
- |---|---:|---:|---:|
2094
- | 0.8.21 baseline | 250.1 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2095
- | 0.8.22 candidate | 250.1 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2096
-
2097
- ```text
2098
- 0.8.21: [249.7,252.0,250.1,251.2,250.0,254.8,249.1]
2099
- 0.8.22: [250.1,247.3,255.1,249.3,253.1,250.3,248.7]
2100
- ```
2101
-
2102
- Before release-content updates, the complete 135-page site and the `bindings`, `keyed-row-hooks`, `effect-dependencies`, `worker-effects`, `runtime-params`, and `navigation` deploy trees had identical file lists and bytes. Their build plans were equivalent after removing the intentional additive RouteIR `version` and state `slot` fields. Every measured Worker/window artifact name, raw byte count, and gzip byte count was identical. `build.mjs` decreased from 3,999 to 3,732 lines; this source-organization metric is not a runtime performance claim.
2103
-
2104
- ## 0.8.21 Explicit Effect Ownership
2105
-
2106
- Measured UTC 2026-08-09 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 25.6.1, and npm 11.18.0. Baseline tag `v0.8.20` at `7fb6e37` and the then-current `0.8.21` compiler candidate used the same local volume and identical installed dependencies.
2107
-
2108
- The final `v0.8.20` to `v0.8.21` tagged implementation patch has reproducible SHA-256 `c78159ccce1f88a5ed06445d5e0b113953576529a5845e7772ab386b8adf166a`, produced by:
2109
-
2110
- ```bash
2111
- git diff --binary v0.8.20 v0.8.21 -- framework/build.mjs framework/compiler/descriptor-session.mjs framework/compiler/effect-analysis.mjs framework/compiler/ir/module-ir.mjs framework/compiler/worker-compiler.mjs framework/core.d.ts | shasum -a 256
2112
- ```
2113
-
2114
- The previously recorded candidate hash does not match this tagged patch, and no intermediate commit exists between the two release tags. The measured candidate is therefore not independently identifiable as the final `v0.8.21` tree from repository history.
2115
-
2116
- Both targets received one warm-up followed by seven clean `worker-effects` production builds in alternating round-robin order. Cleanup remained outside timing. The distributions overlap; the 1.02% lower candidate median does not establish a material change.
2117
-
2118
- | Target | Build median | Worker raw / gzip | Window raw / gzip |
2119
- |---|---:|---:|---:|
2120
- | 0.8.20 baseline | 255.6 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2121
- | 0.8.21 candidate | 253.0 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2122
-
2123
- ```text
2124
- 0.8.20: [253.2,263.4,276.5,255.6,251.3,252.1,266.1]
2125
- 0.8.21: [253.7,249.7,260.4,253.0,251.1,250.1,265.7]
2126
- ```
2127
-
2128
- The complete site `dist` and the `effect-dependencies`, `keyed-effects`, and `worker-effects` fixture output trees had identical file lists and bytes before release-content updates. The Worker graph and every window graph file were byte-identical, including the content-hashed Worker name. This measurement covers compiler clean-build startup and generated artifact size; lifecycle behavior remains covered by the complete effect, Worker, conditional, keyed, and navigation integration tests.
2129
-
2130
- ## 0.8.20 Explicit Keyed Ownership
2131
-
2132
- Measured UTC 2026-08-09 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 25.6.1, and npm 11.18.0. Baseline `0.8.19` commit `c516173` and the current `0.8.20` compiler candidate used the same local volume and identical installed dependencies.
2133
-
2134
- The candidate implementation patch over `c516173` had SHA-256 `137f68090f6024374077f46cb61767f48dff27a193d33c9e92409b8dd7bb7d21`, produced by:
2135
-
2136
- ```bash
2137
- git diff --binary c516173 -- framework/build.mjs framework/compiler/descriptor-session.mjs framework/compiler/ir/module-ir.mjs framework/core.d.ts | shasum -a 256
2138
- ```
2139
-
2140
- Both targets received one warm-up followed by 21 clean `keyed-row-hooks` production builds in round-robin alternating order. Cleanup remained outside timing. The distributions overlap; the candidate median was 0.52% lower and does not establish a material change.
2141
-
2142
- | Target | Build median | List runtime raw / gzip |
2143
- |---|---:|---:|
2144
- | 0.8.19 baseline | 266.8 ms | 21,831 B / 6,930 B |
2145
- | 0.8.20 candidate | 265.4 ms | 21,831 B / 6,930 B |
2146
-
2147
- ```text
2148
- 0.8.19: [272.5,269.7,262.6,267.3,262.9,265.2,268.0,264.7,262.0,268.3,267.1,262.5,263.7,266.8,263.2,267.5,263.3,268.8,266.7,266.9,271.4]
2149
- 0.8.20: [262.5,267.4,266.2,261.7,265.1,262.9,269.9,264.1,275.0,268.2,263.4,263.7,265.4,268.7,263.8,266.1,265.4,265.3,267.2,270.1,263.2]
2150
- ```
2151
-
2152
- The recorded cleanup, warm-up, timing, median, and runtime-size measurement is reproducible with:
2153
-
2154
- ```bash
2155
- BASELINE_ROOT="/var/folders/bt/3r_ntp5x65j81brs6_p93rl00000gn/T/opencode/kudzu-0820-baseline" CANDIDATE_ROOT="/Users/songchibong/Documents/GitHub/kudzu" node --input-type=module -e 'import { spawnSync } from "node:child_process"; import { rmSync,readFileSync } from "node:fs"; import { gzipSync } from "node:zlib"; import { performance } from "node:perf_hooks"; import { resolve } from "node:path"; const roots={baseline:process.env.BASELINE_ROOT,candidate:process.env.CANDIDATE_ROOT}; const runs={baseline:[],candidate:[]}; const fixture="keyed-row-hooks"; const build=name=>{const root=roots[name],cwd=resolve(root,"test/fixtures",fixture); rmSync(resolve(cwd,"dist"),{recursive:true,force:true}); rmSync(resolve(cwd,".kudzu"),{recursive:true,force:true}); const start=performance.now(); const result=spawnSync(process.execPath,[resolve(root,"bin/kudzu.mjs"),"build"],{cwd,encoding:"utf8"}); if(result.status) throw new Error(result.stderr||result.stdout); return Number((performance.now()-start).toFixed(1));}; build("baseline"); build("candidate"); for(let index=0;index<21;index++) for(const name of index%2?["candidate","baseline"]:["baseline","candidate"]) runs[name].push(build(name)); const median=values=>[...values].sort((a,b)=>a-b)[Math.floor(values.length/2)]; const sizes={}; for(const [name,root] of Object.entries(roots)){const file=readFileSync(resolve(root,"test/fixtures",fixture,"dist/assets/kudzu-list.js")); sizes[name]=[file.length,gzipSync(file).length];} console.log(JSON.stringify({runs,medians:{baseline:median(runs.baseline),candidate:median(runs.candidate)},sizes}));'
2156
- ```
2157
-
2158
- Before release-content updates, the complete site `dist` was byte-identical. Seven representative keyed fixtures retained identical file lists and SHA-256 content; `.kudzu` comparison replaced only each worktree's absolute root in existing source-location strings. The complete compared lists were:
2159
-
2160
- ```text
2161
- lists: dist/assets/handlers/pages/index.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs
2162
- nested-lists: dist/assets/effects/index.js, dist/assets/handlers/pages/index.js, dist/assets/kudzu-effect.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs
2163
- keyed-row-hooks: dist/assets/effects/index.js, dist/assets/handlers/pages/index.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-effect.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, .kudzu/HookRow.mjs, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs
2164
- svg-structures: dist/assets/handlers/pages/index.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs
2165
- calculated-collections: dist/assets/handlers/pages/index.js, dist/assets/handlers/pages/ordinary.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/assets/native/ordinary/index.js, dist/index.html, dist/ordinary/index.html, dist/static/index.html, .kudzu/calculate.mjs, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs, .kudzu/pages/ordinary.mjs, .kudzu/pages/static.mjs
2166
- rendered-collections: dist/assets/handlers/pages/index.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs, .kudzu/selectVisible.mjs
2167
- keyed-effects: dist/assets/effects/index.js, dist/assets/effects/item-only/index.js, dist/assets/effects/state-only/index.js, dist/assets/handlers/pages/index.js, dist/assets/handlers/pages/item-only.js, dist/assets/handlers/pages/state-only.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-effect.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, dist/item-only/index.html, dist/state-only/index.html, .kudzu/EffectRow.mjs, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs, .kudzu/pages/item-only.mjs, .kudzu/pages/state-only.mjs
2168
- ```
2169
-
2170
- This measurement covers compiler clean-build startup and generated list-runtime size, not browser reconciliation latency. Browser behavior remains covered by the existing insert/update/reorder/remove/nested/SVG/state/effect/ref integration checks.
2171
-
2172
- ## 0.8.19 Handler, Binding, And Derived IR
2173
-
2174
- Measured UTC 2026-08-08 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 25.6.1, and npm 11.18.0. Baseline `0.8.18` tag `3598be0` and the `0.8.19` compiler-only candidate used detached worktrees on the same temporary volume with identical installed dependencies.
2175
-
2176
- The candidate compiler patch over `3598be0` had SHA-256 `7b2afc4c9a0d1963c8d3ccacfb1e95152136d77cc7afc250d17b1986ca329fb3`, produced by:
2177
-
2178
- ```bash
2179
- git diff --binary 3598be0 -- framework/build.mjs framework/compiler/descriptor-session.mjs framework/compiler/handler-codegen.mjs framework/compiler/handler-lowering.mjs framework/compiler/ir/module-ir.mjs | shasum -a 256
2180
- ```
2181
-
2182
- Both targets received one warm-up followed by 21 clean `worker-effects` production builds in round-robin alternating order. Cleanup remained outside timing. The distributions overlap; the candidate median was 0.32% lower and does not establish a material change.
2183
-
2184
- | Target | Build median | Worker raw / gzip | Window raw / gzip |
2185
- |---|---:|---:|---:|
2186
- | 0.8.18 baseline | 253.4 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2187
- | 0.8.19 candidate | 252.6 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2188
-
2189
- ```text
2190
- 0.8.18: [252.3,254.5,251.0,254.8,254.3,253.8,253.4,251.6,255.4,252.4,249.6,254.2,251.0,253.7,256.0,250.4,251.0,255.4,253.3,253.6,250.5]
2191
- 0.8.19: [252.3,251.7,252.9,251.9,251.5,253.0,252.3,251.3,253.0,252.1,254.3,258.4,249.8,251.6,256.2,253.7,253.5,252.6,252.9,252.5,255.9]
2192
- ```
2193
-
2194
- Before release-content updates, the complete site `dist` was byte-identical. Representative fixture builds retained identical file lists and SHA-256 content; `.kudzu` comparisons replaced only each detached worktree's absolute root in existing source-location strings. The complete fixture lists were:
2195
-
2196
- ```text
2197
- bindings: dist/assets/handlers/pages/index.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs
2198
- native: dist/assets/handlers/pages/index.js, dist/assets/handlers/pages/other/index.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/assets/native/other/index.js, dist/index.html, dist/other/index.html, .kudzu/helpers.mjs, .kudzu/kudzu-plan.json, .kudzu/math.mjs, .kudzu/pages/index.mjs, .kudzu/pages/other/index.mjs
2199
- reducer: dist/assets/handlers/pages/index.js, dist/assets/handlers/pages/lazy.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, dist/lazy/index.html, .kudzu/ImportedControls.mjs, .kudzu/ImportedInput.mjs, .kudzu/ImportedItem.mjs, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs, .kudzu/pages/lazy.mjs, .kudzu/todoReducer.mjs, .kudzu/todoSupport.mjs
2200
- context-actions: dist/assets/handlers/pages/index.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, dist/static/index.html, .kudzu/kudzu-plan.json, .kudzu/notes.mjs, .kudzu/pages/index.mjs, .kudzu/pages/static.mjs, .kudzu/useNotes.mjs
2201
- zustand-migration: dist/assets/handlers/Shell.js, dist/assets/handlers/pages/cart.js, dist/assets/handlers/pages/index.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-native.js, dist/assets/kudzu-navigation.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/cart/index.js, dist/assets/native/index.js, dist/cart/index.html, dist/index.html, .kudzu/Shell.mjs, .kudzu/kudzu-plan.json, .kudzu/pages/cart.mjs, .kudzu/pages/index.mjs, .kudzu/store.mjs
2202
- event-package: dist/assets/handlers/pages/index.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs
2203
- list-expressions: dist/assets/handlers/pages/index.js, dist/assets/kudzu-list.js, dist/assets/kudzu.js, dist/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs
2204
- effect-dependencies: dist/assets/effects/index.js, dist/assets/handlers/pages/index.js, dist/assets/kudzu-collection-selector.js, dist/assets/kudzu-deps.js, dist/assets/kudzu-effect.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu.js, dist/command/index.html, dist/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/command.mjs, .kudzu/pages/index.mjs
2205
- landing-page-migration: dist/assets/assets/badge.png, dist/assets/assets/hero.svg, dist/assets/assets/landing.woff2, dist/assets/assets/module-mark.svg, dist/assets/assets/preview.webp, dist/assets/handlers/pages/index.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/assets/styles/Hero.module.css, dist/assets/styles/landing.css, dist/index.html, dist/static/index.html, .kudzu/LandingSections.mjs, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs, .kudzu/pages/static.mjs
2206
- ```
2207
-
2208
- This measurement covers compiler clean-build startup and artifact size, not browser interaction latency or cross-framework performance.
2209
-
2210
- The recorded cleanup, warm-up, and alternating 21-run loop is reproducible with:
2211
-
2212
- ```bash
2213
- BASELINE_ROOT="/private/var/folders/bt/3r_ntp5x65j81brs6_p93rl00000gn/T/opencode/kudzu-0819-baseline" CANDIDATE_ROOT="/var/folders/bt/3r_ntp5x65j81brs6_p93rl00000gn/T/opencode/kudzu-0.8.19-candidate" node --input-type=module -e 'import { spawnSync } from "node:child_process"; import { rmSync } from "node:fs"; import { performance } from "node:perf_hooks"; import { resolve } from "node:path"; const roots={baseline:process.env.BASELINE_ROOT,candidate:process.env.CANDIDATE_ROOT}; const runs={baseline:[],candidate:[]}; const build=name=>{const root=roots[name],fixture=resolve(root,"test/fixtures/worker-effects"); rmSync(resolve(fixture,"dist"),{recursive:true,force:true}); rmSync(resolve(fixture,".kudzu"),{recursive:true,force:true}); const start=performance.now(); const result=spawnSync(process.execPath,[resolve(root,"bin/kudzu.mjs"),"build"],{cwd:fixture,encoding:"utf8"}); if(result.status!==0) throw new Error(result.stderr||result.stdout); return Number((performance.now()-start).toFixed(1));}; build("baseline"); build("candidate"); for(let index=0;index<21;index++) for(const name of index%2?["candidate","baseline"]:["baseline","candidate"]) runs[name].push(build(name)); console.log(JSON.stringify(runs));'
2214
- ```
2215
-
2216
- The complete `worker-effects` benchmark list was: `dist/assets/effects/dashboard/index.js`, `dist/assets/handlers/pages/dashboard.js`, `dist/assets/kudzu-effect.js`, `dist/assets/kudzu-navigation.js`, `dist/assets/kudzu.js`, `dist/assets/workers/telemetry.worker-BVG2SA55.js`, `dist/dashboard/index.html`, `dist/plain/index.html`, `dist/static/index.html`, `.kudzu/Shell.mjs`, `.kudzu/chart.mjs`, `.kudzu/kudzu-plan.json`, `.kudzu/pages/dashboard.mjs`, `.kudzu/pages/plain.mjs`, `.kudzu/pages/static.mjs`, `.kudzu/telemetry/downsample.mjs`, and `.kudzu/telemetry/ring.mjs`.
2217
-
2218
- ## 0.8.18 Explicit Component Ownership
2219
-
2220
- Measured UTC 2026-08-08 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 25.6.1, and npm 11.18.0. Baseline `0.8.17` tag `d48f0cf` and the `0.8.18` compiler-only candidate used detached worktrees on the same temporary volume with identical installed dependencies.
2221
-
2222
- Both targets received one warm-up followed by 21 clean `worker-effects` production builds in round-robin alternating order. Cleanup remained outside timing. The distributions overlap; the 2.43% candidate median difference remains below the 5% architecture gate and does not establish a material regression.
2223
-
2224
- | Target | Build median | Worker raw / gzip | Window raw / gzip |
2225
- |---|---:|---:|---:|
2226
- | 0.8.17 baseline | 770.9 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2227
- | 0.8.18 candidate | 789.6 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2228
-
2229
- ```text
2230
- 0.8.17: [770.9,705.6,817.1,768.5,760.2,839.8,758.3,756.1,960.7,834.6,707.9,706.5,582.9,463.5,625.5,1004.2,846.9,821.3,837.5,876.9,810.8]
2231
- 0.8.18: [753.9,726.4,879.3,851.5,942.8,949.3,758.4,761.3,794.3,782.2,620.6,622.9,610.8,726.8,732.3,833.0,789.6,816.3,845.2,811.3,825.0]
2232
- ```
2233
-
2234
- Before release-content updates, the complete `dist` and `.kudzu` trees were byte-identical. The Worker and window graphs remain byte-identical. This measurement covers compiler clean-build startup and artifact size, not browser interaction latency or cross-framework performance.
2235
-
2236
- Representative fixture builds also retained identical file lists and SHA-256 content against `v0.8.17`. Deploy `dist` bytes matched exactly; `.kudzu` hashes matched after replacing only each detached worktree's absolute root in existing source-location strings. The complete compared lists were:
2237
-
2238
- ```text
2239
- bindings: dist/assets/handlers/pages/index.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs
2240
- conditionals: dist/assets/handlers/pages/index.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs
2241
- nested-component-lists: dist/assets/effects/index.js, dist/assets/handlers/pages/index.js, dist/assets/kudzu-effect.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, .kudzu/ImportedItem.mjs, .kudzu/ImportedShell.mjs, .kudzu/kudzu-plan.json, .kudzu/label.mjs, .kudzu/pages/index.mjs
2242
- effects: dist/api/items.json, dist/assets/effects/index.js, dist/assets/effects/oak/index.js, dist/assets/effects/only/index.js, dist/assets/handlers/pages/[slug].js, dist/assets/handlers/pages/index.js, dist/assets/handlers/pages/only.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-effect.js, dist/assets/kudzu-list.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/index.html, dist/oak/index.html, dist/only/index.html, dist/static/index.html, .kudzu/kudzu-plan.json, .kudzu/pages/[slug].mjs, .kudzu/pages/index.mjs, .kudzu/pages/only.mjs, .kudzu/pages/static.mjs
2243
- worker-effects: dist/assets/effects/dashboard/index.js, dist/assets/handlers/pages/dashboard.js, dist/assets/kudzu-effect.js, dist/assets/kudzu-navigation.js, dist/assets/kudzu.js, dist/assets/workers/telemetry.worker-BVG2SA55.js, dist/dashboard/index.html, dist/plain/index.html, dist/static/index.html, .kudzu/Shell.mjs, .kudzu/chart.mjs, .kudzu/kudzu-plan.json, .kudzu/pages/dashboard.mjs, .kudzu/pages/plain.mjs, .kudzu/pages/static.mjs, .kudzu/telemetry/downsample.mjs, .kudzu/telemetry/ring.mjs
2244
- runtime-params: dist/assets/effects/orgs/[org]/items/[id]/index.js, dist/assets/handlers/pages/orgs/[org]/items/[id].js, dist/assets/kudzu-binding.js, dist/assets/kudzu-effect.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/orgs/[org]/items/[id]/index.js, dist/assets/params/orgs/[org]/items/[id]/index.js, dist/orgs/[org]/items/[id]/index.html, dist/orgs/acme/items/new/index.html, dist/rewrites.json, .kudzu/kudzu-plan.json, .kudzu/pages/orgs/[org]/items/[id].mjs, .kudzu/pages/orgs/acme/items/new.mjs
2245
- navigation: dist/[section]/[id]/index.html, dist/assets/effects/[section]/[id]/index.js, dist/assets/effects/broken/index.js, dist/assets/effects/cart/index.js, dist/assets/effects/chart/index.js, dist/assets/effects/items/[id]/index.js, dist/assets/effects/items/new/index.js, dist/assets/effects/product/index.js, dist/assets/handlers/Shell.js, dist/assets/handlers/chunks/chunk-VIS4MAAV.js, dist/assets/handlers/pages/cart.js, dist/assets/handlers/pages/chart.js, dist/assets/handlers/pages/items/[id].js, dist/assets/handlers/pages/product.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-effect.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-navigation.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/items/[id]/index.js, dist/assets/native/product/index.js, dist/assets/params/[section]/[id]/index.js, dist/assets/params/items/[id]/index.js, dist/broken/index.html, dist/browser-test.js, dist/cart/index.html, dist/chart/index.html, dist/items/[id]/index.html, dist/items/new/index.html, dist/outside/index.html, dist/product/index.html, .kudzu/Shell.mjs, .kudzu/chart.mjs, .kudzu/kudzu-plan.json, .kudzu/pages/[section]/[id].mjs, .kudzu/pages/broken.mjs, .kudzu/pages/cart.mjs, .kudzu/pages/chart.mjs, .kudzu/pages/items/[id].mjs, .kudzu/pages/items/new.mjs, .kudzu/pages/outside.mjs, .kudzu/pages/product.mjs
2246
- callback-ref-ownership: dist/assets/effects/index.js, dist/assets/handlers/pages/index.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-effect.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, .kudzu/ImportedAgeInput.mjs, .kudzu/ImportedButton.mjs, .kudzu/ImportedSearch.mjs, .kudzu/ImportedTooltip.mjs, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs
2247
- context-actions: dist/assets/handlers/pages/index.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, dist/static/index.html, .kudzu/kudzu-plan.json, .kudzu/notes.mjs, .kudzu/pages/index.mjs, .kudzu/pages/static.mjs, .kudzu/useNotes.mjs
2248
- reducer: dist/assets/handlers/pages/index.js, dist/assets/handlers/pages/lazy.js, dist/assets/kudzu-binding.js, dist/assets/kudzu-list.js, dist/assets/kudzu-native.js, dist/assets/kudzu-serialization.js, dist/assets/kudzu-style.js, dist/assets/kudzu.js, dist/assets/native/index.js, dist/index.html, dist/lazy/index.html, .kudzu/ImportedControls.mjs, .kudzu/ImportedInput.mjs, .kudzu/ImportedItem.mjs, .kudzu/kudzu-plan.json, .kudzu/pages/index.mjs, .kudzu/pages/lazy.mjs, .kudzu/todoReducer.mjs, .kudzu/todoSupport.mjs
2249
- ```
2250
-
2251
- ## 0.8.17 Command ModuleIR
2252
-
2253
- Measured UTC 2026-08-08 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 25.6.1, and npm 11.18.0. Baseline `0.8.16` tag `98a4ad9` and the `0.8.17` release candidate used detached worktrees on the same temporary volume with identical installed dependencies.
2254
-
2255
- Both targets received two warm-ups followed by 21 clean `worker-effects` production builds in round-robin alternating order. Cleanup remained outside timing. The distributions overlap; the 1.76% candidate median difference remains below the 5% architecture gate and does not establish a material regression.
2256
-
2257
- | Target | Build median | Worker raw / gzip | Window raw / gzip |
2258
- |---|---:|---:|---:|
2259
- | 0.8.16 baseline | 782.0 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2260
- | 0.8.17 candidate | 795.8 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2261
-
2262
- ```text
2263
- 0.8.16: [775.9,787.9,846.8,702.3,782.0,712.5,665.1,702.9,835.0,743.2,780.6,931.7,894.1,1004.0,849.8,1031.1,829.7,768.8,718.5,842.9,763.0]
2264
- 0.8.17: [696.0,721.9,778.8,850.4,846.1,835.2,710.4,711.6,836.1,766.9,822.6,945.0,838.2,991.5,858.6,803.4,706.3,760.8,773.8,764.3,795.8]
2265
- ```
2266
-
2267
- Before release-content updates, the unchanged source site, Counter build module, route plan, and command runtime were byte-identical. The final Worker and window graphs remain byte-identical. This measurement covers compiler clean-build startup and artifact size, not browser interaction latency or cross-framework performance.
2268
-
2269
- ## 0.8.16 Compiler Analysis Boundaries
2270
-
2271
- Measured UTC 2026-08-08 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 25.6.1, and npm 11.18.0. Baseline `0.8.15` commit `8405d29` and the `0.8.16` release candidate used detached worktrees on the same temporary volume with identical installed dependencies.
2272
-
2273
- The tracked `worker-effects` fixture received two warm-ups per target followed by 21 clean production builds in round-robin alternating order. Cleanup remained outside timing. The measured distributions overlap; the 3.75% median difference remains below the 5% architecture gate and does not establish a material regression.
2274
-
2275
- | Target | Build median | Worker raw / gzip | Window raw / gzip |
2276
- |---|---:|---:|---:|
2277
- | 0.8.15 baseline | 787.0 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2278
- | 0.8.16 candidate | 816.5 ms | 907 B / 475 B | 12,148 B / 5,427 B |
2279
-
2280
- ```text
2281
- 0.8.15: [762.5,793.7,937.8,820.7,775.9,766.4,807.2,742.7,772.0,757.6,823.0,752.7,814.2,827.2,917.4,787.0,755.1,798.5,742.1,806.8,785.8]
2282
- 0.8.16: [893.1,653.9,915.2,816.5,800.1,747.1,801.5,749.8,951.8,830.3,723.5,780.4,904.4,821.6,957.0,757.9,918.0,809.5,739.3,844.6,950.9]
2283
- ```
2284
-
2285
- The artifact comparison is exact for both graphs. It measures compiler clean-build startup plus the existing Worker fixture, not browser update latency or cross-framework performance.
2286
-
2287
- ## 0.7.12 Keyed Local State
2288
-
2289
- Measured UTC 2026-08-02 on Apple M3, 8 logical CPUs, 8 GiB RAM, macOS 26.5.2 / Darwin 25.5.0, Node 25.6.1, npm 11.18.0, and Chrome 150.0.7871.187.
2290
-
2291
- Targets were Kudzu 0.7.12 at commit `05e5cc248d425b0f30549cd0649df99291c5aa38`, React/React DOM 19.2.8, Vue 3.5.40, Svelte 5.56.8, and Vite 8.2.0. The Vite plugins were React 6.0.5, Vue 6.0.8, and Svelte 7.2.0.
2292
-
2293
- ### Fixture
2294
-
2295
- - 1,000 keyed rows with matching visible content and controls.
2296
- - Each row owns local editing state and conditionally creates a read-only input.
2297
- - Operations run in order: edit row 500, reverse, remove row 500, re-add row 500.
2298
- - Edit and reverse retain row 500 DOM identity; reverse also retains its input and editing state.
2299
- - Removal disconnects the old row and input; re-add creates fresh non-editing DOM and state.
2300
- - All 28 measured browser profiles passed content, order, identity, and reset checks.
2301
-
2302
- Kudzu emitted pre-rendered HTML plus capability ESM. React, Vue, and Svelte used Vite production CSR from an empty shell. Browser operation timing started only after each target had 1,000 rows, so it excludes initial rendering. Total output and JavaScript sizes are not architecture-equivalent comparisons.
2303
-
2304
- ### Method
2305
-
2306
- - Builds: one clean warm-up per target, then seven clean measured builds in round-robin rotated order; cleanup remained outside timing.
2307
- - Browser: 31 round-robin rotated unthrottled runs per target, each in a fresh Chrome profile. A separate seven-profile run used 4x CDP CPU throttling.
2308
- - Timing: one in-page promise installs a <code>MutationObserver</code>, records <code>performance.now()</code>, dispatches the click, and resolves only after terminal DOM and identity predicates pass.
2309
- - Initial JavaScript: unique external module-script/static-import closure plus inline module bodies. Raw size is summed bytes; gzip is one deterministic compression over path-sorted concatenated bytes.
2310
- - Total output: sum of all regular production files.
2311
-
2312
- ### Medians
2313
-
2314
- | Target | Initial rows | JS raw | JS gzip | Total output | Build | Edit | Reverse | Remove | Re-add |
2315
- |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|
2316
- | Kudzu | Yes | 26,117 B | 8,610 B | 940,710 B | 238.051 ms | 0.5 ms | 4.2 ms | 1.3 ms | 1.9 ms |
2317
- | React CSR | No | 191,163 B | 59,564 B | 191,260 B | 185.665 ms | 2.1 ms | 7.5 ms | 2.4 ms | 1.9 ms |
2318
- | Vue CSR | No | 61,652 B | 24,018 B | 61,749 B | 198.550 ms | 0.9 ms | 3.8 ms | 1.3 ms | 0.9 ms |
2319
- | Svelte CSR | No | 35,208 B | 13,686 B | 35,305 B | 279.240 ms | 0.8 ms | 20.1 ms | 1.6 ms | 1.3 ms |
2320
-
2321
- ### Raw Build Times
2322
-
2323
- ```text
2324
- Kudzu: [235.435, 238.051, 237.118, 250.086, 254.562, 251.422, 237.609]
2325
- React: [187.010, 185.665, 186.299, 185.506, 183.472, 186.375, 184.815]
2326
- Vue: [200.253, 198.494, 197.007, 203.240, 198.550, 197.475, 200.469]
2327
- Svelte:[281.211, 285.172, 278.421, 279.240, 277.810, 279.036, 281.426]
2328
- ```
2329
-
2330
- ### Corrected Browser Distributions
2331
-
2332
- The first seven-profile run used external CDP polling and was discarded: protocol roundtrips added roughly 42–49 ms to reverse and produced unstable 4–10 ms bands for short operations. The corrected run measures completion entirely in-page. Values below are min / median / max across 31 fresh profiles.
2333
-
2334
- | Target | Edit | Reverse | Remove | Re-add |
2335
- |---|---:|---:|---:|---:|
2336
- | Kudzu | 0.3 / 0.5 / 0.6 | 3.7 / 4.2 / 4.8 | 0.9 / 1.3 / 1.8 | 1.7 / 1.9 / 3.0 |
2337
- | React CSR | 1.9 / 2.1 / 2.4 | 7.1 / 7.5 / 8.3 | 2.0 / 2.4 / 3.4 | 1.7 / 1.9 / 2.7 |
2338
- | Vue CSR | 0.7 / 0.9 / 1.0 | 3.5 / 3.8 / 4.1 | 1.1 / 1.3 / 1.6 | 0.8 / 0.9 / 1.2 |
2339
- | Svelte CSR | 0.6 / 0.8 / 1.2 | 19.2 / 20.1 / 21.6 | 1.4 / 1.6 / 1.8 | 1.2 / 1.3 / 1.5 |
2340
-
2341
- ### Corrected 4x CPU Medians
2342
-
2343
- | Target | Edit | Reverse | Remove | Re-add |
2344
- |---|---:|---:|---:|---:|
2345
- | Kudzu | 2.3 ms | 17.3 ms | 5.9 ms | 8.6 ms |
2346
- | React CSR | 8.5 ms | 30.3 ms | 10.5 ms | 8.4 ms |
2347
- | Vue CSR | 3.2 ms | 14.8 ms | 5.4 ms | 4.1 ms |
2348
- | Svelte CSR | 3.5 ms | 78.6 ms | 6.3 ms | 6.1 ms |
2349
-
2350
- The observer validates DOM mutation completion, not paint or compositor presentation. Synthetic clicks exclude hardware input latency, and 0.1 ms timer quantization matters for sub-millisecond edits. The fixture measures one keyed local-state workload, not general framework performance.
2351
-
2352
- ## 2026-08-03 Structural SVG And Link Lowering
2353
-
2354
- Measured on Intel Core i5-9500 (6 cores), 32 GB RAM, Linux 6.17.0-19-generic, Node 24.14.0, npm 11.9.0, and Chrome 142.0.7444.175. The worktree was based on Kudzu 0.7.21 with the unreleased structural SVG and React Router `Link` changes.
2355
-
2356
- The structural fixture rendered 1,000 keyed rows plus one reactive conditional. SVG and HTML targets used the same state and operation sequence: conditional toggle, row 500 update, reverse, row 500 removal, and one append. All 31 fresh profiles per target passed content, namespace, and retained reverse-identity checks. Builds received one clean warm-up followed by seven clean round-robin runs; cleanup was outside timing. Browser targets alternated order across 31 fresh profiles each, with completion measured in-page by `MutationObserver`.
2357
-
2358
- ### Medians
2359
-
2360
- | Target | Build | JS raw | JS gzip | Total output | Conditional | Update | Reverse | Remove | Add |
2361
- |---|---:|---:|---:|---:|---:|---:|---:|---:|---:|
2362
- | SVG | 404.291 ms | 23,989 B | 8,079 B | 149,500 B | 0.8 ms | 1.9 ms | 8.3 ms | 2.4 ms | 3.5 ms |
2363
- | HTML control | 391.427 ms | 23,656 B | 8,000 B | 144,894 B | 0.7 ms | 1.8 ms | 8.3 ms | 2.5 ms | 3.6 ms |
2364
-
2365
- SVG added 333 B raw / 79 B aggregate gzip JavaScript to this matched capability graph. Its build median was 3.29% higher. Browser medians differed by +0.1 ms conditional, +0.1 ms update, 0.0 ms reverse, -0.1 ms remove, and -0.1 ms add. The sub-millisecond differences are within timer quantization and overlapping fresh-profile ranges; no material SVG browser regression was established.
2366
-
2367
- The static `Link` fixture and an already base-prefixed native-anchor control emitted byte-identical 248 B HTML, zero JavaScript, and no other files. Their clean build medians were 269.386 ms and 267.514 ms respectively, a 0.70% difference within the observed run variation.
2368
-
2369
- ### Raw Build Times
2370
-
2371
- ```text
2372
- SVG: [379.646, 389.564, 435.431, 429.248, 423.114, 395.475, 404.291]
2373
- HTML: [373.381, 379.176, 420.158, 431.850, 401.762, 391.427, 381.916]
2374
- Link: [255.944, 276.585, 262.099, 322.057, 269.386, 259.338, 302.837]
2375
- Anchor:[262.150, 267.514, 262.529, 272.420, 270.237, 261.387, 279.634]
2376
- ```
2377
-
2378
- ### Raw Browser Times
2379
-
2380
- ```text
2381
- SVG conditional: [0.8,0.8,0.7,0.8,0.7,1.5,1.0,0.8,0.9,0.8,0.8,0.7,0.8,1.1,0.6,0.6,0.7,0.9,0.7,0.8,0.9,1.5,0.9,0.8,0.8,0.8,0.7,1.0,0.7,0.6,0.9]
2382
- SVG update: [1.9,1.7,1.8,1.5,1.7,2.2,2.2,2.8,2.0,1.9,1.7,2.9,1.7,1.9,1.7,1.6,1.9,1.9,1.9,1.8,3.8,3.3,2.1,3.3,1.8,1.7,1.7,1.8,1.9,1.7,1.9]
2383
- SVG reverse: [9.1,7.9,8.3,7.4,7.9,12.7,12.5,10.2,12.8,8.0,7.9,10.0,7.9,8.4,7.7,7.5,7.3,9.1,8.6,9.0,9.8,9.1,9.2,9.9,8.0,8.2,7.7,7.9,7.8,8.4,7.6]
2384
- SVG remove: [2.4,2.1,2.5,2.2,2.3,3.4,3.3,4.1,8.9,2.7,2.2,2.7,2.3,2.6,3.2,2.3,2.1,3.0,2.3,2.6,3.6,4.1,6.3,2.4,2.5,2.1,2.3,2.2,2.3,2.1,2.3]
2385
- SVG add: [3.4,3.3,4.4,2.9,3.1,8.1,5.3,13.0,4.1,6.0,3.2,4.0,3.4,3.6,4.4,3.1,3.0,4.0,3.6,4.0,6.4,4.3,4.9,3.5,3.3,2.9,3.3,2.9,3.4,3.1,3.2]
2386
- HTML conditional:[0.6,0.6,0.6,0.5,0.8,0.8,2.0,4.1,0.8,0.7,2.6,0.7,0.6,0.6,0.7,0.6,0.6,0.6,1.0,0.7,0.7,0.7,1.1,0.8,0.9,0.9,0.7,0.7,0.7,1.5,0.7]
2387
- HTML update: [1.9,1.7,1.8,1.7,2.2,2.8,2.2,1.8,1.8,2.0,1.9,1.8,1.7,1.8,1.7,1.6,1.5,1.4,1.9,2.2,2.6,5.1,2.0,2.8,2.1,1.9,1.7,1.8,1.7,1.8,1.9]
2388
- HTML reverse: [7.4,6.4,6.9,7.3,10.6,10.3,15.3,27.8,8.4,11.6,7.2,8.8,7.1,6.9,6.6,6.5,6.2,6.2,10.3,11.6,8.2,10.6,14.2,11.3,8.5,8.4,7.0,8.6,8.3,6.7,7.0]
2389
- HTML remove: [2.6,2.1,2.2,2.3,3.6,3.7,6.1,10.2,2.4,3.4,2.4,4.7,2.0,2.2,2.0,2.3,2.1,2.1,3.0,3.7,2.3,3.0,2.8,7.0,5.1,2.8,2.3,2.2,2.6,2.5,2.2]
2390
- HTML add: [3.7,3.2,3.1,3.7,4.2,6.6,11.7,8.8,3.3,6.7,3.3,5.5,3.1,3.0,3.0,3.3,2.9,2.9,8.7,7.9,3.3,5.6,4.2,6.0,3.8,7.0,3.3,3.3,3.2,3.3,3.6]
2391
- ```
2392
-
2393
- The browser ranges were SVG conditional 0.6–1.5 ms, update 1.5–3.8 ms, reverse 7.3–12.8 ms, remove 2.1–8.9 ms, add 2.9–13.0 ms; HTML conditional 0.5–4.1 ms, update 1.4–5.1 ms, reverse 6.2–27.8 ms, remove 2.0–10.2 ms, add 2.9–11.7 ms. Measurements cover DOM mutation completion, not paint/compositing, and use unthrottled synthetic clicks. The SVG and HTML markup is behavior-matched but not byte-identical, so total HTML/output differences are not attributed solely to namespace support.
2394
-
2395
- The maintained Worker benchmark also passed on this worktree: build runs `[874.5, 778.5, 757.3, 880.3, 713.7, 672.8, 515.3]` ms, median 757.3 ms; Worker graph 907 B raw / 477 B gzip; window graph 11,960 B raw / 5,353 B gzip. Its historical M3 build timings are not comparable to this Linux machine.
2396
-
2397
- ## 2026-08-04 Large React Migration
2398
-
2399
- Measured on Intel Core i5-9500, Linux 6.17.0-19-generic, Node 24.14.0, npm 11.9.0, and Chrome 142.0.7444.175. The worktree was based on Kudzu 0.7.25 with unreleased React-compatible JSX typing, setter-adapter component specialization, and TypeScript-only collection-wrapper unwrapping.
2400
-
2401
- The generated Trailboard fixture contains 2,000 imported records, 500 initially rendered keyed cards, one reactive search reducing the list to one card, one keyed row-local state update, and 53 routes including 50 report pages. React/Vite has 60 source files, 2,561 lines, and 279,966 bytes; Kudzu has 58 source files, 2,440 lines, and 273,752 bytes because file routes replace the React root/router entries.
2402
-
2403
- Builds received one warm-up followed by seven alternating clean TypeScript-check plus production-build runs. Browser targets alternated across seven runs, each with a new Chrome profile and warm local server. An in-page async evaluation measured navigation start to the expected 500-card DOM, event dispatch to the one-card filtered DOM, and click dispatch to the row-local state attribute update.
2404
-
2405
- ### Medians
2406
-
2407
- | Metric | React/Vite | Kudzu | Kudzu difference |
2408
- |---|---:|---:|---:|
2409
- | Clean typecheck + build | 3,188.27 ms | 2,759.69 ms | -13.44% |
2410
- | Initial 500-card DOM | 261.80 ms | 280.10 ms | +6.99% |
2411
- | Filter 500 cards to one | 13.90 ms | 28.30 ms | +103.60% |
2412
- | Toggle keyed row state | 5.80 ms | 5.30 ms | -8.62% |
2413
- | JavaScript gzip | 97,885 B | 12,191 B | -87.55% |
2414
-
2415
- Kudzu's filter path is the clear loss in this fixture and is the next measured optimization candidate. Initial readiness and row-local state are in overlapping fresh-profile ranges, while the build and JavaScript-size wins are material.
2416
-
2417
- ### Selector Optimization Follow-up
2418
-
2419
- The collection evaluator was changed to cache selector state reads for one execution and avoid recursive rest-array allocation, `slice()`, and `map()` in hot expression nodes. A second seven-run alternating fresh-profile measurement used the same fixture and method.
2420
-
2421
- | Metric | Baseline | Optimized | Change |
2422
- |---|---:|---:|---:|
2423
- | Kudzu filter 500 cards to one | 28.30 ms | 22.00 ms | -22.26% |
2424
- | React filter control | 13.90 ms | 13.60 ms | -2.16% |
2425
- | Kudzu gap versus React | +103.60% | +61.76% | -41.84 points |
2426
- | Kudzu JavaScript gzip | 12,191 B | 12,310 B | +0.98% |
2427
-
2428
- The allocation/state-cache change materially improves the path without changing list ownership or cleanup semantics. The remaining gap is concentrated in generic keyed reconciliation and per-row ownership cleanup when 499 mounted rows are removed at once. An attempted detached batch cleanup was discarded because it broke the remove-all/add-new-key transition; it is not part of the retained change.
2429
-
2430
- ```text
2431
- Optimized Kudzu filter: [22.8, 22.5, 20.8, 19.2, 22.0, 22.5, 20.7]
2432
- Optimized React filter: [14.9, 14.9, 15.6, 12.9, 13.6, 13.4, 12.9]
2433
- ```
2434
-
2435
- ### Indexed Row Release Follow-up
2436
-
2437
- Profiling separated selector evaluation, which took about 3 ms, from the remaining per-row lifecycle work. The compiler now marks keyed rows for direct state-indexed release only when they have row-local state but no row effects, nested lists, or shared text targets. Binding and condition registrations are released by state ID; all other row shapes retain the existing DOM-owned unmount path.
2438
-
2439
- Because the seven-run ranges overlapped, the final isolated measurement used one warm-up and 21 alternating samples:
2440
-
2441
- | Metric | React/Vite | Kudzu | Kudzu difference |
2442
- |---|---:|---:|---:|
2443
- | Clean typecheck + build | 3,024.33 ms | 2,664.58 ms | -11.90% |
2444
- | Initial 500-card DOM | 256.90 ms | 256.00 ms | -0.35% |
2445
- | Filter 500 cards to one | 13.90 ms | 13.50 ms | -2.88% |
2446
- | Toggle keyed row state | 5.70 ms | 5.30 ms | -7.02% |
2447
- | JavaScript gzip | 97,885 B | 12,442 B | -87.29% |
2448
-
2449
- The final Kudzu filter median is 52.30% below the preserved 28.30 ms baseline and 2.88% faster than React on the matched operation. The fast path adds 132 B gzip over the selector-only follow-up. Raw 21-run arrays and generated reports are stored in the benchmark fixture.
2450
-
2451
- ### Artifacts
2452
-
2453
- | Target | HTML raw / gzip | CSS raw / gzip | JS raw / gzip |
2454
- |---|---:|---:|---:|
2455
- | React/Vite | 168 / 143 B | 3,649 / 1,365 B | 465,830 / 97,885 B |
2456
- | Kudzu | 702,854 / 65,355 B | 4,225 / 1,442 B | 30,175 / 12,191 B |
2457
-
2458
- React/Vite emits one CSR shell, while Kudzu's HTML total includes 53 complete documents. The initial-readiness comparison therefore measures the product delivery difference rather than equivalent markup. Gzip totals sum files independently; clients do not download all 53 Kudzu documents for one route.
2459
-
2460
- ### Raw Build Times
2461
-
2462
- ```text
2463
- React: [3156.83, 3190.33, 3155.66, 3188.27, 3115.12, 3201.29, 3268.69]
2464
- Kudzu: [2777.83, 2792.51, 2659.28, 2655.26, 2706.48, 2759.69, 2812.61]
2465
- ```
2466
-
2467
- ### Raw Browser Times
2468
-
2469
- ```text
2470
- React initial: [293.3, 230.8, 272.6, 292.0, 261.8, 261.8, 235.7]
2471
- Kudzu initial: [277.3, 280.6, 287.9, 292.4, 276.1, 254.8, 280.1]
2472
- React filter: [13.9, 15.5, 15.3, 14.4, 13.0, 13.5, 13.8]
2473
- Kudzu filter: [28.3, 31.7, 29.1, 28.9, 26.4, 24.4, 24.1]
2474
- React toggle: [5.7, 6.1, 5.8, 5.8, 5.6, 5.8, 5.7]
2475
- Kudzu toggle: [5.2, 5.4, 5.3, 5.6, 5.3, 5.2, 5.3]
2476
- ```
2477
-
2478
- The original fixture and harness were stored in an excluded local workspace and are unavailable from this checkout. The arrays above remain historical provenance, not an independently reproducible current claim.