diff --git a/docs/plans/2026-09-08-instance-picker-design.md b/docs/plans/2026-09-08-instance-picker-design.md index e820e4e0..e2faf4b5 100644 --- a/docs/plans/2026-09-08-instance-picker-design.md +++ b/docs/plans/2026-09-08-instance-picker-design.md @@ -46,7 +46,7 @@ Alternatives rejected: A parent that changes `Areas`/`Instances` (site change) resets the field text and closes the panel; a parent that changes `SelectedInstanceId` (URL / localStorage restore) updates the field text. -**Pure builder.** `InstanceTreeBuilder.Build(areas, instances, filter)` → `IReadOnlyList` (`Components/Shared/InstanceTreeNode.cs`, `InstanceTreeBuilder.cs`; record `InstanceTreeNode(string Key, string Label, Area? Area, Instance? Instance, List Children)`, keys `a:{id}` / `i:{id}`, `IsInstance => Instance != null`). Orphaned areas (parent id pointing nowhere) are treated as roots so a bad row can never hide a subtree. `Topology.razor` keeps its own richer `TopoNode` — not refactored (YAGNI). +**Pure builder.** `InstanceTreeBuilder.Build(areas, instances, filter)` → `IReadOnlyList` (`Components/Shared/InstanceTreeNode.cs`, `InstanceTreeBuilder.cs`; record `InstanceTreeNode(string Key, string Label, Area? Area, Instance? Instance)` with a read-only `Children` property the builder fills, keys `a:{id}` / `i:{id}`, `IsInstance => Instance != null`). Orphaned areas (parent id pointing nowhere) and orphaned instances (area id pointing nowhere) are treated as roots so a bad row can never hide a subtree; a `ParentAreaId` cycle is unreachable from any root and simply does not render (guarded against looping). `Topology.razor` keeps its own richer `TopoNode` — not refactored (YAGNI). ## 3. Page wiring diff --git a/docs/plans/2026-09-08-instance-picker.md.tasks.json b/docs/plans/2026-09-08-instance-picker.md.tasks.json index 1e34c164..4c00bdbc 100644 --- a/docs/plans/2026-09-08-instance-picker.md.tasks.json +++ b/docs/plans/2026-09-08-instance-picker.md.tasks.json @@ -4,12 +4,12 @@ { "id": 1, "subject": "Task 1: InstanceTreeNode + InstanceTreeBuilder (pure) with tests", - "status": "pending" + "status": "completed" }, { "id": 2, "subject": "Task 2: InstancePicker component \u2014 field, panel, select, outside-click", - "status": "pending", + "status": "in_progress", "blockedBy": [ 1 ]