@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.
Files changed (47) hide show
  1. package/MIGRATION_ROADMAP.md +36 -1
  2. package/PERFORMANCE.md +79 -1
  3. package/README.md +2 -2
  4. package/RELEASES.md +29 -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 +5 -3
  17. package/docs/next-architecture/versioning.md +1 -1
  18. package/framework/README.md +2 -0
  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/route-artifact-report.mjs +4 -3
  33. package/framework/compiler/route-build-record.mjs +12 -0
  34. package/framework/compiler/route-capability-planner.mjs +3 -3
  35. package/framework/compiler/route-ir.mjs +27 -11
  36. package/framework/compiler/runtime-codegen.mjs +2 -2
  37. package/framework/compiler/source-compiler.mjs +359 -78
  38. package/framework/core.d.ts +1 -0
  39. package/framework/core.mjs +18 -5
  40. package/framework/dependency-runtime.js +1 -1
  41. package/framework/effect-runtime.js +2 -2
  42. package/framework/list-runtime.js +67 -24
  43. package/framework/native-runtime.js +12 -9
  44. package/framework/runtime.js +1 -1
  45. package/framework/serialization.js +13 -6
  46. package/framework/shared-runtime.js +14 -12
  47. package/package.json +1 -1
@@ -0,0 +1,227 @@
1
+ # Kudzu 0.9 Semantic Compression Ledger
2
+
3
+ ## Status
4
+
5
+ This ledger completes `0.9.0-06 / Session 06A` at revision `ef5c991` and
6
+ records the first independently verified Session 06B deletion.
7
+
8
+ ```text
9
+ Core semantic LOC before 06B: 5,296
10
+ 0.8.62 baseline: 4,961
11
+ Ordered normalization entries: 15 page / 14 imported
12
+ ```
13
+
14
+ ## Candidate Decisions
15
+
16
+ ### Component Effect Helper Materialization
17
+
18
+ - Producers: `attachStateBackedEffects()` and the setter-callback helper block
19
+ in `source-compiler.mjs`.
20
+ - Consumers: specialized effect analysis, helper insertion, ComponentAnalysis
21
+ ownership, and EffectIR registration.
22
+ - Duplicate decision: both rewrite `__kComponentUseEffect`, preserve authored
23
+ source, install specialization/state links, create one compiler helper, and
24
+ register capability flags.
25
+ - Required diagnostics: object-property no-state/ref/ID and every setter-callback
26
+ hook/callback diagnostic remain source-owned.
27
+ - Enabled deletion: Work Item 05 proved the same helper ABI and OwnerRef.
28
+ - Expected delta: -14 to -22 core LOC; zero passes/runtime concepts/bytes.
29
+ - Regression fixtures: WorkLedger object props, array-prop effect sync, callback
30
+ and ref ownership, and object-property negatives.
31
+ - Decision: selected first; actual delta is -25 core LOC.
32
+
33
+ ### Serializable Initializer Declaration Lookup
34
+
35
+ - Producers: `componentHasDirectPrimitiveState()`,
36
+ `componentHasDirectArrayState()`, and `directStateInitializer()`.
37
+ - Consumers: debounce, setter-effect pairing, and child/row state seeding.
38
+ - Duplicate decision: each rescans one direct `useState()` declaration before
39
+ applying a caller-specific primitive/object/array restriction.
40
+ - Required diagnostics: debounce, setter-child, keyed-row, reducer, and Zustand
41
+ messages remain caller-owned.
42
+ - Enabled deletion: ComponentAnalysis and the shared literal grammar.
43
+ - Expected delta: -6 to -12 core LOC; zero passes.
44
+ - Regression fixtures: debounce, reducer, lazy-state, keyed-row hooks,
45
+ setter-child object/array, and Zustand fixtures.
46
+ - Decision: selected second; actual delta is -7 core LOC.
47
+
48
+ ### Imported Calculation And Derived Production
49
+
50
+ - Producers: imported-calculation validators, binding/list discovery, and
51
+ selected-effect Derived registration.
52
+ - Consumers: BindingIR, DerivedIR, EffectIR, and binding-backed lists.
53
+ - Duplicate decision: source purity/static fields are inspected from multiple
54
+ authored roles.
55
+ - Required diagnostics: binding/list wording and stronger effect-only wording.
56
+ - Enabled deletion: canonical Derived identity removes one repeated async check.
57
+ - Expected delta: -1 core LOC now; broader work needs producer redesign.
58
+ - Regression fixtures: Medusa, Mercury, and imported-calculation negatives.
59
+ - Decision: reject broad work; one line is too small for this slice.
60
+
61
+ ### Context And Zustand Shared Actions
62
+
63
+ - Producers: Context discovery and Zustand normalization.
64
+ - Consumers: generic descriptor, handler-lowering, and ModuleIR paths.
65
+ - Duplicate decision: generic action/state ownership was duplicated before 03.
66
+ - Required diagnostics: Provider exposure/capture and Zustand store shape.
67
+ - Enabled deletion: Work Item 03 already removed generic consumer branches.
68
+ - Expected delta: 0; remaining code is adapter-specific.
69
+ - Regression fixtures: Context/shared-action and Zustand suites.
70
+ - Decision: evidence-closed.
71
+
72
+ ### Listener Pair Validation
73
+
74
+ - Producers: outside-click and media-query normalizers.
75
+ - Consumers: ordinary EffectIR analysis/codegen.
76
+ - Duplicate decision: add/remove identity is shared, but targets and proof differ.
77
+ - Required diagnostics: outside-click containment and media snapshot wording.
78
+ - Enabled deletion: only `isNodeWithin()` was identical and was removed in 04.
79
+ - Expected delta: 0; a generic matcher would move code.
80
+ - Regression fixtures: outside-click and Cal.com media-query suites.
81
+ - Decision: reject.
82
+
83
+ ### Animation Cancellation Validation
84
+
85
+ - Producers: effect-private ref normalization and general effect resource proof.
86
+ - Consumers: existing EffectIR ownership.
87
+ - Duplicate decision: `.current` coalescing/reset differs from a local identifier.
88
+ - Required diagnostics: ref write-count/reset and local loop cancellation.
89
+ - Enabled deletion: none.
90
+ - Expected delta: 0.
91
+ - Regression fixtures: Memos outline and canvas/frame negatives.
92
+ - Decision: reject.
93
+
94
+ ### Specialization Discovery Loops
95
+
96
+ - Producers: setter, reducer, keyed/state-backed, and object-property loops.
97
+ - Consumers: shared `specialize()` plus distinct callback/list owners.
98
+ - Duplicate decision: resolution/iteration looks similar, but source boundaries,
99
+ ordering, and diagnostics differ.
100
+ - Required diagnostics: every specialization label and callback depth.
101
+ - Enabled deletion: only the helper materializer selected above.
102
+ - Expected delta: 0 for broader unification; mostly code movement.
103
+ - Regression fixtures: the complete setter/reducer/keyed/component matrix.
104
+ - Decision: reject broader consolidation.
105
+
106
+ ### Derived Diagnostic Rewording
107
+
108
+ - Producers: `collectionExpression()` and caller string rewrites.
109
+ - Consumers: reactive JSX/imported-calculation diagnostics.
110
+ - Duplicate decision: presentation wording, not semantic analysis.
111
+ - Required diagnostics: authored role plus exact parser reason.
112
+ - Enabled deletion: none without adding a formatter API.
113
+ - Expected delta: 0 to +5 LOC.
114
+ - Regression fixtures: reactive JSX, Derived, and selector negatives.
115
+ - Decision: defer to 06C only if diagnostics require it.
116
+
117
+ ### Route Dependency Denormalization
118
+
119
+ - Producers: EffectIR analysis, transformed effect ABI, and route rendering.
120
+ - Consumers: RouteIR, effect codegen, and capability planning.
121
+ - Duplicate decision: source references become route IDs only after repeated and
122
+ conditional execution; these are different authority levels.
123
+ - Required diagnostics: authored dependency and concrete route ownership errors.
124
+ - Enabled deletion: none without a new ownership projection.
125
+ - Expected delta: 0 or positive; architecture risk is high.
126
+ - Regression fixtures: every dependency, keyed, conditional, and navigation suite.
127
+ - Decision: reject.
128
+
129
+ ## First 06B Result
130
+
131
+ One `materializeComponentHelper()` now owns the shared compiler-only effect
132
+ rewrite, source retention, helper registration, setter/state-owner maps, and
133
+ capability flags. Object-property and setter callers retain distinct diagnostics
134
+ and prepend-versus-replace render shapes.
135
+
136
+ ```text
137
+ Production files changed: 1
138
+ Core semantic LOC: 5,296 -> 5,271 (-25)
139
+ Passes / normalization entries: 0 / 0
140
+ IR kinds / runtime concepts: 0 / 0
141
+ Accepted source / diagnostics: unchanged
142
+ ```
143
+
144
+ Artifact comparisons are byte-identical:
145
+
146
+ | Fixture | Files | Deploy SHA-256 | JS raw / gzip |
147
+ |---|---:|---|---:|
148
+ | WorkLedger object prop | 13 | `31886797161a33150afb3bcbf697545afd9d2041a4968decd33146e68d4b7595` | 37,302 / 14,083 B |
149
+ | Array prop effect sync | 10 | `5e3bd8413e3d42c54e5c50d7098aa5c383e73846f7ad80201c663eae92393ec5` | 21,172 / 8,251 B |
150
+
151
+ Verification passes `npm run check`, all 245 Node tests, all 245 required-Chrome tests, and fresh-install package smoke. The maintained Worker/effect benchmark remains 907 raw / 477 gzip B for Worker and 13,786 raw / 5,931 gzip B for the window graph; seven same-target builds have a 444.7 ms median, with no timing claim.
152
+
153
+ ## Second 06B Result
154
+
155
+ The primitive debounce and array setter-effect checks now consume the existing
156
+ `directStateInitializer()` lookup and retain their caller-owned primitive/array
157
+ restrictions. The two duplicate component-body scans are deleted. The shared
158
+ lookup still accepts only one direct `useState()` declaration with a serializable
159
+ literal, so source acceptance and diagnostics are unchanged.
160
+
161
+ ```text
162
+ Production files changed: 1
163
+ Core semantic LOC: 5,271 -> 5,264 (-7)
164
+ Total 06B deletion: 5,296 -> 5,264 (-32)
165
+ Core LOC above 0.8.62: +303
166
+ Passes / normalization entries: 0 / 0
167
+ IR kinds / runtime concepts: 0 / 0
168
+ ```
169
+
170
+ | Fixture | Files | Baseline and candidate deploy SHA-256 | Baseline and candidate JS raw / gzip |
171
+ |---|---:|---|---:|
172
+ | Parameterized debounce | 13 | `b7106651c6a619b01a3e98101df4ac68f9262803e6729451ef03ed3971b36dc7` | 16,053 / 7,735 B |
173
+ | Array prop effect sync | 10 | `5e3bd8413e3d42c54e5c50d7098aa5c383e73846f7ad80201c663eae92393ec5` | 21,172 / 8,251 B |
174
+
175
+ Verification again passes `npm run check`, all 245 Node tests, all 245
176
+ required-Chrome tests, and package smoke. The maintained Worker/effect graph
177
+ remains 907 raw / 477 gzip B for Worker and 13,786 raw / 5,931 gzip B for the
178
+ window graph. Seven same-target builds have a 507.7 ms median; this is a
179
+ completion diagnostic, not a timing comparison.
180
+
181
+ ## Diagnostic Audit
182
+
183
+ The preceding commit and final candidate were built against six invalid
184
+ fixtures. All six fail with the same authored relative file, line, column, and
185
+ message after path normalization; only internal stack-frame line numbers move:
186
+
187
+ | Fixture | Stable authored diagnostic |
188
+ |---|---|
189
+ | Object property dynamic path | `src/DynamicView.tsx:4:24 useEffect() object property dependencies require a direct static property path` |
190
+ | Object property alias | `src/AliasView.tsx:4:17 Object-property component property aliases are not supported; read the static prop.field path directly at each consumer` |
191
+ | Object property mutation | `src/MutationView.tsx:3:28 Object-property component props must remain immutable` |
192
+ | Setter effect indirect call | `src/Dropdown.tsx:6:5 Setter-callback prop "setSelectedItems" must be called directly inside an intrinsic event handler` |
193
+ | Setter effect mismatched pair | `src/pages/index.tsx:7:50 Setter-callback effect prop "setSelectedItems" must target the same direct array state passed through "selectedItems"` |
194
+ | Parameterized debounce delay | `src/pages/index.tsx:7:45 Parameterized debounce hook delays must be numeric literals` |
195
+
196
+ No generated `.kudzu` path is primary, no fallback is added, and no diagnostic
197
+ formatter or abstraction is justified.
198
+
199
+ ## Final Complexity Review
200
+
201
+ The 0.9 candidate retains ten Semantic Kernel concepts, ten indexed ModuleIR
202
+ record kinds, five post-normalization compiler stages, fifteen page/fourteen
203
+ imported normalization entries, and ten browser runtime concepts. Compatibility
204
+ LOC falls by 9. Session 06 closes at 5,264 core semantic lines after removing 32
205
+ lines. The later Work Item 07 scaling paths add 53 lines, so the current
206
+ candidate is 5,317 lines, up 356 from 0.8.62. Existing capability families gain
207
+ bounded lifecycle specialization; the semantic-codegen/browser-runtime file set
208
+ is 2,854 lines and the frozen C2 graph is 1,705 raw / 589 gzip B
209
+ above its first complete acceptance run and adds no runtime concept.
210
+
211
+ The increase is bounded to existing records and consumers: zero semantic
212
+ concepts, IR kinds, passes, normalization entries, runtime concepts, public APIs,
213
+ or generic browser runtimes were added. The candidate ledger found no further
214
+ deletion that does not move source-specific proof or weaken ownership. This
215
+ closes Work Item 06 without authorizing another abstraction.
216
+
217
+ The maintained public storefront completes the scaling gate against preceding
218
+ commit `bb7fdc5` with one warm-up and seven alternating clean builds per size:
219
+
220
+ | Products | Pages / files | Output bytes | Baseline / candidate median |
221
+ |---:|---:|---:|---:|
222
+ | 100 | 111 / 148 | 1,368,823 | 2,767.3 / 2,755.4 ms |
223
+ | 1,000 | 1,011 / 1,048 | 10,164,835 | 8,407.7 / 8,190.3 ms |
224
+ | 10,000 | 10,011 / 10,048 | 97,521,905 | 63,966.5 / 64,217.4 ms |
225
+
226
+ Every baseline/candidate manifest and byte count is identical. Distributions
227
+ overlap, so no timing change is claimed; raw samples are in `PERFORMANCE.md`.
@@ -0,0 +1,176 @@
1
+ # Kudzu 0.9 Final Proof Audit
2
+
3
+ ## Status
4
+
5
+ Work Item `0.9.0-07` is complete as of 2026-08-20. The measured candidate is
6
+ the release commit containing this audit.
7
+
8
+ Benchmark source remains local and ignored by project policy. The final audit
9
+ therefore records commands, versions, acceptance, artifacts, and candidate
10
+ revision in tracked documentation rather than committing benchmark fixtures.
11
+ The complete comparison passes.
12
+
13
+ ## Local Harness Policy
14
+
15
+ `.gitignore` intentionally excludes the complete `benchmarks/` tree. Benchmark
16
+ source, dependencies, generated output, and raw local files must not be committed.
17
+ Only accepted protocol, environment, candidate revision, and results belong in
18
+ tracked architecture/performance records.
19
+
20
+ The current local dependency set resolves React 19.2.8, Vue 3.5.40, Svelte
21
+ 5.56.7, Astro 7.1.3, Vite 8.1.5, Next.js 16.2.11, Nuxt 4.5.0, and SvelteKit
22
+ 2.70.1. Final evidence must restate these exact versions.
23
+
24
+ The public commerce repository is independently pinned at
25
+ `f2d5be1a516c539e30f7125f6870d42b1dd02ecd`, but its package lock references
26
+ Kudzu 0.8.15 and candidate testing depends on an untracked manual symlink. Its
27
+ three-sample sequential scale command also does not meet the final seven-sample
28
+ rotating protocol. The repository-owned paired runner compares Kudzu revisions,
29
+ not frameworks.
30
+
31
+ ## Matrix Gaps
32
+
33
+ | Required application | Available local evidence | Release blocker |
34
+ |---|---|---|
35
+ | Content | Local Kudzu/React/Vue/Svelte/Astro five-route C1 acceptance passes | None; native disclosure reaches 0 B route/session JavaScript for every target. |
36
+ | Stateful | Local five-target matrix passes seven rotating builds/browser profiles, complete frozen C2 acceptance, and uniform artifact/CPU/heap/transfer/build-RSS fields | None; final row filter/restore and search restore medians pass. |
37
+ | Commerce | Kudzu/Astro generated storefront passes acceptance and seven rotating 10,000-product cold/warm runs | None; build time and peak RSS pass. |
38
+ | Resource | Local five-target Worker/navigation matrix passes seven rotating builds/browser profiles, complete frozen C5 acceptance, and uniform artifact/CPU/heap/transfer/build-RSS fields | No acceptance or metric-field gap remains; timing conclusions still follow the statistical gate. |
39
+
40
+ The C2/C5 suites now collect actual transferred and unique session JavaScript,
41
+ preload graphs, fresh-process peak RSS, script execution cost, post-journey and
42
+ repeated-disposal heap, deterministic digests, and interleaved builds. Chrome's
43
+ `V8CompileDuration` remains zero for most targets, so separately attributable
44
+ parse CPU would require a trace; `ScriptDuration` remains the uniform execution
45
+ measure.
46
+
47
+ ## C1 Content Acceptance
48
+
49
+ The local C1 suite builds `/`, `/article/example`, `/category/example`, `/about`,
50
+ and `/static` for Kudzu, React, Vue, Svelte, and Astro. Every target passes:
51
+
52
+ - complete initial HTML, metadata, landmarks, headings, native links, code, and accessible SVG;
53
+ - build-known `example` route content, local image/font assets, and article-only CSS;
54
+ - labelled disclosure behavior and observable state;
55
+ - JavaScript-disabled content plus native `/about` navigation;
56
+ - readable article content when the required script is missing;
57
+ - zero JavaScript on `/static`.
58
+
59
+ Environment: Node 24.14.0, Chrome 142.0.7444.175, Linux x64. This was one
60
+ acceptance build per target, not a timing benchmark.
61
+
62
+ The first version used state-backed disclosure and exposed an 11,348 B Kudzu
63
+ route graph versus 410 B inline Astro JavaScript. Replacing every implementation
64
+ with native `<details>/<summary>` preserves acceptance and reaches 0 B route and
65
+ session JavaScript for every target.
66
+
67
+ | Target | Files | Total bytes | Deployed / session JS | Deploy SHA-256 |
68
+ |---|---:|---:|---:|---|
69
+ | Kudzu | 9 | 8,441 | 0 / 0 B | `49d1fa4e9c46e7e960e38d07130aa1f0d488f2d8c350ebec05d53ab78941d755` |
70
+ | React | 10 | 197,444 | 191,123 / 0 B | `95638a81350d5a3fa1fb1329e3c0d7e9cec5267f6fa2ac0ff5b54006f280d319` |
71
+ | Vue | 10 | 70,840 | 64,519 / 0 B | `96be755a12e6c733d20679043b0387353f3d9d3f873a57136f5f93e194e891ce` |
72
+ | Svelte | 10 | 32,768 | 26,447 / 0 B | `447d186ac55eba9fd6f9b20f75608e83ebd757f840dc19de99fa7ba2ab366375` |
73
+ | Astro | 7 | 8,680 | 0 / 0 B | `e75073eb394393aa636c6efab17c26fe8995113f1c9d79d4e02357990834940b` |
74
+
75
+ ## Stateful And Capability Runs
76
+
77
+ Astro 7.1.3 React-island variants join React 19.2.8, Vue 3.5.40, Svelte 5.56.7,
78
+ and Kudzu in the local runtime and capability matrices. One warm-up, seven
79
+ rotating builds, and seven fresh rotating Chrome profiles pass for all five
80
+ targets.
81
+
82
+ The C2 matrix now proves immutable object replacement, multi-state derived
83
+ output, keyed 1,000-row local state/effect/ref ownership, filter/restore,
84
+ conditional child cleanup and fresh remount, accessible SVG keyboard state, a
85
+ zero-JavaScript static sibling, and blocked/delayed/missing-JavaScript behavior.
86
+ Kudzu emits 41,862 raw / 15,819 gzip B JavaScript versus 196,089 / 60,661 B
87
+ React and 197,771 / 61,994 B Astro+React. All 19 operations and ownership checks
88
+ pass in every profile.
89
+
90
+ The C5 matrix now proves dependency replacement, invalidation before cleanup,
91
+ late-callback suppression, 30 conditional mount/dispose cycles, exact listener
92
+ removal and Worker termination, flat final active handles, accessible output,
93
+ zero-resource-JavaScript static siblings, and blocked/delayed/missing-JavaScript
94
+ behavior. Every target records 32 balanced starts, invalidations, listener
95
+ removals, terminations, and ignored stale callbacks with zero stale mutations.
96
+ Kudzu's Worker graph is 17,639 raw / 8,189 gzip B versus 193,422 / 60,159 B
97
+ React and 195,108 / 61,493 B Astro+React. Uniform artifact, transfer, preload,
98
+ build-RSS, script CPU, heap, digest, and environment fields are recorded.
99
+
100
+ The final 21-profile C2 measurements close the browser release gate. Row-local
101
+ ref resolution, synchronous cleanup, per-list lifecycle gating, shared
102
+ list-item and ownership-path maps, item-dependency transport gating, structural
103
+ row fill/ID plans, row-state release cleanup, and boolean-toggle specialization
104
+ reduce row filter from 34.6 to 12.0 ms, ownership-heavy row restore from 208.6
105
+ to 62.6 ms, and search restore from 77.5 to 51.6 ms. Row filter is faster than
106
+ Vue's 13.3 ms; row restore and search restore are within 3.5% and 1.8% of their
107
+ nearest comparator medians of 60.5 and 50.7 ms. C5 repeated Worker processing, reconnect, 30-cycle
108
+ ownership, cleanup, heap, and active-handle measurements have no comparable
109
+ acceptance gap.
110
+
111
+ This optimization adds no semantic primitive, ModuleIR kind, compiler pass,
112
+ normalization entry, runtime concept, or public API, and changes zero measured
113
+ core semantic concepts or passes. Core semantic LOC grows from 5,311 to 5,317
114
+ for async production compilation, while the semantic-codegen/browser-runtime
115
+ file set grows from 2,771 to 2,854 lines. C2 deploy JavaScript is 43,567 raw /
116
+ 16,408 gzip B while generated row command HTML and measured ownership work fall;
117
+ the frozen fixture count is unchanged.
118
+
119
+ ## Commerce Scaling
120
+
121
+ The public storefront was linked to the current candidate and compared with
122
+ Astro using acceptance before timing, generated source/assets outside the timed
123
+ interval, one warm-up, 21 rotating cold builds, 21 rotating warm builds, peak
124
+ RSS, actual route counts, output bytes, and deterministic manifests.
125
+
126
+ | Products | Target | Routes | Cold / warm median | Peak RSS median | Output bytes |
127
+ |---:|---|---:|---:|---:|---:|
128
+ | 100 | Kudzu | 111 | 3,317 / 3,552 ms | 363,492 KiB | 1,368,823 |
129
+ | 100 | Astro | 111 | 3,558 / 3,710 ms | 330,252 KiB | 2,070,726 |
130
+ | 1,000 | Kudzu flattened input | 1,011 | 2,949 / 2,964 ms | 264,600 KiB | 10,057,806 |
131
+ | 1,000 | Astro | 1,011 | 3,835 / 3,845 ms | 408,100 KiB | 14,896,056 |
132
+ | 10,000 | Kudzu flattened input | 10,011 | 22,614 / 22,151 ms | 542,484 KiB | 96,379,876 |
133
+ | 10,000 | Astro | 10,011 | 23,198 / 23,438 ms | 612,412 KiB | 142,543,510 |
134
+
135
+ The fixture's preparation phase emits flattened page props and bounded collection
136
+ rows instead of compiling an unused 37 MiB nested catalog literal. Kudzu is
137
+ 23.1%/22.9% faster cold/warm than Astro at 1,000 products and 2.5%/5.5%
138
+ faster at 10,000 products. The 10,000-product output digest is
139
+ `811234693329ebd61eeceb6cd05e5d52473e5c81972a820253bf1aea664a0910`.
140
+ One-shot CLI builds intern repeated RouteIR descriptors, update validated records
141
+ in place, spool rendered HTML to staging until runtime families are known, stream
142
+ the unchanged pretty plan, and release standalone plans after serialization.
143
+ Peak RSS falls 71.0% to 542,484 KiB, 11.4% below Astro's 612,412 KiB. Dev,
144
+ incremental, navigation, `afterBuild`,
145
+ the 135 MiB plan, and the 31 MiB artifact report retain their evidence contracts.
146
+ The retained-render and staged-HTML changes add no
147
+ semantic primitive, pass, runtime concept, public API, browser byte, or fixture;
148
+ the commerce output digest is unchanged by that deletion.
149
+
150
+ ## Stale Results
151
+
152
+ The runtime raw file identifies revision `468372b` with the production changes
153
+ uncommitted, while the capability raw file identifies `f213e73`; both record
154
+ their exact ignored benchmark source hashes. Other ignored result files still
155
+ identify older candidates:
156
+
157
+ | Suite | Recorded Kudzu |
158
+ |---|---:|
159
+ | Calculated SVG | 0.8.1 |
160
+ | Commerce desktop | 0.6.13 |
161
+ | Commerce mobile | 0.5.10 |
162
+
163
+ They cannot establish the 0.9 candidate or be presented as checked-in evidence.
164
+
165
+ ## AI Migration Handoff
166
+
167
+ Model-driven success rate and cost belong to the 1.0 AI Delivery Protocol Seed,
168
+ not the 0.9 browser/build release gate. No model result is fabricated for 0.9.
169
+
170
+ ## Completion
171
+
172
+ 1. The 10,000-route peak-RSS loss is closed without dropping route-plan or artifact evidence.
173
+ 2. Seven rotating 10,000-product cold and warm samples pass build-time, RSS, acceptance, and deterministic-output gates.
174
+ 3. Model-driven AI migration measurement remains in the 1.0 work item.
175
+
176
+ The 0.9 final-proof gates are closed.