@kudzujs/core 0.16.25 → 0.16.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/README.md +47 -5
  2. package/package.json +2 -7
  3. package/GOAL_A.md +0 -116
  4. package/GOAL_B.md +0 -121
  5. package/MIGRATION_ROADMAP.md +0 -457
  6. package/PERFORMANCE.md +0 -2478
  7. package/RELEASES.md +0 -4686
  8. package/docs/next-architecture/0.9-baseline.md +0 -1199
  9. package/docs/next-architecture/0.9-benchmark-contracts.md +0 -507
  10. package/docs/next-architecture/0.9-component-property-contract.md +0 -89
  11. package/docs/next-architecture/0.9-compression-ledger.md +0 -227
  12. package/docs/next-architecture/0.9-final-proof-audit.md +0 -176
  13. package/docs/next-architecture/0.9-implementation-plan.md +0 -1819
  14. package/docs/next-architecture/0.9-resource-lifecycle.md +0 -118
  15. package/docs/next-architecture/0.9-semantic-compression.md +0 -384
  16. package/docs/next-architecture/1.0-large-application-compatibility-audit.md +0 -372
  17. package/docs/next-architecture/README.md +0 -56
  18. package/docs/next-architecture/application-capability-release-plan.md +0 -2445
  19. package/docs/next-architecture/compiler-current-architecture.md +0 -97
  20. package/docs/next-architecture/goal-a-compiler-foundation.md +0 -151
  21. package/docs/next-architecture/goal-b-optimization-benchmarks.md +0 -86
  22. package/docs/next-architecture/goal-c-state-resource-research.md +0 -88
  23. package/docs/next-architecture/goal-d-routing-compatibility-decisions.md +0 -52
  24. package/docs/next-architecture/large-application-ai-native-roadmap.md +0 -486
  25. package/docs/next-architecture/performance-gates.md +0 -50
  26. package/docs/next-architecture/versioning.md +0 -91
  27. package/framework/README.md +0 -105
