add reconciler architecture docs and update existing docs with cross-references
Phase 2: transitioning reconciler research into architecture documents. New docs: - reconciler.md: fiber tree, reconciliation algorithm (signal-driven props + key-based children), update scheduling, commit order, TypeBox optimization layer, file structure, consumer impact - lifecycle.md: mount/update/dispose phases, fiber tree disposal, partial tree removal, ReactiveRoot.dispose(), finalizeInstance, idempotent disposal, computed vs effect cleanup - ADR-004: key as first-class field on UElement (not a prop) - ADR-005: signal-driven updates for props, reconciliation for structure (hybrid approach, not full tree diffing) Updated docs: - README.md: add reconciler.md, lifecycle.md, ADRs 004/005 to index; update reconciler roadmap with architecture doc links - schema.md: add key?: string to UElement type with TODO comment; update known gaps to reference ADR-004 and reconciler.md; rephrase key constraint as temporary - element-factory.md: update key extraction gap to reference ADR-004 and reconciler.md - host-config.md: reference reconciler.md and lifecycle.md for the reconciler bridge and disposal gaps - reactive-layer.md: reference reconciler.md and lifecycle.md for the signal-host bridge and disposal gaps - events.md: reference lifecycle.md for unmount/dispose gap
This commit is contained in:
@@ -34,12 +34,12 @@ UJSX is functional but incomplete. The core primitives exist and are tested:
|
||||
- **Events** — `PubSubLike` and `EventEnvelope` for decoupled event emission
|
||||
- **Pointers** — `ValuePointer`, `selectNode`, `setNode` for tree navigation and targeted mutation
|
||||
|
||||
**Known gaps** (to be addressed by the reconciler work documented in `docs/research/reconciler/`):
|
||||
**Known gaps** (documented in architecture docs, planned for reconciler implementation):
|
||||
|
||||
- `unmount()` is a stub — no fiber tree teardown, no instance removal, no signal disposal
|
||||
- `render()` is mount-only — no re-render, no diffing, no `prepareUpdate`/`commitUpdate` calls
|
||||
- `dispose` functions are no-ops — signal subscriptions leak
|
||||
- No `key` field on `UElement` — positional matching only
|
||||
- `unmount()` is a stub — no fiber tree teardown, no instance removal, no signal disposal. See [host-config.md](host-config.md) and [lifecycle.md](lifecycle.md).
|
||||
- `render()` is mount-only — no re-render, no diffing, no `prepareUpdate`/`commitUpdate` calls. See [reconciler.md](reconciler.md).
|
||||
- `dispose` functions are no-ops — signal subscriptions leak. See [lifecycle.md](lifecycle.md).
|
||||
- No `key` field on `UElement` — positional matching only. See [ADR-004](decisions/004-key-as-first-class-field.md).
|
||||
|
||||
## Architecture Documents
|
||||
|
||||
@@ -49,6 +49,8 @@ UJSX is functional but incomplete. The core primitives exist and are tested:
|
||||
| [element-factory.md](element-factory.md) | h(), createRoot(), createComponent(), Fragment, JSX runtime |
|
||||
| [reactive-layer.md](reactive-layer.md) | ReactiveRoot, reactiveComponent, reactiveElement, signals, disposal gaps |
|
||||
| [host-config.md](host-config.md) | HostConfig interface, createRoot(), mount-only rendering, reconciler gap |
|
||||
| [reconciler.md](reconciler.md) | Fiber tree, reconciliation algorithm, update scheduling, TypeBox optimizations |
|
||||
| [lifecycle.md](lifecycle.md) | Mount, update, unmount/dispose lifecycle, signal cleanup, partial tree teardown |
|
||||
| [transforms.md](transforms.md) | TransformRegistry, TransformRule, TransformContext, bi-directional transforms |
|
||||
| [events.md](events.md) | EventEnvelope, PubSubLike, UjsxEventMap |
|
||||
| [pointers.md](pointers.md) | ValuePointer, selectNode, setNode, tree navigation |
|
||||
@@ -61,6 +63,8 @@ UJSX is functional but incomplete. The core primitives exist and are tested:
|
||||
| [001](decisions/001-html-agnostic-core.md) | HTML-agnostic core — no DOM-specific props |
|
||||
| [002](decisions/002-typebox-module-as-registry.md) | TypeBox Module IS the type registry |
|
||||
| [003](decisions/003-preact-signals-for-reactivity.md) | Preact signals-core for reactivity |
|
||||
| [004](decisions/004-key-as-first-class-field.md) | `key` as a first-class field on UElement — not a prop |
|
||||
| [005](decisions/005-signal-driven-updates-over-tree-diffing.md) | Signal-driven updates for props, reconciliation for structure |
|
||||
|
||||
## Consumer Context
|
||||
|
||||
@@ -84,18 +88,16 @@ An OpenCode plugin that provides UJSX-based template operations. Would use Trans
|
||||
|
||||
## Reconciler Roadmap
|
||||
|
||||
The reconciler research in `docs/research/reconciler/` documents a phased plan to close the current gaps:
|
||||
The reconciler bridges the reactive layer to the host layer, enabling signal-driven updates and key-based children reconciliation. Architecture docs define the WHAT and WHY; research docs contain the detailed implementation plans.
|
||||
|
||||
| Phase | Description | Status |
|
||||
|-------|-------------|--------|
|
||||
| 0 | `key` field on `UElement` | Research complete |
|
||||
| 1 | Reactive → Host bridge (fiber tree, signal-driven updates) | Research complete |
|
||||
| 2 | Key-based children reconciliation (LIS algorithm) | Research complete |
|
||||
| 3 | Unmount & dispose support | Research complete |
|
||||
| 4 | TypeBox value optimization layer | Research complete |
|
||||
| 5 | Flowgraph HostConfig implementations | Research complete |
|
||||
|
||||
Research docs are in `docs/research/reconciler/`. Architecture docs for the reconciler will be created during the architecture phase of the SDD process, informed by this research.
|
||||
| Phase | Description | Architecture | Research |
|
||||
|-------|-------------|-------------|----------|
|
||||
| 0 | `key` field on `UElement` | [ADR-004](decisions/004-key-as-first-class-field.md), [schema.md](schema.md) | [00-KEY-FIELD-DESIGN.md](../research/reconciler/00-KEY-FIELD-DESIGN.md) |
|
||||
| 1 | Reactive → Host bridge (fiber tree, signal-driven updates) | [reconciler.md](reconciler.md), [ADR-005](decisions/005-signal-driven-updates-over-tree-diffing.md) | [01-reactive-host-bridge.md](../research/reconciler/01-reactive-host-bridge.md) |
|
||||
| 2 | Key-based children reconciliation (LIS algorithm) | [reconciler.md](reconciler.md) | [02-key-based-children-reconciliation.md](../research/reconciler/02-key-based-children-reconciliation.md) |
|
||||
| 3 | Unmount & dispose support | [lifecycle.md](lifecycle.md) | [03-unmount-dispose-support.md](../research/reconciler/03-unmount-dispose-support.md) |
|
||||
| 4 | TypeBox value optimization layer | [reconciler.md](reconciler.md) (TypeBox Optimization Layer section) | [04-typebox-optimization-layer.md](../research/reconciler/04-typebox-optimization-layer.md) |
|
||||
| 5 | Flowgraph HostConfig implementations | Downstream consumer (`@alkdev/flowgraph`), not ujsx | [05-flowgraph-host-configs.md](../research/reconciler/05-flowgraph-host-configs.md) |
|
||||
|
||||
## Document Lifecycle
|
||||
|
||||
|
||||
Reference in New Issue
Block a user