@kudzujs/core 0.8.61 → 0.9.0

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 (49) hide show
  1. package/MIGRATION_ROADMAP.md +37 -1
  2. package/PERFORMANCE.md +79 -1
  3. package/README.md +2 -2
  4. package/RELEASES.md +58 -0
  5. package/bin/kudzu.mjs +10 -1
  6. package/docs/next-architecture/0.9-baseline.md +1199 -0
  7. package/docs/next-architecture/0.9-benchmark-contracts.md +507 -0
  8. package/docs/next-architecture/0.9-component-property-contract.md +89 -0
  9. package/docs/next-architecture/0.9-compression-ledger.md +227 -0
  10. package/docs/next-architecture/0.9-final-proof-audit.md +176 -0
  11. package/docs/next-architecture/0.9-implementation-plan.md +1819 -0
  12. package/docs/next-architecture/0.9-resource-lifecycle.md +118 -0
  13. package/docs/next-architecture/0.9-semantic-compression.md +384 -0
  14. package/docs/next-architecture/README.md +16 -12
  15. package/docs/next-architecture/compiler-current-architecture.md +7 -7
  16. package/docs/next-architecture/large-application-ai-native-roadmap.md +6 -4
  17. package/docs/next-architecture/versioning.md +3 -2
  18. package/framework/README.md +3 -1
  19. package/framework/binding-runtime.js +4 -4
  20. package/framework/build.mjs +135 -30
  21. package/framework/compiler/ast-helpers.mjs +5 -0
  22. package/framework/compiler/browser-signal-passes.mjs +2 -7
  23. package/framework/compiler/collection-analysis.mjs +4 -0
  24. package/framework/compiler/descriptor-session.mjs +36 -12
  25. package/framework/compiler/effect-analysis.mjs +28 -8
  26. package/framework/compiler/effect-codegen.mjs +79 -36
  27. package/framework/compiler/effect-private-ref-pass.mjs +4 -8
  28. package/framework/compiler/handler-lowering.mjs +12 -7
  29. package/framework/compiler/ir/module-ir.mjs +26 -4
  30. package/framework/compiler/list-runtime-codegen.mjs +4 -2
  31. package/framework/compiler/optimize/command-specialization.mjs +4 -7
  32. package/framework/compiler/outside-click-pass.mjs +79 -0
  33. package/framework/compiler/react-migration-pass.mjs +27 -1
  34. package/framework/compiler/route-artifact-report.mjs +4 -3
  35. package/framework/compiler/route-build-record.mjs +12 -0
  36. package/framework/compiler/route-capability-planner.mjs +3 -3
  37. package/framework/compiler/route-ir.mjs +27 -11
  38. package/framework/compiler/runtime-codegen.mjs +2 -2
  39. package/framework/compiler/source-compiler.mjs +407 -74
  40. package/framework/core.d.ts +1 -0
  41. package/framework/core.mjs +18 -5
  42. package/framework/dependency-runtime.js +1 -1
  43. package/framework/effect-runtime.js +2 -2
  44. package/framework/list-runtime.js +67 -24
  45. package/framework/native-runtime.js +12 -9
  46. package/framework/runtime.js +1 -1
  47. package/framework/serialization.js +13 -6
  48. package/framework/shared-runtime.js +14 -12
  49. package/package.json +1 -1
