From 8f8100c7a846fd42927b9d729e418e008b0167fd Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Tue, 8 Sep 2026 09:26:41 -0400 Subject: [PATCH] =?UTF-8?q?docs(plans):=20instance=20picker=20=E2=80=94=20?= =?UTF-8?q?node=20shape=20+=20orphan=20rules=20as=20shipped;=20task=201=20?= =?UTF-8?q?complete?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude-Session: https://claude.ai/code/session_01NcMG6xXdsJbmD2wYAgkK29 --- docs/plans/2026-09-08-instance-picker-design.md | 2 +- docs/plans/2026-09-08-instance-picker.md.tasks.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 ]