@@ -1,2445 +0,0 @@
1
- # Application Capability Release Plan
2
-
3
- This is the authoritative execution plan from `0.10.0` through `1.0.0`. It
4
- replaces the provisional `0.10` normalize, `0.11` diagnostics, and `0.12`
5
- adapter ordering recorded in the completed 0.9 packet. Those tools remain in
6
- scope, but application capability evidence now determines their order.
7
-
8
- The plan assigns one application-capability section to each minor release and
9
- one independently releasable evidence packet to each patch release. Planned
10
- versions are not completed releases. `package.json`, release notes, tags, and
11
- registry metadata change only after the matching packet passes every gate.
12
-
13
- ## Product Outcome
14
-
15
- Kudzu must support complete modern application journeys with no React runtime,
16
- VDOM, hydration, retained browser component tree, generic component renderer,
17
- or hook dispatcher. Static routes may still emit zero JavaScript. Interactive
18
- routes may emit every route- or feature-specific capability required for
19
- correct behavior.
20
-
21
- The target is zero unused runtime, not zero runtime.
22
-
23
- ## Version Map
24
-
25
- | Minor | Capability section | Required outcome |
26
- |---|---|---|
27
- | `0.10.x` | Local and shared state | The greenfield application shell and state ownership baseline are executable. |
28
- | `0.11.x` | Async and server data | Loading, errors, stale work, mutation, and evidence-backed shared coordination are complete. |
29
- | `0.12.x` | Routing and application lifetime | Authenticated route, layout, history, focus, and failure journeys are complete. |
30
- | `0.13.x` | Forms | Production-shaped validation, drafts, conditional fields, autosave, and upload boundaries are complete. |
31
- | `0.14.x` | Lists, tables, and virtualization | Large keyed data behavior and a measured bounded-DOM decision are complete. |
32
- | `0.15.x` | Overlay and layer ownership | Accessible dialog, popover/menu, toast, and any proven layer ownership are complete. |
33
- | `0.16.x` | External complex UI | Real editor, chart/map, or grid packages use bounded mount/update/dispose ownership. |
34
- | `0.17.x` | Long-lived applications | Realtime, repeated navigation, cleanup, and long-running memory gates pass. |
35
- | `0.18.x` | Lazy loading and code splitting | Large feature dependencies load only when their owner requires them. |
36
- | `0.19.x` | React ecosystem migration | Apache Answer and Memos pass connected browser journeys through the compatibility boundary. |
37
- | `0.20.x` | AI tooling and delivery cost | Structured tools and a fair tracked AI benchmark reduce cost per successful task. |
38
- | `0.21.x` | Production-scale proof | Functional parity, build scale, browser performance, memory, and release evidence pass together. |
39
- | `1.0.0` | Stable application model | Semantic IR v1 is stable and the maintained AI delivery gate passes. |
40
-
41
- ## Execution Rules
42
-
43
- 1. Work on exactly one patch packet at a time. Start the next packet only after
44
- the previous packet is released or this document explicitly replans it.
45
- 2. Begin behavior work with a real failing greenfield or React-derived fixture.
46
- 3. Reduce the failure through native platform behavior, existing Kudzu
47
- semantics, normalization, or an internal adapter, in that order.
48
- 4. Two unrelated real fixtures register a repeated application limitation.
49
- Three unrelated real fixtures are required before architecture review may
50
- authorize a new semantic primitive.
51
- 5. A patch may complete without a new primitive, compiler pass, public API, or
52
- runtime when existing composition satisfies its acceptance contract.
53
- 6. Package-specific knowledge ends in compatibility analysis, normalization,
54
- or an internal adapter. It must not enter generic IR, codegen, or runtime.
55
- 7. Every static sibling remains JavaScript-free. Every interactive route emits
56
- only the capabilities selected by its validated route record.
57
- 8. Every patch records semantic primitives, core compiler/pass LOC, runtime
58
- concepts, browser bytes, fixtures, output hashes, and benchmark deltas.
59
- 9. Do not publish a planned version merely because its source compiles. The
60
- exact release commit must pass behavior, accessibility, browser, output,
61
- package, and applicable performance gates.
62
- 10. Never silently combine patch packets. Revise this plan first when an
63
- inseparable producer/consumer boundary is proven.
64
-
65
- ## Shared Testbeds
66
-
67
- ### Greenfield Project Application
68
-
69
- The maintained greenfield testbed is a project-management SaaS with this route
70
- shape:
71
-
72
- ```text
73
- /login
74
- /app/projects
75
- /app/projects/:projectId
76
- /app/issues
77
- /app/issues/:issueId
78
- /app/settings
79
- /help
80
- ```
81
-
82
- It grows one accepted user journey at a time. `/help` is the static zero-JS
83
- control. The application uses a deterministic local HTTP server until a packet
84
- explicitly requires a different transport.
85
-
86
- ### Apache Answer
87
-
88
- The connected acceptance target is:
89
-
90
- ```text
91
- login
92
- -> question list
93
- -> search/filter/pagination
94
- -> detail
95
- -> create/edit
96
- -> server validation/error
97
- -> mutation and list refresh
98
- -> logout
99
- ```
100
-
101
- ### Memos
102
-
103
- The connected acceptance target is:
104
-
105
- ```text
106
- login
107
- -> feed
108
- -> pagination
109
- -> create memo
110
- -> reaction
111
- -> realtime refresh
112
- -> logout
113
- ```
114
-
115
- Actual Budget remains deferred until a complete pinned workspace and executable
116
- dependency graph are available.
117
-
118
- ## `0.10.x`: Local And Shared State
119
-
120
- ### `0.10.0`: Application Contract And State Baseline
121
-
122
- - **Purpose:** create the durable greenfield testbed and capability inventory.
123
- - **Current limitation:** state, forms, lists, and navigation are proven mostly
124
- in isolated fixtures rather than one maintained application.
125
- - **Expected files:** a dedicated project-application fixture, browser
126
- acceptance entry, package script, and capability manifest; no production
127
- compiler or runtime file should change.
128
- - **Acceptance:** `/app/projects` renders deterministic project state, one
129
- interaction updates direct DOM, `/help` emits zero JavaScript, required
130
- Chrome runs in CI, and route/artifact baselines are recorded.
131
- - **AI effect:** one application and one manifest replace repeated repository
132
- exploration when selecting later capability work.
133
- - **Stop condition:** the fixture becomes a syntax showcase instead of a user
134
- journey, or requires a new primitive before the baseline exists.
135
- - **Done condition:** every later packet can add behavior to the same testbed
136
- and reuse its framework-neutral acceptance harness.
137
-
138
- **Completion evidence:** the tracked project application emits `/login`,
139
- `/app/projects`, and `/help`. The project route reuses one existing primitive
140
- SignalIR state and one command handler; it adds no production compiler LOC,
141
- pass, semantic primitive, Handler ESM, or runtime concept. Its existing command
142
- runtime graph is 768 raw / 441 aggregate gzip bytes, while `/help` emits 0 B
143
- JavaScript. The complete fixture emits 4 files, 1,970 raw / 1,265 aggregate gzip
144
- bytes, with deploy digest
145
- `94ce7d01cac2e80823a36279294015d2f22328acaed571abb9996f8ca6171121`.
146
- The focused Chrome journey, `npm run check`, 273 non-browser tests, 273
147
- required-Chrome tests, and package smoke pass. No production performance claim
148
- is made because compiler and runtime sources are unchanged.
149
-
150
- ### `0.10.1`: Local, Object, Array, And Derived State Scale
151
-
152
- - **Purpose:** prove stable dependency and ownership behavior with many ordinary
153
- states and nested JSON-safe application records.
154
- - **Expected boundary:** existing SignalIR, DerivedIR, bindings, conditions, and
155
- keyed ownership; no normalized-state runtime.
156
- - **Acceptance:** deterministic updates across project summary, filters, issue
157
- counts, derived labels, conditional owners, and nested lists; unrelated DOM
158
- does not change; removal releases owned state.
159
- - **Performance:** record commit latency and runtime metadata for increasing
160
- state/dependency counts.
161
- - **Stop condition:** proposed support depends on arbitrary object mutation or a
162
- generic rerender loop.
163
- - **Done condition:** the recorded scale remains within the material regression
164
- threshold and nearby unsupported dynamic paths fail at authored locations.
165
-
166
- **Completion evidence:** the project journey composes five ordinary route
167
- states: one object, two arrays, and two primitives. Six existing reactive
168
- bindings, one conditional owner, three keyed lists, one nested issue list, and
169
- one keyed row-local state cover summary replacement, filtering, derived issue
170
- counts, saved-filter append, conditional release/remount, keyed identity, and
171
- row-state release/reset. An unrelated control records zero DOM mutations. The
172
- route adds no semantic primitive, pass, browser runtime concept, normalized
173
- state, or generic rerender path; the only supported source adjustment is the
174
- application's use of a separate project array state at the existing keyed-list
175
- boundary. Direct object-field nested-list replacement remains outside this
176
- packet after its isolated experiment failed browser replacement, while the
177
- existing dynamic object-property diagnostic remains source-located.
178
-
179
- The application deploy contains 12 files, 47,546 raw / 16,285 aggregate gzip
180
- bytes, with SHA-256
181
- `d50c9ff6dccba338559dd9e9141c4607ec62da30385658e617a86f7af3f52e0f`.
182
- `/app/projects` uses 39,178 raw / 14,143 aggregate gzip JavaScript bytes;
183
- `/help` remains 0 B. The generated 1/8/32-state scale benchmark emits identical
184
- deploy output under `v0.10.0` and the candidate. Seven fresh Chrome processes
185
- record commit medians of 0.5/0.6/0.9 ms as the derived binding dependency edges
186
- increase from 0 to 8 to 32. Runtime JavaScript is 768/10,935/11,341 raw bytes
187
- and 441/4,789/4,841 aggregate gzip bytes. No material regression is present.
188
- Release commit `f04041b`, tag `v0.10.1`, both CI jobs, the GitHub release,
189
- `@kudzujs/core@0.10.1`, `create-kudzu@0.1.105`, registry metadata, and a fresh
190
- scaffold install/check are verified.
191
-
192
- ### `0.10.2`: Shared Layout And Cross-Route State
193
-
194
- - **Purpose:** keep workspace/session state across an explicit application
195
- navigation group while resetting route-owned state.
196
- - **Expected boundary:** existing SharedStateIR, layout state IDs, route release,
197
- and native fallback.
198
- - **Acceptance:** workspace selection survives project/list/detail transitions;
199
- route drafts reset; reload behavior is explicit; a separate route group does
200
- not receive the shared state.
201
- - **Stop condition:** implementation requires a document-global store or SPA
202
- router.
203
- - **Done condition:** state lifetime and disposal are exact in browser tests and
204
- static routes receive no shared-state runtime.
205
-
206
- **Completion evidence:** the greenfield application adds one exact Alpha detail
207
- route and one explicit navigation group around list/detail routes. A relative
208
- Context hook lowers through the existing `SharedStateIR`: both routes own the
209
- same `workspace` layout state while list state and the detail `draft` remain
210
- route-owned. Required Chrome proves retained layout DOM identity, workspace
211
- persistence in both directions, detail DOM release, fresh draft state on
212
- re-entry, and initial layout/draft values in a fresh document. `/help` remains
213
- outside the group, retains its native anchor path, and emits complete HTML with
214
- 0 B JavaScript.
215
-
216
- This packet adds no semantic primitive, ModuleIR kind, compiler pass, production
217
- compiler LOC, runtime concept, normalization rule, adapter rule, store, or SPA
218
- router. It adds one application layout/context module, one route, one config,
219
- and one positive browser journey; existing navigation-group diagnostics retain
220
- the nearby rejected configuration boundary. The fixture emits 14 files, 57,293
221
- raw / 19,985 aggregate gzip bytes, with deploy SHA-256
222
- `1c867ee7119f7eb23b935c4506c2a46639acb75c13f0916b29c255421b0d123d`.
223
- The list/detail session uses 10 unique JavaScript files totaling 46,418 raw /
224
- 17,045 aggregate gzip bytes. Seven fresh Chrome profiles record list-to-detail
225
- completion at `[2.3, 6.5, 1.4, 1.3, 5.1, 1.3, 4.0]` ms, median 2.3 ms.
226
-
227
- Release commit `76a45c4`, tag `v0.10.2`, both CI jobs, the GitHub release,
228
- `@kudzujs/core@0.10.2`, `create-kudzu@0.1.106`, registry metadata, and a fresh
229
- registry-backed scaffold install/check passed on 2026-08-22. Publish workflow
230
- `32566976581` completed every version, package, publication, and registry gate.
231
-
232
- ### `0.10.3`: Persistence Recipe And State Release
233
-
234
- - **Purpose:** prove URL, storage, and server-backed persistence without adding a
235
- persistence framework.
236
- - **Expected boundary:** application-owned effects and Web Storage.
237
- - **Acceptance:** guarded restore, schema/version failure fallback, write after
238
- state changes, logout clear, conditional/keyed release, and fresh remount.
239
- - **Stop condition:** a generic persistence API is proposed without another
240
- independent application requirement.
241
- - **Done condition:** deterministic static fallback and browser recovery pass
242
- with no storage runtime in unused routes.
243
-
244
- **Completion evidence:** the greenfield application layout now owns one guarded
245
- `localStorage` recipe composed entirely from ordinary state and two existing
246
- effects. Static HTML starts with `Primary`; a mount effect accepts only version
247
- 1 records whose workspace is `Primary` or `Secondary`, while absent, malformed,
248
- wrong-schema, and wrong-version records fall back safely. A readiness state
249
- prevents the dependency effect from overwriting storage before restore.
250
- Workspace changes write the versioned record, and logout disables persistence,
251
- removes the record, and resets visible state in one synchronous handler.
252
-
253
- Required Chrome proves valid restore, every fallback, post-commit persistence,
254
- logout removal, conditional and keyed release/fresh remount, route draft
255
- release/fresh revisit, and a fresh direct document. `/help` remains outside the
256
- navigation group with complete HTML and 0 B JavaScript. The fixture emits 19
257
- files, 65,376 raw / 23,471 aggregate gzip bytes, with deploy SHA-256
258
- `bb58826876bdf090a85d2c1f8a1edcbbc9abd35d5335eb3d1e7fb1fafe6bed72`.
259
- The two-route session uses 15 unique JavaScript files totaling 53,562 raw /
260
- 20,323 aggregate gzip bytes.
261
-
262
- This packet adds zero semantic primitives, ModuleIR kinds, compiler passes,
263
- production compiler lines, runtime concepts, normalization rules, adapter
264
- rules, public APIs, stores, or persistence runtimes. One existing positive
265
- application fixture gains valid, absent, malformed, wrong-schema, wrong-version,
266
- write, and clear browser cases. A matched 21-profile measurement records the
267
- authored capability cost: the 0.10.2 list/detail median of 1.9 ms and 46,418 raw /
268
- 17,045 gzip session JavaScript becomes 1.5 ms and 53,562 / 20,323 bytes. The
269
- timing ranges overlap with no material loss; the 7,144 raw / 3,278 gzip byte
270
- increase is the explicit cost of route-owned effect/native entries, not a
271
- compiler or shared-runtime change.
272
-
273
- Release commit `4420ccc`, tag `v0.10.3`, both CI jobs, the GitHub release,
274
- `@kudzujs/core@0.10.3`, `create-kudzu@0.1.107`, registry metadata, and a fresh
275
- registry-backed scaffold install/check passed on 2026-08-22. Publish workflow
276
- `32568752477` completed every version, package, publication, and registry gate.
277
-
278
- ## `0.11.x`: Async And Server Data
279
-
280
- ### `0.11.0`: Owned Fetch Lifecycle
281
-
282
- - **Purpose:** establish the greenfield loading/error/data/refetch baseline.
283
- - **Expected boundary:** existing EffectIR, ordinary state, and native `fetch`.
284
- - **Acceptance:** delayed stale response loses state authority, HTTP failure is
285
- accessible, explicit refetch recovers, route removal blocks late writes, and
286
- authored cancellation is tested where required.
287
- - **Stop condition:** a query cache is added to implement one request.
288
- - **Done condition:** the project list journey passes and `/help` stays zero-JS.
289
-
290
- **Completion evidence:** the project list now composes one route-owned native
291
- `fetch` effect with ordinary request, status, error, project, and summary state.
292
- The deterministic server drives initial loading, a fast explicit refetch, an
293
- HTTP 500 alert, and recovery. A delayed prior continuation attempts its writes
294
- after dependency replacement and cannot replace the newer keyed project data.
295
- The effect owns an `AbortController`; dependency replacement and route removal
296
- invoke authored abort cleanup, and late route work cannot mutate the detail
297
- route or recreated list ownership. Existing project filtering, nested keyed
298
- identity, row state, shared layout state, persistence, and logout journeys still
299
- pass. `/help` remains complete HTML with 0 B JavaScript.
300
-
301
- This packet adds zero semantic primitives, ModuleIR kinds, compiler passes,
302
- production compiler lines, runtime concepts, normalization rules, adapter
303
- rules, public APIs, caches, Providers, retry schedulers, or query runtimes. One
304
- existing positive application fixture gains loading, success, stale completion,
305
- HTTP failure, recovery, cancellation, and route-release cases. The fixture
306
- still emits 19 files and now totals 67,886 raw / 24,077 aggregate gzip bytes,
307
- with deploy SHA-256
308
- `9c06d2a5d47b4ea2ae54cebbc0448bf161907691ee37a02a5dae0e7c37779ae4`.
309
- The project route uses 52,130 raw / 19,502 aggregate gzip JavaScript bytes; the
310
- two-route session uses 54,770 / 20,763 bytes, an authored capability increase of
311
- 1,208 raw / 440 gzip bytes over `0.10.3`. Twenty-one fresh Chrome profiles record
312
- 0.8 ms median list-to-detail completion with a 0.6/1.3 ms range. The changed
313
- fetch-completion prerequisite permits no latency improvement claim; no material
314
- regression is present.
315
-
316
- Clean-worktree `npm run check`, 273/273 standard tests, the required project
317
- Chrome journey, the focused required-Chrome retry for the one full-suite browser
318
- timeout, and packed-package smoke pass on 2026-08-22.
319
-
320
- Release commit `8065d86`, tag `v0.11.0`, both CI jobs, the GitHub release,
321
- `@kudzujs/core@0.11.0`, `create-kudzu@0.1.108`, registry metadata, and a fresh
322
- registry-backed scaffold install/check passed on 2026-08-22. Publish workflow
323
- `32571667242` completed every version, package, publication, and registry gate.
324
-
325
- ### `0.11.1`: List And Detail Data Consistency Evidence
326
-
327
- - **Purpose:** expose the first real multi-consumer coordination limit.
328
- - **Expected boundary:** layout shared state plus existing effects first.
329
- - **Acceptance:** project list and detail observe one mutation, duplicate
330
- requests are counted, route changes and refresh are deterministic, and all
331
- current limitations are machine-recorded.
332
- - **Stop condition:** the fixture invents package-shaped query semantics not
333
- required by the user journey.
334
- - **Done condition:** existing composition is accepted or the smallest repeated
335
- missing coordination contract is isolated.
336
-
337
- **Completion evidence:** one layout-owned project record composes from two
338
- primitive shared signals and one existing mount effect. The list and detail
339
- routes observe the same server-confirmed rename without another read. The
340
- deterministic journey records one initial GET, zero additional GETs across two
341
- enhanced route changes, one mutation POST, and exactly one new GET after full
342
- document reload. The refreshed document reconstructs revision 1 from server
343
- truth while route-owned detail draft state resets. `/help` remains complete HTML
344
- with 0 B JavaScript.
345
-
346
- Current composition is accepted. Shared data lasts for one document and retained
347
- layout owner; independently authored fetch owners are not deduplicated, and no
348
- request registry, invalidation graph, subscriber set, or retained query cache
349
- exists. This one fixture does not authorize `0.11.2`: it needs no coordination
350
- primitive after ownership is placed correctly, while the packet requires two
351
- additional independent fixtures to demonstrate the same missing contract.
352
-
353
- This packet adds zero semantic primitives, ModuleIR kinds, compiler passes,
354
- production compiler lines, runtime concepts, normalization rules, adapter rules,
355
- public APIs, caches, Providers, or query runtimes. One existing positive fixture
356
- gains list/detail consistency, counted domain requests, mutation, navigation,
357
- and reload cases. It emits 20 files totaling 69,501 raw / 24,649 aggregate gzip
358
- bytes with deploy SHA-256
359
- `bc6335131b7867da2857621211919fad43ebfb9414aac711c45f0c8ed3803022`.
360
- The two-route session uses 16 JavaScript files totaling 55,736 raw / 21,208
361
- aggregate gzip bytes, an authored application increase of 966 raw / 445 gzip
362
- bytes over `0.11.0`. Twenty-one fresh Chrome profiles record a 0.9 ms median
363
- list-to-detail completion with a 0.7/1.2 ms range, overlapping the prior
364
- 0.6/1.3 ms range; no latency change is claimed.
365
-
366
- Clean-worktree `npm run check`, 273/273 required-Chrome tests, and packed-package
367
- smoke passed on 2026-08-22. Release commit `5bab3fe`, tag `v0.11.1`, feature CI
368
- `32573961250`, the GitHub release, `@kudzujs/core@0.11.1`,
369
- `create-kudzu@0.1.109`, registry metadata, and a fresh registry-backed scaffold
370
- install/check passed. Publish workflow `32574182988` completed every version,
371
- package, publication, and registry gate.
372
-
373
- ### `0.11.2`: Shared Request Coordination
374
-
375
- - **Purpose:** implement only the deduplication, subscriber, and invalidation
376
- semantics authorized by `0.11.1` and two additional independent fixtures.
377
- - **Expected boundary:** package-neutral application semantics; no TanStack,
378
- SWR, Provider, retry scheduler, or public query API by default.
379
- - **Acceptance:** one in-flight request per key, exact subscriber ownership,
380
- invalidation after mutation, route/layout disposal, bounded retention, and
381
- static exclusion.
382
- - **Stop condition:** three unrelated fixtures do not require the same semantic
383
- primitive, or ordinary shared state remains sufficient.
384
- - **Done condition:** architecture review records the reused or new primitive,
385
- runtime bytes, cache bound, and cleanup behavior.
386
-
387
- **Completion evidence:** architecture review covers three unrelated executable
388
- fixtures: the project application, TanStack Query-shaped product loading, and
389
- Apache Answer/SWR-shaped question loading. Every fixture has one explicit data
390
- owner, ordinary loading/error/data state, one native fetch effect, dependency or
391
- owner invalidation, exact cleanup, and static exclusion. None has two independent
392
- owners requesting one key, independently releasable subscribers, mutation-key
393
- invalidation, retained results after owner release, or a cache bound.
394
-
395
- The stop condition is met and this packet closes with no new primitive. The
396
- project application records `closed-no-new-primitive`, the three reviewed
397
- fixtures, an empty repeated-missing-contract list, and the reused semantics in
398
- its machine-readable capability contract. Existing fixture journeys remain the
399
- executable behavioral evidence. Absence of generic deduplication is not itself
400
- fixture pressure.
401
-
402
- This packet adds zero semantic primitives, ModuleIR kinds, compiler passes,
403
- production compiler lines, runtime concepts, normalization rules, adapter rules,
404
- public APIs, request registries, subscriber sets, invalidation graphs, caches, or
405
- browser bytes. One existing machine-readable contract and assertion change;
406
- all three existing positive fixtures remain behaviorally unchanged. The project
407
- application retains its 20-file, 69,501 raw / 24,649 aggregate gzip deploy and
408
- 55,736 raw / 21,208 aggregate gzip two-route JavaScript session. Cache bound is
409
- not applicable because no cache exists; cleanup remains existing effect and
410
- route/layout owner release.
411
-
412
- Clean-worktree `npm run check`, 273/273 required-Chrome tests, and packed-package
413
- smoke passed on 2026-08-22. Release commit `0ae4d5d`, tag `v0.11.2`, CI
414
- `32575316981`, the GitHub release, `@kudzujs/core@0.11.2`,
415
- `create-kudzu@0.1.110`, registry metadata, and a fresh registry-backed scaffold
416
- install/check passed. Publish workflow `32575541567` completed every version,
417
- package, publication, and registry gate.
418
-
419
- ### `0.11.3`: Mutation, Optimistic Update, And Rollback
420
-
421
- - **Purpose:** complete issue create/edit/delete behavior under failure.
422
- - **Expected boundary:** immediate state setters and existing shared data
423
- coordination; a transaction primitive is evidence-gated.
424
- - **Acceptance:** optimistic list/detail update, server rejection, exact
425
- rollback, duplicate-submit prevention, retained row identity, and accessible
426
- error state.
427
- - **Stop condition:** generic transactions are proposed for a single-owner
428
- handler.
429
- - **Done condition:** data integrity survives success, failure, navigation, and
430
- retry.
431
-
432
- **Completion evidence:** one layout-owned async rename handler snapshots the
433
- current project name/revision, writes an immediate optimistic value, disables its
434
- button after the synchronous-turn commit, and sends one native POST. The
435
- deterministic server rejects the first attempt. The handler restores the exact
436
- snapshot, exposes `HTTP 500` through an accessible alert, and leaves the retained
437
- keyed row identity unchanged. A retry from detail writes the optimistic value,
438
- clears the alert, commits the confirmed revision, survives list/detail
439
- navigation, and restores from server truth after full document reload. Counts
440
- record two attempts, one accepted mutation, and no mutation-triggered GET.
441
-
442
- Existing immediate setters, native async handlers, shared layout signals, and
443
- owner authority are sufficient. This packet adds zero semantic primitives,
444
- ModuleIR kinds, compiler passes, production compiler lines, runtime concepts,
445
- normalization rules, adapter rules, public APIs, transaction primitives, caches,
446
- or schedulers. One positive application fixture gains optimistic success,
447
- failure, rollback, disabled duplicate submission, navigation, retry, and reload
448
- cases. It emits 19 files totaling 73,202 raw / 25,057 aggregate gzip bytes with
449
- deploy SHA-256
450
- `40c68fef4eeba5ea4c1a92e9a8003b74e6a45b7a10671ee2f3e4952010117b26`.
451
- The two-route session uses 15 JavaScript files totaling 56,318 raw / 21,211
452
- aggregate gzip bytes, an authored application increase of 582 raw / 3 gzip bytes
453
- over `0.11.2`. Twenty-one fresh Chrome profiles record a 0.8 ms median with a
454
- 0.7/1.0 ms range; no latency change is claimed.
455
-
456
- Clean-worktree `npm run check`, 273/273 required-Chrome tests, and packed-package
457
- smoke passed on 2026-08-22. Release commit `ba6f97a`, tag `v0.11.3`, CI
458
- `32576861865`, the GitHub release, `@kudzujs/core@0.11.3`,
459
- `create-kudzu@0.1.111`, registry metadata, and a fresh registry-backed scaffold
460
- install/check passed. Publish workflow `32577090955` completed every version,
461
- package, publication, and registry gate.
462
-
463
- ### `0.11.4`: Pagination, Refresh, And Polling Policy
464
-
465
- - **Purpose:** complete bounded server-data loading before infinite data work.
466
- - **Expected boundary:** URL signals, effects, native timers, and visibility
467
- events.
468
- - **Acceptance:** page/filter synchronization, back/forward, refresh, optional
469
- polling cleanup, no duplicate work, and bounded retained results.
470
- - **Stop condition:** background policy becomes a universal scheduler without
471
- repeated evidence.
472
- - **Done condition:** the exact owner and network behavior are measured and
473
- documented.
474
-
475
- **Completion evidence:** the project list reads page and filter from two
476
- existing React Router query signals and restarts its existing abortable fetch
477
- effect when either changes. Static updater handlers push page 2/all and page
478
- 1/active URLs. Two browser back operations restore the prior URL, signal values,
479
- and bounded server results. An explicit refresh increments the same route-owned
480
- request signal. Optional polling owns one native interval and one
481
- `visibilitychange` listener; hidden events perform no work, one visible event
482
- performs one refresh, and disabling polling clears both owners before a later
483
- event. The deterministic journey records 11 total list requests across initial
484
- stale replacement, HTTP recovery, page/filter history, refresh, polling, and
485
- route remount. Every response retains at most two rows.
486
-
487
- Existing query signals, primitive state, dependency effects, abort invalidation,
488
- native timers/listeners, and route cleanup are sufficient. This packet adds zero
489
- semantic primitives, ModuleIR kinds, compiler passes, production compiler lines,
490
- runtime concepts, normalization rules, adapter rules, public APIs, caches,
491
- schedulers, or retained result stores. One positive application fixture gains
492
- page/filter URL ownership, history, refresh, visibility-aware polling, exact
493
- cleanup, request counts, and bounded-result cases. It emits 20 files totaling
494
- 77,263 raw / 26,156 aggregate gzip bytes with deploy SHA-256
495
- `a3864a5155d658e86378fce80de94e082ef0894c5db5f5793d91b4de7f359b46`.
496
- The two-route session uses 16 JavaScript files totaling 58,970 raw / 22,124
497
- aggregate gzip bytes, an authored application increase of 2,652 raw / 913 gzip
498
- bytes over `0.11.3`. Twenty-one fresh Chrome profiles record a 1.3 ms median
499
- with a 1.2/1.6 ms range. The prior range does not overlap, so the 0.5 ms median
500
- increase is disclosed rather than presented as a no-regression result. `/help`
501
- remains 0 B JavaScript.
502
-
503
- ## `0.12.x`: Routing And Application Lifetime
504
-
505
- ### `0.12.0`: Project Route Shell And Runtime Parameters
506
-
507
- - **Purpose:** prove directly addressable project and issue routes.
508
- - **Expected boundary:** file routes, runtime parameters, complete HTML, and
509
- native navigation.
510
- - **Acceptance:** direct entry, reload, invalid parameter rejection, project to
511
- issue navigation, and standalone fallback.
512
- - **Stop condition:** an SPA route registry is introduced.
513
- - **Done condition:** all target routes are addressable without a browser router.
514
-
515
- **Completion evidence:** the maintained project application adds one bracket
516
- project page and one nested bracket issue page, both using the existing aliased
517
- React Router `useParams()` migration path and the existing shared application
518
- layout. Each fallback emits complete document structure plus only pathname
519
- parameter, binding, native-handler, and owned-layout capability ESM. The project
520
- page owns a native parameterized anchor to its first issue. The issue page owns a
521
- native parameterized project return. Neither standalone artifact includes the
522
- enhanced-navigation entry.
523
-
524
- The fixture emits the compiler-provided ordered rewrite records through its
525
- existing `afterBuild` host boundary. A deterministic static server checks exact
526
- files first, then applies those records for direct project and issue entry.
527
- Required Chrome proves project entry,
528
- issue entry, and issue reload; the generated parameter module rejects an encoded
529
- slash before mounting. Static HTML and artifact assertions prove the project to
530
- issue anchor remains native, both routes share one signature-keyed standalone
531
- runtime family, and `/help` remains 0 B JavaScript. Deployment still must install
532
- the generated rewrites; Kudzu does not add a server or browser route registry.
533
-
534
- Existing file routes, runtime pathname parameters, layout ownership, route
535
- bindings, native anchors, host rewrites, and browser reload are sufficient. This
536
- packet adds zero semantic primitives, ModuleIR kinds, compiler passes,
537
- production compiler lines, runtime concepts, normalization rules, adapter rules,
538
- or public APIs. One positive application fixture gains two route files, direct
539
- entry, reload, invalid-parameter rejection, native project-to-issue linkage, and
540
- host fallback cases. It emits 36 files totaling 105,577 raw / 38,067 aggregate
541
- gzip bytes with deploy SHA-256
542
- `6a6c5985cf2a7e9649b0bbd70506357051dac995a74225b0022c5f1ecedaf2b8`.
543
- The runtime project route uses 17,905 raw / 8,455 gzip JavaScript bytes and the
544
- issue route uses 18,002 raw / 8,474 gzip bytes. The existing two-route enhanced
545
- session remains byte-identical at 58,970 raw / 22,124 gzip bytes. Twenty-one
546
- fresh Chrome profiles record a 1.3 ms median with a 1.1/1.6 ms range; the range
547
- overlaps `0.11.4`, so no latency change is claimed.
548
-
549
- ### `0.12.1`: Shared Layout, History, Focus, And Scroll
550
-
551
- - **Purpose:** complete the accepted same-document application group behavior.
552
- - **Expected boundary:** existing navigation runtime and layout/route lifetime.
553
- - **Acceptance:** back/forward, retained layout state, route cleanup, title/live
554
- announcement, focus destination, hash behavior, and explicit scroll policy.
555
- - **Stop condition:** browser-native navigation is weakened for routes outside
556
- the approved group.
557
- - **Done condition:** keyboard and browser-history journeys pass with native
558
- recovery.
559
-
560
- **Completion evidence:** the project application adds route titles, one native
561
- hash anchor, and one intrinsic hash destination. Required Chrome activates the
562
- focused anchor, retains the layout and workspace state through push, back, and
563
- forward navigation, releases and recreates dirty route state, updates the title
564
- and polite live status, focuses hash and heading destinations, applies explicit
565
- hash and top scroll policies, and leaves `/help` browser-native outside the
566
- approved route group.
567
-
568
- The journey exposed one existing JavaScript value bug: an absent hash produced
569
- the empty string and prevented the nullish heading/main focus fallback. The
570
- navigation runtime now produces `null` for that case. This packet adds zero
571
- semantic primitives, ModuleIR kinds, compiler passes, core compiler lines,
572
- runtime concepts, normalization rules, adapter rules, or public APIs. Runtime
573
- source remains 351 lines. One positive application fixture gains the complete
574
- acceptance journey; `/help` remains 0 B JavaScript.
575
-
576
- The fixture emits 36 files totaling 106,096 raw / 38,201 aggregate gzip bytes
577
- with deploy SHA-256
578
- `4f1ce541af0794fcb17458ad37db7b32beb434f3a83cb7f949f13b3e4536fe1c`.
579
- The two-route session uses 16 JavaScript files totaling 58,974 raw / 22,129
580
- aggregate gzip bytes, 4 raw / 5 gzip bytes above `0.12.0`. Seven fresh Chrome
581
- profiles record a 1.3 ms navigation median with a 1.3/1.5 ms range. The range
582
- overlaps `0.12.0`, so no latency change is claimed. This correctness packet has
583
- no measured AI-delivery cost effect.
584
-
585
- ### `0.12.2`: Authentication And Permission Boundary
586
-
587
- - **Purpose:** complete login, restore, 401, logout, and permission-aware UI.
588
- - **Expected boundary:** shared layout state, owned fetch, storage, and server or
589
- host authorization.
590
- - **Acceptance:** invalid and valid login, reload restoration, direct protected
591
- entry, role-aware controls, server rejection, token clear, and logout.
592
- - **Stop condition:** client conditional rendering is presented as a security
593
- boundary.
594
- - **Done condition:** server authorization and client UX responsibilities are
595
- executable and explicit.
596
-
597
- **Completion evidence:** the project application replaces its placeholder login
598
- route with a native constrained form and one async handler. The shared layout
599
- restores a stored token, validates the current user, exposes authenticated
600
- identity and role state, and clears local state before replacement navigation on
601
- rejection or logout. Required Chrome proves invalid and valid login, reload
602
- restoration, anonymous and rejected direct protected entry, member/admin control
603
- visibility, server 401/403 enforcement, token clearing, and logout. Client
604
- conditions are recorded as presentation only; the deterministic API server
605
- authorizes every protected read and mutation.
606
-
607
- Existing native forms, state, layout ownership, effects, storage, fetch, and
608
- native navigation are sufficient. This packet adds zero semantic primitives,
609
- ModuleIR kinds, compiler passes, production compiler/runtime lines, runtime
610
- concepts, normalization rules, adapter rules, public APIs, auth runtimes, or
611
- servers. The fixture emits 43 files totaling 123,476 raw / 45,305 aggregate gzip
612
- bytes with deploy SHA-256
613
- `81d0b3c5e0d1d1f72f29d219647601463f5317f215274e14a45fe5ba92eb033e`.
614
- The login route uses 12,093 raw / 5,795 gzip JavaScript bytes. The two-route
615
- session uses 16 JavaScript files totaling 60,767 raw / 22,561 aggregate gzip
616
- bytes. Seven fresh Chrome profiles record a 1.4 ms navigation median with a
617
- 1.2/1.5 ms range; the range overlaps `0.12.1`, so no latency change is claimed.
618
- `/help` remains 0 B JavaScript.
619
-
620
- ### `0.12.3`: Route Failure And Restoration Policy
621
-
622
- - **Purpose:** decide application-visible handling of navigation/data failures.
623
- - **Expected boundary:** native fallback and application-owned error UI first.
624
- - **Acceptance:** invalid document, asset failure, offline/error state, retry,
625
- focus restoration, and no half-replaced route for those precommit failures.
626
- - **Stop condition:** a generic React-style error-boundary renderer is required.
627
- - **Done condition:** each classified transport, document-validation,
628
- capability-loading, or stylesheet-loading failure leaves a valid document
629
- and recoverable navigation path.
630
-
631
- **Completion evidence:** required Chrome injects deterministic fetch and
632
- response-body transport rejections through a pending prefetch and click retry,
633
- then proves the current URL, route DOM, and retained layout remain unchanged.
634
- The test moves focus away while the request is pending; the existing polite
635
- navigation status announces the failure and restores the initiating link.
636
- Activating that link again completes list-to-detail replacement and focuses the
637
- destination heading.
638
- Separate invalid-identity, missing-capability-module, and missing-stylesheet
639
- responses fail before route disposal and recover through the existing native
640
- document fallback. The maintained HTTP 500 project read still reports an
641
- application-owned alert and succeeds on explicit retry.
642
-
643
- Only `navigation-runtime.js` changes: fetch and response-body transport failures
644
- receive one private error classification, while document validation and asset
645
- failures keep their existing fallback. The source grows from 351 to 374 lines and adds no
646
- semantic primitive, ModuleIR kind, compiler pass, core compiler line, runtime
647
- concept, public API, error-boundary renderer, route registry, or additional
648
- browser file. The application emits 43 files totaling 123,835 raw / 45,379
649
- aggregate gzip bytes with deploy SHA-256
650
- `fb9d24cc01791bf80b67b659738ba62beded6ff6ce14a86a278fa4b34d088acf`.
651
- The two-route session remains 16 JavaScript files totaling 61,126 raw / 22,663
652
- aggregate gzip bytes, 359 raw bytes above `0.12.2`; the unpaired,
653
- environment-sensitive 102-byte gzip difference is not attributed to the patch.
654
- `/help` remains 0 B JavaScript. Seven fresh Linux x64 Chrome 142 profiles record
655
- a 1.8 ms median with a 1.5/2.4 ms range. No latency comparison is claimed
656
- against the macOS arm64 Chrome 151 `0.12.2` samples.
657
-
658
- ### `0.12.4`: Nested Layout Evidence Decision
659
-
660
- - **Purpose:** determine whether multiple independently retained layout owners
661
- are required.
662
- - **Acceptance:** at least three unrelated application routes demonstrate the
663
- same lifetime that one shared layout plus static composition cannot express.
664
- - **Stop condition:** route nesting is only a source-organization preference.
665
- - **Done condition:** either existing layout composition is accepted or a
666
- minimal layout-owner chain is approved with explicit disposal order.
667
-
668
- **Completion evidence:** architecture review covers the project application's
669
- list, static detail, runtime project, and runtime issue routes; Apache Answer's
670
- questions, tags, admin, and legal route-shell reduction; its independently
671
- reduced authentication shell; the Context and Zustand cart reductions; and the
672
- two disjoint navigation-group shells. All executable evidence fits one retained
673
- layout owner around one replaceable route owner, followed by existing
674
- conditional, keyed, effect, and DOM ownership. The project runtime routes use
675
- native document navigation, the Answer shell is static composition, and the
676
- independent navigation groups require disjoint top-level owners rather than a
677
- nested owner chain.
678
-
679
- No reviewed route proves an intermediate layout whose DOM, state, or effects
680
- must survive descendant route replacement and then dispose on subtree exit.
681
- The qualifying evidence count is zero, below the required three unrelated
682
- routes. The stop condition is met: current nesting is source organization or
683
- static composition, so this packet accepts the existing single-layout model and
684
- does not authorize a layout-owner chain. A future review must first prove the
685
- same otherwise-inexpressible intermediate lifetime in three unrelated
686
- executable application routes, including leaf-before-intermediate and
687
- deepest-first disposal requirements.
688
-
689
- The project application records `closed-by-stop-condition`, the reviewed route
690
- sets, an empty qualifying-route list, and the reused ownership semantics in its
691
- machine-readable capability contract. This packet adds zero semantic
692
- primitives, ModuleIR or RouteIR kinds, compiler passes, production compiler or
693
- runtime lines, runtime concepts, normalization or adapter rules, public APIs,
694
- layout registries, disposal paths, browser files, or browser bytes. Existing
695
- fixtures and output remain unchanged: 43 deploy files totaling 123,835 raw /
696
- 45,379 aggregate gzip bytes with the same deploy digest, a 61,126 raw / 22,663
697
- aggregate gzip two-route JavaScript session, and 0 B JavaScript on `/help`. No
698
- benchmark rerun or latency claim applies to a machine-readable evidence decision
699
- with no generated-output change.
700
-
701
- ## `0.13.x`: Forms
702
-
703
- ### `0.13.0`: Production Form And Server Validation
704
-
705
- - **Purpose:** complete issue creation with native constraints and server errors.
706
- - **Expected boundary:** native form, FormData, state, and async handler.
707
- - **Acceptance:** keyboard submit, native constraints, pending state, field and
708
- form errors, retry, focus/ARIA linkage, and retained valid input.
709
- - **Stop condition:** React Hook Form is reproduced.
710
- - **Done condition:** complete accessible create/edit behavior passes without a
711
- form runtime.
712
-
713
- **Completion evidence:** the maintained Alpha project detail now authors one
714
- ordinary uncontrolled issue form with native `required` and `minLength`
715
- constraints, `FormData`, three route-owned primitive states, one object ref, and
716
- one async submit handler. Required Chrome sends real Enter key events through
717
- the browser input domain and proves empty and short titles make zero requests.
718
- For valid input, the deterministic server returns a delayed `422` field error,
719
- then a `503` form error, then a `201` success. The journey verifies pending
720
- disable/label state, title focus, `aria-invalid` and `aria-describedby` linkage,
721
- alert/status roles, exact attempt/create counts, retry without re-entry, and
722
- retention of the valid title and description through every response.
723
-
724
- The existing native-form, state, ref, conditional, binding, and handler
725
- semantics cover the complete packet. Production compiler and runtime source do
726
- not change. The application route grows from 20 to 70 authored lines and emits
727
- one additional route handler file; no form package, registration API, proxy
728
- metadata graph, schema adapter, semantic primitive, IR kind, compiler pass,
729
- runtime concept, public API, or browser runtime file is added. `/help` remains
730
- complete HTML with 0 B JavaScript.
731
-
732
- The project application emits 44 files totaling 127,343 raw / 46,261 aggregate
733
- gzip bytes with deploy SHA-256
734
- `183f5a7ca081f99ae38de6974e61fdcb32ca49de699359aac053d0154ae38036`.
735
- The two-route session uses 17 JavaScript files totaling 62,118 raw / 23,096
736
- aggregate gzip bytes, 992 raw / 433 gzip bytes above `0.12.4`; the detail route
737
- itself adds the same 992 raw bytes and 440 gzip bytes. Seven fresh Linux x64
738
- Chrome 142 profiles record list-to-detail samples of
739
- `[3.8, 5.6, 4.3, 2.6, 2.9, 3.6, 3.1]` ms, a 3.6 ms median and 2.6/5.6 ms range.
740
- The range does not overlap `0.12.4`; this is the measured cost of adding the
741
- form DOM and route-specific handler to the destination application route, not a
742
- same-content compiler/runtime comparison or a latency improvement claim.
743
-
744
- ### `0.13.1`: Nested Fields, Field Arrays, Dirty, And Touched
745
-
746
- - **Purpose:** determine which form metadata needs framework support.
747
- - **Expected boundary:** object/array state and keyed rows first.
748
- - **Acceptance:** dynamic assignee/checklist rows, reorder/remove, conditional
749
- fields, dirty/touched display, reset, and exact row identity.
750
- - **Stop condition:** a registration/proxy runtime is added before three
751
- independent forms require the same metadata graph.
752
- - **Done condition:** application composition is accepted or the smallest
753
- repeated metadata semantic is isolated.
754
-
755
- **Completion evidence:** the maintained Alpha issue form now owns nested
756
- assignee metadata as one ordinary object state and a dynamic checklist as one
757
- ordinary array state with stable string keys. Native `input`, `blur`, `change`,
758
- and `reset` events drive explicit dirty/touched display, conditional assignee
759
- fields, immutable checklist add/reorder/remove operations, and reset to the
760
- authored baseline. Required Chrome proves retained checklist keys preserve exact
761
- DOM identity through reorder and reset, removed and reset-added keys disconnect,
762
- conditional ownership releases the assignee controls, and native reset clears
763
- uncontrolled title/body values plus application-owned metadata. The existing
764
- keyboard constraints and delayed `422`, `503`, and `201` server journey continue
765
- to pass while nested assignee/checklist values survive field and form failures.
766
-
767
- The first failing fixture was the `0.13.1` project-application contract against
768
- the released `0.13.0` Alpha form. Native controls and existing object/array
769
- state, condition, keyed-list, binding, and handler semantics close it without a
770
- normalization rule, adapter, semantic primitive, IR kind, compiler pass,
771
- production compiler/runtime line, runtime concept, public API, registration
772
- function, proxy metadata graph, schema adapter, or form runtime. The
773
- machine-readable decision is `closed-by-application-composition`; dynamic field
774
- names, schema-driven registration, generic watchers, and proxy dirty/touched
775
- graphs remain unsupported until independent real forms prove a repeated gap.
776
-
777
- The application emits 44 files totaling 138,064 raw / 47,964 aggregate gzip
778
- bytes with deploy SHA-256
779
- `f0d96cfd5dee2cf3fa67f4ebe25d8b32cbb1bf66e72ed5ca1c29bd06fdcc0a33`.
780
- The maintained two-route session remains 17 JavaScript files and grows by 3,286
781
- raw / 803 aggregate gzip bytes to 65,404 / 23,899 bytes. This is authored
782
- route-specific form behavior, not a shared form runtime; `/help` remains 0 B
783
- JavaScript. Seven fresh Linux x64 Chrome 142 profiles record list-to-detail
784
- samples of `[3.5, 3.3, 4.4, 3.3, 3.2, 4.7, 3.3]` ms, a 3.3 ms median and
785
- 3.2/4.7 ms range. The range overlaps `0.13.0` and the destination content
786
- changed, so no latency regression or improvement is claimed.
787
-
788
- ### `0.13.2`: Multistep Draft And Autosave
789
-
790
- - **Purpose:** prove draft persistence across steps and failures.
791
- - **Expected boundary:** routes or conditionals, state, dependency effects,
792
- debounce cleanup, and storage/server persistence.
793
- - **Acceptance:** step navigation, validation gate, debounced save, stale-save
794
- rejection, reload restore, reset, and conflict/error state.
795
- - **Stop condition:** a wizard or autosave scheduler is added for one form.
796
- - **Done condition:** no data loss occurs across navigation, reload, or failure.
797
-
798
- Development evidence is complete. The Alpha application now owns a two-step
799
- project setup draft with native first-step constraints, parent-owned values,
800
- versioned local storage, one mount restore effect, and one dependency effect
801
- whose direct timeout cleanup debounces an owned server write. Required Chrome
802
- proves step navigation, validation, two overlapping versions, server rejection
803
- of the older save, ignored stale completion, enhanced-navigation restoration,
804
- reload restoration, retained conflict input, and reset of state, storage, and
805
- pending work.
806
-
807
- The first failing fixture was the `0.13.2` project-application contract against
808
- the released `0.13.1` Alpha route. Existing ordinary state, conditional
809
- ownership, dependency invalidation, effect cleanup, owned fetch, late-write
810
- rejection, and guarded versioned storage close it without a semantic primitive,
811
- IR kind, compiler pass, production compiler/runtime line, normalization rule,
812
- adapter, runtime concept, public API, wizard scheduler, or autosave scheduler.
813
- The machine-readable decision is `closed-by-application-composition`.
814
-
815
- The application emits 44 files totaling 144,633 raw / 49,217 aggregate gzip
816
- bytes with deploy SHA-256
817
- `06a35341c5e70bfec48c46ad767ac351326b39ba701f5c1f1d03992a65ec8b9e`.
818
- The maintained two-route session remains 17 JavaScript files and grows by 3,260
819
- raw / 848 aggregate gzip bytes to 68,664 / 24,747 bytes; `/help` remains 0 B
820
- JavaScript. Seven fresh Linux x64 Chrome 142 profiles record list-to-detail
821
- samples of `[10.7, 7.4, 3.7, 7.9, 6.1, 4.0, 5.4]` ms, a 6.1 ms median and
822
- 3.7/10.7 ms range. The destination content changed and the range is noisy, so
823
- no same-content latency regression or improvement is claimed.
824
-
825
- ### `0.13.3`: File Upload Boundary
826
-
827
- - **Purpose:** move beyond local file reading to a real upload lifecycle.
828
- - **Expected boundary:** native input, FormData/fetch or a proven browser API.
829
- - **Acceptance:** type/size validation, progress when the selected transport can
830
- expose it, cancellation, failure/retry, route departure, and successful
831
- attachment mutation.
832
- - **Stop condition:** chunking/resume/background upload is added without a real
833
- application requirement.
834
- - **Done condition:** the supported transport and unsupported progress/resume
835
- boundary are explicit and tested.
836
-
837
- Development evidence is complete. The Alpha application accepts one plain-text
838
- attachment up to 1 KiB, rejects invalid type and size before any request, reads
839
- the selected file into bounded route state, and reconstructs it as a `Blob` in
840
- one dependency effect that owns `FormData`, fetch, and `AbortController`.
841
- Required Chrome proves explicit user cancellation, delayed `503` feedback,
842
- retry without reselection, successful keyed attachment mutation, and exact
843
- abort when enhanced navigation releases the route.
844
-
845
- The first failing fixture was the `0.13.3` project-application contract against
846
- the released `0.13.2` Alpha route. Existing native file handlers, ordinary
847
- state, dependency invalidation, effect cleanup, owned fetch, route release, and
848
- keyed list identity close it without a semantic primitive, IR kind, compiler
849
- pass, production compiler/runtime line, normalization rule, adapter, runtime
850
- concept, public API, upload scheduler, or transfer runtime. The machine-readable
851
- decision is `closed-by-application-composition`.
852
-
853
- Fetch does not expose upload progress, so the application renders that boundary
854
- explicitly and does not emit a fake progress element. Chunking, resume,
855
- background sync, binary formats, multiple concurrent files, and files above the
856
- authored 1 KiB in-memory text limit remain unsupported. Add a different
857
- transport only when a real application requires one of those capabilities.
858
-
859
- The application emits 44 files totaling 150,023 raw / 50,240 aggregate gzip
860
- bytes with deploy SHA-256
861
- `a16fd5dbc08086aa6a7c0ec0aba3a38fbe2a63b96005a81e8747a7f4e45e214e`.
862
- The maintained two-route session remains 17 JavaScript files and grows by 2,367
863
- raw / 557 aggregate gzip bytes to 71,031 / 25,304 bytes; `/help` remains 0 B
864
- JavaScript. Seven fresh Linux x64 Chrome 142 profiles record list-to-detail
865
- samples of `[3.7, 5.0, 3.5, 3.7, 3.8, 3.8, 4.0]` ms, a 3.8 ms median and
866
- 3.5/5.0 ms range. The destination content changed, so no same-content latency
867
- regression or improvement is claimed.
868
-
869
- ## `0.14.x`: Lists, Tables, And Virtualization
870
-
871
- ### `0.14.0`: Project Table CRUD And Identity
872
-
873
- - **Purpose:** establish the production table baseline.
874
- - **Expected boundary:** existing keyed list runtime and valid table structure.
875
- - **Acceptance:** insert, update, delete, reorder, sort, filter, selection,
876
- row-local edit state, keyboard access, and retained DOM identity.
877
- - **Stop condition:** a data-grid runtime is introduced for ordinary tables.
878
- - **Done condition:** complete CRUD behavior passes with measured update latency.
879
-
880
- Evidence complete. The first failing fixture was the
881
- `0.14.0` project-application contract against the previous article list. It now
882
- uses a native table, ordinary array/object state, the existing pure collection
883
- selector, three existing keyed row-state slots, and native button/input keyboard
884
- behavior for insert, update, delete, reverse, sort, filter, selection, and edit.
885
- The browser journey proves retained row and draft-input identity through reorder
886
- and sort, fresh identity/state after filter removal and restoration, and focused
887
- keyboard reachability. Native `hidden` keeps the editor mounted rather than
888
- introducing a conditional callback-scope adapter or data-grid runtime.
889
-
890
- This slice adds zero semantic primitives, zero compiler passes, zero core LOC,
891
- and zero runtime concepts. It changes one real fixture, its contract, the
892
- machine-readable capability record, and the existing project benchmark. The
893
- application remains 44 files and changes from the `0.13.3` baseline by +9,235
894
- raw / +1,387 aggregate gzip bytes to 159,258 / 51,627 bytes, with deploy SHA-256
895
- `ebb3358e7a03612459e723ae765c39d105498db9d293415b924f1066cddf4793`.
896
- The maintained two-route session remains 17 JavaScript files and grows by 2,273
897
- raw / 626 aggregate gzip bytes to 73,304 / 25,930 bytes; `/help` remains 0 B
898
- JavaScript.
899
-
900
- Seven fresh Linux x64 Chrome 142 profiles record table Save-click-to-committed-
901
- DOM samples of `[0.7, 0.8, 1.0, 0.7, 1.1, 0.7, 0.8]` ms, a 0.8 ms median and
902
- 0.7/1.1 ms range. This is the first equivalent table-update measurement, so no
903
- same-content latency delta is claimed. The same runs record list-to-detail
904
- samples of `[3.9, 3.9, 5.5, 4.2, 6.1, 3.5, 3.4]` ms, a 3.9 ms median and
905
- 3.4/6.1 ms range. No compiler/runtime production logic changed; `0.14.0`
906
- publishes the accepted application-capability packet and `create-kudzu@0.1.122`
907
- generates projects on `@kudzujs/core@^0.14.0`.
908
-
909
- ### `0.14.1`: Nested And Object-State Collections
910
-
911
- - **Purpose:** prove project/group/issue/checklist nesting from ordinary object
912
- state without authored field state.
913
- - **Expected boundary:** existing object-property links and nested KeyedBlockIR.
914
- - **Acceptance:** replacement, nested insertion/removal/reorder, latest handlers,
915
- row cleanup, invalid-shape rejection, and static sibling exclusion.
916
- - **Stop condition:** dynamic property paths or mutation require generic runtime
917
- object observation.
918
- - **Done condition:** direct immutable paths cover the application journey and
919
- nearby dynamic forms fail clearly.
920
-
921
- Release evidence complete. The first failure replaced the project route's
922
- separate array state with one direct `projectData.projects` field and failed at
923
- build time because nested lists required their source ownership signal itself to
924
- contain an array. The compiler already emitted a binding-backed root
925
- `KeyedBlockIR`, its selector states, and the nested issue child block. Build-time
926
- list validation now allows an object-valued signal only for a compiler-proven
927
- `ownerField`; root lists still require arrays and nested non-array fields still
928
- fail. Browser mounting initializes binding-backed roots with children from their
929
- serialized state before the evaluator module loads, preserving the existing
930
- parent prototype and ownership path.
931
-
932
- Required Chrome proves immutable whole-object replacement, nested issue insert,
933
- update, reorder, removal, re-addition, retained project/issue identity, latest
934
- issue handlers, descendant state release, and fresh remount. Existing dynamic
935
- object-property, alias, mutation, mutating-sort, and non-array diagnostics retain
936
- the negative boundary, while `/help` remains complete HTML with 0 B JavaScript.
937
- The slice adds zero semantic primitives, IR kinds, compiler passes,
938
- normalization rules, adapters, runtime concepts, or public APIs. It changes one
939
- build-time validation line and adds one production list-runtime line.
940
-
941
- The release emits 44 files totaling 164,305 raw / 52,185 aggregate gzip bytes
942
- with deploy SHA-256
943
- `0a3b7e10b3447a76a9c04ef34ad7c2bfa30400ea53c9d16fc85b1c7cbf2ea203`.
944
- The two-route session remains 17 JavaScript files totaling 74,826 raw / 26,204
945
- aggregate gzip bytes. Seven fresh Chrome 142 profiles record table
946
- update samples of `[0.8, 0.8, 0.7, 0.8, 0.9, 0.8, 0.8]` ms, a 0.8 ms median and
947
- 0.7/0.9 ms range, plus navigation samples of
948
- `[3.7, 4.1, 4.5, 3.9, 4.2, 3.9, 4.3]` ms, a 4.1 ms median and 3.7/4.5 ms range.
949
- `0.14.1` publishes this accepted packet, and `create-kudzu@0.1.123` generates
950
- projects on `@kudzujs/core@^0.14.1`.
951
-
952
- ### `0.14.2`: Infinite Loading Composition
953
-
954
- - **Purpose:** prove sentinel-driven incremental loading before virtualization.
955
- - **Expected boundary:** IntersectionObserver, owned fetch, append, keyed list.
956
- - **Acceptance:** cursor progression, duplicate suppression, end/error/retry,
957
- route cleanup, retained identity, and bounded result policy.
958
- - **Stop condition:** infinite-query or observer runtime is added for one list.
959
- - **Done condition:** the full journey passes with explicit network and memory
960
- bounds.
961
-
962
- Published release evidence complete. The maintained project application adds one
963
- intrinsic sentinel, an owned native `IntersectionObserver`, cursor and request
964
- primitive state, an owned fetch with `AbortController`, immutable keyed append,
965
- duplicate ID suppression, and explicit loading/error/retry/end UI. The authored
966
- policy permits two successful pages of two records and retains at most six unique
967
- projects. It adds no infinite-query runtime, observer scheduler, cache, retained
968
- component tree, or virtualization machinery.
969
-
970
- Required Chrome proves duplicate sentinel triggers issue one request, duplicate
971
- records do not remount retained rows, cursor progression reaches an authored
972
- `503`, retry reaches terminal state, post-terminal triggers issue no request, and
973
- enhanced navigation disconnects the observer and aborts the in-flight fetch
974
- signal. Exact request counts and retained DOM identity pass. `/help` remains
975
- complete HTML with 0 B JavaScript.
976
-
977
- The slice adds zero semantic primitives, IR kinds, compiler passes, production
978
- compiler/runtime lines, normalization rules, adapters, runtime concepts, or
979
- public APIs. The application emits 44 files totaling 168,037 raw / 52,955
980
- aggregate gzip bytes with deploy SHA-256
981
- `230dea098442275e42a966ca595743a4da9c832327ba52d4d09de663c68f8f1a`.
982
- The maintained two-route session remains 17 JavaScript files totaling 76,889 raw
983
- / 26,750 aggregate gzip bytes.
984
-
985
- Seven fresh macOS arm64 Chrome 151 profiles record table update samples of
986
- `[0.4, 0.5, 0.5, 0.3, 0.5, 0.4, 0.6]` ms, a 0.5 ms median and 0.3/0.6 ms range,
987
- plus navigation samples of `[2.3, 2.3, 2.2, 2.6, 2.5, 2.5, 2.3]` ms, a 2.3 ms
988
- median and 2.2/2.6 ms range. The environment differs from `0.14.1`, so no timing
989
- delta is claimed. `0.14.2` publishes this accepted packet, and
990
- `create-kudzu@0.1.124` generates projects on `@kudzujs/core@^0.14.2`.
991
-
992
- ### `0.14.3`: 10,000-Item Browser Decision
993
-
994
- - **Purpose:** measure direct DOM, pagination, and windowing alternatives.
995
- - **Acceptance:** equivalent behavior, keyboard access, edit identity, scroll
996
- latency, DOM count, heap, and update latency across alternatives.
997
- - **Stop condition:** a virtualization result is claimed without equivalent
998
- behavior or repeated samples.
999
- - **Done condition:** the selected strategy and thresholds are recorded without
1000
- assuming direct 10,000-row rendering is acceptable.
1001
-
1002
- Decision evidence is complete. A tracked three-route fixture and
1003
- `npm run benchmark:project-list-decision` now compare one static 10,000-row
1004
- table with pagination and a scroll-driven 100-row window over the same
1005
- deterministic records and native edit controls. Seven rotating fresh Chrome 142
1006
- profiles show direct DOM
1007
- at an 806.6 ms load median and 90,023 DOM nodes, versus 165.4/161.2 ms and a
1008
- 1,470/1,471-node median for pagination and the scroll window. Direct JavaScript
1009
- heap is lower because its route is static; DOM size and load remain materially
1010
- worse.
1011
-
1012
- Pagination is selected. Its 12.1 ms range median is lower than the window's 16.5
1013
- ms, it uses 100,300 fewer median JavaScript-heap bytes, and it preserves native
1014
- page, keyboard, focus, and variable-row-height behavior without a scroll listener
1015
- or measurement policy. Both bounded routes release an edited off-range row and
1016
- restore fresh native input identity. The experiment adds no semantic primitive,
1017
- IR kind, compiler pass, production compiler/runtime line, runtime concept, or
1018
- public API. `0.14.4` remains blocked because this one fixture cannot authorize
1019
- virtual range ownership.
1020
-
1021
- ### `0.14.4`: Virtual Range Ownership
1022
-
1023
- - **Purpose:** implement bounded DOM only if `0.14.3` and three independent
1024
- fixtures authorize it.
1025
- - **Expected boundary:** keyed ownership extended by a minimal visible-range
1026
- owner; no general component renderer.
1027
- - **Acceptance:** spacer/measurement behavior, retained key state, keyboard and
1028
- focus, dynamic row height policy, cleanup, and bounded heap.
1029
- - **Stop condition:** evidence favors pagination or native containment.
1030
- - **Done condition:** range semantics are package-neutral, optional, measured,
1031
- and absent from non-virtual routes.
1032
-
1033
- Closed by stop condition. The `0.14.3` decision selected pagination over both
1034
- direct 10,000-row DOM and the authored fixed-height scroll window. No independent
1035
- application fixture proves pagination or application-owned bounded ranges
1036
- insufficient, against the required three. Kudzu therefore adds no visible-range
1037
- owner, measurement policy, range primitive, or virtualization runtime and moves
1038
- to the next evidence-ready application capability.
1039
-
1040
- ## `0.15.x`: Overlay And Layer Ownership
1041
-
1042
- ### `0.15.0`: Native Dialog Baseline
1043
-
1044
- - **Purpose:** use browser top-layer semantics for destructive issue actions.
1045
- - **Acceptance:** initial focus, Escape/cancel, confirm, trigger focus restore,
1046
- inert background, route cleanup, and static exclusion.
1047
- - **Stop condition:** a custom modal/focus-trap runtime replaces `<dialog>`.
1048
- - **Done condition:** project delete and edit confirmation pass accessibly.
1049
-
1050
- Validation evidence is complete and the packet closed without consuming a release
1051
- because no production compiler or runtime changed. The maintained
1052
- project application replaces immediate keyed project deletion with one shared
1053
- native `<dialog>`, one route-owned object ref, and one pending project ID state.
1054
- Existing row callback specialization opens the browser top layer; native cancel,
1055
- explicit cancel, and confirmation handlers close it without a Portal, focus trap,
1056
- overlay runtime, or retained component tree.
1057
-
1058
- Required Chrome proves modal top-layer behavior, native initial focus, explicit
1059
- cancel, Escape-equivalent `requestClose()`, trigger-focus restoration, confirmed
1060
- keyed deletion with fallback focus, retained sibling identity, and exact top-layer
1061
- release on enhanced route navigation. The static `/help` sibling remains 0 B
1062
- JavaScript. The slice adds no semantic primitive, IR kind, compiler pass,
1063
- production compiler/runtime line, normalization rule, adapter, runtime concept,
1064
- or public API. The application emits 44 files totaling 169,778 raw / 53,294
1065
- aggregate gzip bytes with deploy SHA-256
1066
- `91c5517e69c341bbd2051f07b3f0ad7df627098ba8e1984561268ea8666f3407`.
1067
- The maintained two-route session remains 17 JavaScript files totaling 77,453 raw
1068
- / 26,905 aggregate gzip bytes.
1069
-
1070
- Seven fresh macOS arm64 Chrome 151 profiles record table update samples of
1071
- `[0.5, 0.6, 0.6, 0.6, 0.6, 0.4, 0.5]` ms, a 0.6 ms median and 0.4/0.6 ms range,
1072
- plus navigation samples of `[2.3, 2.6, 2.9, 2.6, 2.5, 2.7, 2.5]` ms, a 2.6 ms
1073
- median and 2.3/2.9 ms range. These retained-path ranges overlap the previous
1074
- same-environment evidence, so no timing improvement or regression is claimed.
1075
-
1076
- ### `0.15.1`: Popover, Dropdown, And Menu Behavior
1077
-
1078
- - **Purpose:** establish the native-first non-modal overlay boundary.
1079
- - **Expected boundary:** native Popover where available, ordinary state/events,
1080
- and owned listeners.
1081
- - **Acceptance:** positioning policy, outside click, Escape, trigger restore,
1082
- roving keyboard behavior where menu semantics apply, and route cleanup.
1083
- - **Stop condition:** package Portal/Slot reconciliation enters the runtime.
1084
- - **Done condition:** supported native and custom boundaries are explicit.
1085
-
1086
- Completed with the maintained project application as the qualifying fixture. A
1087
- keyed project row now authors one top-level `useId()`, a native
1088
- `popovertarget`, and a native `popover="auto"` action group. The compiler scopes
1089
- the generated ID by the existing keyed ownership path and the list runtime
1090
- rewrites only intrinsic `id`, `for`, static ARIA IDREF, `form`, `headers`,
1091
- `list`, and `popovertarget` attributes. Unsupported ID escapes receive a source
1092
- diagnostic. Native Chrome behavior supplies the top layer, Escape, light
1093
- dismiss, and trigger focus restoration; ordinary keyed ownership preserves IDs
1094
- across reorder, scopes inserted rows, recreates deterministic IDs after
1095
- remove/re-add, and releases an open popover during enhanced navigation. The
1096
- authored overlay uses static anchor positioning and `role="group"`, so menu
1097
- roving focus is not applicable.
1098
-
1099
- The slice adds no semantic primitive, IR kind, compiler pass, runtime concept,
1100
- public API, Portal/Slot reconciliation, focus manager, positioning engine, or
1101
- retained overlay tree. It adds 52 and removes 24 production lines across the
1102
- source compiler, RouteIR validation, capability projection, build renderer, and
1103
- existing list runtime. The maintained application emits 44 files totaling
1104
- 171,202 raw / 53,629 aggregate gzip bytes with deploy SHA-256
1105
- `46ba45b4a423b9627c6ede5f8dd3a667f593cb5401454ae42ecc66207b07b323`.
1106
- The two-route session remains 17 JavaScript files totaling 77,779 raw / 27,050
1107
- aggregate gzip bytes, a 326 raw / 145 gzip byte increase from `0.15.0`; the
1108
- static `/help` sibling remains 0 B JavaScript. Familiar React-shaped `useId()`
1109
- authoring remains intact, so no application adapter or migration-only source
1110
- structure is added.
1111
-
1112
- Seven fresh macOS arm64 Chrome 151 profiles record table update samples of
1113
- `[0.4, 0.4, 0.5, 0.4, 0.5, 0.5, 0.5]` ms, a 0.5 ms median and 0.4/0.5 ms range,
1114
- plus navigation samples of `[4, 2.4, 2.6, 2.5, 2.5, 2.8, 2.4]` ms, a 2.5 ms
1115
- median and 2.4/4 ms range. These retained-path ranges overlap prior evidence,
1116
- so no timing improvement or regression is claimed.
1117
-
1118
- Release transaction complete at commit
1119
- `2dd5c409d3553cdf0b04080f1ba7c39b4541c523` and immutable tag `v0.15.1`.
1120
- CI run `33069675599` passed both jobs. The GitHub release is
1121
- [`v0.15.1`](https://github.com/kudzujs/kudzu/releases/tag/v0.15.1), and publish
1122
- workflow run `33071439012` published and verified `@kudzujs/core@0.15.1` and
1123
- `create-kudzu@0.1.126`. A fresh registry install imported `useId()` from core
1124
- and confirmed both exact package versions. The first publish attempt stopped at
1125
- the existing concurrent Chrome timing gate before any publish step; the exact
1126
- same immutable tag passed on the release-event retry.
1127
-
1128
- ### `0.15.2`: Toast And Notification Ownership
1129
-
1130
- - **Purpose:** provide application feedback across route mutations.
1131
- - **Expected boundary:** layout state, keyed list, timer effects, and live region.
1132
- - **Acceptance:** queue, deduplication, timeout, pause/focus behavior if required,
1133
- dismissal, route persistence, announcement, and disposal.
1134
- - **Stop condition:** a global scheduler is added before ordinary composition is
1135
- shown insufficient.
1136
- - **Done condition:** notifications remain owner-bounded and absent from unused
1137
- route output.
1138
-
1139
- **Result:** closed by ordinary layout composition. The maintained project
1140
- application now owns one deduplicated notification queue in layout state, renders
1141
- keyed rows in a native polite live region, and uses one cleanup-owned sequential
1142
- timeout plus explicit dismissal. Required Chrome preserves the live-region and
1143
- row identities through enhanced route replacement, proves timeout removal and
1144
- disposal, and keeps `/help` at zero JavaScript. The 45-file deploy totals 193,770
1145
- raw / 60,227 aggregate gzip bytes. No scheduler, primitive, runtime concept, or
1146
- production source changed, so no release was consumed.
1147
-
1148
- ### `0.15.3`: Layer Owner Decision
1149
-
1150
- - **Purpose:** decide whether logical ownership of DOM rendered outside its
1151
- authored range is necessary.
1152
- - **Acceptance:** three independent overlay fixtures fail native top-layer and
1153
- in-place composition for the same reason.
1154
- - **Stop condition:** the request is React Portal source compatibility alone.
1155
- - **Done condition:** no new concept is added, or a minimal owner edge with exact
1156
- cleanup/focus order is approved.
1157
-
1158
- **Result:** closed with no owner edge. Native dialog and Popover already satisfy
1159
- modal and non-modal top-layer behavior, while maintained dropdown, tooltip,
1160
- notification, and menu fixtures compose in their authored ranges. Zero fixtures
1161
- fail because DOM must render outside its authored range, below the required three
1162
- independent failures. Portal source compatibility alone remains insufficient;
1163
- no production source or release changed.
1164
-
1165
- ## `0.16.x`: External Complex UI
1166
-
1167
- ### `0.16.0`: Bounded External UI Contract
1168
-
1169
- - **Purpose:** define and prove `mount`, `update`, `dispose`, owner, lifetime, and
1170
- route-specific assets without a React island.
1171
- - **Expected boundary:** DOM ref plus owned effect first.
1172
- - **Acceptance:** a small imperative package creates and disposes one real DOM or
1173
- canvas instance; static siblings exclude it.
1174
- - **Stop condition:** the package requires React reconciliation.
1175
- - **Done condition:** package ownership remains inside effect/handler ESM and no
1176
- generic widget runtime is added.
1177
-
1178
- **Result:** closed through existing effect ownership. A real Typed.js instance
1179
- creates DOM from one attached host ref, replaces on application-state dependency
1180
- change, disposes on conditional/document release, and remounts fresh. The package
1181
- is absent from the complete zero-JavaScript static sibling. No compiler, IR,
1182
- runtime concept, or production source changed, so no release was consumed.
1183
-
1184
- ### `0.16.1`: Real Editor Lifecycle
1185
-
1186
- - **Purpose:** integrate one real CodeMirror-class editor.
1187
- - **Acceptance:** mount, initial value, application-state update, editor-to-state
1188
- update, dependency changes, route disposal, remount, errors, and accessibility.
1189
- - **Stop condition:** preserving the React wrapper requires a React island.
1190
- - **Done condition:** the native package owns its DOM and Kudzu owns only its
1191
- bounded lifecycle.
1192
-
1193
- **Result:** complete. The Apache Answer-derived CodeMirror fixture exposes the
1194
- first real retained-instance failure: an unattached `useRef(null)` shared by one
1195
- mount/cleanup effect and a later dependency update effect was incorrectly treated
1196
- as a DOM ref. Kudzu now lowers exactly one proven retained handle to existing
1197
- owner-scoped object state. Required Chrome proves initial value, retained
1198
- application updates, editor-to-state updates, package-error recovery, accessible
1199
- textbox naming, conditional disposal, fresh remount, and document disposal. The
1200
- fixture emits 214,968 raw / 71,607 aggregate gzip JavaScript bytes while its
1201
- static sibling emits zero. One existing normalization pass grows; semantic
1202
- concepts, IR kinds, runtime concepts, runtime files, and public APIs remain
1203
- unchanged.
1204
-
1205
- ### `0.16.2`: Chart And Map Lifecycle
1206
-
1207
- - **Purpose:** validate the same contract against unrelated canvas/SVG/map DOM.
1208
- - **Acceptance:** resize/data update, listener/source cleanup, route transition,
1209
- retained instance where required, and asset exclusion.
1210
- - **Stop condition:** package-specific concepts enter generic IR/runtime.
1211
- - **Done condition:** one lifecycle model covers editor and chart/map evidence.
1212
-
1213
- **Result:** closed through the `0.16.1` retained-instance contract. A reduced
1214
- Mattermost Chart.js doughnut chart first reproduced the existing diagnostic when
1215
- its dependency effect both created and updated the retained instance. Moving
1216
- acquisition, resize-listener registration, and exact destroy/reset cleanup into
1217
- one mount effect leaves later data effects read-only and lowers the handle to the
1218
- same owner-scoped object state used by CodeMirror. Required Chrome proves initial
1219
- drawing, retained data and resize updates, listener removal, enhanced route
1220
- disposal, fresh remount, accessibility, and package exclusion from the static
1221
- sibling. The interactive graph is 208,686 raw / 73,312 aggregate gzip bytes
1222
- across six JavaScript files; the static sibling emits zero. Semantic primitives,
1223
- IR kinds, compiler passes, core/compiler LOC, normalization rules, runtime
1224
- concepts, runtime files, and public APIs change by zero. One positive fixture and
1225
- one browser contract were added. The maintained Worker/effect benchmark remains
1226
- 907 raw / 477 gzip bytes for the Worker graph and 14,456 raw / 6,159 gzip bytes
1227
- for the window graph; its seven-run Linux median was 2,464.9 ms, recorded without
1228
- a timing comparison because the host differs from the published baseline. No
1229
- production source changed, so no release was consumed.
1230
-
1231
- ### `0.16.3`: Grid And Drag/Drop Decision
1232
-
1233
- - **Purpose:** test external data-grid or drag engine ownership against keyed
1234
- Kudzu state.
1235
- - **Acceptance:** keyboard equivalent, reorder/mutation, state synchronization,
1236
- package disposal, and failure recovery.
1237
- - **Stop condition:** two independent renderers attempt to own the same DOM.
1238
- - **Done condition:** either bounded ownership is proven or the package is
1239
- explicitly unsupported with a migration path.
1240
-
1241
- **Result:** complete through existing keyed state and effect ownership. A
1242
- THRM-derived SortableJS fixture reproduced one compiler failure because the
1243
- browser `HTMLElement` constructor was classified as an effect capture and then
1244
- evaluated during the Node build. Adding that platform constructor to the
1245
- existing browser-global set fixes the shared root cause while lexical shadowing
1246
- remains covered. During a gesture SortableJS may move DOM temporarily, but its
1247
- `onEnd` callback restores authored order before one immutable state reorder;
1248
- Kudzu's keyed reconciler remains the durable DOM owner and preserves retained
1249
- row and input identity. The same state operation provides keyboard movement and
1250
- reset, while invalid package indexes restore DOM without changing state.
1251
- Required Chrome proves drag and keyboard reorder, state synchronization,
1252
- identity, invalid-input recovery, conditional/document disposal, and fresh
1253
- remount. The interactive graph is 72,251 raw / 26,603 aggregate gzip bytes
1254
- across ten JavaScript files; the static sibling emits zero. Its normalized
1255
- deploy archive SHA-256 is
1256
- `a55c18e14ba29df3f1f8ccdc7bcae936092508a01d05abdb887417e6fffb2ecf`.
1257
- Semantic primitives, IR kinds, compiler passes, normalization rules, runtime
1258
- concepts, runtime files, drag/drop abstractions, and public APIs change by zero;
1259
- one existing compiler lookup gains one token. One positive fixture, one browser
1260
- contract, and one browser-global shadowing case were added. The maintained
1261
- Worker/effect benchmark remains 907 raw / 477 gzip bytes for the Worker graph
1262
- and 14,456 raw / 6,159 gzip bytes for the window graph; its seven-run Linux
1263
- median was 999.7 ms, recorded without a timing comparison because the host
1264
- differs from the published baseline.
1265
-
1266
- ### `0.16.4`: GSAP Animation Lifecycle
1267
-
1268
- - **Purpose:** validate one real GSAP landing-page animation against existing
1269
- DOM-ref and effect ownership.
1270
- - **Expected boundary:** one owned effect and native reduced-motion behavior;
1271
- no animation IR or scheduler runtime.
1272
- - **Acceptance:** mount, deterministic static fallback, scoped targets,
1273
- prefers-reduced-motion behavior, dependency update where required, route and
1274
- conditional disposal, fresh remount, and static sibling asset exclusion.
1275
- - **Stop condition:** package timelines compete with Kudzu for durable DOM
1276
- structure or require a retained component renderer.
1277
- - **Done condition:** GSAP owns only bounded presentation changes and exact
1278
- cleanup while Kudzu retains document structure and lifetime ownership.
1279
-
1280
- **Result:** complete. A reduction of the MIT-licensed
1281
- Magic Modal landing page at revision
1282
- `ab3df864de5b01d604d26345165ea5f7900eae14` reproduced one compiler failure:
1283
- GSAP's root-scoped `context()` receives an inline callback whose direct package
1284
- calls were rejected because package-reference validation stopped at the nearest
1285
- function. The existing ancestry check now accepts only an unbroken chain of
1286
- inline call arguments back to the owned effect; named, local, and imported helper
1287
- indirection remains rejected. Required Chrome proves deterministic visible HTML,
1288
- root-scoped presentation, native reduced-motion fallback without residual inline
1289
- opacity/transform, dependency replacement with retained DOM identity,
1290
- conditional and enhanced-route disposal, and fresh remount. GSAP owns only
1291
- bounded opacity and transform changes; Kudzu retains structural DOM and lifetime
1292
- ownership. The interactive graph is 94,110 raw / 37,819 aggregate gzip bytes
1293
- across eight JavaScript files; the static sibling emits zero. Its normalized
1294
- deploy archive SHA-256 is
1295
- `2b6467f04452c51878ea81d5e80db21c60286e191e1e49ac482556dbf7c713c3`.
1296
- Semantic primitives, IR kinds, compiler passes, normalization rules, runtime
1297
- concepts, runtime files, animation abstractions, schedulers, and public APIs
1298
- change by zero; one existing compiler ancestry helper shrinks by two LOC. One
1299
- positive fixture and one two-scenario browser contract were added. The maintained
1300
- Worker/effect benchmark remains 907 raw / 477 gzip bytes for the Worker graph and
1301
- 14,456 raw / 6,159 gzip bytes for the window graph; its seven-run Linux median was
1302
- 625.9 ms, recorded without a timing comparison because the host differs from the
1303
- published baseline.
1304
-
1305
- ### `0.16.5`: Endurance Harness
1306
-
1307
- - **Purpose:** make long-session correctness locally reproducible.
1308
- - **Expected files:** a dedicated browser soak harness and machine-readable heap,
1309
- listener, resource, DOM, and navigation counters.
1310
- - **Acceptance:** repeated route, conditional, keyed, dialog, and editor cycles;
1311
- raw traces are retained.
1312
- - **Stop condition:** only a short synthetic timing loop is measured.
1313
- - **Done condition:** failures identify the owner that retained memory or work.
1314
-
1315
- **Result:** closed through existing document, route, conditional, keyed, and
1316
- effect ownership. A dedicated application fixture repeatedly opens and closes a
1317
- native dialog, removes and recreates keyed row state, conditionally disposes and
1318
- remounts a real CodeMirror editor, and navigates to a canonical released route.
1319
- The standalone Chrome harness keeps one browser profile alive, runs five warm-up
1320
- and 30 measured cycles by default, forces GC only before five-cycle checkpoints,
1321
- and retains machine-readable `samples.jsonl`, `summary.json`, and
1322
- `environment.json` artifacts under the ignored `test-results/endurance/` path.
1323
- The required default run completed 71 enhanced navigations with 71 editor mounts
1324
- and 71 disposals. Every released checkpoint had zero active editors, dialogs,
1325
- and keyed rows, 29 route elements, six documents, 141 DOM nodes, and seven event
1326
- listeners. Forced-GC heap moved from 1,820,132 to 2,005,572 bytes, below the
1327
- larger of the declared 2 MiB or 15% observation alarm. A deterministic failure
1328
- reports `route:/plain` and the mismatched counters; browser exceptions and failed
1329
- requests are retained with the same owner. The interactive route graph is
1330
- 242,928 raw / 81,792 aggregate gzip bytes across 11 JavaScript files. Semantic
1331
- primitives, IR kinds, compiler passes, core/compiler LOC, runtime concepts,
1332
- runtime files, and public APIs change by zero; one test fixture and one browser
1333
- harness were added. This evidence changed no production source by itself and was
1334
- published with the later stale-prefetch fix in the actual `0.16.5` patch.
1335
-
1336
- Release transaction complete at commit
1337
- `f23db7403060df7615b684f3a4a39781e600ed23` and immutable tag `v0.16.5`.
1338
- CI run `33235364419` passed Node 22, required-Chrome Node 24, and the Cloudflare
1339
- deployment. The GitHub release is
1340
- [`v0.16.5`](https://github.com/kudzujs/kudzu/releases/tag/v0.16.5), and publish
1341
- workflow run `33235705347` published and verified `@kudzujs/core@0.16.5` and
1342
- `create-kudzu@0.1.130`. A fresh registry-only install imported core, confirmed
1343
- both exact package versions, generated a two-route application, and passed its
1344
- TypeScript and production build check.
1345
-
1346
- ## `0.17.x`: Long-Lived Applications
1347
-
1348
- ### `0.17.0`: WebSocket Application Journey
1349
-
1350
- - **Purpose:** move from isolated fake socket ownership to project notifications.
1351
- - **Acceptance:** connect, message, keyed update, reconnect, stale socket
1352
- rejection, route/layout lifetime, offline/error state, and exact cleanup.
1353
- - **Stop condition:** a shared transport runtime is added for one consumer.
1354
- - **Done condition:** repeated navigation balances every listener, timer, and
1355
- socket handle.
1356
-
1357
- **Result:** closed through existing layout state, `EffectIR`, keyed-list, and
1358
- enhanced-navigation ownership. The first project-application browser extension
1359
- failed at `websocket-connect`; one inline layout effect now owns a native
1360
- WebSocket, four socket listeners, native online/offline listeners, generation
1361
- and socket-identity stale guards, and one 50 ms reconnect timer. Incoming
1362
- snapshots are validated before replacing the existing notification array, so a
1363
- same-key server update retains its DOM node and live-region ownership. Required
1364
- Chrome proves connect, message, keyed update, visible error, reconnect, stale
1365
- message/error rejection, offline cancellation, online recovery, and eight
1366
- list/detail enhanced transitions with one retained layout socket. The journey
1367
- creates three sockets total; while connected it has one active socket, four
1368
- socket listeners, and two online/offline listeners. Of two reconnect timers,
1369
- one fires and one is cleared. Final document disposal leaves zero active sockets,
1370
- socket listeners, window listeners, and reconnect timers, and repeated disposal
1371
- changes no counter. The project deploy grows by 2,908 raw / 652 aggregate gzip
1372
- bytes; the list-route JavaScript graph grows by 1,755 raw / 460 aggregate gzip
1373
- bytes, while `/help` remains zero JavaScript. Semantic primitives, IR kinds,
1374
- compiler passes, core/compiler LOC, runtime concepts, runtime files, transport
1375
- abstractions, and public APIs change by zero; one existing application fixture
1376
- and one browser scenario grow. The maintained Worker/effect graph remains 907
1377
- raw / 477 gzip bytes for Worker and 14,456 raw / 6,159 gzip bytes for window;
1378
- its seven-run Linux median was 605.6 ms. No production source changed, so no
1379
- release was consumed.
1380
-
1381
- ### `0.17.1`: Shared SSE/Transport Decision
1382
-
1383
- - **Purpose:** test multiple independently mounted consumers, replay, and
1384
- reconnect against existing layout effects/shared state.
1385
- - **Acceptance:** subscription add/remove, one transport, replay ordering,
1386
- reconnect, consumer removal, final close, and bounded history.
1387
- - **Stop condition:** fewer than three independent applications require the same
1388
- shared transport semantics.
1389
- - **Done condition:** existing composition passes or a minimal transport owner is
1390
- architecture-approved.
1391
-
1392
- **Result:** closed by the stop condition with zero qualifying applications.
1393
- Mattermost and Twenty remain external research candidates, but neither has a
1394
- repository-owned reduction proving the complete shared-consumer, ordered replay,
1395
- reconnect, independent removal, final close, and bounded-history contract. The
1396
- project application has one layout consumer; all Lupin reductions belong to one
1397
- application and each owns its socket in one page effect; the route WebSocket,
1398
- navigation telemetry, Worker dashboard, Memos audit, and development EventSource
1399
- also lack the complete shared transport shape. Existing layout state and
1400
- independent `EffectIR` owners remain authoritative. Semantic primitives, IR
1401
- kinds, compiler passes, core/compiler LOC, runtime concepts, runtime files,
1402
- fixtures, browser bytes, and public APIs change by zero. No production source
1403
- changed, so no release was consumed.
1404
-
1405
- ### `0.17.2`: Memory And Disposal Gate
1406
-
1407
- - **Purpose:** close document/layout/route/range/external-instance memory risks.
1408
- - **Acceptance:** long repeated journeys show bounded heap, DOM, prefetch cache,
1409
- resource handles, listener counts, and state maps.
1410
- - **Stop condition:** undocumented browser GC timing is presented as exact proof.
1411
- - **Done condition:** retained growth has a declared bound and repeated samples
1412
- pass the agreed threshold.
1413
-
1414
- **Result:** complete with one navigation-cache ownership fix. A deterministic
1415
- race holds unique prefetched documents, starts navigation to each, commits a
1416
- canonical route that prunes them, and then releases the stale responses. Before
1417
- the fix, five races left `browserState.size` at zero but increased CDP documents
1418
- from 8 to 16 under owner `navigation:documents`: stale `navigate()` calls wrote
1419
- their parsed documents back into the cache before checking the navigation
1420
- revision. `navigation-runtime.js` now checks revision before the existing cache
1421
- write; no cache type, LRU, cancellation registry, or public instrumentation was
1422
- added. The default gate batches ten races within browser connection limits, then
1423
- runs 30 route, conditional, keyed, dialog, and editor cycles in one Chrome
1424
- profile. Across 101 navigations, baseline/final documents remain 8, browser state
1425
- entries 0, DOM nodes 174, listeners 7, and editor mounts/disposals 71/71. Forced-
1426
- GC heap moves from 1,826,244 to 2,022,160 bytes, below the declared larger-of-2-
1427
- MiB-or-15% alarm. Semantic primitives, IR kinds, compiler passes, runtime
1428
- concepts, runtime files, cache abstractions, and public APIs change by zero; one
1429
- production runtime reorders one existing statement with zero LOC growth. The
1430
- maintained Worker graph remains 907 raw / 477 gzip bytes and the window graph
1431
- remains 14,456 raw bytes with gzip moving from 6,159 to 6,160 bytes; its seven-
1432
- run Linux median was 795.3 ms, recorded without a timing comparison because the
1433
- host load differs. One endurance fixture and browser gate grow, while static
1434
- routes remain zero JavaScript. This packet ships as the actual `0.16.5` patch to
1435
- retain the public `0.16.x` version line.
1436
-
1437
- ## `0.18.x`: Lazy Loading And Code Splitting
1438
-
1439
- ### `0.18.0`: Route And Feature Artifact Baseline
1440
-
1441
- - **Purpose:** record current route-specific ESM, shared chunks, preload, Worker,
1442
- CSS, and navigation prefetch behavior.
1443
- - **Expected boundary:** existing RouteBuildRecord and artifact report.
1444
- - **Acceptance:** exact source-to-artifact ownership and bytes for the greenfield
1445
- app, editor, Answer, and Memos routes.
1446
- - **Stop condition:** a new loader is designed before the current graph is
1447
- measured.
1448
- - **Done condition:** every eager dependency has a structural reason.
1449
-
1450
- **Result:** closed by the existing RouteBuildRecord and artifact report. A
1451
- test-only collector builds the greenfield project, real CodeMirror editor, four
1452
- separate Apache Answer reductions, and Memos outline reduction: seven fixtures
1453
- and 25 routes total. It joins each route's source page to HTML, runtime entries
1454
- and requirements, handler entries/chunks, Worker entries/chunks, and styles,
1455
- then records exact raw/gzip bytes and SHA-256 values. Every generated JavaScript
1456
- file has at least one route owner, every direct module script has one matching
1457
- `modulepreload`, and every static control owns zero JavaScript and zero preload.
1458
- No measured fixture emits a shared chunk.
1459
-
1460
- The greenfield deploy is 45 files and 196,678 raw / 60,880 aggregate gzip
1461
- bytes. Its project routes own 38,652-69,178 raw JavaScript bytes; `/login` owns
1462
- 12,093 raw bytes and `/help` owns zero. The editor route owns 214,968 raw /
1463
- 71,607 gzip bytes, including its 200,260 raw / 64,949 gzip CodeMirror handler;
1464
- its static sibling owns zero. The Answer question reduction owns 32,022 raw /
1465
- 12,408 gzip bytes. Its route-shell static pages own zero while the two runtime
1466
- parameter pages own 2,134 and 2,078 raw bytes. Answer auth routes own 25,684 and
1467
- 26,818 raw bytes with a zero-byte public sibling; authoring/admin routes own
1468
- 12,251 and 20,919 raw bytes with a zero-byte legal sibling. The Memos outline
1469
- owns 14,701 raw / 7,044 gzip bytes and its static sibling owns zero.
1470
-
1471
- Current navigation prefetch remains structurally bounded: eligible same-origin
1472
- group links prefetch on hover, focus, viewport proximity, or idle fallback;
1473
- promises deduplicate, failures leave the cache, current/eligible URLs define the
1474
- retained set, and the `0.16.5` revision check rejects stale navigation results
1475
- before cache insertion. The report intentionally records emitted closure rather
1476
- than esbuild input-byte attribution. Answer and Memos remain disconnected
1477
- reductions, not whole-application claims. Semantic primitives, IR kinds,
1478
- compiler passes, production compiler/runtime LOC, runtime concepts/files, and
1479
- public APIs change by zero. No release is consumed.
1480
-
1481
- ### `0.18.1`: Bounded Lazy Capability Import
1482
-
1483
- - **Purpose:** permit one statically analyzable feature dependency to load only
1484
- when its owner requests it.
1485
- - **Expected boundary:** validated static dynamic-import edge, route artifact
1486
- closure, owner token, and native ESM import.
1487
- - **Acceptance:** exact specifier, no arbitrary graph escape, deduplicated load,
1488
- error/retry, owner release, and static exclusion.
1489
- - **Stop condition:** arbitrary dynamic imports or lazy component rendering are
1490
- required.
1491
- - **Done condition:** the feature loader is capability-specific, not a component
1492
- runtime.
1493
-
1494
- **Completion evidence:** one direct literal bare-package `import()` may remain
1495
- inside an inline synchronous effect when its first statement is the exact
1496
- dependency-state guard `if (!state) return`. The source graph, descriptor
1497
- session, ModuleIR validation, build-module erasure, esbuild split graph, and
1498
- route artifact report preserve that edge without adding a loader. Relative,
1499
- URL, render-time, event, indirect, async-effect, unguarded, and multiple dynamic
1500
- imports remain rejected. Failed native ESM evaluation remains visible through
1501
- application-owned error state; same-document retry of the failed URL is not
1502
- claimed because the browser module map cannot be reset without adding the
1503
- loader forbidden by this packet.
1504
-
1505
- The CodeMirror-derived fixture initially requests no deferred chunk. Activation
1506
- requests one chunk, mounts the editor, and owner release destroys it. Remount
1507
- uses the browser module map without another request, and document disposal
1508
- balances the second mount. The initial eager graph is 12,982 raw / 6,153 gzip
1509
- bytes versus 214,968 raw / 71,607 gzip bytes for the existing eager editor;
1510
- 250,086 raw / 80,890 gzip bytes move to the deferred graph. Initial gzip falls
1511
- by 65,454 bytes (91.4%), while the static sibling remains 0 B JavaScript.
1512
-
1513
- The packet adds no semantic primitive, compiler pass, public API, browser
1514
- runtime concept/file, React, VDOM, hydration, retained component tree, or retry
1515
- cache. It adds one validated `ImportIR` kind and additive
1516
- `handlers.lazyChunks` reporting. Production compiler sources change by 76 added
1517
- and 11 removed lines. The artifact collector now covers eight fixtures and 27
1518
- routes with no ownerless JavaScript or preload mismatch. `npm run check`, 284
1519
- required-Chrome tests, package smoke, and the maintained benchmark pass. The
1520
- Worker graph remains 907 raw / 477 gzip bytes; the window graph remains 14,456
1521
- raw / 6,160 gzip bytes, with a seven-build median of 222.8 ms. This packet ships
1522
- as the actual `0.16.6` patch to retain the public `0.16.x` version line.
1523
-
1524
- ### `0.18.2`: Lazy Editor Journey
1525
-
1526
- - **Purpose:** apply `0.18.1` to the real editor.
1527
- - **Acceptance:** editor package absent before activation, loaded once on demand,
1528
- mount/update/dispose behavior unchanged, failure recoverable, and revisit
1529
- semantics explicit.
1530
- - **Stop condition:** package evaluation must occur during build rendering.
1531
- - **Done condition:** initial route bytes fall by the exact deferred package
1532
- graph without losing behavior.
1533
-
1534
- **Completion evidence:** a real retained CodeMirror editor now begins closed and
1535
- uses the `0.18.1` guarded literal package edge for its mount. The existing
1536
- effect-private-ref normalization recognizes its one direct `.then()` assignment
1537
- as the retained setup write, lowers the handle to owner-scoped state, and leaves
1538
- later value effects read-only. Indirect callbacks, repeated writes, attached
1539
- refs, update-effect writes, missing null-reset cleanup, and broader dynamic
1540
- imports retain diagnostics. Package evaluation remains entirely in browser
1541
- effect ESM.
1542
-
1543
- Required Chrome records zero chunk requests before activation and one afterward.
1544
- It proves initial content and accessible name, application-to-editor and
1545
- editor-to-application updates, retained DOM identity, authored update failure
1546
- and recovery, exact conditional disposal, fresh `Alpha` state on remount, no
1547
- second package request, and final document disposal. Native ESM evaluation
1548
- failure retry remains outside this packet as recorded in `0.18.1`.
1549
-
1550
- The eager editor owns 214,968 raw / 71,607 gzip bytes. The lazy retained editor
1551
- initially owns 15,896 raw / 7,230 gzip bytes and defers 250,086 raw / 80,890 gzip
1552
- bytes, reducing initial gzip by 64,377 bytes (89.9%). Its static sibling remains
1553
- 0 B JavaScript. The artifact collector covers nine fixtures and 29 routes with
1554
- no ownerless JavaScript or preload mismatch.
1555
-
1556
- The packet adds no semantic primitive, IR kind, compiler pass, public API,
1557
- browser runtime concept/file, loader, resource registry, or widget runtime. One
1558
- existing normalization pass changes by 15 added and four removed production
1559
- lines. `npm run check`, 285 required-Chrome tests, package smoke, and the
1560
- maintained benchmark pass. Worker and window graphs remain 907 raw / 477 gzip
1561
- and 14,456 raw / 6,160 gzip bytes; the seven-build median is 230.5 ms. This
1562
- packet ships as the actual `0.16.7` patch to retain the public `0.16.x` line.
1563
-
1564
- ### `0.18.3`: Shared Chunks And Prefetch Policy
1565
-
1566
- - **Purpose:** avoid duplicate large feature graphs and define optional preload.
1567
- - **Acceptance:** shared chunk ownership, no duplicate fetch, route/interaction
1568
- prefetch policy, cache bound, cancellation limits, and output report.
1569
- - **Stop condition:** all features are globally prefetched.
1570
- - **Done condition:** policy minimizes unused transfer while meeting accepted
1571
- interaction latency.
1572
-
1573
- **Completion evidence:** two enhanced-navigation route owners now use one
1574
- deferred CodeMirror graph. Existing multi-entry esbuild splitting emits one
1575
- 250,086 raw / 80,890 gzip byte chunk, and the existing artifact report records
1576
- that exact lazy path as shared by `/` and `/second`. Their eager graphs remain
1577
- 21,599 raw / 9,466 gzip and 21,609 raw / 9,468 gzip bytes. Neither route HTML
1578
- preloads the deferred chunk, navigation document prefetch does not request it,
1579
- and the static sibling remains complete HTML with 0 B JavaScript.
1580
-
1581
- Required Chrome proves zero requests before interaction, one request when the
1582
- first owner activates, exact disposal, no route-triggered request, and no second
1583
- request when the second owner activates. The selected policy is therefore no
1584
- optional package preload: interaction calls native `import()` immediately, the
1585
- browser module map deduplicates it for the document lifetime, and Kudzu owns no
1586
- additional cache. Native ESM imports cannot be cancelled after request; owner
1587
- cleanup invalidates the callback and prevents a late mount rather than claiming
1588
- network cancellation.
1589
-
1590
- The released lazy-import gate is also hardened before closing the packet.
1591
- `ownedLazyPackageImport()` now resolves the callback callee through the existing
1592
- lexical binding index and accepts only named `useEffect` imports from React or
1593
- Kudzu. A local function with the same text can no longer bypass the ordinary
1594
- dynamic-import diagnostic. The packet adds no semantic primitive, IR kind,
1595
- compiler pass, public API, runtime concept/file, loader, prefetch registry, or
1596
- cache. Four existing compiler files change by 17 added and eight removed lines.
1597
- The artifact collector covers ten fixtures and 32 routes. `npm run check`, 288
1598
- required-Chrome tests, package smoke, and the maintained benchmark pass. Worker
1599
- and window graphs remain 907 raw / 477 gzip and 14,456 raw / 6,160 gzip bytes;
1600
- the loaded Linux host records a 696.6 ms seven-build median without a timing
1601
- comparison. This packet ships as the actual `0.16.8` patch to retain the public
1602
- `0.16.x` line.
1603
-
1604
- ## `0.19.x`: React Ecosystem Migration
1605
-
1606
- ### `0.19.0`: Compatibility Boundary And Inventory
1607
-
1608
- - **Purpose:** centralize package recognition and compatibility provenance without
1609
- changing semantic IR or browser output.
1610
- - **Expected files:** focused compatibility metadata/registry, current passes,
1611
- project report; no public plugin API.
1612
- - **Acceptance:** Native, Compiled, Normalized, Adapter, Owned External UI,
1613
- Partial, and Unsupported sites are deterministic and source-located.
1614
- - **Stop condition:** package origin enters ModuleIR, RouteIR, codegen, or runtime.
1615
- - **Done condition:** existing React Router, Bootstrap, Zustand, and browser
1616
- normalizations preserve output and diagnostics.
1617
-
1618
- Implementation and release-candidate evidence complete. One internal registry
1619
- now owns package identities and classifies original reachable import, re-export,
1620
- and literal dynamic-import sites before normalization. The deterministic
1621
- `.kudzu/kudzu-compatibility.json` report records package/API identity, stable
1622
- rule, Native, Compiled, Normalized, Adapter, Owned External UI, Partial, or
1623
- Unsupported treatment, and exact authored line/column range. Type-only,
1624
- relative, Node, Kudzu-first-party, and unreachable source stays outside the
1625
- inventory.
1626
-
1627
- React Router, React Bootstrap, Zustand, React migration, browser-signal, `clsx`,
1628
- and i18next recognition reuse the registry's package identities. Focused tests
1629
- cover all seven classes, aliases, exact ranges, deterministic ordering, and a
1630
- real build where an unreachable unsupported module is excluded. Existing
1631
- project output baselines and package diagnostics remain green. Package origin
1632
- does not enter SourceResult, ComponentAnalysis, ModuleIR, RouteIR, codegen,
1633
- runtime files, `afterBuild()`, or deploy output.
1634
-
1635
- The slice adds zero semantic primitives, IR kinds, compiler passes,
1636
- normalization entries, runtime concepts/files, browser bytes, or public APIs.
1637
- Production compiler/orchestration changes are 161 added and 13 removed lines,
1638
- including the 141-line registry, for +148 net compatibility/build lines and zero
1639
- core semantic LOC. `npm run check`, 290 required-Chrome tests, package smoke,
1640
- and the maintained benchmark pass. Worker and window graphs remain 907 raw /
1641
- 477 gzip and 14,456 raw / 6,160 gzip bytes; seven clean Linux x64 builds record
1642
- a 532.6 ms median without a timing comparison. This packet ships as the actual
1643
- `0.16.9` patch, with `create-kudzu@0.1.134`, to retain the public
1644
- `0.16.x` line.
1645
-
1646
- ### `0.19.1`: Apache Answer Authentication Journey
1647
-
1648
- - **Purpose:** promote the existing build-only auth fixture to browser evidence.
1649
- - **Acceptance:** anonymous, invalid login, valid login, token restore, shared
1650
- header/settings, 401 clear, replacement navigation, public zero-JS sibling.
1651
- - **Stop condition:** client UI is treated as authorization.
1652
- - **Done condition:** the complete journey passes against a deterministic server.
1653
-
1654
- Complete. The existing Apache Answer reduction now runs one required-Chrome
1655
- journey against a deterministic native server. It proves anonymous startup,
1656
- invalid and valid native form submission, token persistence and reload restore,
1657
- layout-owned header/settings reads, a server 401 clearing storage and shared
1658
- state, and replacement navigation back to the anonymous login document. The
1659
- public sibling remains complete HTML with zero JavaScript.
1660
-
1661
- No authored fixture, compiler, IR, runtime, or deploy artifact changed. The
1662
- packet adds one browser harness only: zero semantic primitives, ModuleIR kinds,
1663
- passes, normalization entries, runtime concepts, public APIs, and browser bytes.
1664
- The authentication fixture remains 17 deploy files and 36,441 raw / 15,598 gzip
1665
- bytes; `/` owns 25,684 raw / 11,372 gzip bytes, `/settings` owns 26,818 raw /
1666
- 11,319 gzip bytes, and `/public` owns 0 JavaScript bytes. Worker and window
1667
- graphs remain 907 raw / 477 gzip and 14,456 raw / 6,160 gzip bytes; seven clean
1668
- Linux x64 builds record a 674.7 ms median without a timing comparison. This
1669
- packet ships as the actual `0.16.10` patch, with `create-kudzu@0.1.135`, to
1670
- retain the public `0.16.x` line.
1671
-
1672
- ### `0.19.2`: Apache Answer Connected Authoring Journey
1673
-
1674
- - **Purpose:** connect query, route, detail, create/edit, validation, mutation,
1675
- refresh, admin, and logout.
1676
- - **Acceptance:** behavior, accessibility, persistence, errors, navigation,
1677
- source retention, and output all pass.
1678
- - **Stop condition:** fixture-only compiler semantics or broad package runtime is
1679
- introduced.
1680
- - **Done condition:** this is a connected browser journey, not a whole-app claim.
1681
-
1682
- Complete. One Apache Answer-derived fixture now connects invalid and valid login,
1683
- layout-shared authentication, page/order query loading, explicit refresh, native
1684
- creation with server validation and retained draft, runtime detail routing,
1685
- editing, reload persistence, keyed administration, delete-and-refetch, and
1686
- logout against one deterministic server. Native controls and status/alert
1687
- regions preserve the accessibility boundary, every retained source file is
1688
- checked, and the public sibling remains complete HTML with zero JavaScript.
1689
-
1690
- The packet reuses existing Zustand normalization, search signals, dependency
1691
- effects, runtime parameters, native handlers, bindings, keyed ownership, and
1692
- enhanced navigation. It adds zero semantic primitives, ModuleIR kinds, compiler
1693
- passes or core LOC, runtime concepts, package adapters, and public APIs. The new
1694
- fixture emits 33 deploy files and 88,198 raw / 33,173 gzip bytes; `/` owns 27,196
1695
- raw / 11,968 gzip bytes, `/questions` owns 51,577 raw / 19,801 gzip bytes,
1696
- `/questions/add` owns 27,109 raw / 11,893 gzip bytes, runtime detail owns 32,783
1697
- raw / 14,056 gzip bytes, admin owns 50,861 raw / 19,426 gzip bytes, and `/public`
1698
- owns zero JavaScript. Worker and window graphs remain 907 raw / 477 gzip and
1699
- 14,456 raw / 6,160 gzip bytes; seven clean Linux x64 builds record a 640.5 ms
1700
- median without a timing comparison. No production logic changed, so the public
1701
- version remains `0.16.10` and no release is consumed.
1702
-
1703
- ### `0.19.3`: Memos Feed And CRUD Journey
1704
-
1705
- - **Purpose:** establish the first durable Memos application slice.
1706
- - **Acceptance:** login, loading/error, feed, pagination, create/edit/delete,
1707
- retained memo identity, refresh, and logout.
1708
- - **Stop condition:** outline-only or static feed output is presented as Memos
1709
- migration.
1710
- - **Done condition:** pinned upstream provenance and exact retained source are
1711
- recorded.
1712
-
1713
- Complete. A fixture pinned to Memos revision
1714
- `e5ed6e7ec60e141d6e354f3ab59906c2c47dccac` now runs invalid and valid login,
1715
- initial loading, a server pagination failure, explicit recovery, overlapping-key
1716
- pagination, create, edit, delete, reload persistence, and logout against one
1717
- deterministic server. The retained memo row keeps DOM identity through the
1718
- failed request, successful pagination, and every CRUD refetch. Native labels,
1719
- status and alert regions preserve the accessibility boundary, every authored
1720
- source file is retained, and the public sibling emits zero JavaScript.
1721
-
1722
- The packet reuses existing Zustand normalization, dependency effects, keyed
1723
- ownership, native forms and handlers, and enhanced navigation. It adds zero
1724
- semantic primitives, ModuleIR kinds, compiler passes or core LOC, runtime
1725
- concepts, package adapters, and public APIs. The fixture emits 19 deploy files
1726
- and 56,167 raw / 21,634 gzip bytes; `/` owns 25,856 raw / 11,396 gzip bytes,
1727
- `/feed` owns 45,690 raw / 17,836 gzip bytes, and `/public` owns zero JavaScript.
1728
- Worker and window graphs remain 907 raw / 477 gzip and 14,456 raw / 6,160 gzip
1729
- bytes; seven clean Linux x64 builds record a 761.8 ms median without a timing
1730
- comparison. No production logic changed, so the public version remains
1731
- `0.16.10` and no release is consumed.
1732
-
1733
- ### `0.19.4`: Memos Realtime Journey
1734
-
1735
- - **Purpose:** add reaction and realtime refresh using the accepted long-lived
1736
- transport model.
1737
- - **Acceptance:** mutation, server event, deduplication, reconnect, stale event
1738
- rejection, route cleanup, and memory gate.
1739
- - **Stop condition:** a query or SSE package runtime is copied wholesale.
1740
- - **Done condition:** browser and endurance acceptance pass.
1741
-
1742
- Complete. The connected Memos fixture now adds a native reaction mutation and
1743
- an effect-owned WebSocket that refreshes the keyed feed from versioned server
1744
- events. Required Chrome proves duplicate and stale version rejection, old-socket
1745
- callback rejection after reconnect, retained memo DOM identity, exact route
1746
- cleanup, and fresh ownership after re-entry and reload. Active sockets,
1747
- listeners, and reconnect timers remain bounded and return to zero after each
1748
- owner release. The public sibling remains complete HTML with zero JavaScript.
1749
-
1750
- The packet reuses existing native handlers, keyed ownership, effect-private
1751
- lifecycle, invalidation, timers, and route release. It adds zero semantic
1752
- primitives, ModuleIR kinds, compiler passes or core LOC, runtime concepts,
1753
- normalization or adapter rules, and public APIs. The fixture emits 19 deploy
1754
- files and 57,811 raw / 22,069 gzip bytes; `/` owns 25,856 raw / 11,396 gzip
1755
- bytes, `/feed` owns 46,740 raw / 18,184 gzip bytes, and `/public` owns zero
1756
- JavaScript. Worker and window graphs remain 907 raw / 477 gzip and 14,456 raw /
1757
- 6,160 gzip bytes; seven clean Linux x64 builds record a 620.7 ms median without
1758
- a timing comparison. Browser-disabled tests pass 292/292, required-Chrome
1759
- focused acceptance, package smoke, and artifact accounting pass. No production
1760
- logic changed, so the public version remains `0.16.10` and no release is
1761
- consumed.
1762
-
1763
- ### `0.19.5`: Actual Budget Intake Decision
1764
-
1765
- - **Purpose:** determine whether a complete, legally and technically usable
1766
- workspace can become the third application proof.
1767
- - **Acceptance:** pinned source, install/build path, dependency inventory, first
1768
- executable user journey, and honest source-retention denominator.
1769
- - **Stop condition:** workspace dependencies or core packages remain absent.
1770
- - **Done condition:** a later packet is authorized, or deferral is recorded with
1771
- no compatibility claim.
1772
-
1773
- Deferred by the stop condition. The pinned MIT revision
1774
- `87e33e49eb4d666c33e0c0f172faf340d1b7aa0a` remains only a sparse desktop-client
1775
- acquisition: 810 TS/TSX modules, 163,344 LOC, and 80 route declarations without
1776
- the workspace tooling, component library, core backend, Yarn release, database,
1777
- worker coordinator, or spreadsheet implementation needed to install and run an
1778
- honest user journey. The prior static report probe is an exported report, not
1779
- Actual Budget, and its 22/906 retained-line result is not a whole-workspace
1780
- denominator. No later application packet, compatibility claim, compiler work,
1781
- runtime, package adapter, public API, version, or release is authorized. Intake
1782
- may resume only from a complete pinned workspace and executable dependency
1783
- graph.
1784
-
1785
- ## `0.20.x`: AI Tooling And Delivery Cost
1786
-
1787
- ### `0.20.0`: Structured Diagnostics
1788
-
1789
- - **Purpose:** expose stable machine-readable errors from the existing compiler.
1790
- - **Acceptance:** version, code, stage, severity, source range, message,
1791
- compatibility class, and safe suggestion; human diagnostics remain useful.
1792
- - **Stop condition:** diagnostic codes expose pass filenames or unstable IR.
1793
- - **Done condition:** agents no longer parse message substrings for maintained
1794
- fixtures.
1795
-
1796
- Complete. Authored
1797
- source failures now propagate as one versioned diagnostic envelope with stable
1798
- semantic code, stage, severity, project-relative source range, human message,
1799
- nullable compatibility class, and nullable safe suggestion. `kudzu build
1800
- --json` emits only that deterministic envelope for structured failures, while
1801
- ordinary builds and the development overlay retain readable source-located
1802
- messages. Unresolved imports and re-exports, unsupported dynamic imports,
1803
- TypeScript syntax errors, runtime-locale `react-i18next`, and keyed-row ref
1804
- initializers prove the maintained boundary without parsing message text.
1805
-
1806
- The implementation centralizes 72 lines in `diagnostics.mjs`, reuses the
1807
- existing compatibility classification function, and normalizes paths only at
1808
- the project build boundary. It adds zero semantic primitives, ModuleIR kinds,
1809
- compiler passes, normalization entries, runtime concepts, browser modules, or
1810
- public application APIs. Production source is +111 net lines, including +8 in
1811
- the measured core semantic file set; the increase is compiler/tooling error
1812
- transport rather than semantic analysis. All representative deploy manifests
1813
- and hashes remain unchanged. Worker and window graphs remain 907 raw / 477 gzip
1814
- and 14,456 raw / 6,160 gzip bytes; seven clean Linux x64 release-candidate builds
1815
- record a 1,034.4 ms median without a timing comparison. `npm run check`, 293/293
1816
- browser-disabled and required-Chrome tests, focused CLI JSON tests, development error recovery, package smoke,
1817
- artifact accounting, and `git diff --check` pass. The packet ships as
1818
- `@kudzujs/core@0.16.11` with `create-kudzu@0.1.136`.
1819
-
1820
- ### `0.20.1`: `kudzu inspect --json`
1821
-
1822
- - **Purpose:** expose reachable application and compatibility inventory.
1823
- - **Acceptance:** filtered module/route/package/capability/owner/blocker facts,
1824
- deterministic order, schema version, and large-project context bound.
1825
- - **Stop condition:** the command builds a second analyzer or dumps full raw IR.
1826
- - **Done condition:** the first blocker can be selected without reading hundreds
1827
- of source or dependency files.
1828
-
1829
- Complete. `kudzu inspect --json` now runs the authoritative build and projects
1830
- the existing reachable source, compatibility, ComponentAnalysis, ModuleIR,
1831
- CapabilityIR, and route-artifact records into one versioned report. Modules,
1832
- routes, packages, compatibility sites, capability families, semantic owners,
1833
- and blockers sort before fixed section limits; totals and omitted counts keep
1834
- large-project context explicit. Unreachable source, generated code, HTML, raw
1835
- IR, captures, state values, and full artifact closures remain excluded.
1836
-
1837
- One real CLI fixture proves reachable filtering, static and interactive route
1838
- facts, native package classification, state ownership, project-relative paths,
1839
- deterministic output, and structured blocked inventory. A synthetic 101-module
1840
- and 51-blocker check proves sort-before-truncation and first-blocker retention.
1841
- The implementation is one 154-line projection over existing records plus the
1842
- existing build/CLI seam; it adds no analyzer, semantic primitive, compiler pass,
1843
- normalization entry, runtime concept, or browser module. Representative deploy
1844
- manifests and hashes remain unchanged. Worker and window graphs remain 907 raw /
1845
- 477 gzip and 14,456 raw / 6,160 gzip bytes; seven clean builds record a 648.7 ms
1846
- median without a timing comparison. Browser-disabled and required-Chrome suites
1847
- pass 295/295 tests, package smoke and artifact accounting pass, and the packet
1848
- ships as `@kudzujs/core@0.16.12` with `create-kudzu@0.1.137`.
1849
-
1850
- ### `0.20.2`: `kudzu explain --route`
1851
-
1852
- - **Purpose:** trace one authored route to its selected browser artifacts.
1853
- - **Acceptance:** source site, normalization provenance, semantic owner,
1854
- capability, entry/chunk/style/Worker, byte reason, and zero-JS explanation.
1855
- - **Stop condition:** a second artifact graph is introduced.
1856
- - **Done condition:** existing route records and artifact reports answer the
1857
- query with bounded output.
1858
-
1859
- Completed by `@kudzujs/core@0.16.13` and `create-kudzu@0.1.138`. The
1860
- `worker-effects` fixture proves exact configured-base lookup for an effect-owned
1861
- Worker route, authored source closure, `Dashboard` ownership, capability family,
1862
- runtime/handler/Worker byte reasons, raw/gzip totals, hashes, deterministic
1863
- output, structured missing-route diagnostics, and a static sibling with an empty
1864
- JavaScript closure. The implementation is one 137-line bounded projection over
1865
- existing source results, compatibility sites, route records, and the sole route
1866
- artifact report plus the existing build/CLI seam. It adds no analyzer, semantic
1867
- primitive, compiler pass, normalization entry, runtime concept, or browser
1868
- module. Representative deploy manifests and hashes remain unchanged. Worker and
1869
- window graphs remain 907 raw / 477 gzip and 14,456 raw / 6,160 gzip bytes; seven
1870
- clean builds record a 605 ms median without a timing comparison. Browser-disabled
1871
- and required-Chrome suites pass 296/296 tests, and package smoke and artifact
1872
- accounting pass. Fixed 100-record section limits expose totals and omitted counts;
1873
- the command requires one exact emitted route and intentionally excludes raw IR,
1874
- HTML, generated code, captures, and state values.
1875
-
1876
- ### `0.20.3`: Deterministic Normalize And Fix
1877
-
1878
- - **Purpose:** automate only edits proven safe and useful by recorded AI trials.
1879
- - **Acceptance:** check/preview/write modes, exact ranges, idempotence, comments
1880
- retained, no unrelated formatting, and byte-equivalent output.
1881
- - **Stop condition:** canonical compiler source replaces ordinary authored TSX.
1882
- - **Done condition:** each fix has one diagnostic code and explicit preconditions.
1883
-
1884
- Deferred by the evidence gate without production changes or a release. A complete
1885
- repository inventory found no recorded model prompt, model/tool version, raw
1886
- attempt, correction cycle, token/cost trace, or repeated source edit proving any
1887
- automatic fix useful. Existing diagnostics offer migration guidance but do not
1888
- identify a uniquely safe edit; replacing a non-null ref initializer would change
1889
- authored behavior. The existing lazy-state-literal normalization could support a
1890
- narrow exact-range rewrite while preserving comments and output bytes, but no AI
1891
- trial records it as a correction or cost reduction. Adding check/preview/write
1892
- infrastructure now would therefore be speculative and violate the packet purpose.
1893
- Resume this packet only after `0.20.4` records a repeated correction with one
1894
- stable diagnostic code, a unique semantics-preserving replacement, and
1895
- compiler-proven preconditions. No fixture, analyzer, fix command, formatter,
1896
- compiler pass, runtime concept, browser module, package version, or release was
1897
- added.
1898
-
1899
- ### `0.20.4`: AI Delivery Protocol And Runner
1900
-
1901
- - **Purpose:** track fair Kudzu and React+Vite delivery attempts.
1902
- - **Acceptance:** pinned model/tools/prompts/budgets, framework-neutral behavior
1903
- suite, raw failures, token/cost/tool/file/build metrics, source retention, and
1904
- browser artifacts.
1905
- - **Stop condition:** Kudzu receives private compiler guidance unavailable to the
1906
- comparator.
1907
- - **Done condition:** every attempt is reproducible or fully attributable.
1908
-
1909
- Completed by `@kudzujs/core@0.16.14` and `create-kudzu@0.1.139`. The
1910
- repository-owned Node standard-library runner pins the model revision, pricing,
1911
- tools, prompt, budgets, adapter, acceptance command, starter digests, optional
1912
- public context, and paired schedule before creating isolated workspaces. It
1913
- retains raw adapter/build/acceptance streams, final source, browser artifacts,
1914
- hashes, attribution, token/cost/tool/file/build metrics, source retention, and
1915
- both successful and failed attempts. The deterministic two-attempt-per-variant
1916
- fixture proves equal ordering, one retained failure per variant, independent
1917
- final builds, framework-neutral acceptance, and failure-inclusive cost per
1918
- success. It is protocol evidence only and makes no Kudzu versus React+Vite
1919
- delivery claim. No dependency, compiler pass, semantic primitive, runtime
1920
- concept, application API, or browser byte was added. Browser-disabled and
1921
- required-Chrome suites pass 297/297 tests, and package smoke passes.
1922
-
1923
- ### `0.20.5`: Tooling Cost Validation
1924
-
1925
- - **Purpose:** prove that diagnostics/inspect/explain/fix lower total cost per
1926
- successful task.
1927
- - **Acceptance:** before/after attempts on the same tasks; failures remain in the
1928
- numerator; success behavior remains identical.
1929
- - **Stop condition:** token reduction comes from omitted behavior or hidden
1930
- context.
1931
- - **Done condition:** useful tools are retained and non-improving tools are
1932
- removed or deferred.
1933
-
1934
- Measured on 2026-09-01 with five interleaved attempts per condition against one
1935
- Apache Answer-derived static Bootstrap correction. Both conditions passed 5/5
1936
- with identical accepted behavior, source retention, and browser artifacts, but
1937
- plain-build baseline cost 67,860 tokens per success while structured
1938
- build/inspect/explain cost 84,793. The structured bundle is therefore deferred
1939
- as an AI default rather than credited with a cost reduction. Existing JSON,
1940
- inspection, and explanation commands remain for their independently accepted
1941
- machine-readable contracts; no speculative `fix` command, compiler pass,
1942
- runtime concept, application API, dependency, or browser byte was added. Exact
1943
- samples, medians, and ranges are recorded in `PERFORMANCE.md`, while the pinned
1944
- protocol reproduces and retains raw attempt evidence under the ignored
1945
- `test-results/ai-delivery/` path.
1946
-
1947
- ## `0.21.x`: Production-Scale Proof
1948
-
1949
- ### `0.21.0`: Functional Parity Matrix
1950
-
1951
- - **Purpose:** freeze complete greenfield, Answer, and Memos acceptance.
1952
- - **Acceptance:** content, auth, forms, CRUD, shared data, large list, overlay,
1953
- editor, lazy load, realtime, errors, accessibility, and navigation pass.
1954
- - **Stop condition:** any build-only result is counted as application success.
1955
- - **Done condition:** every claimed capability has a browser journey and static
1956
- exclusion control.
1957
-
1958
- **Result:** closed through existing application semantics without a release.
1959
- The required-Chrome 300-test matrix passes content, authentication, forms, CRUD,
1960
- shared data, large lists, overlays, editor ownership, lazy loading, realtime,
1961
- errors, accessibility, and navigation across the maintained greenfield, Apache
1962
- Answer, Memos, and focused package fixtures. The one material matrix gap was the
1963
- 10,000-item pagination decision: its release/remount behavior existed only in an
1964
- optional benchmark. One ordinary browser acceptance now proves Enter-key page
1965
- advance, focus retention, the 101-200 and restored 1-100 ranges, bounded 100-row
1966
- DOM, fresh off-range input state, and no browser exceptions. Greenfield `/help`,
1967
- Answer and Memos `/public`, package `/static` routes, and the complete direct
1968
- 10,000-row route provide zero-JavaScript controls.
1969
-
1970
- The artifact inventory now includes the large-list fixture: 19 files,
1971
- 1,900,048 raw / 242,968 aggregate gzip bytes, deploy SHA-256
1972
- `1bbaf3479ac90f923deb469c73eb93c0dd7364e7fe906919b167f2f854deda70`.
1973
- Pagination owns 30,143 raw / 11,193 gzip bytes of existing JavaScript while the
1974
- direct static route owns zero. Semantic primitives, IR kinds, compiler passes,
1975
- production compiler/runtime LOC, normalization rules, adapters, runtime
1976
- concepts, public APIs, and browser artifacts change by zero. `npm run check`,
1977
- required-Chrome 300/300, package smoke, focused acceptance, and artifact
1978
- inventory pass. No production feature changed, so no release is consumed.
1979
-
1980
- ### `0.21.1`: Compiler And Route Scale
1981
-
1982
- - **Purpose:** measure clean/incremental compilation and artifact emission.
1983
- - **Acceptance:** 100, 1,000, and separately provisioned 10,000 routes; module
1984
- graph time, parse/normalize/compile/render/write time, peak RSS, output digest,
1985
- and failure recovery.
1986
- - **Stop condition:** projected or incomplete 10,000-route data is called a pass.
1987
- - **Done condition:** repeated measurements and all material regressions are
1988
- explained or fixed.
1989
-
1990
- **Result:** opt-in internal telemetry records source reads, reachable
1991
- graph discovery, TypeScript parse, normalize, compile/transform, render, and
1992
- write boundaries without changing deploy output. Compile/transform excludes
1993
- the measured TypeScript parse and Kudzu normalization but includes indivisible
1994
- esbuild parse/transform for proven import-free modules. Render includes
1995
- provisional page materialization, write includes finalization and staged-output
1996
- promotion, and the end-to-end clean build is not their sum. The runner also proves that an
1997
- incremental source edit matches a clean build of the changed source, compares
1998
- paired incremental outputs when a baseline is supplied, names retained-session
1999
- rather than incremental-only peak RSS, and fails the process when either clean
2000
- or retained-session invalid-source recovery changes output. This adds no
2001
- semantic primitive, compiler pass, runtime concept, public API, deploy artifact,
2002
- or browser byte; production compiler/build instrumentation is 35 added and four
2003
- removed lines.
2004
-
2005
- One warm-up and three fresh-process samples pass at 100 routes / 1,000 modules /
2006
- 101,100 lines and 1,000 routes / 10,000 modules / 1,011,000 lines. Clean-build
2007
- medians are 7,444.3 and 77,515.9 ms with 672.3 and 3,182.3 MiB peak RSS;
2008
- incremental medians are 1,838.0 and 18,132.1 ms, recompiling exactly 10 modules
2009
- and rendering one page in every sample. Clean and changed digests differ,
2010
- incremental output equals a clean changed-source build, and clean and retained
2011
- failure probes preserve then recover the expected digest. Exact phase samples,
2012
- bytes, and digests are recorded in `PERFORMANCE.md`.
2013
-
2014
- The full 10,000-route / 100,000-module / 10,110,000-line topology initially
2015
- exhausted a 10,240 MiB V8 heap because the canonical module cache retained about
2016
- 90,000 complete TypeScript ASTs. A 1,024-record LRU bounds that existing cache
2017
- without changing stable position-based symbols. The identical topology then
2018
- completed under the same heap cap with 5,461.0 MiB clean-build RSS and 8,266.9
2019
- MiB retained-session peak RSS. It emits 10,000 files / 2,237,780 B with clean
2020
- digest `7a48bc40ff33c4faaef8a01ab90fcfe611a4bada5364a6fedca42f80ad5070d3`;
2021
- incremental output matches a clean changed-source build, recompiles 10 modules,
2022
- renders one page, and clean and retained recovery pass. One complete measured
2023
- run is retained after two diagnostic runs completed measured stages but exposed
2024
- cleanup and timeout defects; no projection or reduced topology is counted.
2025
- The memory fix adds eight net production lines, no semantic primitive, pass,
2026
- runtime concept, public API, deploy artifact, or browser byte.
2027
-
2028
- ### `0.21.2`: Browser Performance And Memory
2029
-
2030
- - **Purpose:** protect interaction latency and long-running stability.
2031
- - **Acceptance:** initial/session bytes, list/range latency, navigation, lazy
2032
- feature load, resource cleanup, repeated heap, detached DOM, cache, listeners,
2033
- and handles.
2034
- - **Stop condition:** smaller JavaScript is preferred over behavior parity.
2035
- - **Done condition:** complete features meet declared thresholds with bounded
2036
- long-session growth.
2037
-
2038
- **Result:** closed through existing route artifacts, keyed ownership, enhanced
2039
- navigation, native ESM loading, and the released endurance harness. Seven fresh
2040
- Chrome profiles keep 2,000-row append, filter, restore, and reverse medians at
2041
- 9.6, 17.6, 84.5, and 19.4 ms against a 100 ms median alarm. Project table save
2042
- and list-to-detail navigation medians are 0.9 and 4.9 ms against the same alarm;
2043
- the exact session graph owns 17 JavaScript files totaling 81,200 raw / 27,885
2044
- aggregate gzip bytes. The static 10,000-row document loads in a 999.8 ms median
2045
- against a 2,000 ms alarm. Pagination and windowing keep the DOM at 100 rows,
2046
- load in 163.1 and 251.7 ms against a 1,000 ms alarm, and change range in 18.1
2047
- and 23.7 ms against a 100 ms alarm.
2048
-
2049
- The lazy editor retains 12,982 raw / 6,153 gzip eager bytes and one 250,086 raw
2050
- / 80,890 gzip deferred CodeMirror chunk; two route owners share one native ESM
2051
- module request and the static sibling remains zero JavaScript. Focused Chrome
2052
- acceptance passes 3/3. The endurance gate passes five warm-ups, ten stale-
2053
- prefetch races, 30 ownership cycles, and 101 navigations: editor mounts and
2054
- disposals balance 71/71, browser state stays zero, documents and listeners stay
2055
- at six and seven, DOM nodes move by one, and forced-GC heap grows 79,988 B under
2056
- the existing 2 MiB or 15% alarm. No exception or failed request occurs. Three
2057
- existing benchmark entry points now fail when their declared median budgets are
2058
- exceeded; the artifact collector may name the current packet. Production source,
2059
- semantic primitives, compiler passes, runtime concepts, APIs, deploy artifacts,
2060
- and browser bytes change by zero. Exact samples and limitations are recorded in
2061
- `PERFORMANCE.md`; no package release is consumed.
2062
-
2063
- ### `0.21.3`: Package And Release Candidate
2064
-
2065
- - **Purpose:** verify the exact candidate as an installed product.
2066
- - **Acceptance:** `npm run check`, `npm test`, required Chrome, focused
2067
- benchmarks, package smoke, tarball inspection, generated application, registry
2068
- dry run, docs, and release rollback procedure.
2069
- - **Stop condition:** version metadata changes before the exact candidate passes.
2070
- - **Done condition:** the reviewed commit is independently publishable.
2071
-
2072
- **Result:** released as `@kudzujs/core@0.16.17` and
2073
- `create-kudzu@0.1.142`. The exact versioned tree passes `npm run check`, all 301
2074
- remaining tests after the application contract, package smoke, generator
2075
- creation, and both registry dry runs. Tarball inspection records the expected 85
2076
- core files and four generator files with no bundled dependencies. The Node 22
2077
- no-browser lane initially attempted the list acceptance despite
2078
- `KUDZU_SKIP_BROWSER`; that test now follows the existing skip contract while the
2079
- Node 24 required-Chrome lane retains the browser acceptance.
2080
-
2081
- Seven fresh exact-candidate Chrome profiles pass every maintained alarm. The
2082
- project table-save/navigation medians are 0.7/3.6 ms; direct, pagination, and
2083
- window load medians are 849.2, 166.6, and 184.5 ms; bounded range medians are
2084
- 13.0 and 19.7 ms. The keyed benchmark also passes all four 100 ms alarms. A
2085
- fresh endurance run balances editor mounts/disposals at 71/71 across 101
2086
- navigations, with zero document/listener growth, one additional DOM node, and
2087
- 144,172 B forced-GC heap growth under the 2 MiB alarm. Package contents preserve
2088
- the existing production compiler/runtime and introduce no semantic primitive,
2089
- pass, runtime concept, API, deploy artifact, or browser byte. The immutable
2090
- rollback contract remains forward-only: a failed push, tag, publication, or
2091
- registry verification keeps this packet active; a published npm version or tag
2092
- is never moved and requires a forward-fix patch.
2093
-
2094
- Commit `e9b33c04a7a2a382b858069910e4473800e7b70a`, tag `v0.16.17`, the
2095
- [GitHub release](https://github.com/kudzujs/kudzu/releases/tag/v0.16.17), and
2096
- [publish workflow](https://github.com/kudzujs/kudzu/actions/runs/33704726784)
2097
- are complete. npm exposes core `0.16.17` and generator `0.1.142`; a fresh
2098
- registry-generated application resolves core `0.16.17` and passes its complete
2099
- TypeScript and Kudzu build check.
2100
-
2101
- ### `0.21.4`: AI Delivery Proof
2102
-
2103
- - **Purpose:** run the final equal-condition comparison on production-shaped
2104
- tasks.
2105
- - **Acceptance:** highest or statistically tied success rate, lowest median cost
2106
- per successful task, complete raw attempts, maintainable source, and retained
2107
- browser/build advantage.
2108
- - **Stop condition:** cherry-picked attempts, toy-only tasks, or unequal tooling.
2109
- - **Done condition:** the evidence either authorizes `1.0.0` or names the next
2110
- measured blocker without changing the release criteria.
2111
-
2112
- The first independently reviewable evidence-integrity prerequisite is released
2113
- as `@kudzujs/core@0.16.18`. A successful adapter result without its raw
2114
- attribution trace previously remained eligible for the success-rate and median
2115
- successful-cost denominators with synthetic zero metrics. The runner now
2116
- requires the trace in the success predicate, retains that attempt as an
2117
- incomplete failure, and withholds unsupported per-success claims. The focused
2118
- three-test harness passes and the change adds one condition with no semantic
2119
- primitive, compiler pass, runtime concept, application API, dependency, or
2120
- application browser byte.
2121
-
2122
- This prerequisite makes no framework ranking. Existing complete fixtures cover
2123
- the content, forms, CRUD/shared-state, and resource/realtime task classes. The
2124
- pinned public `kudzu-based-bench` storefront at commit
2125
- `f2d5be1a516c539e30f7125f6870d42b1dd02ecd` remains the smallest complete paired
2126
- commerce source. The next exact action is to freeze equivalent pre-task starters
2127
- and complete acceptance journeys for those five classes, then run at least five
2128
- interleaved attempts per framework and task under one model, tool, context, and
2129
- time contract.
2130
-
2131
- The corrected production comparison was recorded in GitHub release `v0.16.19`.
2132
- Its npm workflow stopped before publication on an unrelated flaky project browser
2133
- journey. The `v0.16.20` forward release passed every repository gate, but npm
2134
- rejected its trusted-publishing signing certificate with HTTP 403. The immutable
2135
- recovery release `@kudzujs/core@0.16.21` carries the unchanged evidence and
2136
- `create-kudzu@0.1.146` targets it.
2137
- The first batch is retained but excluded from ranking after hidden content/form
2138
- selector assumptions and inconsistent React versions were found. Revision 2
2139
- hashes the written contracts and executable acceptance, uses React 19.2.8 in all
2140
- five task classes, and records Kudzu 11/25 attributable successes (44%) against
2141
- React + Vite 24/25 (96%). One React realtime adapter exceeded 300 seconds without
2142
- a trace and correctly remains incomplete; it was not selectively replaced.
2143
-
2144
- The gate fails: Kudzu has no successful task result for content or commerce, so
2145
- its aggregate task-token median is unavailable. React's incomplete realtime
2146
- attempt also leaves its aggregate failure-inclusive cost unavailable. Kudzu keeps lower accepted browser artifacts and zero-JavaScript static
2147
- siblings, but does not meet the required success-rate or cost criteria. The raw
2148
- invalid and corrected attempts are published as
2149
- `kudzu-ai-delivery-0.21.4-gpt-5.6-sol.tar.gz`, SHA-256
2150
- `4e37d15b4c4b0cf88720a3a7743996794b2e0172dbc43d40514f944fb01bd0f8`.
2151
- The next evidence-selected work must address reactive collection normalization
2152
- and count reuse, then reactive text inside selected conditional branches.
2153
- `1.0.0` remains unauthorized. This packet adds no semantic primitive, compiler
2154
- pass, runtime concept, public API, dependency, generated behavior, or browser
2155
- byte.
2156
-
2157
- The first evidence-selected follow-up now normalizes one supported collection
2158
- alias across a keyed map, a top-level `.length` count, reactive text, and a
2159
- count-selected JSX branch. It reuses collection analysis plus existing binding,
2160
- conditional, and keyed ownership: no semantic primitive, compiler pass, runtime
2161
- concept, API, dependency, or shared-runtime byte was added. The implementation
2162
- changes two existing compiler files by net 37 lines and extends one positive and
2163
- one negative fixture. Required Chrome verifies count updates, empty-branch
2164
- unmount, keyed remount, and retained source diagnostics; all 302 tests, package
2165
- smoke, and `npm run check` pass. The exercised route ships the unchanged 36,219
2166
- B shared runtime closure and 37,870 B total JavaScript including its existing
2167
- route handlers. No benchmark contract or budget changes; the production AI
2168
- comparison must be rerun only after the remaining selected-branch reactive-text
2169
- blocker is addressed. This follow-up is released as `@kudzujs/core@0.16.22`
2170
- with `create-kudzu@0.1.147`. `1.0.0` remains unauthorized.
2171
-
2172
- The second evidence-selected follow-up now lowers reactive scalar text inside a
2173
- selected conditional branch through the existing binding descriptor and
2174
- conditional ownership paths. It adds no semantic primitive, compiler pass,
2175
- runtime concept, API, dependency, or shared-runtime source byte; one production
2176
- compiler file grows by net 11 lines. A focused fixture proves same-branch text
2177
- updates and branch replacement, and required Chrome, all 302 tests, package
2178
- smoke, and `npm run check` pass. The five retained commerce sources now pass
2179
- their complete acceptance with `empty`, `below`, and `reached` all true and a
2180
- zero-JavaScript static sibling. Their route-specific checkout handlers add
2181
- 147-154 transferred bytes; no runtime module or benchmark contract changes.
2182
- This does not revise the published equal-condition score without a complete
2183
- rerun, so `1.0.0` remains unauthorized. This follow-up is released as
2184
- `@kudzujs/core@0.16.23` with `create-kudzu@0.1.148`.
2185
-
2186
- The user-approved 2026-09-07 `0.16.24` continuation addresses the initial r3
2187
- content patch's imported collection alias and direct filter-count failures.
2188
- [`imported-article-search`](../../test/fixtures/imported-article-search/README.md)
2189
- reproduced both failures before changes. The reduction extends existing import
2190
- discovery, pure selector normalization, and count build-value lowering, with
2191
- existing BindingIR/DerivedIR/KeyedBlockIR consumers and route/keyed/conditional
2192
- ownership. It adds no primitive, IR kind, pass, runtime concept, API, or adapter;
2193
- the two core files grow by net 39 lines. Three source variants produce identical
2194
- JavaScript (32,190 raw / 12,324 gzip B) and six unsafe neighboring forms remain
2195
- source-located errors. Required Chrome verifies search/count/empty transitions,
2196
- retained keys, fresh remounts, and static zero-JavaScript exclusion. Check, the
2197
- project ownership gate plus 308 tests, package smoke, and both package dry-runs pass.
2198
-
2199
- The full initial-source replay passes the unchanged content acceptance and emits
2200
- the same 13 JavaScript files/bytes as the earlier retained inlined workaround
2201
- (55,447 raw / 20,976 gzip B). This is a source replay, not a fresh model trial or
2202
- replacement benchmark score; no timing or AI-cost improvement is claimed.
2203
- [`PERFORMANCE.md`](../../PERFORMANCE.md#imported-search-source-replay-2026-09-07)
2204
- records commands, provenance, accounting, and limits. Preserve the original r3
2205
- evidence. The release also includes the reviewed r4 protocol/adapter lifecycle
2206
- work: atomic partial traces, bounded incremental output, setup-inclusive deadlines,
2207
- owned process-tree termination, and incomplete timeout attribution. Two Linux
2208
- lifecycle regressions protect future-run integrity; Windows termination remains
2209
- untested. The frozen r4 starters stay on published `0.16.23`; old raw records are
2210
- not reinterpreted. This packet ships as `@kudzujs/core@0.16.24` with
2211
- `create-kudzu@0.1.149`, without authorizing `1.0.0` or a new AI performance claim.
2212
-
2213
- The post-release 2026-09-07 r5 rerun now executes all 50 predeclared attempts with
2214
- published `0.16.24` core pins, registry lock integrity, and canonical hashes in
2215
- all five Kudzu starters. Revision 5 preserves the release-documented r4 pins as
2216
- history rather than relabeling them; model `openai/gpt-5.6-sol`, OpenCode 1.18.27,
2217
- budgets, prompts, public context, acceptance, React starters, schedules, and the
2218
- r4 lifecycle adapter are unchanged. No compiler or runtime change is made.
2219
-
2220
- The frozen scorer records Kudzu 18/25 versus React + Vite 23/25, with per-task
2221
- counts 3/5, 5/5, 3/5, 5/5, 2/5 versus 5/5, 5/5, 3/5, 5/5, 5/5. All tasks finish,
2222
- but two Kudzu realtime deadline failures retain partial attribution, so suite
2223
- status and Kudzu aggregate token cost remain incomplete. React's failure-inclusive
2224
- task-token median is 81,111. Historical r2's published 11/25 versus 24/25 and all
2225
- r3 raw evidence remain unchanged; no selective retries or replacement scores.
2226
-
2227
- This is not a clean ranking or `1.0.0` authorization. Four CRUD failures are
2228
- exact accessible-name mismatches against a requirement absent from the supplied
2229
- prompt; two content failures arise from the grader reading count and empty copy
2230
- as one live-region string, one also exceeding the input budget. The next
2231
- prerequisite is acceptance/prompt alignment review without retroactive rescoring.
2232
- Real compiler intake remains in raw `query.trim` failures for direct count uses
2233
- of normalized-query filters and realtime refs intended to survive pause/resume.
2234
- One null-ref workaround builds but fails the first snapshot; two zero-ref
2235
- attempts fail cleanup proof and time out. Accepted source retains declarative
2236
- composition but some Kudzu attempts add derived/version state workarounds.
2237
- Designated static siblings remain script-free; content's unchanged topic source
2238
- emits list scripts, leaving the broader static-route contract unproven.
2239
-
2240
- Exact commands, nine-failure census, hashes, artifact medians, and scope limits:
2241
- [`PERFORMANCE.md`](../../PERFORMANCE.md#0214-released-01624-rerun-2026-09-07).
2242
- Local raw evidence is
2243
- `test-results/ai-delivery-production/0.21.4-gpt-5.6-sol-r5-kudzu-0.16.24-20260907-01/`.
2244
- Six integrity/lifecycle tests, `npm run check`, and the standalone ownership gate
2245
- plus 308 tests pass. No commit, version bump, publication, or release is part of
2246
- this continuation.
2247
-
2248
- ### r5 Compiler Follow-Up
2249
-
2250
- The evidence-backed follow-up is implemented without changing the dirty r5/r6
2251
- protocol, prompt, contract, or acceptance work. The two content reductions were
2252
- confirmed red before compiler changes: direct JSX `.length` over a normalized
2253
- query filter threw `query.trim is not a function`, and the unchanged static topic
2254
- filter emitted list state/scripts. Existing count dependency registration now
2255
- selects signal build values, while direct imported pipelines without selector
2256
- states or collection aliases stay in ordinary build-time map execution.
2257
- BindingIR, DerivedIR, KeyedBlockIR, and route/keyed/conditional ownership remain
2258
- unchanged; reactive selectors retain the existing list path and negative checks.
2259
-
2260
- Realtime source tracing closes the proposed lifetime extension negatively.
2261
- Attempts 0/3 correctly reject version refs without cleanup reset; moving them
2262
- into invocation-private closures would lose the version on pause/resume. Attempt
2263
- 1 exposes a separate diagnostic gap: render-written null refs were accepted as
2264
- DOM refs, which serialize an ID rather than the retained numeric value. Existing
2265
- ref normalization now rejects those writes at source. No cross-invocation ref,
2266
- resource primitive, runtime, or arbitrary callback support was added. Original
2267
- state-based attempts 2/4 still pass the realtime browser journey.
2268
-
2269
- Accounting: semantic primitives, IR kinds, core passes, normalization entries,
2270
- transform/adapter rules, runtime concepts/source, and APIs all +0; core semantic
2271
- LOC +5, focused normalization LOC +2, one diagnostic guard, two positive and two
2272
- negative reduced cases. The four search variants emit identical JavaScript at
2273
- 32,190 raw / 12,324 gzip B. All five final content sources plus the recovered
2274
- first attempt-1 patch pass the prepared r6 acceptance, including every one of the
2275
- ten static siblings and combined polite regions. Each deploy removes four topic
2276
- JavaScript files totaling 20,539 raw / 7,299 gzip B, including 20,462 / 7,204 B of
2277
- runtime files; every retained JavaScript file is byte-identical to r5.
2278
-
2279
- `npm run check`, the standalone ownership gate plus 315 required-Chrome tests,
2280
- and package smoke pass with 1,200,000 ms command timeouts. Exact source locations,
2281
- replay hashes, commands, output tables, diagnostic boundaries, and local evidence
2282
- are in [`PERFORMANCE.md`](../../PERFORMANCE.md#r5-compiler-follow-up-2026-09-07).
2283
- This is source replay, not AI rescoring: r5 remains 18/25 versus 23/25 with partial
2284
- traces, and published r2 remains 11/25 versus 24/25. No model rerun, timing claim,
2285
- commit, release, or `1.0.0` authorization follows. The next benchmark decision
2286
- must use the aligned r6 protocol in a separately authorized complete run, not
2287
- selective retries or broader compiler semantics without new evidence.
2288
-
2289
- ### 0.16.25 Release Transaction
2290
-
2291
- The user-authorized patch packages the preceding r5 records, compiler fixes,
2292
- render-ref diagnostic, and future-only r6 acceptance alignment as core 0.16.25
2293
- and create-kudzu 0.1.150. The pre-release session records above remain historical.
2294
- R6 accepts semantically named CRUD groups and combined polite count/empty regions,
2295
- and checks all ten content static siblings. Its hashes and published 0.16.24
2296
- starter pins remain frozen; testing 0.16.25 in a model run requires a new frozen
2297
- revision. No fresh model run, score replacement, persistent-ref support, or
2298
- `1.0.0` authorization is part of this release.
2299
-
2300
- ## `1.0.0`: Stable Application Model
2301
-
2302
- `1.0.0` is authorized only after every required `0.21.x` gate passes. It means:
2303
-
2304
- - the small package-neutral application semantic model is stable;
2305
- - complete production-shaped application journeys pass;
2306
- - static routes retain zero JavaScript;
2307
- - interactive routes retain only used capabilities;
2308
- - React migration uses compatibility, normalization, adapters, and owned
2309
- external UI rather than a React runtime;
2310
- - browser/build/performance and long-running memory gates pass;
2311
- - the equal-condition AI benchmark meets the published success and cost gates.
2312
-
2313
- ## Patch Session Procedure
2314
-
2315
- Before implementation:
2316
-
2317
- 1. Read this plan, `MIGRATION_ROADMAP.md`, the current architecture map, and the
2318
- applicable capability packet.
2319
- 2. Confirm the package version and inspect uncommitted work without modifying
2320
- unrelated changes.
2321
- 3. Confirm every earlier patch is complete or explicitly replanned.
2322
- 4. Name the exact application journey, failing fixture, owner, producer, and
2323
- consumer boundary.
2324
- 5. Record the baseline output, browser bytes, runtime concepts, compiler/pass
2325
- LOC, and applicable benchmark.
2326
-
2327
- During implementation:
2328
-
2329
- 1. Add the failing fixture first.
2330
- 2. Try native behavior and existing semantics before changing the framework.
2331
- 3. Keep the smallest correct patch and preserve ordinary React-shaped TSX.
2332
- 4. Add nearby negative diagnostics and static zero-cost exclusion.
2333
- 5. Do not broaden public APIs, IR, runtime, or package support beyond the packet.
2334
-
2335
- Before release:
2336
-
2337
- 1. Run focused tests, `npm run check`, `npm test`, required Chrome, and package
2338
- smoke.
2339
- 2. Run affected output and performance gates with at least seven interleaved
2340
- measured samples where a comparison is claimed.
2341
- 3. Record fixtures, semantic primitives, core/pass LOC, runtime concepts,
2342
- browser bytes, output digest, benchmark deltas, AI-cost effect, risks, and
2343
- known limits.
2344
- 4. Update package version, lockfile, release notes, support documentation, and
2345
- registry-facing records only on the exact accepted release commit.
2346
- 5. Complete the release transaction below, then advance the active status to
2347
- the next patch.
2348
-
2349
- ## Release Transaction
2350
-
2351
- Every completed patch and every new minor is a real release. A work session that
2352
- does not complete its packet does not consume a version; the next session
2353
- continues the same target version.
2354
-
2355
- 1. Confirm the target version is the active packet and is not already present in
2356
- npm or Git tags.
2357
- 2. Update `package.json`, root lockfile metadata, `RELEASES.md`, README/support
2358
- records, and generator metadata when the release changes generated projects.
2359
- 3. Run the complete release gate on the exact versioned tree: focused tests,
2360
- `npm run check`, `npm test`, required Chrome, `npm run test:package`, affected
2361
- benchmarks, package inspection, and `git diff --check`.
2362
- 4. Inspect `git status`, the complete diff, and recent release history. Stage
2363
- only the intended packet and release files.
2364
- 5. Create one release commit using the established `Release Kudzu X.Y.Z`
2365
- convention. Do not amend a rejected release commit; fix forward and create a
2366
- new commit.
2367
- 6. Push the release commit and require its CI checks to pass.
2368
- 7. Create tag `vX.Y.Z` on that exact commit and push the tag. Never move or
2369
- repoint a published tag.
2370
- 8. Publish the matching GitHub release. The existing `Publish npm` workflow
2371
- checks out the tag, reruns check/test/package gates, verifies version/tag
2372
- equality, publishes `@kudzujs/core` and any changed `create-kudzu`, and checks
2373
- npm registry visibility.
2374
- 9. Require the publish workflow to pass, verify npm metadata and a fresh install
2375
- manually, and record the release URL and registry versions.
2376
- 10. Only after commit, push, tag, GitHub release, npm publication, registry
2377
- verification, and fresh-install verification succeed may the next patch
2378
- become active.
2379
-
2380
- If Git push, tag push, GitHub release, npm publication, or registry verification
2381
- fails, the current packet remains active. Do not start or version the next
2382
- packet. npm versions and published tags are immutable; recover with the same
2383
- release transaction where possible or document and publish a forward-fix patch.
2384
-
2385
- ## Active Status
2386
-
2387
- | Patch | Status | Next exact action | Blocker |
2388
- |---|---|---|---|
2389
- | `0.10.0` | Released | Preserve the published application baseline and release evidence. | None |
2390
- | `0.10.1` | Released | Preserve the published state-scale evidence and explicit object-field limit. | None |
2391
- | `0.10.2` | Released | Preserve the published shared-layout navigation and exact route-release evidence. | None |
2392
- | `0.10.3` | Released | Preserve the published guarded persistence recipe and zero-runtime exclusion. | None |
2393
- | `0.11.0` | Released | Preserve the published owned-fetch lifecycle and zero-query-runtime exclusion. | None |
2394
- | `0.11.1` | Released | Preserve the published single-owner consistency and exact request-count evidence. | None |
2395
- | `0.11.2` | Released | Preserve the published no-new-primitive architecture decision and zero-byte result. | None |
2396
- | `0.11.3` | Released | Preserve the published optimistic rollback, duplicate prevention, navigation, and retry evidence. | None |
2397
- | `0.11.4` | Released | Preserve the published bounded pagination, history, refresh, polling cleanup, and exact request-count evidence. | None |
2398
- | `0.12.0` | Released | Preserve direct runtime entry, reload, rewrite, and native fallback evidence. | None |
2399
- | `0.12.1` | Released | Preserve the published layout/history/focus/scroll evidence. | None |
2400
- | `0.12.2` | Released | Preserve the published authentication and permission evidence. | None |
2401
- | `0.12.3` | Released | Preserve the published route failure, focused retry, native fallback, and precommit retention evidence. | None |
2402
- | `0.12.4` | Released | Preserve the published single-layout decision and zero-owner-chain evidence. | None |
2403
- | `0.13.0` | Released | Preserve native constraints, server feedback, focused field errors, retained input, and retry evidence. | None |
2404
- | `0.13.1` | Released | Preserve application-owned nested metadata, keyed row identity, release, and reset evidence. | None |
2405
- | `0.13.2` | Released | Preserve multistep validation, versioned persistence, stale-save rejection, conflict retention, and reset evidence. | None |
2406
- | `0.13.3` | Released | Preserve the published upload validation, cancellation, retry, route cleanup, and attachment mutation evidence. | None |
2407
- | `0.14.0` | Released | Preserve native table CRUD, retained identity, keyboard access, and measured update evidence. | None |
2408
- | `0.14.1` | Released | Preserve immutable object-state replacement, nested keyed identity, latest handlers, and exact row release. | None |
2409
- | `0.14.2` | Released | Preserve bounded cursor loading, duplicate suppression, retry/end behavior, retained identity, and route cleanup. | None |
2410
- | `0.14.3` | Released | Preserve the published 10,000-item pagination decision and measurement evidence. | None |
2411
- | `0.14.4` | Closed by stop condition | Preserve pagination as the selected strategy until three independent fixtures authorize virtual ownership review. | Evidence favors pagination; zero qualifying fixtures |
2412
- | `0.15.0` | Closed by native composition | Preserve the native dialog, focus, cancellation, keyed deletion, and route cleanup evidence. | No production change; no release consumed |
2413
- | `0.15.1` | Released | Preserve key-scoped IDs, native Popover behavior, retained keyed identity, and route cleanup evidence. | None |
2414
- | `0.15.2` | Closed by layout composition | Preserve owner-bounded queue, deduplication, dismissal, route persistence, live-region, and timer cleanup evidence. | No production change; no release consumed |
2415
- | `0.15.3` | Closed by stop condition | Preserve native top-layer and in-place composition until three independent authored-range failures exist. | Zero qualifying failures; no release consumed |
2416
- | `0.16.0` | Closed by existing effect ownership | Preserve real package mount, replacement, disposal, remount, and static exclusion evidence. | No production change; no release consumed |
2417
- | `0.16.1` | Released | Preserve the retained CodeMirror instance boundary, bidirectional updates, error recovery, accessibility, and exact cleanup. | None |
2418
- | `0.16.2` | Closed by existing effect ownership | Preserve retained Chart.js data/resize updates, listener and route cleanup, fresh remount, accessibility, and static exclusion. | No production change; no release consumed |
2419
- | `0.16.3` | Released | Preserve state-owned order, keyed identity, keyboard parity, invalid-input recovery, package disposal, and static exclusion. | None |
2420
- | `0.16.4` | Released | Preserve scoped GSAP presentation, reduced-motion fallback, dependency/owner cleanup, fresh remount, and static exclusion. | None |
2421
- | `0.16.5` | Released | Preserve the reproducible endurance evidence, project notification ownership, and bounded stale-prefetch cache disposal. | None |
2422
- | `0.17.0` | Closed by existing layout effect ownership | Preserve project notification connect, keyed update, reconnect, stale rejection, offline recovery, retained navigation, and exact cleanup evidence. | No production change; no release consumed |
2423
- | `0.17.1` | Closed by stop condition | Preserve independent effect ownership until three applications prove the complete shared transport and bounded replay contract. | Zero qualifying applications; no release consumed |
2424
- | `0.17.2` | Released as `0.16.5` | Preserve stale-prefetch rejection and bounded document, state, resource, listener, DOM, and external-instance ownership. | Patch release retained the `0.16.x` public version line |
2425
- | `0.18.0` | Closed by existing artifact reporting | Preserve exact route/source ownership, bytes, hashes, preload equality, zero-JavaScript controls, and bounded prefetch policy. | No production change; no release consumed |
2426
- | `0.18.1` | Released as `0.16.6` | Preserve one guarded literal package edge, native module-map deduplication, exact owner cleanup, deferred artifact ownership, and static exclusion. | Patch release retained the `0.16.x` public version line |
2427
- | `0.18.2` | Released as `0.16.7` | Preserve on-demand retained editor mount, bidirectional updates, failure recovery, identity, exact cleanup, cached fresh remount, and static exclusion. | Patch release retained the `0.16.x` public version line |
2428
- | `0.18.3` | Released as `0.16.8` | Preserve shared deferred ownership, interaction-only loading, native document module-map deduplication, exact owner cleanup, binding-aware import validation, and static exclusion. | Patch release retained the `0.16.x` public version line |
2429
- | `0.19.0` | Released as `0.16.9` | Preserve the compatibility registry, reachable source inventory, exact ranges, and package-neutral output boundary. | Patch release retained the `0.16.x` public version line |
2430
- | `0.19.1` | Released as `0.16.10` | Preserve anonymous, invalid/valid login, token restore, layout-shared session reads, 401 clear, replacement navigation, and public zero-JavaScript output. | Patch release retained the `0.16.x` public version line |
2431
- | `0.19.2` | Closed by existing semantics | Preserve connected auth, query, route, create/edit validation, refresh, persistence, admin deletion, logout, source retention, accessibility, and public zero-JavaScript output. | No production change; no release consumed |
2432
- | `0.19.3` | Closed by existing semantics | Preserve connected Memos login, loading/error, feed, overlapping-key pagination, refresh, CRUD, reload persistence, logout, source retention, accessibility, and public zero-JavaScript output. | No production change; no release consumed |
2433
- | `0.19.4` | Closed by existing effect ownership | Preserve reaction mutation, version deduplication, stale-socket rejection, reconnect, keyed identity, exact route cleanup, fresh ownership, bounded handles/listeners/timers, and public zero-JavaScript output. | No production change; no release consumed |
2434
- | `0.19.5` | Deferred by stop condition | Resume only from a complete pinned Actual Budget workspace with an executable dependency graph and honest retention denominator. | Sparse acquisition omits required workspace and core packages; no compatibility claim |
2435
- | `0.20.0` | Released as `0.16.11` | Preserve stable diagnostic schema/codes, authored ranges, human errors, compatibility reuse, and zero browser/output delta. | Patch release retained the `0.16.x` public version line |
2436
- | `0.20.1` | Released as `0.16.12` | Preserve bounded deterministic reachable inventory, first-blocker retention, existing-record reuse, and zero browser/output delta. | Patch release retained the `0.16.x` public version line |
2437
- | `0.20.2` | Released as `0.16.13` | Preserve exact emitted-route lookup, authored provenance, semantic ownership, capability/artifact byte reasons and hashes, bounded deterministic output, structured missing-route diagnostics, and zero-JavaScript explanation. | Patch release retained the `0.16.x` public version line |
2438
- | `0.20.3` | Deferred by evidence gate | Resume only after recorded AI trials prove one repeated correction safe and useful with a stable diagnostic code and compiler-proven preconditions. | No recorded AI trials; no production change or release consumed |
2439
- | `0.20.4` | Released as `0.16.14` | Preserve pinned equal conditions, isolated paired attempts, raw failures, independent acceptance, attribution, failure-inclusive costs, source retention, and browser artifact evidence. | Deterministic fixture validates the protocol only; no framework ranking claimed |
2440
- | `0.20.5` | Closed by measured stop condition | Preserve the negative tooling-cost result and do not present structured tools as an AI cost reduction. | Tool-assisted attempts cost 16,933 more tokens per success; no release consumed |
2441
- | `0.21.0` | Closed by existing semantics | Preserve the complete browser parity matrix, large-list keyboard/release acceptance, and static exclusion controls. | No production change; no release consumed |
2442
- | `0.21.1` | Released as `0.16.16` | Preserve 100/1,000/10,000-route phase, RSS, output, digest, incremental-equivalence, recovery, and bounded canonical-AST retention evidence. | Full 10,000-route report has one complete measured run after two measured-stage diagnostics; no projection used |
2443
- | `0.21.2` | Closed by existing semantics | Preserve initial/session/lazy bytes, keyed/range/navigation median alarms, and bounded endurance ownership evidence. | Same-revision absolute gates; structural artifact bytes are not compressed network transfer |
2444
- | `0.21.3` | Released as `0.16.17` | Preserve exact package, browser, benchmark, registry, and fresh-install evidence. | One initial navigation benchmark invocation stalled at the outer timeout; its clean seven-profile rerun passed all alarms |
2445
- | `0.21.4` | r5 executed all 50 attempts; compiler follow-up verified; gate remains blocked | Preserve raw scores and partial traces. Direct-count/static-topic fixes and the render-ref diagnostic are verified; persistent version refs remain unsupported. Use aligned r6 only in a separately authorized complete run. | Local historical r5 scorer: Kudzu 18/25 versus React + Vite 23/25, with two partial Kudzu traces. Source replay passes all ten content static siblings but does not replace scores. Published r2 remains 11/25 versus 24/25. |