@@ -0,0 +1,1199 @@
1
+ # Kudzu 0.9 Baseline Ledger
2
+
3
+ ## Status
4
+
5
+ This is the dated architecture and complexity ledger produced by `0.9.0-01 / Session 01A`. It records the production baseline before 0.9 semantic implementation begins.
6
+
7
+ ```text
8
+ Session: 0.9.0-01A Architecture And Complexity Ledger
9
+ Measured at: 2026-08-18T12:06:07Z
10
+ Production baseline revision: bada14585d112de8debf75a2bf914e9d5e0769ed
11
+ Package version: 0.8.62
12
+ Completed sessions: 01A Architecture And Complexity Ledger; 01B Output And Capability Baseline; 01C Correctness And Browser Baseline; 01D Kudzu-Only Performance Baseline; 01E Restore The Maintained Cross-Framework Harness; 01F Cross-Framework Contract; 01G Baseline Sign-Off
13
+ Next work: 0.9.0-07 / 10,000-Route Peak RSS
14
+ ```
15
+
16
+ The baseline revision contains the 0.9 direction and implementation-plan documents but no production compiler or browser-runtime change. This ledger is a documentation-only continuation of that production baseline.
17
+
18
+ ## Workspace And Environment
19
+
20
+ | Field | Value |
21
+ |---|---|
22
+ | Branch | `main` |
23
+ | Upstream state at measurement | one local documentation commit ahead of `origin/main` |
24
+ | Untracked unrelated file | `.DS_Store` |
25
+ | Node | `v24.14.0` |
26
+ | npm | `11.9.0` |
27
+ | Operating system | macOS 26.5, build 25F71 |
28
+ | Architecture | `arm64` |
29
+ | CPU | Apple M4 |
30
+ | Logical CPUs | 10 |
31
+ | Memory | 17,179,869,184 bytes, 16 GiB |
32
+
33
+ Reproduction commands:
34
+
35
+ ```bash
36
+ git rev-parse HEAD
37
+ git status --short --branch
38
+ node --version
39
+ npm --version
40
+ sw_vers
41
+ uname -m
42
+ sysctl -n machdep.cpu.brand_string
43
+ sysctl -n hw.logicalcpu
44
+ sysctl -n hw.memsize
45
+ ```
46
+
47
+ The unrelated `.DS_Store` is excluded from every baseline count and future commit.
48
+
49
+ ## Compiler Stage Baseline
50
+
51
+ ```text
52
+ source graph and ProjectSession
53
+ -> ordered normalization
54
+ -> source-local binding index
55
+ -> main source-local semantic transformer
56
+ -> ComponentAnalysis v2 and ModuleIR v2 finalization
57
+ -> fail-closed ModuleIR reference validation
58
+ -> TypeScript transpilation
59
+ -> build-time route execution
60
+ -> RouteIR v1 and RouteBuildRecord
61
+ -> CapabilityIR v1 and runtime-family planning
62
+ -> route-specific artifact emission
63
+ ```
64
+
65
+ | Stage | Count | Qualification |
66
+ |---|---:|---|
67
+ | Ordered page normalization entries | 15 | Page compilation supplies an `importedStaticCollections` map, including an empty map. |
68
+ | Ordered imported-declaration normalization entries | 14 | Imported declaration normalization omits the conditional static-collection entry. |
69
+ | Source-local binding-index stage | 1 | Runs after normalization. |
70
+ | Main semantic transformer | 1 | `createKudzuTransformer()` remains the principal coupling point. |
71
+ | ModuleIR structural validation boundary | 1 | Runs before build-module generation. |
72
+ | RouteIR validation boundary | 1 | Runs before route artifact selection. |
73
+ | CapabilityIR projection/validation boundary | 1 | Runs before runtime-family emission. |
74
+
75
+ These counts prevent a false pass-count improvement produced by moving a decision into the main transformer or renaming a pass.
76
+
77
+ ## Ordered Normalization Baseline
78
+
79
+ | Order | Exact entry | Classification | Canonical effect |
80
+ |---:|---|---|---|
81
+ | 1 | `normalizeImportedStaticCollections()` | Transform | Replaces a direct mapped named immutable imported collection with its serializable array literal. |
82
+ | 2 | `normalizeReactRouterSyntax()` | Compatibility adapter | Erases supported Router syntax and lowers it to native navigation or Kudzu route signals. |
83
+ | 3 | `normalizeClsxSyntax()` | Compatibility adapter | Validates supported `clsx()` arguments, lowers them to primitive concatenation/conditions, and removes the used import. |
84
+ | 4 | `normalizeMediaQueryExternalStores()` | Mixed proof/transform | Proves static `matchMedia` subscribe/snapshot/cleanup ownership and rewrites it to ordinary state plus an owned effect. |
85
+ | 5 | `normalizeReactMigrationSyntax()` | Compatibility adapter | Validates and erases supported React imports, hooks, fragments, and wrappers. |
86
+ | 6 | `normalizeNavigatorCapabilityConditions()` | Mixed proof/transform | Proves one static navigator capability condition and rewrites it to false state plus a mount effect. |
87
+ | 7 | `normalizeParameterizedDebounceHooks()` | Mixed proof/transform | Proves the supported debounce lifecycle and canonicalizes initialization and dependencies. |
88
+ | 8 | `normalizeOutsideClickHooks()` | Mixed proof/transform | Proves the supported listener/containment/cleanup hook and canonicalizes callback value/dependencies. |
89
+ | 9 | `normalizeEffectPrivateRefs()` | Mixed proof/transform | Proves one-effect ownership and moves mutable ref objects into the effect invocation closure. |
90
+ | 10 | `normalizeCustomHookTimerRefs()` | Mixed proof/transform | Proves the private timeout lifecycle and lowers its ref to compiler-owned state metadata. |
91
+ | 11 | `validateUseIdSyntax()` | Validator | Validates zero arguments and one top-level component declaration without changing source. |
92
+ | 12 | `normalizeLazyStateInitializers()` | Mixed proof/transform | Proves serializable state/reducer initialization and replaces supported lazy forms with direct literals. |
93
+ | 13 | `normalizeZustandMigrationSyntax()` | Compatibility adapter | Validates reduced Zustand syntax, erases the package import, and emits package-neutral shared-state creation syntax. |
94
+ | 14 | `normalizeRenderControlFlow()` | Transform | Canonicalizes supported assignment/return control flow into immutable declarations and conditions. |
95
+ | 15 | `workerCompiler.rejectOrdinaryImports()` | Validator | Rejects ordinary runtime imports or re-exports of Worker entry modules. |
96
+
97
+ | Classification | Count |
98
+ |---|---:|
99
+ | Compatibility adapter | 4 |
100
+ | Mixed semantic proof/transform | 7 |
101
+ | Package-neutral transform | 2 |
102
+ | Validator | 2 |
103
+ | Total | 15 |
104
+
105
+ Important qualifications:
106
+
107
+ - Entry 1 is conditional and absent when `importedStaticCollections` is not supplied.
108
+ - Outside-click normalization canonicalizes an authored effect hook; existing effect compilation establishes final ownership.
109
+ - React normalization handles supported source references, while later compilation and surviving-reference validation enforce the complete no-React output boundary.
110
+ - Validators count as ordered pipeline entries but not as transforms.
111
+
112
+ Code owner: `framework/compiler/source-compiler.mjs`, `normalizeCompilerSource()`.
113
+
114
+ ## Semantic Kernel To Current Contracts
115
+
116
+ | Semantic concept | Current compiler representation | Current browser representation |
117
+ |---|---|---|
118
+ | Value | Serializable literals, captures, tagged pure expressions | Direct values or deserialized route-owned captures |
119
+ | State | `SignalIR`, ComponentAnalysis state, concrete RouteIR state | Logical state slots with synchronous writes and batched commits |
120
+ | Derived | Tagged `DerivedIR` expression/selector records | `collection-selector.js` when a route needs derived effect/list evaluation |
121
+ | Operation | Command `HandlerIR`, native `HandlerIR`, `SharedActionIR` references | Direct command execution or route-owned handler ESM |
122
+ | Event | Route event descriptors and native handler records | Specialized command listeners or route-owned native listeners |
123
+ | Effect | `EffectIR` setup, cleanup, dependencies, subscriptions, ownership | Route-specific effect entries plus capability-selected effect runtime |
124
+ | Resource | Effect-owned authored lifecycle and invocation-private closures | Authored resource object in one owned effect invocation |
125
+ | Range | Route, conditional, keyed, and navigation ownership descriptors | Direct owned DOM ranges without a component tree |
126
+ | Navigation | Native links plus explicit navigation-group artifacts | Native documents by default; optional group-specific navigation ESM |
127
+ | Ownership | `OwnerRef`, ComponentAnalysis, KeyedBlockIR, RouteIR owner fields | Route/layout/conditional/keyed registration and release |
128
+
129
+ No additional Semantic Kernel concept is authorized by this baseline.
130
+
131
+ ## ModuleIR v2 Baseline
132
+
133
+ `createModuleIR()` returns:
134
+
135
+ ```text
136
+ version
137
+ file
138
+ symbols[]
139
+ sharedStates[]
140
+ sharedActions[]
141
+ signals[]
142
+ handlers[]
143
+ bindings[]
144
+ derived[]
145
+ effects[]
146
+ keyedBlocks[]
147
+ imports[]
148
+ clientModules[]
149
+ ```
150
+
151
+ | Slot collection | Record kind |
152
+ |---|---|
153
+ | `symbols[]` | `SymbolRef` |
154
+ | `sharedStates[]` | `SharedStateIR` |
155
+ | `sharedActions[]` | `SharedActionIR` |
156
+ | `signals[]` | `SignalIR` |
157
+ | `handlers[]` | `HandlerIR` |
158
+ | `bindings[]` | `BindingIR` |
159
+ | `derived[]` | `DerivedIR` |
160
+ | `effects[]` | `EffectIR` |
161
+ | `keyedBlocks[]` | `KeyedBlockIR` |
162
+ | `imports[]` | `ImportIR` |
163
+
164
+ `clientModules[]` is a path list, not an indexed IR record kind. ComponentAnalysis v2, RouteIR v1, RouteBuildRecord, and CapabilityIR v1 are separate contracts and are not counted as ModuleIR record kinds.
165
+
166
+ ## ModuleIR Structural References
167
+
168
+ | Producer | Structural target |
169
+ |---|---|
170
+ | `SharedActionIR.state` | `SharedStateIR` |
171
+ | `SignalIR.reference.kind = symbol` | `SymbolRef` |
172
+ | `SignalIR.reference.kind = shared-state` | `SharedStateIR` |
173
+ | `SignalIR.reference.kind = state` | ComponentAnalysis owner/specialization state through `OwnerRef` |
174
+ | `HandlerIR.commands/signals` | `SignalIR` |
175
+ | `HandlerIR.imports` | `ImportIR` |
176
+ | `HandlerIR.captures` | `SymbolRef` |
177
+ | `HandlerIR.actions` | `SharedActionIR` |
178
+ | `HandlerIR.keyedBlock` | `KeyedBlockIR` |
179
+ | `BindingIR.signals/imports/captures/keyedBlock` | `SignalIR`, `ImportIR`, `SymbolRef`, `KeyedBlockIR` |
180
+ | `DerivedIR.signals` | `SignalIR` |
181
+ | `EffectIR.setup.handler` | Effect-role `HandlerIR` |
182
+ | `EffectIR dependencies` | `SignalIR` or `DerivedIR` plus source `SignalIR` records |
183
+ | `EffectIR ownership` | `OwnerRef` and optional `KeyedBlockIR` |
184
+ | `KeyedBlockIR collection` | `SignalIR`, `BindingIR`, `SymbolRef`, or static data |
185
+ | `KeyedBlockIR parent/children` | Reciprocal acyclic `KeyedBlockIR` references |
186
+ | `KeyedBlockIR.selector` | `DerivedIR` |
187
+ | `KeyedBlockIR row state/ref` | `SignalIR` and ComponentAnalysis specialization ref |
188
+
189
+ Every indexed record slot equals its array index. Module handler and binding export names share one uniqueness boundary. Ownership cycles and broken keyed reciprocity fail before code generation.
190
+
191
+ Code owner: `framework/compiler/ir/module-ir.mjs`, `assertModuleIRReferences()`.
192
+
193
+ ## ComponentAnalysis v2 Baseline
194
+
195
+ ComponentAnalysis is separate from ModuleIR:
196
+
197
+ ```text
198
+ version
199
+ file
200
+ owners[]
201
+ specializations[]
202
+ ```
203
+
204
+ Owners contain props, states, setters, refs, IDs, source/site provenance, and optional external ownership. Specializations contain call-site props, state, refs, IDs, OwnerRefs, and SignalIR prop links. Browser output does not retain component records.
205
+
206
+ ## CapabilityIR v1 Baseline
207
+
208
+ CapabilityIR contains seven sections:
209
+
210
+ ```text
211
+ routes
212
+ events
213
+ bindings
214
+ lists
215
+ effects
216
+ captures
217
+ runtime
218
+ ```
219
+
220
+ | Section | Current fields |
221
+ |---|---|
222
+ | `routes` | `behaviors`, `regularBehaviors`, `regularStateSeeds`, `dependencyStateSeeds` |
223
+ | `events` | command event names, native event names, `hasNativeHandlers` |
224
+ | `bindings` | count, text binding, SVG conditions |
225
+ | `effects` | any, derived dependencies, item dependencies, captures, navigable effects, navigable owners |
226
+ | `captures` | nested state and setter capture flags |
227
+ | `runtime` | shared and dependency runtime flags |
228
+
229
+ Current list fields:
230
+
231
+ ```text
232
+ count, styleCount, conditions, svg, deepConditions, textRanges,
233
+ attributes, events, expressions, expressionAttributes, seeds, effects,
234
+ rowHooks, rowRefs, complexRowState, nested, selectors, calculated,
235
+ static, indexes, stableFastPaths, generalRowHooks, asyncParts, mounts
236
+ ```
237
+
238
+ Standalone interactive routes with identical signatures share one runtime family. Enhanced-navigation groups receive one union family. Static routes outside navigation groups receive no runtime family.
239
+
240
+ ## Browser Capability Concept Baseline
241
+
242
+ | Concept | Selected output | Selection boundary |
243
+ |---|---|---|
244
+ | Logical state and commit core | `kudzu.js` | Interactive route without the narrow dependency-only core |
245
+ | Narrow dependency core | `kudzu-deps.js` | Non-navigable dependency effects without bindings, lists, native handlers, or owned effects |
246
+ | Capture serialization | `kudzu-serialization.js` | Bindings, native handlers, or effect captures |
247
+ | Effect invocation and invalidation | `kudzu-effect.js` | Any retained effect |
248
+ | Style serialization | `kudzu-style.js` | Bindings or list style updates |
249
+ | Direct DOM bindings and conditions | `kudzu-binding.js` | Any retained binding |
250
+ | Tagged derived/selector evaluation | `kudzu-collection-selector.js` | Derived effect dependencies or list selectors |
251
+ | Keyed list/range ownership | `kudzu-list.js` | Any retained keyed list |
252
+ | Native event handlers | `kudzu-native.js` | Any retained native handler |
253
+ | Opt-in warm navigation | `kudzu-navigation.js` or group file | Configured navigation group only |
254
+
255
+ `kudzu.js` and `kudzu-deps.js` are alternative cores, not modules loaded together.
256
+
257
+ Route-specific artifacts are separate from shared runtime concepts:
258
+
259
+ - runtime path/search-parameter entries;
260
+ - effect setup entries;
261
+ - native handler entries;
262
+ - retained handler/evaluator ESM;
263
+ - browser-only package chunks;
264
+ - effect-owned Worker graphs.
265
+
266
+ ## LOC Baseline
267
+
268
+ LOC includes blank lines and comments and uses `wc -l` over explicit tracked files.
269
+
270
+ ### Core Semantic Compiler
271
+
272
+ ```bash
273
+ wc -l framework/compiler/source-compiler.mjs framework/compiler/descriptor-session.mjs framework/compiler/handler-lowering.mjs framework/compiler/effect-analysis.mjs framework/compiler/collection-analysis.mjs framework/compiler/normalization-pipeline.mjs framework/compiler/analysis/binding-index.mjs framework/compiler/analysis/component-analysis.mjs framework/compiler/ir/module-ir.mjs
274
+ ```
275
+
276
+ | File | LOC |
277
+ |---|---:|
278
+ | `source-compiler.mjs` | 3,404 |
279
+ | `descriptor-session.mjs` | 398 |
280
+ | `handler-lowering.mjs` | 288 |
281
+ | `effect-analysis.mjs` | 111 |
282
+ | `collection-analysis.mjs` | 187 |
283
+ | `normalization-pipeline.mjs` | 12 |
284
+ | `analysis/binding-index.mjs` | 292 |
285
+ | `analysis/component-analysis.mjs` | 55 |
286
+ | `ir/module-ir.mjs` | 214 |
287
+ | **Total** | **4,961** |
288
+
289
+ `source-compiler.mjs` is 3,404 of 4,961 measured core lines, approximately 68.6%. This is a coupling signal, not authorization to split the file without deleting semantic duplication.
290
+
291
+ ### Compatibility And Focused Normalization
292
+
293
+ ```bash
294
+ wc -l framework/compiler/react-migration-pass.mjs framework/compiler/router-pass.mjs framework/compiler/zustand-pass.mjs framework/compiler/browser-signal-passes.mjs framework/compiler/effect-private-ref-pass.mjs framework/compiler/custom-hook-timer-pass.mjs framework/compiler/outside-click-pass.mjs framework/compiler/render-control-pass.mjs
295
+ ```
296
+
297
+ | File | LOC |
298
+ |---|---:|
299
+ | `react-migration-pass.mjs` | 365 |
300
+ | `router-pass.mjs` | 245 |
301
+ | `zustand-pass.mjs` | 117 |
302
+ | `browser-signal-passes.mjs` | 182 |
303
+ | `effect-private-ref-pass.mjs` | 132 |
304
+ | `custom-hook-timer-pass.mjs` | 126 |
305
+ | `outside-click-pass.mjs` | 79 |
306
+ | `render-control-pass.mjs` | 96 |
307
+ | **Total** | **1,342** |
308
+
309
+ ### Semantic Code Generation And Browser Evaluation
310
+
311
+ ```bash
312
+ wc -l framework/compiler/handler-codegen.mjs framework/compiler/effect-codegen.mjs framework/compiler/list-runtime-codegen.mjs framework/compiler/runtime-codegen.mjs framework/compiler/codegen/command-codegen.mjs framework/collection-selector.js framework/effect-runtime.js framework/native-runtime.js framework/list-runtime.js framework/shared-runtime.js
313
+ ```
314
+
315
+ | File | LOC |
316
+ |---|---:|
317
+ | `handler-codegen.mjs` | 23 |
318
+ | `effect-codegen.mjs` | 884 |
319
+ | `list-runtime-codegen.mjs` | 95 |
320
+ | `runtime-codegen.mjs` | 146 |
321
+ | `codegen/command-codegen.mjs` | 20 |
322
+ | `collection-selector.js` | 82 |
323
+ | `effect-runtime.js` | 41 |
324
+ | `native-runtime.js` | 123 |
325
+ | `list-runtime.js` | 1,193 |
326
+ | `shared-runtime.js` | 154 |
327
+ | **Total** | **2,761** |
328
+
329
+ This measures maintained source complexity, not deployed bytes. Session 01B records emitted raw/gzip output by selected family.
330
+
331
+ ## Test Surface Baseline
332
+
333
+ ```bash
334
+ git ls-files 'test/*.test.mjs' 'test/fixtures/**' | wc -l
335
+ git ls-files 'test/*.test.mjs' | wc -l
336
+ git ls-files 'test/fixtures/**' | wc -l
337
+ npm test
338
+ ```
339
+
340
+ | Metric | Count |
341
+ |---|---:|
342
+ | Top-level Node test files | 9 |
343
+ | Tracked fixture files | 450 |
344
+ | Combined tracked test/fixture files | 459 |
345
+ | Current `npm test` tests | 233 |
346
+
347
+ Top-level files:
348
+
349
+ ```text
350
+ test/ast-helpers.test.mjs
351
+ test/binding-index.test.mjs
352
+ test/build-output.test.mjs
353
+ test/compiler-passes.test.mjs
354
+ test/create-kudzu.test.mjs
355
+ test/dev.test.mjs
356
+ test/framework.test.mjs
357
+ test/seo.test.mjs
358
+ test/source-scale.test.mjs
359
+ ```
360
+
361
+ Browser execution remains environment-sensitive unless `KUDZU_REQUIRE_CHROME=1` is set. Session 01C records the required-browser result separately.
362
+
363
+ ## Current Authority Gaps
364
+
365
+ | Area | Baseline finding |
366
+ |---|---|
367
+ | Derived | `DerivedIR` is authoritative for keyed selectors and derived effect dependencies, while reactive bindings and imported calculation fields retain separate identity paths. |
368
+ | Shared state | Zustand produces `SharedStateIR`/`SharedActionIR`; reduced Context actions use Context-specific discovery and lowering. |
369
+ | Resource | Current resource fixtures fit EffectIR and effect-private closure ownership; no ResourceIR evidence exists. |
370
+ | Component | WorkLedger now proves that immutable object-property effect/list dependencies across an ordinary component prop are unsupported; Session 05B must define the narrow semantic link. |
371
+ | Main transformer | `source-compiler.mjs` owns 68.6% of measured core LOC; convergence must precede extraction. |
372
+
373
+ ## Session 01A Completion Record
374
+
375
+ | Deliverable | Result |
376
+ |---|---|
377
+ | Production revision and environment | Recorded |
378
+ | Normalization order/classification | Recorded with 15/14 path qualification |
379
+ | Semantic Kernel map | Recorded |
380
+ | ModuleIR record/reference map | Recorded |
381
+ | ComponentAnalysis separation | Recorded |
382
+ | Capability/runtime concept map | Recorded |
383
+ | LOC commands/results | Recorded |
384
+ | `source-compiler.mjs` size | 3,404 LOC |
385
+ | Test counts | 9 files, 450 fixture files, 233 tests |
386
+ | Production code changed | No |
387
+ | Browser runtime changed | No |
388
+
389
+ ## Session 01B Output And Capability Baseline
390
+
391
+ ### Scope
392
+
393
+ Six existing fixtures cover the required representative output classes without changing production source:
394
+
395
+ | Fixture | Baseline role |
396
+ |---|---|
397
+ | `native` | Native event handlers, captures, serialization, and shared core |
398
+ | `calculated-collections` | Command events, bindings, styles, keyed lists, calculated collections, native row handlers, and static sibling |
399
+ | `effect-dependencies` | Command-only route, narrow dependency core, derived effect dependency, effect entry, and cleanup handler |
400
+ | `worker-effects` | Effect ownership, Worker graph, shared-layout navigation, plain navigation route, and static sibling |
401
+ | `runtime-params` | Runtime path parameters, bindings, native handler, effect, rewrite manifest, and static known route |
402
+ | `effect-package` | Route-owned browser package bundle, effect entry, and static package exclusion |
403
+
404
+ Build commands:
405
+
406
+ ```bash
407
+ node ../../../bin/kudzu.mjs build
408
+ ```
409
+
410
+ The command ran from each fixture root. Every fixture was built twice. Output digests include each relative deploy path, a null separator, and file bytes in sorted path order.
411
+
412
+ Raw bytes are exact file sizes. Gzip totals are the sum of `gzipSync()` output for each deploy file, matching the project's existing per-artifact accounting style.
413
+
414
+ ### Aggregate Deploy Baseline
415
+
416
+ | Fixture | Pages | Interactive | Deploy files | HTML raw/gzip | JS raw/gzip | Other raw/gzip | Deploy SHA-256 |
417
+ |---|---:|---:|---:|---:|---:|---:|---|
418
+ | `native` | 2 | 2 | 9 | 1,445 / 770 B | 5,176 / 2,832 B | 0 / 0 B | `794c0b3228ae30afed36eaca62afe57d27603e5a20e49311dfaad26e0853efd2` |
419
+ | `calculated-collections` | 3 | 2 | 17 | 7,461 / 1,871 B | 48,524 / 18,453 B | 0 / 0 B | `5c64b2ca98fca13203f4d03f4751c31eb46d235f975d257ed72cfd83c8f38390` |
420
+ | `effect-dependencies` | 2 | 2 | 9 | 1,243 / 681 B | 9,223 / 4,117 B | 0 / 0 B | `9f50a3eefd562397b38cf0f45caccd9457e4b4b6f2641234f93f71626ccb3d3f` |
421
+ | `worker-effects` | 3 | 1 | 9 | 2,502 / 1,153 B | 14,693 / 6,408 B | 0 / 0 B | `4f98e655dc65120d1aa489beff3758c1232d5b89a5d06ac6245851546d38d5e2` |
422
+ | `runtime-params` | 2 | 1 | 13 | 2,588 / 854 B | 16,813 / 7,927 B | 278 / 169 B | `1901d88cf125e5ccec22525d75808ebf09dc5f95dc0c5144232651f8300654ff` |
423
+ | `effect-package` | 2 | 1 | 6 | 676 / 421 B | 3,562,795 / 1,025,300 B | 0 / 0 B | `caee188906d23f4c45df4f543dcadca4d638a38070c59439bdf31b9e7d3260e1` |
424
+
425
+ All six second-build digests exactly matched the first build.
426
+
427
+ ### Representative Route Graphs
428
+
429
+ Route JavaScript is the sum of unique runtime requirements, route entries, retained handlers, and Worker files attributable to the representative route. Per-file gzip sizes are summed; this is not a combined archive size.
430
+
431
+ | Fixture/route | Capability | HTML raw/gzip | Unique route JS raw/gzip |
432
+ |---|---|---:|---:|
433
+ | `calculated-collections /static` | Static HTML | 223 / 178 B | 0 / 0 B |
434
+ | `effect-dependencies /command` | Command-only state operation | 458 / 294 B | 752 / 432 B |
435
+ | `native /` | Native handlers and captures | 787 / 424 B | 4,882 / 2,575 B |
436
+ | `calculated-collections /` | Commands, bindings, keyed SVG list, styles, native handlers | 6,206 / 1,244 B | 29,367 / 11,339 B |
437
+ | `effect-dependencies /` | Narrow dependency effect with derived comparison | 785 / 387 B | 8,471 / 3,685 B |
438
+ | `worker-effects /dash/dashboard` | Navigable effect and Worker graph | 1,384 / 535 B | 14,693 / 6,408 B |
439
+ | `runtime-params /포터/orgs/[org]/items/[id]` | Params, binding, native handler, effect | 2,374 / 680 B | 16,813 / 7,927 B |
440
+ | `effect-package /` | Effect-owned TypeScript package | 475 / 256 B | 3,562,795 / 1,025,300 B |
441
+
442
+ The command-only route emits only its specialized `kudzu.js` core and no external handler module. The package fixture intentionally demonstrates that a large browser-only package remains route-owned rather than becoming shared runtime cost.
443
+
444
+ ### Capability Family Baseline
445
+
446
+ | Fixture/route | Family | Runtime requirements | Route entries |
447
+ |---|---|---|---|
448
+ | `native /` | `4f01ddfa05e539fe` | `kudzu.js`, `kudzu-native.js`, `kudzu-serialization.js` | `assets/native/index.js` |
449
+ | `calculated-collections /` | `fabda65ebcd2d3ee` | `kudzu.js`, `kudzu-binding.js`, `kudzu-list.js`, `kudzu-native.js`, `kudzu-serialization.js`, `kudzu-style.js` | `assets/native/index.js` |
450
+ | `calculated-collections /ordinary` | `500271bc83c366b3` | `kudzu.js`, `kudzu-list.js`, `kudzu-native.js`, `kudzu-serialization.js` | `assets/native/ordinary/index.js` |
451
+ | `effect-dependencies /command` | `c853918db55de9b2` | `kudzu.js` | none |
452
+ | `effect-dependencies /` | `2007d3090f033665` | `kudzu-deps.js`, `kudzu-effect.js`, `kudzu-collection-selector.js`, `kudzu-serialization.js` | `assets/effects/index.js` |
453
+ | `worker-effects /dash/dashboard` | `abdadc89bb0d780c` | `kudzu.js`, `kudzu-effect.js` | effect entry and `kudzu-navigation.js` |
454
+ | `worker-effects /dash/plain` | `abdadc89bb0d780c` | `kudzu.js` through the navigation-group union family | `kudzu-navigation.js` |
455
+ | `runtime-params` dynamic route | `e169b1b30eadc6e8` | `kudzu.js`, binding, effect, native, serialization, style | params, native, and effect entries |
456
+ | `effect-package /` | `8c84431af8a7052f` | `kudzu.js`, `kudzu-effect.js` | `assets/effects/index.js` |
457
+
458
+ The Worker graph is structurally attached only to `/dash/dashboard` as `assets/workers/telemetry.worker-BVG2SA55.js`. The static route belongs to no runtime family.
459
+
460
+ ### Complete Emitted Path Baseline
461
+
462
+ `native`:
463
+
464
+ ```text
465
+ assets/handlers/pages/index.js
466
+ assets/handlers/pages/other/index.js
467
+ assets/native/index.js
468
+ assets/native/other/index.js
469
+ assets/runtime/4f01ddfa05e539fe/kudzu-native.js
470
+ assets/runtime/4f01ddfa05e539fe/kudzu-serialization.js
471
+ assets/runtime/4f01ddfa05e539fe/kudzu.js
472
+ index.html
473
+ other/index.html
474
+ ```
475
+
476
+ `calculated-collections`:
477
+
478
+ ```text
479
+ assets/handlers/pages/index.js
480
+ assets/handlers/pages/ordinary.js
481
+ assets/native/index.js
482
+ assets/native/ordinary/index.js
483
+ assets/runtime/500271bc83c366b3/kudzu-list.js
484
+ assets/runtime/500271bc83c366b3/kudzu-native.js
485
+ assets/runtime/500271bc83c366b3/kudzu-serialization.js
486
+ assets/runtime/500271bc83c366b3/kudzu.js
487
+ assets/runtime/fabda65ebcd2d3ee/kudzu-binding.js
488
+ assets/runtime/fabda65ebcd2d3ee/kudzu-list.js
489
+ assets/runtime/fabda65ebcd2d3ee/kudzu-native.js
490
+ assets/runtime/fabda65ebcd2d3ee/kudzu-serialization.js
491
+ assets/runtime/fabda65ebcd2d3ee/kudzu-style.js
492
+ assets/runtime/fabda65ebcd2d3ee/kudzu.js
493
+ index.html
494
+ ordinary/index.html
495
+ static/index.html
496
+ ```
497
+
498
+ `effect-dependencies`:
499
+
500
+ ```text
501
+ assets/effects/index.js
502
+ assets/handlers/pages/index.js
503
+ assets/runtime/2007d3090f033665/kudzu-collection-selector.js
504
+ assets/runtime/2007d3090f033665/kudzu-deps.js
505
+ assets/runtime/2007d3090f033665/kudzu-effect.js
506
+ assets/runtime/2007d3090f033665/kudzu-serialization.js
507
+ assets/runtime/c853918db55de9b2/kudzu.js
508
+ command/index.html
509
+ index.html
510
+ ```
511
+
512
+ `worker-effects`:
513
+
514
+ ```text
515
+ assets/effects/dashboard/index.js
516
+ assets/handlers/pages/dashboard.js
517
+ assets/runtime/abdadc89bb0d780c/kudzu-effect.js
518
+ assets/runtime/abdadc89bb0d780c/kudzu-navigation.js
519
+ assets/runtime/abdadc89bb0d780c/kudzu.js
520
+ assets/workers/telemetry.worker-BVG2SA55.js
521
+ dashboard/index.html
522
+ plain/index.html
523
+ static/index.html
524
+ ```
525
+
526
+ `runtime-params`:
527
+
528
+ ```text
529
+ assets/effects/orgs/[org]/items/[id]/index.js
530
+ assets/handlers/pages/orgs/[org]/items/[id].js
531
+ assets/native/orgs/[org]/items/[id]/index.js
532
+ assets/params/orgs/[org]/items/[id]/index.js
533
+ assets/runtime/e169b1b30eadc6e8/kudzu-binding.js
534
+ assets/runtime/e169b1b30eadc6e8/kudzu-effect.js
535
+ assets/runtime/e169b1b30eadc6e8/kudzu-native.js
536
+ assets/runtime/e169b1b30eadc6e8/kudzu-serialization.js
537
+ assets/runtime/e169b1b30eadc6e8/kudzu-style.js
538
+ assets/runtime/e169b1b30eadc6e8/kudzu.js
539
+ orgs/[org]/items/[id]/index.html
540
+ orgs/acme/items/new/index.html
541
+ rewrites.json
542
+ ```
543
+
544
+ `effect-package`:
545
+
546
+ ```text
547
+ assets/effects/index.js
548
+ assets/handlers/pages/index.js
549
+ assets/runtime/8c84431af8a7052f/kudzu-effect.js
550
+ assets/runtime/8c84431af8a7052f/kudzu.js
551
+ index.html
552
+ static/index.html
553
+ ```
554
+
555
+ ### Static Zero-JavaScript Evidence
556
+
557
+ | Fixture/route | HTML raw/gzip | Script sources | State markers | Capability/package reference |
558
+ |---|---:|---:|---:|---:|
559
+ | `calculated-collections /static` | 223 / 178 B | 0 | 0 | 0 |
560
+ | `worker-effects /dash/static` | 270 / 203 B | 0 | 0 | 0 |
561
+ | `runtime-params /포터/orgs/acme/items/new` | 214 / 174 B | 0 | 0 | 0 |
562
+ | `effect-package /static` | 201 / 165 B | 0 | 0 | 0 |
563
+
564
+ The `/dash/plain` route intentionally loads navigation ESM because it belongs to the configured navigation group. It is not used as the static zero-JavaScript control; `/dash/static` remains outside the group and emits no scripts.
565
+
566
+ ### Package Erasure And Isolation
567
+
568
+ No built HTML or JavaScript file in the six fixtures contains a surviving ESM/CommonJS module reference to:
569
+
570
+ ```text
571
+ react
572
+ react-router-dom
573
+ zustand
574
+ ```
575
+
576
+ The `effect-package` fixture directly imports `typescript` inside an owned effect. Its bundled handler is 3,560,776 raw / 1,024,128 gzip bytes and appears only in the interactive route graph. The static sibling has no script and no TypeScript package reference. This is intentional package isolation, not a recommended browser payload size.
577
+
578
+ ### Determinism Check
579
+
580
+ All six fixtures were rebuilt with unchanged source. Every second deploy digest matched its first digest exactly:
581
+
582
+ ```text
583
+ native identical
584
+ calculated-collections identical
585
+ effect-dependencies identical
586
+ worker-effects identical
587
+ runtime-params identical
588
+ effect-package identical
589
+ ```
590
+
591
+ ## Session 01B Completion Record
592
+
593
+ | Deliverable | Result |
594
+ |---|---|
595
+ | Representative static route | Recorded |
596
+ | Command-only route | Recorded |
597
+ | Binding/list route | Recorded |
598
+ | Derived dependency effect | Recorded |
599
+ | Worker and navigation route | Recorded |
600
+ | Runtime parameter route | Recorded |
601
+ | Browser package effect route | Recorded |
602
+ | Complete emitted paths | Recorded for six fixtures |
603
+ | Raw/gzip artifact classes | Recorded |
604
+ | Static zero-JavaScript controls | Four routes pass |
605
+ | React/Router/Zustand output references | None |
606
+ | Deterministic deploy hashes | Six of six match on rebuild |
607
+ | Production code changed | No |
608
+ | Browser runtime changed | No |
609
+
610
+ ## Session 01C Correctness And Browser Baseline
611
+
612
+ ### Required Checks
613
+
614
+ | Check | Environment | Result |
615
+ |---|---|---|
616
+ | `npm run check` | Node 24.14.0 | Pass; 174 pages, 2 interactive pages |
617
+ | `npm test` | Node 24.14.0 | Pass; 233 tests |
618
+ | `KUDZU_REQUIRE_CHROME=1 npm test` | Google Chrome 151.0.7922.138 | Pass; 233 tests, 64.574 seconds |
619
+ | `npm run test:package` | Fresh temporary install | Pass; 4 packages installed, 1 static page built, 0 interactive pages |
620
+
621
+ The required-Chrome flag prevents browser work from silently skipping. No `CHROME_BIN` override was needed because the test harness found the installed Google Chrome application.
622
+
623
+ ### Browser Journey Inventory
624
+
625
+ `test/framework.test.mjs` currently defines 48 named browser journey helpers. The required-Chrome suite passed all invoking tests.
626
+
627
+ | Category | Named journeys |
628
+ |---|---|
629
+ | State, reducers, and component ownership | reducer; array prop draft/effect sync; callback/ref ownership; non-keyed child state; primitive prop dependency; React-shaped integration |
630
+ | Timers, refs, and native UI | parameterized debounce; outside click; native dialog; native bubbling; dynamic runtime behavior |
631
+ | Forms and async data | React Hook Form migration; TanStack Query migration |
632
+ | Resource and browser capabilities | Memos outline/animation frame; colonni canvas/blog; colonni locale detection; Excalidraw sharing; Cal.com media query; Worker effects |
633
+ | Navigation and routing | navigation; navigation groups; owned navigation effects; search params; imperative navigation; runtime params |
634
+ | Context and shared state | Context actions; Zustand migration |
635
+ | Collections and SVG | SVG structures; calculated collections; lists; rendered collections; nested lists; indexed optional nested rows; nested component lists; flat/keyed row hooks; imported memo collection; local/imported component lists; list bindings |
636
+ | Effects and ownership | ordinary effects; conditional effects; keyed effects |
637
+ | Application migration and docs | landing page; React/Vite app; release notes; docs list |
638
+
639
+ Exact helper inventory:
640
+
641
+ ```text
642
+ runReducerBrowserTest
643
+ runArrayPropDraftBrowserTest
644
+ runParameterizedDebounceBrowserTest
645
+ runOutsideClickBrowserTest
646
+ runCallbackRefOwnershipBrowserTest
647
+ runNativeDialogMigrationBrowserTest
648
+ runReactHookFormMigrationBrowserTest
649
+ runTanStackQueryMigrationBrowserTest
650
+ runMemosOutlineMigrationBrowserTest
651
+ runColonniBlogMigrationBrowserTest
652
+ runColonniLocaleDetectionBrowserTest
653
+ runExcalidrawShareMigrationBrowserTest
654
+ runCalcomMediaQueryMigrationBrowserTest
655
+ runReleaseNotesBrowserTest
656
+ runDocsListBrowserTest
657
+ runNavigationBrowserTest
658
+ runNavigationGroupsBrowserTest
659
+ runOwnedNavigationEffectBrowserTest
660
+ runWorkerEffectBrowserTest
661
+ runConditionalBrowserTest
662
+ runContextActionsBrowserTest
663
+ runSvgStructureBrowserTest
664
+ runCalculatedCollectionsBrowserTest
665
+ runListBrowserTest
666
+ runRenderedCollectionBrowserTest
667
+ runNestedListBrowserTest
668
+ runNestedIndexedOptionalBrowserTest
669
+ runNestedComponentListBrowserTest
670
+ runFlatKeyedRowHooksBrowserTest
671
+ runKeyedRowHooksBrowserTest
672
+ runNonKeyedChildStateBrowserTest
673
+ runPrimitivePropDependencyBrowserTest
674
+ runReactShapedIntegrationBrowserTest
675
+ runLandingPageMigrationBrowserTest
676
+ runReactViteAppBrowserTest
677
+ runZustandMigrationBrowserTest
678
+ runImportedMemoCollectionBrowserTest
679
+ runComponentListBrowserTest
680
+ runImportedComponentListBrowserTest
681
+ runListBindingsBrowserTest
682
+ runEffectBrowserTest
683
+ runConditionalEffectBrowserTest
684
+ runKeyedEffectBrowserTest
685
+ runNativeBubblingBrowserTest
686
+ runDynamicBrowserTest
687
+ runSearchParamBrowserTest
688
+ runNavigateBrowserTest
689
+ runRuntimeParamsBrowserTest
690
+ ```
691
+
692
+ ### Proven Browser Areas
693
+
694
+ - direct state and DOM updates;
695
+ - keyed insertion, removal, reorder, identity, row state, refs, and effects;
696
+ - SVG namespace and accessible chart interactions;
697
+ - effect setup, replacement, cleanup, conditional/keyed ownership, and document disposal;
698
+ - Worker startup, navigation ownership, listener removal, termination, and repeated disposal;
699
+ - navigation direct entry, enhanced transitions, groups, history, and owned effects;
700
+ - reducer, Context, and Zustand action behavior;
701
+ - form constraints and async query replacement;
702
+ - timer replacement and cleanup;
703
+ - outside-click listener behavior and cleanup;
704
+ - canvas, observer, animation-frame, media-query, clipboard/share, and locale behaviors;
705
+ - component callback/ref propagation and independent child ownership.
706
+
707
+ ### Known Correctness And Resilience Gaps
708
+
709
+ The following scenarios have no maintained automated test in the repository baseline:
710
+
711
+ | Gap | Current evidence | 0.9 requirement |
712
+ |---|---|---|
713
+ | JavaScript disabled | Static HTML assertions only | Run complete matched application journeys with JS disabled. |
714
+ | JavaScript delayed | No automated delay injection | Delay capability loading while checking initial HTML and early native behavior. |
715
+ | Missing capability chunk | No automated request failure | Fail one selected chunk and verify unrelated document behavior and observable failure. |
716
+ | Slow network | No maintained throttled journey | Run pinned slow-network profiles in the external matched harness. |
717
+ | Slow CPU | No maintained CPU-throttled journey | Record readiness and event latency under pinned CPU throttling. |
718
+ | E2B terminal lifecycle in browser | Build/output assertions only | Exercise async acquisition, late completion, BFCache retain/resume/discard, and cleanup. |
719
+ | Route WebSocket lifecycle in browser | Generated handler executed with a Node fake transport | Add a deterministic Chrome owner-release/replacement journey when authorized. |
720
+ | Cross-framework commerce browser result | Existing suite timed out before cross-target sampling | Restore and fix/characterize the in-flight rejection-navigation timeout. |
721
+
722
+ The existing `PERFORMANCE.md` record states that the full commerce browser command was attempted twice and timed out in Kudzu's in-flight rejection-navigation wait. No commerce browser timing claim exists at this baseline.
723
+
724
+ ### Package Smoke Evidence
725
+
726
+ `npm run test:package` packed and installed the current package into a fresh temporary project, installed four packages, and built one complete static page with zero interactive pages. This confirms package contents and ordinary fresh-install build behavior for the baseline.
727
+
728
+ ## Session 01C Completion Record
729
+
730
+ | Deliverable | Result |
731
+ |---|---|
732
+ | Standard suite | 233/233 pass |
733
+ | Required-Chrome suite | 233/233 pass |
734
+ | Browser version | Google Chrome 151.0.7922.138 |
735
+ | Package smoke | Pass |
736
+ | Browser journey inventory | 48 named helpers recorded |
737
+ | Progressive-enhancement gaps | Recorded |
738
+ | Terminal/WebSocket browser gaps | Recorded |
739
+ | Commerce timeout | Recorded without a timing claim |
740
+ | Production code changed | No |
741
+ | Browser runtime changed | No |
742
+
743
+ ## Session 01D Kudzu-Only Performance Baseline
744
+
745
+ ### Measurement Rules
746
+
747
+ All benchmarks ran alone rather than concurrently. The environment remains Apple M4, 10 logical CPUs, 16 GiB memory, macOS 26.5, Node 24.14.0, and Chrome 151.0.7922.138 where required.
748
+
749
+ These are same-revision baseline measurements. They do not claim an improvement over another Kudzu revision or framework.
750
+
751
+ ### Worker And Effect Build Baseline
752
+
753
+ Command:
754
+
755
+ ```bash
756
+ npm run benchmark
757
+ ```
758
+
759
+ Method: one warm-up and seven clean production builds.
760
+
761
+ | Metric | Result |
762
+ |---|---:|
763
+ | Build median | 177.4 ms |
764
+ | Build min/max | 173.3 / 186.5 ms |
765
+ | Worker graph | 907 raw / 477 gzip B |
766
+ | Window graph | 13,786 raw / 5,931 gzip B |
767
+
768
+ Raw build samples:
769
+
770
+ ```text
771
+ [177.4, 181.0, 186.5, 174.0, 179.8, 174.7, 173.3]
772
+ ```
773
+
774
+ ### 2,000-Row Keyed Browser Baseline
775
+
776
+ Command:
777
+
778
+ ```bash
779
+ RUNS=7 CHROME_BIN="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" npm run benchmark:keyed
780
+ ```
781
+
782
+ Method: one build warm-up, seven clean builds, and seven fresh Chrome profiles.
783
+
784
+ | Operation | Median | Min/max |
785
+ |---|---:|---:|
786
+ | Clean build | 220.9 ms | 215.7 / 230.3 ms |
787
+ | Append 33 rows | 2.2 ms | 2.1 / 2.5 ms |
788
+ | Filter 2,000 rows to one | 3.8 ms | 3.5 / 4.0 ms |
789
+ | Restore 1,999 rows | 22.1 ms | 20.9 / 22.9 ms |
790
+ | Reverse 2,000 rows | 3.4 ms | 3.1 / 3.6 ms |
791
+
792
+ Raw samples:
793
+
794
+ ```text
795
+ build [230.3, 227.6, 217.0, 215.7, 229.4, 216.8, 220.9]
796
+ append [2.2, 2.2, 2.1, 2.1, 2.2, 2.5, 2.5]
797
+ filter [4.0, 3.8, 3.5, 3.7, 3.7, 4.0, 4.0]
798
+ restore [22.4, 20.9, 21.2, 22.1, 21.1, 22.9, 22.7]
799
+ reverse [3.1, 3.2, 3.4, 3.4, 3.5, 3.4, 3.6]
800
+ ```
801
+
802
+ The complete keyed JavaScript graph is 28,626 raw / 11,286 aggregate gzip bytes across nine files:
803
+
804
+ ```text
805
+ assets/handlers/pages/index.js
806
+ assets/native/index.js
807
+ assets/runtime/1fbcadd3ee29cf40/kudzu-binding.js
808
+ assets/runtime/1fbcadd3ee29cf40/kudzu-collection-selector.js
809
+ assets/runtime/1fbcadd3ee29cf40/kudzu-list.js
810
+ assets/runtime/1fbcadd3ee29cf40/kudzu-native.js
811
+ assets/runtime/1fbcadd3ee29cf40/kudzu-serialization.js
812
+ assets/runtime/1fbcadd3ee29cf40/kudzu-style.js
813
+ assets/runtime/1fbcadd3ee29cf40/kudzu.js
814
+ ```
815
+
816
+ The benchmark also validates retained identity, released state, restored fresh state, restored handler behavior, and browser exceptions before reporting timing.
817
+
818
+ ### Generated Source-Scale Baseline
819
+
820
+ Commands:
821
+
822
+ ```bash
823
+ WARMUPS=1 RUNS=7 npm run benchmark:source-scale
824
+ ROUTES=100 WARMUPS=1 RUNS=7 npm run benchmark:source-scale
825
+ ROUTES=1000 WARMUPS=1 RUNS=7 npm run benchmark:source-scale
826
+ ```
827
+
828
+ Every route owns nine imported plain TypeScript modules with 110 filler exports per module and one TSX page. Fixture generation is excluded. Every phase runs in a fresh process.
829
+
830
+ #### Topology And Output
831
+
832
+ | Routes | Imported modules | Total modules | Source lines | Output files/pages | Output bytes | Output SHA-256 |
833
+ |---:|---:|---:|---:|---:|---:|---|
834
+ | 50 | 450 | 500 | 50,550 | 50 / 50 | 10,980 | `e107d78a7f55bc8a1af0ea6e53efeffa19b3d44d21c892484d103fa346e7ba7b` |
835
+ | 100 | 900 | 1,000 | 101,100 | 100 / 100 | 21,980 | `61525962c70c5e69a975a656781e598cf6665137d648be82f1c3d5e73f0b1b48` |
836
+ | 1,000 | 9,000 | 10,000 | 1,011,000 | 1,000 / 1,000 | 221,780 | `ccdd2630bcaf9fac4a481b64c69982c341e4798205bb9fbb4cac67d528246635` |
837
+
838
+ All routes are complete static HTML and emit no JavaScript.
839
+
840
+ #### Median Phase Timing
841
+
842
+ | Routes | Source read | Reachable graph | Compile | Clean build |
843
+ |---:|---:|---:|---:|---:|
844
+ | 50 | 13.4 ms | 200.7 ms | 478.9 ms | 893.0 ms |
845
+ | 100 | 25.8 ms | 396.2 ms | 891.2 ms | 1,626.2 ms |
846
+ | 1,000 | 644.0 ms | 3,347.6 ms | 8,995.4 ms | 15,877.2 ms |
847
+
848
+ #### Median Peak RSS
849
+
850
+ | Routes | Compile | Clean build |
851
+ |---:|---:|---:|
852
+ | 50 | 509.0 MiB | 600.6 MiB |
853
+ | 100 | 918.8 MiB | 758.9 MiB |
854
+ | 1,000 | 3,598.3 MiB | 3,411.0 MiB |
855
+
856
+ #### Compiler Result
857
+
858
+ | Routes | Parsed/export summaries/plain modules | Result bytes | Compiler result SHA-256 |
859
+ |---:|---:|---:|---|
860
+ | 50 | 500 / 500 / 450 | 1,989,561 | `08389bd33544161bc5db0dca9a5ebe775217a56492c833a8016116adede5f4dc` |
861
+ | 100 | 1,000 / 1,000 / 900 | 3,991,661 | `6d60a2ec4f5e099aa383b5e4915642b5410bd005b2cd3bd03707b2261d29c1dc` |
862
+ | 1,000 | 10,000 / 10,000 / 9,000 | 40,960,061 | `3b7b301dda4ac9142fe19c9ce0894f9338131561bbbf039a03780cb16f248cc9` |
863
+
864
+ #### Raw 50-Route Samples
865
+
866
+ ```text
867
+ source read [13.0, 15.6, 13.5, 13.4, 13.3, 13.4, 13.2]
868
+ graph [194.7, 200.7, 201.9, 222.0, 211.1, 197.4, 196.1]
869
+ compile [573.2, 488.3, 478.9, 477.3, 494.1, 474.2, 475.8]
870
+ clean build [893.0, 997.4, 861.4, 831.9, 918.7, 861.2, 911.8]
871
+ compile RSS [506.7, 506.8, 507.4, 510.0, 510.2, 525.5, 509.0]
872
+ build RSS [600.4, 601.0, 587.5, 599.7, 600.6, 603.2, 603.6]
873
+ ```
874
+
875
+ #### Raw 100-Route Samples
876
+
877
+ ```text
878
+ source read [25.7, 25.8, 26.8, 25.7, 28.0, 26.5, 25.5]
879
+ graph [398.4, 386.9, 396.4, 396.2, 385.4, 396.7, 369.3]
880
+ compile [862.8, 863.4, 909.6, 901.3, 938.7, 891.2, 867.9]
881
+ clean build [1615.9, 1706.5, 1673.4, 1626.2, 1664.0, 1607.4, 1539.9]
882
+ compile RSS [924.2, 917.6, 918.3, 917.3, 933.1, 924.2, 918.8]
883
+ build RSS [745.1, 758.9, 754.2, 772.6, 761.1, 770.5, 758.5]
884
+ ```
885
+
886
+ #### Raw 1,000-Route Samples
887
+
888
+ ```text
889
+ source read [651.7, 644.0, 644.9, 635.6, 642.1, 635.7, 648.2]
890
+ graph [3404.0, 3362.5, 3335.8, 3347.6, 3326.1, 3406.8, 3331.0]
891
+ compile [9611.8, 8808.4, 8995.4, 8977.7, 9056.6, 9108.0, 8907.8]
892
+ clean build [16267.0, 15661.8, 15877.2, 15868.4, 16345.5, 16889.3, 15769.1]
893
+ compile RSS [3406.8, 3764.9, 3618.6, 3598.3, 3531.1, 3549.3, 3734.3]
894
+ build RSS [3485.5, 3449.2, 3312.1, 3411.0, 3372.8, 3404.8, 3413.5]
895
+ ```
896
+
897
+ ### Scaling Observation
898
+
899
+ Doubling the topology from 50 to 100 routes produced 1.86x compile and 1.82x clean-build medians. Increasing from 100 to 1,000 routes produced 10.09x compile and 9.76x clean-build medians for 10x modules and source lines. These ratios characterize the current generated fixture only; they are not a cross-framework result.
900
+
901
+ ### 10,000-Route Gap
902
+
903
+ The default topology at 10,000 routes would generate:
904
+
905
+ ```text
906
+ 90,000 imported modules
907
+ 100,000 total modules
908
+ 10,110,000 source lines
909
+ ```
910
+
911
+ The 1,000-route run already used a 3,598.3 MiB compile peak-RSS median on a 16 GiB machine. A seven-sample 10,000-route default-topology run was not attempted because the lower-scale evidence does not establish that it can complete without memory pressure or host instability.
912
+
913
+ The fixture was not silently reduced to claim 10,000-route coverage. The 10,000-route result remains an explicit gap for a suitable host or the matched external catalog harness. A smaller `MODULES_PER_ROUTE` or `FILLER_LINES` diagnostic may be added later only under a separately named topology; it cannot replace this baseline series.
914
+
915
+ ## Session 01D Completion Record
916
+
917
+ | Deliverable | Result |
918
+ |---|---|
919
+ | Worker/effect build benchmark | Recorded |
920
+ | Worker/window graph bytes | Recorded |
921
+ | 2,000-row keyed build/browser benchmark | Recorded |
922
+ | Keyed JavaScript files and bytes | Recorded |
923
+ | 50-route source scale | Recorded |
924
+ | 100-route source scale | Recorded |
925
+ | 1,000-route source scale | Recorded |
926
+ | 10,000-route default topology | Explicitly unavailable on current host; not fabricated |
927
+ | Raw samples, medians, ranges | Recorded |
928
+ | Output and compiler digests | Recorded |
929
+ | Peak RSS | Recorded |
930
+ | Production code changed | No |
931
+ | Browser runtime changed | No |
932
+
933
+ ## Session 01E Restore The Maintained Cross-Framework Harness
934
+
935
+ ### Pinned Public Input
936
+
937
+ | Field | Value |
938
+ |---|---|
939
+ | Repository | `https://github.com/SimYunSup/kudzu-based-bench.git` |
940
+ | Revision | `f2d5be1a516c539e30f7125f6870d42b1dd02ecd` |
941
+ | Commit subject | `feat(bench): 빌드 지표를 cold/warm으로 재구성 + 랜딩에 커머스 벤치 게시` |
942
+ | Package manager | `pnpm@10.20.0` through Corepack |
943
+ | Node requirement | `>=22.22.0` |
944
+ | Local Node | `v24.14.0` |
945
+ | Playwright | `1.61.1` |
946
+ | Playwright browser | Chrome for Testing 149.0.7827.55, Chromium revision 1228 |
947
+
948
+ Clone/install reproduction:
949
+
950
+ ```bash
951
+ git clone https://github.com/SimYunSup/kudzu-based-bench.git /tmp/kudzu-based-bench
952
+ git -C /tmp/kudzu-based-bench checkout --detach f2d5be1a516c539e30f7125f6870d42b1dd02ecd
953
+ corepack pnpm install --force
954
+ corepack pnpm exec playwright install chromium
955
+ ```
956
+
957
+ This machine did not expose a standalone `pnpm` executable through Volta. A temporary wrapper outside both repositories delegated `pnpm` to `corepack pnpm`; no global tool configuration or tracked benchmark source changed.
958
+
959
+ ### Pinned Comparator Versions
960
+
961
+ | Package/framework | Lockfile version |
962
+ |---|---|
963
+ | Kudzu dependency in the pinned lockfile | `0.8.15` |
964
+ | Current Kudzu candidate used after relinking | `0.8.62` at `bada14585d112de8debf75a2bf914e9d5e0769ed` |
965
+ | React / React DOM | `19.2.8` |
966
+ | Astro | `7.1.3` |
967
+ | `@astrojs/react` | `5.0.7` |
968
+ | React Router | `8.3.0` |
969
+ | TanStack React Router | `1.170.18` |
970
+ | TanStack Start | `1.168.32` |
971
+ | Next.js | `16.2.11` |
972
+ | Vite used by shop variants | `7.3.6` |
973
+ | TypeScript | `5.9.3` |
974
+
975
+ The first installed Kudzu build used the pinned lockfile's `0.8.15`. It produced 1,011 pages and 3,056 files, preserving the historical harness result shape. It is not the current candidate baseline.
976
+
977
+ The temporary `apps/shop-kudzu/node_modules/@kudzujs/core` symlink was then pointed to the current Kudzu workspace. All current-candidate results below use `0.8.62`.
978
+
979
+ ### Current 1,000-Product Kudzu Build
980
+
981
+ Commands:
982
+
983
+ ```bash
984
+ OTW_CATALOG_SIZE=1000 pnpm run build:commerce
985
+ OTW_CATALOG_SIZE=1000 pnpm --filter @otw/shop-kudzu build
986
+ pnpm shop:scale --variants shop-kudzu --sizes 1000 --runs 3 --out bench-current
987
+ ```
988
+
989
+ Build output:
990
+
991
+ | Metric | Result |
992
+ |---|---:|
993
+ | Products | 1,000 |
994
+ | Complete pages | 1,011 |
995
+ | Full deploy files | 1,048 |
996
+ | Non-image measured files | 1,036 |
997
+ | Full HTML | 9,855,116 raw / 1,916,624 aggregate gzip B |
998
+ | Full JavaScript | 44,391 raw / 19,330 aggregate gzip B |
999
+ | Other assets | 265,328 raw / 243,568 aggregate gzip B |
1000
+ | Full deploy SHA-256 | `b371cc792e3509e848cce0c7acdb08f4253e6223914cd19f8f6dcc482f78d69f` |
1001
+ | Non-image output | 9.44 MiB |
1002
+ | Cold samples | 3,036 / 3,058 / 3,043 ms |
1003
+ | Cold median | 3,043 ms |
1004
+ | Warm samples | 3,045 / 3,053 / 3,058 ms |
1005
+ | Warm median | 3,053 ms |
1006
+ | Reported cold ms/product | 3.04 ms |
1007
+
1008
+ The three-sample `shop:scale` protocol proves command reproducibility only. It is insufficient for the final Kudzu release claim, which requires rotating targets and at least seven samples.
1009
+
1010
+ ### Current 1,000-Product Browser-Fetched JavaScript
1011
+
1012
+ Command:
1013
+
1014
+ ```bash
1015
+ pnpm shop:assets --variants shop-kudzu --out bench-current
1016
+ ```
1017
+
1018
+ | Route | Requests | Raw JS | Gzip JS | Rendered HTML characters |
1019
+ |---|---:|---:|---:|---:|
1020
+ | Home | 9 | 12,615 B | 4,832 B | 7,383 |
1021
+ | Search | 12 | 28,967 B | 9,691 B | 32,578 |
1022
+ | Collection | 9 | 12,633 B | 4,826 B | 17,075 |
1023
+ | Product | 10 | 13,635 B | 5,070 B | 12,872 |
1024
+ | Policy | 9 | 12,624 B | 4,837 B | 3,226 |
1025
+ | Checkout | 9 | 12,624 B | 4,829 B | 3,335 |
1026
+
1027
+ These values come from JavaScript responses and inline module bodies actually observed by Playwright, not static import-graph guessing.
1028
+
1029
+ ### Current Single-Run Commerce Journey Diagnostic
1030
+
1031
+ Command:
1032
+
1033
+ ```bash
1034
+ pnpm shop:bench --variant shop-kudzu --runs 1 --cpu 4 --net slow4g --out bench-current
1035
+ ```
1036
+
1037
+ This one-run diagnostic is not a performance claim. It verifies that the pinned harness can execute the current Kudzu journey and degradation tracks.
1038
+
1039
+ | Step | Content ready | Action ready | Step latency |
1040
+ |---|---:|---:|---:|
1041
+ | Product entry | 172.8 ms | - | - |
1042
+ | Listing navigation | 273.1 ms | - | - |
1043
+ | Sort | - | 405.1 ms | 2.2 ms |
1044
+ | Filter | - | 0 ms | 1.1 ms |
1045
+ | Detail navigation | 188.6 ms | - | - |
1046
+ | Variant selection | - | 350.1 ms | 0.2 ms |
1047
+ | Add to cart | - | 0 ms | 0.7 ms |
1048
+ | Checkout navigation | 175.1 ms | - | - |
1049
+
1050
+ Impatient add-to-cart clicks were lost at 0, 100, and 300 ms after first paint and succeeded at 500 ms and every later sampled delay. With one attempt per point, this only characterizes harness behavior.
1051
+
1052
+ Degradation result:
1053
+
1054
+ | Condition | Surviving capabilities |
1055
+ |---|---:|
1056
+ | JavaScript blocked | 3 / 6: content, category navigation, detail navigation |
1057
+ | JavaScript delayed 2 seconds | 6 / 6 |
1058
+ | One JavaScript response dropped | 6 / 6 in this run |
1059
+ | Total | 15 / 18 |
1060
+
1061
+ The historical in-flight rejection-navigation timeout did not reproduce in this single current-candidate diagnostic. It is not considered fixed until the full seven-run cross-target protocol completes without the timeout.
1062
+
1063
+ ### Five-Variant Build Reproduction
1064
+
1065
+ Command:
1066
+
1067
+ ```bash
1068
+ OTW_CATALOG_SIZE=100 pnpm run build:shop
1069
+ ```
1070
+
1071
+ The pinned checkout successfully built all five 100-product variants:
1072
+
1073
+ ```text
1074
+ shop-kudzu
1075
+ shop-astro
1076
+ shop-react-router
1077
+ shop-tanstack
1078
+ shop-next-app
1079
+ ```
1080
+
1081
+ Kudzu and Astro emitted 111 complete application pages. React Router and Next generated their configured static route sets. TanStack completed its prerender pass. Framework warnings and all command output remain part of the raw external run; no failed variant was omitted.
1082
+
1083
+ ### Five-Variant Browser Asset Reproduction
1084
+
1085
+ Command:
1086
+
1087
+ ```bash
1088
+ pnpm shop:assets --out bench-current-all
1089
+ ```
1090
+
1091
+ All five variants completed six route measurements.
1092
+
1093
+ | Variant | Home | Search | Collection | Product | Policy | Checkout | Non-image output |
1094
+ |---|---:|---:|---:|---:|---:|---:|---:|
1095
+ | Kudzu | 4,832 B | 9,694 B | 4,837 B | 5,080 B | 4,829 B | 4,829 B | 1,103,495 B |
1096
+ | Astro | 62,056 B | 62,471 B | 62,056 B | 62,574 B | 62,054 B | 62,052 B | 1,805,625 B |
1097
+ | React Router | 106,776 B | 106,779 B | 106,435 B | 106,955 B | 106,445 B | 106,380 B | 1,139,478 B |
1098
+ | TanStack | 106,483 B | 106,406 B | 106,538 B | 106,608 B | 105,989 B | 106,073 B | 1,662,535 B |
1099
+ | Next.js | 149,124 B | 149,692 B | 148,901 B | 148,820 B | 147,907 B | 147,689 B | 4,902,234 B |
1100
+
1101
+ The table records browser-observed gzip JavaScript bytes. It is not yet a final competitive proof because 01F must freeze behavior/accessibility contracts and the final matrix must run acceptance before timing.
1102
+
1103
+ ### Harness Capabilities Confirmed
1104
+
1105
+ | Script | Confirmed behavior |
1106
+ |---|---|
1107
+ | `build:shop` | Builds Kudzu, Astro, React Router, TanStack, and Next shop variants |
1108
+ | `shop:assets` | Measures actual fetched and inline JavaScript on six routes |
1109
+ | `shop:bench` | Measures session content/action readiness, event latency, impatient-click loss, and three degradation modes |
1110
+ | `shop:scale` | Sweeps catalog sizes and records cold/warm build samples and output size |
1111
+ | `shop:report` | Produces the external benchmark report from generated JSON |
1112
+
1113
+ ### Harness Limitations Before Final Proof
1114
+
1115
+ - `shop:scale` defaults to three sequential samples per variant rather than rotating/interleaving at least seven samples.
1116
+ - `shop:scale` divides by requested product count instead of verified emitted route count.
1117
+ - `shop:scale` does not record peak RSS, artifact classes, output digest, or correctness acceptance before timing.
1118
+ - `shop:assets` measures bytes but does not itself run the behavior/accessibility contract.
1119
+ - The shop comparator set has no Vue or Svelte variant.
1120
+ - The one-run Kudzu journey cannot establish medians, uncertainty, or a cross-framework result.
1121
+ - The historical timeout requires a complete repeated cross-target run before closure.
1122
+ - The pinned lockfile retains Kudzu 0.8.15; candidate runs require an explicit reviewed symlink or an updated pinned benchmark revision.
1123
+
1124
+ ### Orchestration Decision
1125
+
1126
+ The benchmark applications remain in the public external repository. Kudzu does not copy five application implementations into the compiler repository.
1127
+
1128
+ The minimum reproducibility contract is:
1129
+
1130
+ - pin the exact external commit;
1131
+ - pin package-manager and Playwright versions;
1132
+ - explicitly link the candidate Kudzu checkout;
1133
+ - record exact commands and environment in this ledger or `PERFORMANCE.md`;
1134
+ - retain raw JSON results and failed runs;
1135
+ - pin an updated external commit before the final release gate if harness protocol changes.
1136
+
1137
+ The existing `npm run benchmark:commerce` remains the focused paired-Kudzu-revision runner. The external scripts remain responsible for cross-framework applications and browser journeys.
1138
+
1139
+ ## Session 01E Completion Record
1140
+
1141
+ | Deliverable | Result |
1142
+ |---|---|
1143
+ | Public benchmark revision | Pinned |
1144
+ | Lockfile comparator versions | Recorded |
1145
+ | Dependency installation | Reproduced through Corepack |
1146
+ | Current Kudzu candidate link | Explicitly verified as 0.8.62 |
1147
+ | 1,000-product Kudzu build | Reproduced |
1148
+ | 1,000-product scale command | Reproduced; three-sample limitation recorded |
1149
+ | Browser-fetched JS command | Reproduced at 1,000 products |
1150
+ | Five-variant 100-product build | Reproduced |
1151
+ | Five-variant browser asset command | Reproduced |
1152
+ | Commerce journey/degradation command | Reproduced for one Kudzu diagnostic run |
1153
+ | Historical timeout | Not reproduced once; not declared fixed |
1154
+ | Harness limitations | Recorded |
1155
+ | Benchmark apps copied into Kudzu | No |
1156
+ | Production Kudzu code changed | No |
1157
+
1158
+ Session 01F is complete in [`0.9-benchmark-contracts.md`](./0.9-benchmark-contracts.md).
1159
+
1160
+ ## Session 01G Baseline Sign-Off
1161
+
1162
+ | Sign-off requirement | Evidence | Result |
1163
+ |---|---|---|
1164
+ | Architecture and LOC ledger reproducible | Sessions 01A and explicit commands in this document | Pass |
1165
+ | Output manifests and capability bytes recorded | Session 01B | Pass |
1166
+ | Standard suite | 233/233 | Pass |
1167
+ | Required-Chrome suite | 233/233 on Chrome 151.0.7922.138 | Pass |
1168
+ | Package smoke | Fresh install and static build | Pass |
1169
+ | Kudzu-only build/browser baseline | Session 01D | Pass |
1170
+ | 50/100/1,000 source scale | Raw samples and RSS recorded | Pass |
1171
+ | 10,000 source-scale gap | Host limitation explicit; no reduced substitute claimed | Pass as recorded gap |
1172
+ | Public benchmark revision pinned | `f2d5be1a516c539e30f7125f6870d42b1dd02ecd` | Pass |
1173
+ | Comparator versions pinned | Session 01E lockfile table | Pass |
1174
+ | External build and asset commands | Five variants reproduced | Pass |
1175
+ | Commerce timeout | One run succeeded; historical repeated timeout remains open | Pass as recorded gap |
1176
+ | Cross-framework contracts frozen | `0.9-benchmark-contracts.md` | Pass |
1177
+ | Missing content/stateful/resource comparator harnesses | Contract matrix records blockers | Pass as recorded gaps |
1178
+ | Production compiler source changed | No | Pass |
1179
+ | Browser runtime source changed | No | Pass |
1180
+
1181
+ `0.9.0-01 Freeze And Restore The Baseline` is complete. Completion records current facts and explicit gaps; it does not claim that the final cross-framework release gate has passed.
1182
+
1183
+ ## Next Work
1184
+
1185
+ `0.9.0-02 / Session 02A: Fixture Intake And Failure Census` completed on 2026-08-18 with the pinned Medusa Product Actions reduction in [`test/fixtures/derived-medusa-product-actions`](../../test/fixtures/derived-medusa-product-actions).
1186
+
1187
+ Session 02A evidence:
1188
+
1189
+ 1. Pin a real upstream multi-state Derived source and license.
1190
+ 2. Record upstream URL, commit/tag, and acquisition hash.
1191
+ 3. Build or migrate the source far enough to reproduce the first current Kudzu failure.
1192
+ 4. Preserve at least two primitive states, serializable static data, and deterministic result behavior.
1193
+ 5. Reduce only the first Derived blocker.
1194
+ 6. Add one static sibling and one failing focused build test.
1195
+ 7. Add no semantic implementation in the fixture-intake session.
1196
+
1197
+ The earlier pinned commerce benchmark was investigated first but rejected as authorization: its `0.8.15` two-dimensional variant limitation can now be expressed by a synchronous relative calculation in `0.8.62`. The Medusa reduction remained unsupported after that same ordinary helper extraction because its selected result field was also an effect dependency.
1198
+
1199
+ Sessions 02B through 02I are complete. Medusa now uses one calculation `DerivedIR` across selected bindings and an effect dependency; the independently pinned Mercury Profit Sharing reduction reuses that identity for scalar summaries and an adjustable keyed yearly collection. Ten unsafe neighboring forms fail at authored source locations. Sessions 03A through 03G subsequently unified reduced Context and Zustand action output through existing shared-state/action records and generic handler consumers with byte-identical deploy output. Work proceeds to `0.9.0-04 / Session 04A`.