@kudzujs/core 0.8.62 → 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.
- package/MIGRATION_ROADMAP.md +36 -1
- package/PERFORMANCE.md +79 -1
- package/README.md +2 -2
- package/RELEASES.md +29 -0
- package/bin/kudzu.mjs +10 -1
- package/docs/next-architecture/0.9-baseline.md +1199 -0
- package/docs/next-architecture/0.9-benchmark-contracts.md +507 -0
- package/docs/next-architecture/0.9-component-property-contract.md +89 -0
- package/docs/next-architecture/0.9-compression-ledger.md +227 -0
- package/docs/next-architecture/0.9-final-proof-audit.md +176 -0
- package/docs/next-architecture/0.9-implementation-plan.md +1819 -0
- package/docs/next-architecture/0.9-resource-lifecycle.md +118 -0
- package/docs/next-architecture/0.9-semantic-compression.md +384 -0
- package/docs/next-architecture/README.md +16 -12
- package/docs/next-architecture/compiler-current-architecture.md +7 -7
- package/docs/next-architecture/large-application-ai-native-roadmap.md +5 -3
- package/docs/next-architecture/versioning.md +1 -1
- package/framework/README.md +2 -0
- package/framework/binding-runtime.js +4 -4
- package/framework/build.mjs +135 -30
- package/framework/compiler/ast-helpers.mjs +5 -0
- package/framework/compiler/browser-signal-passes.mjs +2 -7
- package/framework/compiler/collection-analysis.mjs +4 -0
- package/framework/compiler/descriptor-session.mjs +36 -12
- package/framework/compiler/effect-analysis.mjs +28 -8
- package/framework/compiler/effect-codegen.mjs +79 -36
- package/framework/compiler/effect-private-ref-pass.mjs +4 -8
- package/framework/compiler/handler-lowering.mjs +12 -7
- package/framework/compiler/ir/module-ir.mjs +26 -4
- package/framework/compiler/list-runtime-codegen.mjs +4 -2
- package/framework/compiler/optimize/command-specialization.mjs +4 -7
- package/framework/compiler/route-artifact-report.mjs +4 -3
- package/framework/compiler/route-build-record.mjs +12 -0
- package/framework/compiler/route-capability-planner.mjs +3 -3
- package/framework/compiler/route-ir.mjs +27 -11
- package/framework/compiler/runtime-codegen.mjs +2 -2
- package/framework/compiler/source-compiler.mjs +359 -78
- package/framework/core.d.ts +1 -0
- package/framework/core.mjs +18 -5
- package/framework/dependency-runtime.js +1 -1
- package/framework/effect-runtime.js +2 -2
- package/framework/list-runtime.js +67 -24
- package/framework/native-runtime.js +12 -9
- package/framework/runtime.js +1 -1
- package/framework/serialization.js +13 -6
- package/framework/shared-runtime.js +14 -12
- 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`.
|