--- id: render-re-renderable name: Make Root.render() re-renderable status: pending depends_on: [mount-with-fibers] created: 2026-05-18T16:22:57.183371873Z modified: 2026-05-18T16:22:57.183372316Z scope: moderate risk: medium impact: component level: implementation --- # Description Make `Root.render()` support being called multiple times. Currently, calling `render()` twice creates two independent instance trees appended alongside each other. After this task, the second `render()` call reconciles against the stored fiber tree: it compares the new UNode tree to the existing fiber tree and applies property-only updates (structural reconciliation is Phase 2). This task also addresses the `render()` → `mount()` naming question from host-config.md Open Question 1: consider whether renaming `render()` to `mount()` for the first call makes the semantic clearer. For Phase 1 (before key-based reconciliation), `render()` handles: - First call: mounts the tree and builds the fiber tree - Subsequent calls: reconciles props positionally (same structure assumed), calls `prepareUpdate`/`commitUpdate` for changed props ## Acceptance Criteria - [ ] `Root.render(node)` on first call mounts and builds fiber tree (existing behavior) - [ ] `Root.render(node)` on second call reconciles props against existing fiber tree - [ ] Second `render()` does NOT create duplicate instances - [ ] Positional children matching: Nth old child → Nth new child - [ ] If child count differs, excess old children remain (structural changes deferred to Phase 2) - [ ] `Root.unmount()` still a stub (proper unmount is Phase 3) - [ ] Existing tests pass - [ ] New test: calling `render()` twice on same root produces one instance tree with updated props - [ ] New test: `prepareUpdate` is called for changed props on re-render ## References - docs/architecture/host-config.md — Known Gaps: The Reconciler Gap, render() is not idempotent - docs/architecture/reconciler.md — Step 2 (Reconcile Props), Changes to Existing Files - docs/architecture/host-config.md — Open Question 1 (render → mount rename) ## Notes > To be filled by implementation agent ## Summary > To be filled on completion