@kudzujs/core 0.9.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,838 @@
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
+ ### `0.10.2`: Shared Layout And Cross-Route State
167
+
168
+ - **Purpose:** keep workspace/session state across an explicit application
169
+ navigation group while resetting route-owned state.
170
+ - **Expected boundary:** existing SharedStateIR, layout state IDs, route release,
171
+ and native fallback.
172
+ - **Acceptance:** workspace selection survives project/list/detail transitions;
173
+ route drafts reset; reload behavior is explicit; a separate route group does
174
+ not receive the shared state.
175
+ - **Stop condition:** implementation requires a document-global store or SPA
176
+ router.
177
+ - **Done condition:** state lifetime and disposal are exact in browser tests and
178
+ static routes receive no shared-state runtime.
179
+
180
+ ### `0.10.3`: Persistence Recipe And State Release
181
+
182
+ - **Purpose:** prove URL, storage, and server-backed persistence without adding a
183
+ persistence framework.
184
+ - **Expected boundary:** application-owned effects and Web Storage.
185
+ - **Acceptance:** guarded restore, schema/version failure fallback, write after
186
+ state changes, logout clear, conditional/keyed release, and fresh remount.
187
+ - **Stop condition:** a generic persistence API is proposed without another
188
+ independent application requirement.
189
+ - **Done condition:** deterministic static fallback and browser recovery pass
190
+ with no storage runtime in unused routes.
191
+
192
+ ## `0.11.x`: Async And Server Data
193
+
194
+ ### `0.11.0`: Owned Fetch Lifecycle
195
+
196
+ - **Purpose:** establish the greenfield loading/error/data/refetch baseline.
197
+ - **Expected boundary:** existing EffectIR, ordinary state, and native `fetch`.
198
+ - **Acceptance:** delayed stale response loses state authority, HTTP failure is
199
+ accessible, explicit refetch recovers, route removal blocks late writes, and
200
+ authored cancellation is tested where required.
201
+ - **Stop condition:** a query cache is added to implement one request.
202
+ - **Done condition:** the project list journey passes and `/help` stays zero-JS.
203
+
204
+ ### `0.11.1`: List And Detail Data Consistency Evidence
205
+
206
+ - **Purpose:** expose the first real multi-consumer coordination limit.
207
+ - **Expected boundary:** layout shared state plus existing effects first.
208
+ - **Acceptance:** project list and detail observe one mutation, duplicate
209
+ requests are counted, route changes and refresh are deterministic, and all
210
+ current limitations are machine-recorded.
211
+ - **Stop condition:** the fixture invents package-shaped query semantics not
212
+ required by the user journey.
213
+ - **Done condition:** existing composition is accepted or the smallest repeated
214
+ missing coordination contract is isolated.
215
+
216
+ ### `0.11.2`: Shared Request Coordination
217
+
218
+ - **Purpose:** implement only the deduplication, subscriber, and invalidation
219
+ semantics authorized by `0.11.1` and two additional independent fixtures.
220
+ - **Expected boundary:** package-neutral application semantics; no TanStack,
221
+ SWR, Provider, retry scheduler, or public query API by default.
222
+ - **Acceptance:** one in-flight request per key, exact subscriber ownership,
223
+ invalidation after mutation, route/layout disposal, bounded retention, and
224
+ static exclusion.
225
+ - **Stop condition:** three unrelated fixtures do not require the same semantic
226
+ primitive, or ordinary shared state remains sufficient.
227
+ - **Done condition:** architecture review records the reused or new primitive,
228
+ runtime bytes, cache bound, and cleanup behavior.
229
+
230
+ ### `0.11.3`: Mutation, Optimistic Update, And Rollback
231
+
232
+ - **Purpose:** complete issue create/edit/delete behavior under failure.
233
+ - **Expected boundary:** immediate state setters and existing shared data
234
+ coordination; a transaction primitive is evidence-gated.
235
+ - **Acceptance:** optimistic list/detail update, server rejection, exact
236
+ rollback, duplicate-submit prevention, retained row identity, and accessible
237
+ error state.
238
+ - **Stop condition:** generic transactions are proposed for a single-owner
239
+ handler.
240
+ - **Done condition:** data integrity survives success, failure, navigation, and
241
+ retry.
242
+
243
+ ### `0.11.4`: Pagination, Refresh, And Polling Policy
244
+
245
+ - **Purpose:** complete bounded server-data loading before infinite data work.
246
+ - **Expected boundary:** URL signals, effects, native timers, and visibility
247
+ events.
248
+ - **Acceptance:** page/filter synchronization, back/forward, refresh, optional
249
+ polling cleanup, no duplicate work, and bounded retained results.
250
+ - **Stop condition:** background policy becomes a universal scheduler without
251
+ repeated evidence.
252
+ - **Done condition:** the exact owner and network behavior are measured and
253
+ documented.
254
+
255
+ ## `0.12.x`: Routing And Application Lifetime
256
+
257
+ ### `0.12.0`: Project Route Shell And Runtime Parameters
258
+
259
+ - **Purpose:** prove directly addressable project and issue routes.
260
+ - **Expected boundary:** file routes, runtime parameters, complete HTML, and
261
+ native navigation.
262
+ - **Acceptance:** direct entry, reload, invalid parameter rejection, project to
263
+ issue navigation, and standalone fallback.
264
+ - **Stop condition:** an SPA route registry is introduced.
265
+ - **Done condition:** all target routes are addressable without a browser router.
266
+
267
+ ### `0.12.1`: Shared Layout, History, Focus, And Scroll
268
+
269
+ - **Purpose:** complete the accepted same-document application group behavior.
270
+ - **Expected boundary:** existing navigation runtime and layout/route lifetime.
271
+ - **Acceptance:** back/forward, retained layout state, route cleanup, title/live
272
+ announcement, focus destination, hash behavior, and explicit scroll policy.
273
+ - **Stop condition:** browser-native navigation is weakened for routes outside
274
+ the approved group.
275
+ - **Done condition:** keyboard and browser-history journeys pass with native
276
+ recovery.
277
+
278
+ ### `0.12.2`: Authentication And Permission Boundary
279
+
280
+ - **Purpose:** complete login, restore, 401, logout, and permission-aware UI.
281
+ - **Expected boundary:** shared layout state, owned fetch, storage, and server or
282
+ host authorization.
283
+ - **Acceptance:** invalid and valid login, reload restoration, direct protected
284
+ entry, role-aware controls, server rejection, token clear, and logout.
285
+ - **Stop condition:** client conditional rendering is presented as a security
286
+ boundary.
287
+ - **Done condition:** server authorization and client UX responsibilities are
288
+ executable and explicit.
289
+
290
+ ### `0.12.3`: Route Failure And Restoration Policy
291
+
292
+ - **Purpose:** decide application-visible handling of navigation/data failures.
293
+ - **Expected boundary:** native fallback and application-owned error UI first.
294
+ - **Acceptance:** invalid document, asset failure, offline/error state, retry,
295
+ focus restoration, and no half-replaced route.
296
+ - **Stop condition:** a generic React-style error-boundary renderer is required.
297
+ - **Done condition:** every failure leaves a valid document and recoverable
298
+ navigation path.
299
+
300
+ ### `0.12.4`: Nested Layout Evidence Decision
301
+
302
+ - **Purpose:** determine whether multiple independently retained layout owners
303
+ are required.
304
+ - **Acceptance:** at least three unrelated application routes demonstrate the
305
+ same lifetime that one shared layout plus static composition cannot express.
306
+ - **Stop condition:** route nesting is only a source-organization preference.
307
+ - **Done condition:** either existing layout composition is accepted or a
308
+ minimal layout-owner chain is approved with explicit disposal order.
309
+
310
+ ## `0.13.x`: Forms
311
+
312
+ ### `0.13.0`: Production Form And Server Validation
313
+
314
+ - **Purpose:** complete issue creation with native constraints and server errors.
315
+ - **Expected boundary:** native form, FormData, state, and async handler.
316
+ - **Acceptance:** keyboard submit, native constraints, pending state, field and
317
+ form errors, retry, focus/ARIA linkage, and retained valid input.
318
+ - **Stop condition:** React Hook Form is reproduced.
319
+ - **Done condition:** complete accessible create/edit behavior passes without a
320
+ form runtime.
321
+
322
+ ### `0.13.1`: Nested Fields, Field Arrays, Dirty, And Touched
323
+
324
+ - **Purpose:** determine which form metadata needs framework support.
325
+ - **Expected boundary:** object/array state and keyed rows first.
326
+ - **Acceptance:** dynamic assignee/checklist rows, reorder/remove, conditional
327
+ fields, dirty/touched display, reset, and exact row identity.
328
+ - **Stop condition:** a registration/proxy runtime is added before three
329
+ independent forms require the same metadata graph.
330
+ - **Done condition:** application composition is accepted or the smallest
331
+ repeated metadata semantic is isolated.
332
+
333
+ ### `0.13.2`: Multistep Draft And Autosave
334
+
335
+ - **Purpose:** prove draft persistence across steps and failures.
336
+ - **Expected boundary:** routes or conditionals, state, dependency effects,
337
+ debounce cleanup, and storage/server persistence.
338
+ - **Acceptance:** step navigation, validation gate, debounced save, stale-save
339
+ rejection, reload restore, reset, and conflict/error state.
340
+ - **Stop condition:** a wizard or autosave scheduler is added for one form.
341
+ - **Done condition:** no data loss occurs across navigation, reload, or failure.
342
+
343
+ ### `0.13.3`: File Upload Boundary
344
+
345
+ - **Purpose:** move beyond local file reading to a real upload lifecycle.
346
+ - **Expected boundary:** native input, FormData/fetch or a proven browser API.
347
+ - **Acceptance:** type/size validation, progress when the selected transport can
348
+ expose it, cancellation, failure/retry, route departure, and successful
349
+ attachment mutation.
350
+ - **Stop condition:** chunking/resume/background upload is added without a real
351
+ application requirement.
352
+ - **Done condition:** the supported transport and unsupported progress/resume
353
+ boundary are explicit and tested.
354
+
355
+ ## `0.14.x`: Lists, Tables, And Virtualization
356
+
357
+ ### `0.14.0`: Project Table CRUD And Identity
358
+
359
+ - **Purpose:** establish the production table baseline.
360
+ - **Expected boundary:** existing keyed list runtime and valid table structure.
361
+ - **Acceptance:** insert, update, delete, reorder, sort, filter, selection,
362
+ row-local edit state, keyboard access, and retained DOM identity.
363
+ - **Stop condition:** a data-grid runtime is introduced for ordinary tables.
364
+ - **Done condition:** complete CRUD behavior passes with measured update latency.
365
+
366
+ ### `0.14.1`: Nested And Object-State Collections
367
+
368
+ - **Purpose:** prove project/group/issue/checklist nesting from ordinary object
369
+ state without authored field state.
370
+ - **Expected boundary:** existing object-property links and nested KeyedBlockIR.
371
+ - **Acceptance:** replacement, nested insertion/removal/reorder, latest handlers,
372
+ row cleanup, invalid-shape rejection, and static sibling exclusion.
373
+ - **Stop condition:** dynamic property paths or mutation require generic runtime
374
+ object observation.
375
+ - **Done condition:** direct immutable paths cover the application journey and
376
+ nearby dynamic forms fail clearly.
377
+
378
+ ### `0.14.2`: Infinite Loading Composition
379
+
380
+ - **Purpose:** prove sentinel-driven incremental loading before virtualization.
381
+ - **Expected boundary:** IntersectionObserver, owned fetch, append, keyed list.
382
+ - **Acceptance:** cursor progression, duplicate suppression, end/error/retry,
383
+ route cleanup, retained identity, and bounded result policy.
384
+ - **Stop condition:** infinite-query or observer runtime is added for one list.
385
+ - **Done condition:** the full journey passes with explicit network and memory
386
+ bounds.
387
+
388
+ ### `0.14.3`: 10,000-Item Browser Decision
389
+
390
+ - **Purpose:** measure direct DOM, pagination, and windowing alternatives.
391
+ - **Acceptance:** equivalent behavior, keyboard access, edit identity, scroll
392
+ latency, DOM count, heap, and update latency across alternatives.
393
+ - **Stop condition:** a virtualization result is claimed without equivalent
394
+ behavior or repeated samples.
395
+ - **Done condition:** the selected strategy and thresholds are recorded without
396
+ assuming direct 10,000-row rendering is acceptable.
397
+
398
+ ### `0.14.4`: Virtual Range Ownership
399
+
400
+ - **Purpose:** implement bounded DOM only if `0.14.3` and three independent
401
+ fixtures authorize it.
402
+ - **Expected boundary:** keyed ownership extended by a minimal visible-range
403
+ owner; no general component renderer.
404
+ - **Acceptance:** spacer/measurement behavior, retained key state, keyboard and
405
+ focus, dynamic row height policy, cleanup, and bounded heap.
406
+ - **Stop condition:** evidence favors pagination or native containment.
407
+ - **Done condition:** range semantics are package-neutral, optional, measured,
408
+ and absent from non-virtual routes.
409
+
410
+ ## `0.15.x`: Overlay And Layer Ownership
411
+
412
+ ### `0.15.0`: Native Dialog Baseline
413
+
414
+ - **Purpose:** use browser top-layer semantics for destructive issue actions.
415
+ - **Acceptance:** initial focus, Escape/cancel, confirm, trigger focus restore,
416
+ inert background, route cleanup, and static exclusion.
417
+ - **Stop condition:** a custom modal/focus-trap runtime replaces `<dialog>`.
418
+ - **Done condition:** project delete and edit confirmation pass accessibly.
419
+
420
+ ### `0.15.1`: Popover, Dropdown, And Menu Behavior
421
+
422
+ - **Purpose:** establish the native-first non-modal overlay boundary.
423
+ - **Expected boundary:** native Popover where available, ordinary state/events,
424
+ and owned listeners.
425
+ - **Acceptance:** positioning policy, outside click, Escape, trigger restore,
426
+ roving keyboard behavior where menu semantics apply, and route cleanup.
427
+ - **Stop condition:** package Portal/Slot reconciliation enters the runtime.
428
+ - **Done condition:** supported native and custom boundaries are explicit.
429
+
430
+ ### `0.15.2`: Toast And Notification Ownership
431
+
432
+ - **Purpose:** provide application feedback across route mutations.
433
+ - **Expected boundary:** layout state, keyed list, timer effects, and live region.
434
+ - **Acceptance:** queue, deduplication, timeout, pause/focus behavior if required,
435
+ dismissal, route persistence, announcement, and disposal.
436
+ - **Stop condition:** a global scheduler is added before ordinary composition is
437
+ shown insufficient.
438
+ - **Done condition:** notifications remain owner-bounded and absent from unused
439
+ route output.
440
+
441
+ ### `0.15.3`: Layer Owner Decision
442
+
443
+ - **Purpose:** decide whether logical ownership of DOM rendered outside its
444
+ authored range is necessary.
445
+ - **Acceptance:** three independent overlay fixtures fail native top-layer and
446
+ in-place composition for the same reason.
447
+ - **Stop condition:** the request is React Portal source compatibility alone.
448
+ - **Done condition:** no new concept is added, or a minimal owner edge with exact
449
+ cleanup/focus order is approved.
450
+
451
+ ## `0.16.x`: External Complex UI
452
+
453
+ ### `0.16.0`: Bounded External UI Contract
454
+
455
+ - **Purpose:** define and prove `mount`, `update`, `dispose`, owner, lifetime, and
456
+ route-specific assets without a React island.
457
+ - **Expected boundary:** DOM ref plus owned effect first.
458
+ - **Acceptance:** a small imperative package creates and disposes one real DOM or
459
+ canvas instance; static siblings exclude it.
460
+ - **Stop condition:** the package requires React reconciliation.
461
+ - **Done condition:** package ownership remains inside effect/handler ESM and no
462
+ generic widget runtime is added.
463
+
464
+ ### `0.16.1`: Real Editor Lifecycle
465
+
466
+ - **Purpose:** integrate one real CodeMirror-class editor.
467
+ - **Acceptance:** mount, initial value, application-state update, editor-to-state
468
+ update, dependency changes, route disposal, remount, errors, and accessibility.
469
+ - **Stop condition:** preserving the React wrapper requires a React island.
470
+ - **Done condition:** the native package owns its DOM and Kudzu owns only its
471
+ bounded lifecycle.
472
+
473
+ ### `0.16.2`: Chart And Map Lifecycle
474
+
475
+ - **Purpose:** validate the same contract against unrelated canvas/SVG/map DOM.
476
+ - **Acceptance:** resize/data update, listener/source cleanup, route transition,
477
+ retained instance where required, and asset exclusion.
478
+ - **Stop condition:** package-specific concepts enter generic IR/runtime.
479
+ - **Done condition:** one lifecycle model covers editor and chart/map evidence.
480
+
481
+ ### `0.16.3`: Grid And Drag/Drop Decision
482
+
483
+ - **Purpose:** test external data-grid or drag engine ownership against keyed
484
+ Kudzu state.
485
+ - **Acceptance:** keyboard equivalent, reorder/mutation, state synchronization,
486
+ package disposal, and failure recovery.
487
+ - **Stop condition:** two independent renderers attempt to own the same DOM.
488
+ - **Done condition:** either bounded ownership is proven or the package is
489
+ explicitly unsupported with a migration path.
490
+
491
+ ## `0.17.x`: Long-Lived Applications
492
+
493
+ ### `0.17.0`: Endurance Harness
494
+
495
+ - **Purpose:** make long-session correctness locally reproducible.
496
+ - **Expected files:** a dedicated browser soak harness and machine-readable heap,
497
+ listener, resource, DOM, and navigation counters.
498
+ - **Acceptance:** repeated route, conditional, keyed, dialog, and editor cycles;
499
+ raw traces are retained.
500
+ - **Stop condition:** only a short synthetic timing loop is measured.
501
+ - **Done condition:** failures identify the owner that retained memory or work.
502
+
503
+ ### `0.17.1`: WebSocket Application Journey
504
+
505
+ - **Purpose:** move from isolated fake socket ownership to project notifications.
506
+ - **Acceptance:** connect, message, keyed update, reconnect, stale socket
507
+ rejection, route/layout lifetime, offline/error state, and exact cleanup.
508
+ - **Stop condition:** a shared transport runtime is added for one consumer.
509
+ - **Done condition:** repeated navigation balances every listener, timer, and
510
+ socket handle.
511
+
512
+ ### `0.17.2`: Shared SSE/Transport Decision
513
+
514
+ - **Purpose:** test multiple independently mounted consumers, replay, and
515
+ reconnect against existing layout effects/shared state.
516
+ - **Acceptance:** subscription add/remove, one transport, replay ordering,
517
+ reconnect, consumer removal, final close, and bounded history.
518
+ - **Stop condition:** fewer than three independent applications require the same
519
+ shared transport semantics.
520
+ - **Done condition:** existing composition passes or a minimal transport owner is
521
+ architecture-approved.
522
+
523
+ ### `0.17.3`: Memory And Disposal Gate
524
+
525
+ - **Purpose:** close document/layout/route/range/external-instance memory risks.
526
+ - **Acceptance:** long repeated journeys show bounded heap, DOM, prefetch cache,
527
+ resource handles, listener counts, and state maps.
528
+ - **Stop condition:** undocumented browser GC timing is presented as exact proof.
529
+ - **Done condition:** retained growth has a declared bound and repeated samples
530
+ pass the agreed threshold.
531
+
532
+ ## `0.18.x`: Lazy Loading And Code Splitting
533
+
534
+ ### `0.18.0`: Route And Feature Artifact Baseline
535
+
536
+ - **Purpose:** record current route-specific ESM, shared chunks, preload, Worker,
537
+ CSS, and navigation prefetch behavior.
538
+ - **Expected boundary:** existing RouteBuildRecord and artifact report.
539
+ - **Acceptance:** exact source-to-artifact ownership and bytes for the greenfield
540
+ app, editor, Answer, and Memos routes.
541
+ - **Stop condition:** a new loader is designed before the current graph is
542
+ measured.
543
+ - **Done condition:** every eager dependency has a structural reason.
544
+
545
+ ### `0.18.1`: Bounded Lazy Capability Import
546
+
547
+ - **Purpose:** permit one statically analyzable feature dependency to load only
548
+ when its owner requests it.
549
+ - **Expected boundary:** validated static dynamic-import edge, route artifact
550
+ closure, owner token, and native ESM import.
551
+ - **Acceptance:** exact specifier, no arbitrary graph escape, deduplicated load,
552
+ error/retry, owner release, and static exclusion.
553
+ - **Stop condition:** arbitrary dynamic imports or lazy component rendering are
554
+ required.
555
+ - **Done condition:** the feature loader is capability-specific, not a component
556
+ runtime.
557
+
558
+ ### `0.18.2`: Lazy Editor Journey
559
+
560
+ - **Purpose:** apply `0.18.1` to the real editor.
561
+ - **Acceptance:** editor package absent before activation, loaded once on demand,
562
+ mount/update/dispose behavior unchanged, failure recoverable, and revisit
563
+ semantics explicit.
564
+ - **Stop condition:** package evaluation must occur during build rendering.
565
+ - **Done condition:** initial route bytes fall by the exact deferred package
566
+ graph without losing behavior.
567
+
568
+ ### `0.18.3`: Shared Chunks And Prefetch Policy
569
+
570
+ - **Purpose:** avoid duplicate large feature graphs and define optional preload.
571
+ - **Acceptance:** shared chunk ownership, no duplicate fetch, route/interaction
572
+ prefetch policy, cache bound, cancellation limits, and output report.
573
+ - **Stop condition:** all features are globally prefetched.
574
+ - **Done condition:** policy minimizes unused transfer while meeting accepted
575
+ interaction latency.
576
+
577
+ ## `0.19.x`: React Ecosystem Migration
578
+
579
+ ### `0.19.0`: Compatibility Boundary And Inventory
580
+
581
+ - **Purpose:** centralize package recognition and compatibility provenance without
582
+ changing semantic IR or browser output.
583
+ - **Expected files:** focused compatibility metadata/registry, current passes,
584
+ project report; no public plugin API.
585
+ - **Acceptance:** Native, Compiled, Normalized, Adapter, Owned External UI,
586
+ Partial, and Unsupported sites are deterministic and source-located.
587
+ - **Stop condition:** package origin enters ModuleIR, RouteIR, codegen, or runtime.
588
+ - **Done condition:** existing React Router, Bootstrap, Zustand, and browser
589
+ normalizations preserve output and diagnostics.
590
+
591
+ ### `0.19.1`: Apache Answer Authentication Journey
592
+
593
+ - **Purpose:** promote the existing build-only auth fixture to browser evidence.
594
+ - **Acceptance:** anonymous, invalid login, valid login, token restore, shared
595
+ header/settings, 401 clear, replacement navigation, public zero-JS sibling.
596
+ - **Stop condition:** client UI is treated as authorization.
597
+ - **Done condition:** the complete journey passes against a deterministic server.
598
+
599
+ ### `0.19.2`: Apache Answer Connected Authoring Journey
600
+
601
+ - **Purpose:** connect query, route, detail, create/edit, validation, mutation,
602
+ refresh, admin, and logout.
603
+ - **Acceptance:** behavior, accessibility, persistence, errors, navigation,
604
+ source retention, and output all pass.
605
+ - **Stop condition:** fixture-only compiler semantics or broad package runtime is
606
+ introduced.
607
+ - **Done condition:** this is a connected browser journey, not a whole-app claim.
608
+
609
+ ### `0.19.3`: Memos Feed And CRUD Journey
610
+
611
+ - **Purpose:** establish the first durable Memos application slice.
612
+ - **Acceptance:** login, loading/error, feed, pagination, create/edit/delete,
613
+ retained memo identity, refresh, and logout.
614
+ - **Stop condition:** outline-only or static feed output is presented as Memos
615
+ migration.
616
+ - **Done condition:** pinned upstream provenance and exact retained source are
617
+ recorded.
618
+
619
+ ### `0.19.4`: Memos Realtime Journey
620
+
621
+ - **Purpose:** add reaction and realtime refresh using the accepted long-lived
622
+ transport model.
623
+ - **Acceptance:** mutation, server event, deduplication, reconnect, stale event
624
+ rejection, route cleanup, and memory gate.
625
+ - **Stop condition:** a query or SSE package runtime is copied wholesale.
626
+ - **Done condition:** browser and endurance acceptance pass.
627
+
628
+ ### `0.19.5`: Actual Budget Intake Decision
629
+
630
+ - **Purpose:** determine whether a complete, legally and technically usable
631
+ workspace can become the third application proof.
632
+ - **Acceptance:** pinned source, install/build path, dependency inventory, first
633
+ executable user journey, and honest source-retention denominator.
634
+ - **Stop condition:** workspace dependencies or core packages remain absent.
635
+ - **Done condition:** a later packet is authorized, or deferral is recorded with
636
+ no compatibility claim.
637
+
638
+ ## `0.20.x`: AI Tooling And Delivery Cost
639
+
640
+ ### `0.20.0`: Structured Diagnostics
641
+
642
+ - **Purpose:** expose stable machine-readable errors from the existing compiler.
643
+ - **Acceptance:** version, code, stage, severity, source range, message,
644
+ compatibility class, and safe suggestion; human diagnostics remain useful.
645
+ - **Stop condition:** diagnostic codes expose pass filenames or unstable IR.
646
+ - **Done condition:** agents no longer parse message substrings for maintained
647
+ fixtures.
648
+
649
+ ### `0.20.1`: `kudzu inspect --json`
650
+
651
+ - **Purpose:** expose reachable application and compatibility inventory.
652
+ - **Acceptance:** filtered module/route/package/capability/owner/blocker facts,
653
+ deterministic order, schema version, and large-project context bound.
654
+ - **Stop condition:** the command builds a second analyzer or dumps full raw IR.
655
+ - **Done condition:** the first blocker can be selected without reading hundreds
656
+ of source or dependency files.
657
+
658
+ ### `0.20.2`: `kudzu explain --route`
659
+
660
+ - **Purpose:** trace one authored route to its selected browser artifacts.
661
+ - **Acceptance:** source site, normalization provenance, semantic owner,
662
+ capability, entry/chunk/style/Worker, byte reason, and zero-JS explanation.
663
+ - **Stop condition:** a second artifact graph is introduced.
664
+ - **Done condition:** existing route records and artifact reports answer the
665
+ query with bounded output.
666
+
667
+ ### `0.20.3`: Deterministic Normalize And Fix
668
+
669
+ - **Purpose:** automate only edits proven safe and useful by recorded AI trials.
670
+ - **Acceptance:** check/preview/write modes, exact ranges, idempotence, comments
671
+ retained, no unrelated formatting, and byte-equivalent output.
672
+ - **Stop condition:** canonical compiler source replaces ordinary authored TSX.
673
+ - **Done condition:** each fix has one diagnostic code and explicit preconditions.
674
+
675
+ ### `0.20.4`: AI Delivery Protocol And Runner
676
+
677
+ - **Purpose:** track fair Kudzu and React+Vite delivery attempts.
678
+ - **Acceptance:** pinned model/tools/prompts/budgets, framework-neutral behavior
679
+ suite, raw failures, token/cost/tool/file/build metrics, source retention, and
680
+ browser artifacts.
681
+ - **Stop condition:** Kudzu receives private compiler guidance unavailable to the
682
+ comparator.
683
+ - **Done condition:** every attempt is reproducible or fully attributable.
684
+
685
+ ### `0.20.5`: Tooling Cost Validation
686
+
687
+ - **Purpose:** prove that diagnostics/inspect/explain/fix lower total cost per
688
+ successful task.
689
+ - **Acceptance:** before/after attempts on the same tasks; failures remain in the
690
+ numerator; success behavior remains identical.
691
+ - **Stop condition:** token reduction comes from omitted behavior or hidden
692
+ context.
693
+ - **Done condition:** useful tools are retained and non-improving tools are
694
+ removed or deferred.
695
+
696
+ ## `0.21.x`: Production-Scale Proof
697
+
698
+ ### `0.21.0`: Functional Parity Matrix
699
+
700
+ - **Purpose:** freeze complete greenfield, Answer, and Memos acceptance.
701
+ - **Acceptance:** content, auth, forms, CRUD, shared data, large list, overlay,
702
+ editor, lazy load, realtime, errors, accessibility, and navigation pass.
703
+ - **Stop condition:** any build-only result is counted as application success.
704
+ - **Done condition:** every claimed capability has a browser journey and static
705
+ exclusion control.
706
+
707
+ ### `0.21.1`: Compiler And Route Scale
708
+
709
+ - **Purpose:** measure clean/incremental compilation and artifact emission.
710
+ - **Acceptance:** 100, 1,000, and separately provisioned 10,000 routes; module
711
+ graph time, parse/normalize/compile/render/write time, peak RSS, output digest,
712
+ and failure recovery.
713
+ - **Stop condition:** projected or incomplete 10,000-route data is called a pass.
714
+ - **Done condition:** repeated measurements and all material regressions are
715
+ explained or fixed.
716
+
717
+ ### `0.21.2`: Browser Performance And Memory
718
+
719
+ - **Purpose:** protect interaction latency and long-running stability.
720
+ - **Acceptance:** initial/session bytes, list/range latency, navigation, lazy
721
+ feature load, resource cleanup, repeated heap, detached DOM, cache, listeners,
722
+ and handles.
723
+ - **Stop condition:** smaller JavaScript is preferred over behavior parity.
724
+ - **Done condition:** complete features meet declared thresholds with bounded
725
+ long-session growth.
726
+
727
+ ### `0.21.3`: Package And Release Candidate
728
+
729
+ - **Purpose:** verify the exact candidate as an installed product.
730
+ - **Acceptance:** `npm run check`, `npm test`, required Chrome, focused
731
+ benchmarks, package smoke, tarball inspection, generated application, registry
732
+ dry run, docs, and release rollback procedure.
733
+ - **Stop condition:** version metadata changes before the exact candidate passes.
734
+ - **Done condition:** the reviewed commit is independently publishable.
735
+
736
+ ### `0.21.4`: AI Delivery Proof
737
+
738
+ - **Purpose:** run the final equal-condition comparison on production-shaped
739
+ tasks.
740
+ - **Acceptance:** highest or statistically tied success rate, lowest median cost
741
+ per successful task, complete raw attempts, maintainable source, and retained
742
+ browser/build advantage.
743
+ - **Stop condition:** cherry-picked attempts, toy-only tasks, or unequal tooling.
744
+ - **Done condition:** the evidence either authorizes `1.0.0` or names the next
745
+ measured blocker without changing the release criteria.
746
+
747
+ ## `1.0.0`: Stable Application Model
748
+
749
+ `1.0.0` is authorized only after every required `0.21.x` gate passes. It means:
750
+
751
+ - the small package-neutral application semantic model is stable;
752
+ - complete production-shaped application journeys pass;
753
+ - static routes retain zero JavaScript;
754
+ - interactive routes retain only used capabilities;
755
+ - React migration uses compatibility, normalization, adapters, and owned
756
+ external UI rather than a React runtime;
757
+ - browser/build/performance and long-running memory gates pass;
758
+ - the equal-condition AI benchmark meets the published success and cost gates.
759
+
760
+ ## Patch Session Procedure
761
+
762
+ Before implementation:
763
+
764
+ 1. Read this plan, `MIGRATION_ROADMAP.md`, the current architecture map, and the
765
+ applicable capability packet.
766
+ 2. Confirm the package version and inspect uncommitted work without modifying
767
+ unrelated changes.
768
+ 3. Confirm every earlier patch is complete or explicitly replanned.
769
+ 4. Name the exact application journey, failing fixture, owner, producer, and
770
+ consumer boundary.
771
+ 5. Record the baseline output, browser bytes, runtime concepts, compiler/pass
772
+ LOC, and applicable benchmark.
773
+
774
+ During implementation:
775
+
776
+ 1. Add the failing fixture first.
777
+ 2. Try native behavior and existing semantics before changing the framework.
778
+ 3. Keep the smallest correct patch and preserve ordinary React-shaped TSX.
779
+ 4. Add nearby negative diagnostics and static zero-cost exclusion.
780
+ 5. Do not broaden public APIs, IR, runtime, or package support beyond the packet.
781
+
782
+ Before release:
783
+
784
+ 1. Run focused tests, `npm run check`, `npm test`, required Chrome, and package
785
+ smoke.
786
+ 2. Run affected output and performance gates with at least seven interleaved
787
+ measured samples where a comparison is claimed.
788
+ 3. Record fixtures, semantic primitives, core/pass LOC, runtime concepts,
789
+ browser bytes, output digest, benchmark deltas, AI-cost effect, risks, and
790
+ known limits.
791
+ 4. Update package version, lockfile, release notes, support documentation, and
792
+ registry-facing records only on the exact accepted release commit.
793
+ 5. Complete the release transaction below, then advance the active status to
794
+ the next patch.
795
+
796
+ ## Release Transaction
797
+
798
+ Every completed patch and every new minor is a real release. A work session that
799
+ does not complete its packet does not consume a version; the next session
800
+ continues the same target version.
801
+
802
+ 1. Confirm the target version is the active packet and is not already present in
803
+ npm or Git tags.
804
+ 2. Update `package.json`, root lockfile metadata, `RELEASES.md`, README/support
805
+ records, and generator metadata when the release changes generated projects.
806
+ 3. Run the complete release gate on the exact versioned tree: focused tests,
807
+ `npm run check`, `npm test`, required Chrome, `npm run test:package`, affected
808
+ benchmarks, package inspection, and `git diff --check`.
809
+ 4. Inspect `git status`, the complete diff, and recent release history. Stage
810
+ only the intended packet and release files.
811
+ 5. Create one release commit using the established `Release Kudzu X.Y.Z`
812
+ convention. Do not amend a rejected release commit; fix forward and create a
813
+ new commit.
814
+ 6. Push the release commit and require its CI checks to pass.
815
+ 7. Create tag `vX.Y.Z` on that exact commit and push the tag. Never move or
816
+ repoint a published tag.
817
+ 8. Publish the matching GitHub release. The existing `Publish npm` workflow
818
+ checks out the tag, reruns check/test/package gates, verifies version/tag
819
+ equality, publishes `@kudzujs/core` and any changed `create-kudzu`, and checks
820
+ npm registry visibility.
821
+ 9. Require the publish workflow to pass, verify npm metadata and a fresh install
822
+ manually, and record the release URL and registry versions.
823
+ 10. Only after commit, push, tag, GitHub release, npm publication, registry
824
+ verification, and fresh-install verification succeed may the next patch
825
+ become active.
826
+
827
+ If Git push, tag push, GitHub release, npm publication, or registry verification
828
+ fails, the current packet remains active. Do not start or version the next
829
+ packet. npm versions and published tags are immutable; recover with the same
830
+ release transaction where possible or document and publish a forward-fix patch.
831
+
832
+ ## Active Status
833
+
834
+ | Patch | Status | Next exact action | Blocker |
835
+ |---|---|---|---|
836
+ | `0.10.0` | Release candidate | Complete commit, push, tag, GitHub release, npm publication, registry, and fresh-install verification. | Release transaction |
837
+ | `0.10.1` | Blocked | Extend the greenfield fixture with local, object, array, and derived state scale evidence after 0.10.0 publication. | 0.10.0 release |
838
+ | `0.10.2` onward | Blocked | Wait for the preceding patch acceptance and release record. | Ordered dependency |