diff --git a/docs/en/phase-0-reactflow-parity-audit.md b/docs/en/phase-0-reactflow-parity-audit.md index f4574631..b15b2966 100644 --- a/docs/en/phase-0-reactflow-parity-audit.md +++ b/docs/en/phase-0-reactflow-parity-audit.md @@ -182,6 +182,10 @@ Phase 533 is GitHub #189 / `avalonia-node-map-cxe`, the public lasso pointer-mod Phase 534 is GitHub #191 / `avalonia-node-map-lzy`, the lasso visual gesture feedback route selected after the public lasso pointer-mode activation path. This implementation slice keeps `NodeCanvasSelectionMode.Lasso` on the existing selection route and adds a transient lasso path on the existing `OverlayLayer` while the user drags. `UpdateLassoFeedback(...)`, `ClearLassoFeedback()`, and `LassoSelectionMode_RendersTransientFeedbackPathOnlyDuringDrag` guard that the path appears after the existing drag threshold and clears on release or capture loss without creating persistent whiteboard state. It keeps toolbar UX, lasso screenshot route, eraser behavior, rectangle/freehand drawing, whiteboard primitives, persistence, renderer-layer changes, screenshot manifest expansion, strict visual-baseline enforcement, retained API removal, and full React Flow whiteboard parity as explicit gaps. +## Phase 535 Update + +Phase 535 is GitHub #193 / `avalonia-node-map-8l6`, the post-Phase-534 parity queue refresh. This docs/tests-only slice records Phase 534 as closed and turns the remaining whiteboard pressure into tracker-backed follow-up candidates for lasso screenshot proof, lasso toolbar UX/public activation ergonomics, eraser behavior/API feasibility, rectangle/freehand drawing primitives, and whiteboard persistence/render-layer readiness. It authorizes no runtime behavior changes, no public API changes, no UI redesign, no screenshot manifest expansion, no strict pixel baseline enforcement, no retained API removal, and no whiteboard implementation. + ## Phase 489 Update Phase 489 closed GitHub #101 / `avalonia-node-map-6sc` through PR #102 as a renderer virtualization design spike on branch `perf/renderer-virtualization-spike`. This slice was docs/tests only: it defined the proof contract required before any future ItemsRepeater/Skia-style renderer virtualization, background graph index, or graph-size claim expansion. It made no public API change and no runtime change. The current evidence remains viewport-budgeted scene projection/rendering, not a true renderer virtualization contract; `xlarge` stays telemetry-only. @@ -261,7 +265,7 @@ Phase 483 closes GitHub #82 by choosing the bounded-docs path instead of a rende | Edge labels and markers | Present | Labels and source/target marker fields are modeled in edge presentation/geometry snapshots. | Keep guarded. | | Drag, pan, zoom | Present | Canvas pointer/wheel coordinators and viewport commands exist. | Keep guarded. | | Marquee/box selection and multi-select | Present | `GetSelectionRectangleSnapshot`, `GetSelectionLassoSnapshot`, overlay coordinator marquee selection, internal lasso bridge selection, internal lasso gesture capture, public `NodeCanvasSelectionMode.Lasso`, transient lasso overlay feedback, `SelectAll`, `SelectNone`, and `InvertSelection` have tests and Cookbook routes. Rectangle marquee is UI-backed and remains the default; lasso/freehand has backend/editor query support, an internal Avalonia bridge, internal pointer gesture capture, a public `NodeCanvas.SelectionMode` activation path, and transient visual feedback while dragging. | Keep guarded. | -| Whiteboard / lasso / eraser / rectangle draw | Gap retained / public lasso selection started | React Flow whiteboard docs list Freehand draw, Lasso selection, Eraser, and Rectangle draw as distinct advanced examples. AsterGraph now has rectangle marquee selection, command projection evidence, a guarded backend `GetSelectionLassoSnapshot(...)` query, an internal Avalonia lasso selection bridge, internal lasso gesture capture, public lasso pointer-mode activation, and transient visual feedback for active lasso drags, but no toolbar UX, lasso screenshot route, whiteboard primitives, or drawing tools. | Phase 534 adds transient lasso visual feedback without implementing full whiteboard UI behavior. | +| Whiteboard / lasso / eraser / rectangle draw | Gap retained / public lasso selection started | React Flow whiteboard docs list Freehand draw, Lasso selection, Eraser, and Rectangle draw as distinct advanced examples. AsterGraph now has rectangle marquee selection, command projection evidence, a guarded backend `GetSelectionLassoSnapshot(...)` query, an internal Avalonia lasso selection bridge, internal lasso gesture capture, public lasso pointer-mode activation, and transient visual feedback for active lasso drags, but no toolbar UX, lasso screenshot route, whiteboard primitives, or drawing tools. | Phase 535 refreshes the post-Phase-534 queue and keeps the next candidates tracker-backed before any whiteboard behavior claim expands. | | Connection preview and validation | Present / guarded | Pending connection, compatible targets, validation snapshots, repair commands, and `validation-prevent-cycle` fixture exist. Cycle prevention is enforced by the canonical connection completion path and exposes `GraphEditorPendingConnectionRejectionReason.WouldCreateCycle` through pending snapshots. | Keep `RuntimeSession_CompleteConnection_RejectsDirectCycleWithStableReason`, `RuntimeSession_CompleteConnection_RejectsIndirectCycleThroughNormalCommandPath`, and `RuntimeSession_TryExecuteCommand_RejectsCycleThroughConnectionsConnectRoute` guarded. | | Context menu | Present | Menu descriptors and hosted context menu plumbing exist. | Keep guarded. | | Undo/redo | Present | Session commands and history tests cover normal command semantics. | Keep guarded. | @@ -487,15 +491,12 @@ Phase 534 adds the lasso visual gesture feedback route through GitHub #191 / `av | GitHub | Bead | Title | Priority | Likely write set | Parallelism | | --- | --- | --- | --- | --- | --- | -| #169 | `avalonia-node-map-bp0` | Phase 523: refresh React Flow parity issue wave after retained readiness audit | P2 | parity roadmap docs and focused docs tests | Current issue. Blocks the next implementation wave because it defines the queue and tracker boundaries. | -| #171 | `avalonia-node-map-0k0` | Phase 524: built-in component parity matrix for MiniMap, Controls, Background, Panel | P2 | feature catalog, public API inventory, Avalonia README, and docs tests | Current docs/test slice. Blocks Phase 525-528 because it defines the built-in row boundaries. | -| #173 | `avalonia-node-map-ba7` | Phase 525: MiniMap interaction and customization parity gate | P2 | `GraphMiniMap`, MiniMap factory/options, minimap tests, and docs | Current docs/test gate. Do not run in parallel with other work touching `GraphMiniMap`. | -| #175 | `avalonia-node-map-clw` | Phase 526: Controls interactivity/custom-button parity gate | P2 | `AsterGraphControls`, hosted action button tests, and docs | Current docs/test gate. Do not run in parallel with other work touching `AsterGraphControls` action projection. | -| #177 | `avalonia-node-map-dim` | Phase 527: Background variant public surface gate | P3 | background/grid control docs/tests and current background support evidence | Current docs/test gate. Can run in parallel with non-overlapping Panel or whiteboard work if it avoids shared shell docs and does not modify MiniMap/Controls. | -| #179 | `avalonia-node-map-9ow` | Phase 528: Panel versus viewport-attached overlay boundary | P3 | `AsterGraphPanel`, host integration docs, and panel tests | Current docs/test gate. Can run in parallel with whiteboard feasibility work if it avoids shared parity roadmap rows. | -| #181 | `avalonia-node-map-jrm` | Phase 529: whiteboard/lasso/eraser feasibility audit | P4 | advanced editing docs/tests and source-backed feasibility boundary | Current docs/test feasibility audit. Larger optional parity track; should not block built-in component parity and adds no whiteboard implementation. | -| #183 | `avalonia-node-map-8um` | Phase 530: lasso/freehand selection query contract | P2 | `AsterGraph.Editor` query API, editor tests, public API inventory/baseline, and parity roadmap docs | Current backend/editor query slice. Adds no Avalonia gestures, whiteboard renderer, drawing persistence, eraser behavior, or screenshot rows. | -| #191 | `avalonia-node-map-lzy` | Phase 534: lasso visual gesture feedback route | P2 | `NodeCanvas` overlay feedback, pointer coordinator tests, headless Avalonia interaction test, and parity roadmap docs | Current Avalonia visual feedback slice. Adds no toolbar UX, screenshot route, eraser behavior, drawing primitives, persistence, renderer rewrite, or full whiteboard parity claim. | +| #193 | `avalonia-node-map-8l6` | Phase 535: refresh post-lasso visual feedback parity queue | P2 | parity roadmap docs and focused docs tests | Current docs/test queue refresh. Blocks the next implementation wave because it replaces the stale Phase 534 current row with tracker-backed follow-ups. | +| TBD | TBD | Phase 536: lasso screenshot route and Cookbook proof boundary | P2 | Cookbook screenshot manifest, Demo fixture route, scene/shell screenshot tests, and parity docs | Ready after Phase 535. Sequential with lasso toolbar work because both may touch lasso Cookbook route copy and screenshot documentation. | +| TBD | TBD | Phase 537: lasso toolbar UX and public activation ergonomics boundary | P2 | hosted authoring tools, `NodeCanvas.SelectionMode` activation surface, Demo/Cookbook route, and editor/Avalonia tests | Ready after Phase 535. Do not run in parallel with Phase 536 if both need the same lasso route text or visual proof fixture. | +| TBD | TBD | Phase 538: eraser behavior/API feasibility gate | P3 | editor selection/delete commands, Avalonia hit-testing route, parity docs, and focused feasibility tests | Can run after Phase 535 in parallel with drawing model planning if it avoids shared pointer-mode state edits. | +| TBD | TBD | Phase 539: rectangle/freehand drawing primitive model gate | P3 | Core/Editor model contract docs/tests and whiteboard primitive API inventory | Can run after Phase 535 in parallel with eraser feasibility if it stays docs/model-only and does not touch Avalonia pointer coordinators. | +| TBD | TBD | Phase 540: whiteboard persistence and render-layer readiness gate | P4 | persistence/schema planning docs, renderer-layer boundary docs, screenshot policy notes, and focused docs tests | Depends on Phase 539 model decisions; do not implement persistence or renderer behavior in the queue refresh. | ## Recommended Parallel Worktree Plan @@ -531,9 +532,12 @@ Phase 534 adds the lasso visual gesture feedback route through GitHub #191 / `av - `docs/phase-526-controls-interactivity-gate`: owns #175 / `avalonia-node-map-clw`; current docs/test worktree for the Controls interactivity/custom-button parity gate. - `docs/phase-527-background-variant-gate`: owns #177 / `avalonia-node-map-dim`; current docs/test worktree for the Background variant public surface gate. - `docs/phase-528-panel-overlay-boundary`: owns #179 / `avalonia-node-map-9ow`; current docs/test worktree for the Panel versus viewport-attached overlay boundary. -- `docs/phase-529-whiteboard-feasibility`: owns #181 / `avalonia-node-map-jrm`; current feasibility audit for lasso, eraser, rectangle, and freehand whiteboard-style parity without committing to implementation. -- `feature/phase-530-lasso-selection-query`: owns #183 / `avalonia-node-map-8um`; current backend/editor query slice for lasso/freehand selection without Avalonia gesture, renderer, persistence, eraser, or screenshot changes. -- `feature/phase-534-lasso-visual-feedback`: owns #191 / `avalonia-node-map-lzy`; current Avalonia overlay feedback slice for transient lasso gesture visuals without toolbar, screenshot, eraser, drawing, persistence, renderer rewrite, or full whiteboard parity. +- `docs/phase-535-post-lasso-queue-refresh`: owns #193 / `avalonia-node-map-8l6`; current docs/test queue refresh after transient lasso feedback, with no runtime/API/UI/screenshot-manifest/whiteboard implementation changes. +- `visual/phase-536-lasso-screenshot-proof`: future candidate for the first lasso screenshot route and Cookbook proof boundary after Phase 535. +- `feature/phase-537-lasso-toolbar-ergonomics`: future candidate for lasso toolbar UX and public activation ergonomics after Phase 535. +- `feature/phase-538-eraser-feasibility`: future candidate for eraser behavior/API feasibility after Phase 535. +- `docs/phase-539-drawing-primitive-model-gate`: future candidate for rectangle/freehand drawing primitive model decisions after Phase 535. +- `docs/phase-540-whiteboard-render-persistence-gate`: future candidate for persistence/render-layer readiness after drawing model decisions. ## UI Verification Policy @@ -586,4 +590,5 @@ Current coverage includes scene-level route captures plus ten manifest-driven fu - Phase 529 is GitHub #181 / `avalonia-node-map-jrm`; it records the whiteboard/lasso/eraser feasibility audit without runtime UI behavior changes, public API changes, renderer changes, screenshot manifest expansion, strict visual-baseline enforcement, retained API removal, or whiteboard implementation. - Phase 530 is GitHub #183 / `avalonia-node-map-8um`; it adds the backend/editor lasso selection query contract without Avalonia gesture capture, pointer-mode state machine, eraser behavior, drawing primitives, persistence, renderer changes, screenshot manifest expansion, strict visual-baseline enforcement, retained API removal, or a full React Flow whiteboard parity claim. - Phase 534 is GitHub #191 / `avalonia-node-map-lzy`; it adds transient lasso visual gesture feedback without toolbar UX, lasso screenshot route, eraser behavior, drawing primitives, persistence, renderer changes, screenshot manifest expansion, strict visual-baseline enforcement, retained API removal, or a full React Flow whiteboard parity claim. -- Product code remains out of scope for Phase 478, Phase 484, Phase 490, Phase 491, Phase 492, Phase 493, Phase 494, Phase 495, Phase 497, Phase 498, Phase 499, Phase 500, Phase 501, Phase 502, Phase 503, Phase 504, Phase 505, Phase 506, Phase 507, Phase 508, Phase 509, Phase 510, Phase 511, Phase 512, Phase 513, Phase 520, Phase 521, Phase 522, Phase 523, Phase 524, Phase 525, Phase 526, Phase 527, Phase 528, and Phase 529 unless a focused test proves a specific missing contract. +- Phase 535 is GitHub #193 / `avalonia-node-map-8l6`; it refreshes the post-Phase-534 parity queue without runtime behavior changes, public API changes, UI redesign, screenshot manifest expansion, strict pixel baseline enforcement, retained API removal, or whiteboard implementation. +- Product code remains out of scope for Phase 478, Phase 484, Phase 490, Phase 491, Phase 492, Phase 493, Phase 494, Phase 495, Phase 497, Phase 498, Phase 499, Phase 500, Phase 501, Phase 502, Phase 503, Phase 504, Phase 505, Phase 506, Phase 507, Phase 508, Phase 509, Phase 510, Phase 511, Phase 512, Phase 513, Phase 520, Phase 521, Phase 522, Phase 523, Phase 524, Phase 525, Phase 526, Phase 527, Phase 528, Phase 529, and Phase 535 unless a focused test proves a specific missing contract. diff --git a/docs/zh-CN/phase-0-reactflow-parity-audit.md b/docs/zh-CN/phase-0-reactflow-parity-audit.md index 6d460e8d..4aac93de 100644 --- a/docs/zh-CN/phase-0-reactflow-parity-audit.md +++ b/docs/zh-CN/phase-0-reactflow-parity-audit.md @@ -182,6 +182,10 @@ Phase 533 是 GitHub #189 / `avalonia-node-map-cxe`,承接 internal lasso gest Phase 534 是 GitHub #191 / `avalonia-node-map-lzy`,承接 public lasso pointer-mode activation path 后的 lasso visual gesture feedback route。本实现 slice 继续使用 `NodeCanvasSelectionMode.Lasso` 的现有 selection route,并在用户拖拽时把 transient lasso path 渲染到现有 `OverlayLayer`。`UpdateLassoFeedback(...)`、`ClearLassoFeedback()` 和 `LassoSelectionMode_RendersTransientFeedbackPathOnlyDuringDrag` 守住该 path 会在现有 drag threshold 后出现,并在 release 或 capture loss 后清理,且不创建持久化 whiteboard state。它继续把 toolbar UX、lasso screenshot route、eraser behavior、rectangle/freehand drawing、whiteboard primitives、persistence、renderer-layer changes、screenshot manifest expansion、strict visual-baseline enforcement、retained API removal 和 full React Flow whiteboard parity 保留为显式 gaps。 +## Phase 535 更新 + +Phase 535 是 GitHub #193 / `avalonia-node-map-8l6`,承接 Phase 534 关闭后的 post-Phase-534 parity queue refresh。本 slice 只修改 docs/tests:记录 Phase 534 已关闭,并把剩余 whiteboard 压力拆成 tracker-backed follow-up candidates,包括 lasso screenshot proof、lasso toolbar UX/public activation ergonomics、eraser behavior/API feasibility、rectangle/freehand drawing primitives,以及 whiteboard persistence/render-layer readiness。不授权 no runtime behavior changes、no public API changes、no UI redesign、no screenshot manifest expansion、no strict pixel baseline enforcement、no retained API removal 或 no whiteboard implementation。 + ## Phase 489 更新 Phase 489 通过 PR #102 关闭 GitHub #101 / `avalonia-node-map-6sc`,完成 `perf/renderer-virtualization-spike` 分支上的 renderer virtualization design spike。本 slice 只做 docs/tests:先定义未来声明 ItemsRepeater/Skia-style renderer virtualization、background graph index 或扩大 graph-size claim 前必须满足的 proof contract。不做 public API change,也不做 runtime change。当前证据仍只支持 viewport-budgeted scene projection/rendering,不是真正的 renderer virtualization contract;`xlarge` 继续保持 telemetry-only。 @@ -261,7 +265,7 @@ Phase 483 通过选择 bounded-docs 路径关闭 GitHub #82,而不是重写 re | Edge labels and markers | Present | Labels 与 source/target marker fields 已在 edge presentation/geometry snapshots 中建模。 | Keep guarded。 | | Drag, pan, zoom | Present | Canvas pointer/wheel coordinators 与 viewport commands 已存在。 | Keep guarded。 | | Marquee/box selection and multi-select | Present | `GetSelectionRectangleSnapshot`、`GetSelectionLassoSnapshot`、overlay coordinator marquee selection、internal lasso bridge selection、internal lasso gesture capture、public `NodeCanvasSelectionMode.Lasso`、transient lasso overlay feedback、`SelectAll`、`SelectNone`、`InvertSelection` 有 tests 和 Cookbook routes。Rectangle marquee 已有 UI-backed route 且仍是 default;lasso/freehand 有 backend/editor query、internal Avalonia bridge、internal pointer gesture capture、public `NodeCanvas.SelectionMode` activation path 和拖拽中的 transient visual feedback。 | Keep guarded。 | -| Whiteboard / lasso / eraser / rectangle draw | Gap retained / public lasso selection started | React Flow whiteboard docs 把 Freehand draw、Lasso selection、Eraser 和 Rectangle draw 列为 distinct advanced examples。AsterGraph 现在有 rectangle marquee selection、command projection evidence、受防守的 backend `GetSelectionLassoSnapshot(...)` query、internal Avalonia lasso selection bridge、internal lasso gesture capture、public lasso pointer-mode activation 和 active lasso drag 的 transient visual feedback,但没有 toolbar UX、lasso screenshot route、whiteboard primitives 或 drawing tools。 | Phase 534 新增 transient lasso visual feedback;不实现 full whiteboard UI behavior。 | +| Whiteboard / lasso / eraser / rectangle draw | Gap retained / public lasso selection started | React Flow whiteboard docs 把 Freehand draw、Lasso selection、Eraser 和 Rectangle draw 列为 distinct advanced examples。AsterGraph 现在有 rectangle marquee selection、command projection evidence、受防守的 backend `GetSelectionLassoSnapshot(...)` query、internal Avalonia lasso selection bridge、internal lasso gesture capture、public lasso pointer-mode activation 和 active lasso drag 的 transient visual feedback,但没有 toolbar UX、lasso screenshot route、whiteboard primitives 或 drawing tools。 | Phase 535 刷新 post-Phase-534 queue,并在任何 whiteboard behavior claim 扩大前保持下一批候选 tracker-backed。 | | Connection preview and validation | Present / guarded | Pending connection、compatible targets、validation snapshots、repair commands 和 `validation-prevent-cycle` fixture 已存在。Cycle prevention 由 canonical connection completion path 强制执行,并通过 pending snapshot 暴露 `GraphEditorPendingConnectionRejectionReason.WouldCreateCycle`。 | 继续守住 `RuntimeSession_CompleteConnection_RejectsDirectCycleWithStableReason`、`RuntimeSession_CompleteConnection_RejectsIndirectCycleThroughNormalCommandPath` 和 `RuntimeSession_TryExecuteCommand_RejectsCycleThroughConnectionsConnectRoute`。 | | Context menu | Present | Menu descriptors 与 hosted context menu plumbing 已存在。 | Keep guarded。 | | Undo/redo | Present | Session commands 与 history tests 覆盖正常 command semantics。 | Keep guarded。 | @@ -487,15 +491,12 @@ Phase 534 通过 GitHub #191 / `avalonia-node-map-lzy` 新增 lasso visual gestu | GitHub | Bead | 标题 | 优先级 | 可能 write set | 并行边界 | | --- | --- | --- | --- | --- | --- | -| #169 | `avalonia-node-map-bp0` | Phase 523: refresh React Flow parity issue wave after retained readiness audit | P2 | parity roadmap docs 和 focused docs tests | Current issue。它定义 queue 和 tracker 边界,因此会阻塞下一批 implementation wave。 | -| #171 | `avalonia-node-map-0k0` | Phase 524: built-in component parity matrix for MiniMap, Controls, Background, Panel | P2 | feature catalog、public API inventory、Avalonia README 和 docs tests | Current docs/test slice。它定义 built-in row 边界,因此会阻塞 Phase 525-528。 | -| #173 | `avalonia-node-map-ba7` | Phase 525: MiniMap interaction and customization parity gate | P2 | `GraphMiniMap`、MiniMap factory/options、minimap tests 和 docs | Current docs/test gate。不要与其他触碰 `GraphMiniMap` 的工作并行。 | -| #175 | `avalonia-node-map-clw` | Phase 526: Controls interactivity/custom-button parity gate | P2 | `AsterGraphControls`、hosted action button tests 和 docs | Current docs/test gate。不要与其他触碰 `AsterGraphControls` action projection 的工作并行。 | -| #177 | `avalonia-node-map-dim` | Phase 527: Background variant public surface gate | P3 | background/grid control docs/tests 和当前 background support evidence | Current docs/test gate。只要避免共享 shell docs 且不修改 MiniMap/Controls,可与不重叠的 Panel 或 whiteboard work 并行。 | -| #179 | `avalonia-node-map-9ow` | Phase 528: Panel versus viewport-attached overlay boundary | P3 | `AsterGraphPanel`、host integration docs 和 panel tests | Current docs/test gate。只要避免共享 parity roadmap rows,可与 whiteboard feasibility work 并行。 | -| #181 | `avalonia-node-map-jrm` | Phase 529: whiteboard/lasso/eraser feasibility audit | P4 | advanced editing docs/tests 和 source-backed feasibility boundary | Current docs/test feasibility audit。更大的可选 parity track;不阻塞 built-in component parity,也不实现 whiteboard。 | -| #183 | `avalonia-node-map-8um` | Phase 530: lasso/freehand selection query contract | P2 | `AsterGraph.Editor` query API、editor tests、public API inventory/baseline 和 parity roadmap docs | Current backend/editor query slice。不新增 Avalonia gestures、whiteboard renderer、drawing persistence、eraser behavior 或 screenshot rows。 | -| #191 | `avalonia-node-map-lzy` | Phase 534: lasso visual gesture feedback route | P2 | `NodeCanvas` overlay feedback、pointer coordinator tests、headless Avalonia interaction test 和 parity roadmap docs | Current Avalonia visual feedback slice。不新增 toolbar UX、screenshot route、eraser behavior、drawing primitives、persistence、renderer rewrite 或 full whiteboard parity claim。 | +| #193 | `avalonia-node-map-8l6` | Phase 535: refresh post-lasso visual feedback parity queue | P2 | parity roadmap docs 和 focused docs tests | Current docs/test queue refresh。它用 tracker-backed follow-ups 替换 stale Phase 534 current row,因此会阻塞下一批 implementation wave。 | +| TBD | TBD | Phase 536: lasso screenshot route and Cookbook proof boundary | P2 | Cookbook screenshot manifest、Demo fixture route、scene/shell screenshot tests 和 parity docs | Phase 535 后 ready。与 lasso toolbar work 顺序推进,因为两者可能触碰同一 lasso route copy 与 visual proof fixture。 | +| TBD | TBD | Phase 537: lasso toolbar UX and public activation ergonomics boundary | P2 | hosted authoring tools、`NodeCanvas.SelectionMode` activation surface、Demo/Cookbook route 和 editor/Avalonia tests | Phase 535 后 ready。如果 Phase 536 也需要相同 lasso route text 或 visual proof fixture,不要并行。 | +| TBD | TBD | Phase 538: eraser behavior/API feasibility gate | P3 | editor selection/delete commands、Avalonia hit-testing route、parity docs 和 focused feasibility tests | Phase 535 后可与 drawing model planning 并行,只要不共享 pointer-mode state edits。 | +| TBD | TBD | Phase 539: rectangle/freehand drawing primitive model gate | P3 | Core/Editor model contract docs/tests 和 whiteboard primitive API inventory | Phase 535 后可与 eraser feasibility 并行,只要保持 docs/model-only 且不触碰 Avalonia pointer coordinators。 | +| TBD | TBD | Phase 540: whiteboard persistence and render-layer readiness gate | P4 | persistence/schema planning docs、renderer-layer boundary docs、screenshot policy notes 和 focused docs tests | 依赖 Phase 539 model decisions;本 queue refresh 不实现 persistence 或 renderer behavior。 | ## 推荐并行 Worktree 计划 @@ -531,9 +532,12 @@ Phase 534 通过 GitHub #191 / `avalonia-node-map-lzy` 新增 lasso visual gestu - `docs/phase-526-controls-interactivity-gate`:负责 #175 / `avalonia-node-map-clw`;当前 docs/test worktree,用于 Controls interactivity/custom-button parity gate。 - `docs/phase-527-background-variant-gate`:负责 #177 / `avalonia-node-map-dim`;当前 docs/test worktree,用于 Background variant public surface gate。 - `docs/phase-528-panel-overlay-boundary`:负责 #179 / `avalonia-node-map-9ow`;当前 docs/test worktree,用于 Panel versus viewport-attached overlay boundary。 -- `docs/phase-529-whiteboard-feasibility`:负责 #181 / `avalonia-node-map-jrm`;当前 feasibility audit,评估 lasso、eraser、rectangle 和 freehand whiteboard-style parity,不直接承诺实现。 -- `feature/phase-530-lasso-selection-query`:负责 #183 / `avalonia-node-map-8um`;当前 backend/editor query slice,用于 lasso/freehand selection,不修改 Avalonia gesture、renderer、persistence、eraser 或 screenshot。 -- `feature/phase-534-lasso-visual-feedback`:负责 #191 / `avalonia-node-map-lzy`;当前 Avalonia overlay feedback slice,用于 transient lasso gesture visuals,不做 toolbar、screenshot、eraser、drawing、persistence、renderer rewrite 或 full whiteboard parity。 +- `docs/phase-535-post-lasso-queue-refresh`:负责 #193 / `avalonia-node-map-8l6`;当前 docs/test queue refresh,承接 transient lasso feedback 后续拆分,不做 runtime/API/UI/screenshot-manifest/whiteboard implementation changes。 +- `visual/phase-536-lasso-screenshot-proof`:future candidate,用于 Phase 535 后第一条 lasso screenshot route 和 Cookbook proof boundary。 +- `feature/phase-537-lasso-toolbar-ergonomics`:future candidate,用于 Phase 535 后的 lasso toolbar UX 和 public activation ergonomics。 +- `feature/phase-538-eraser-feasibility`:future candidate,用于 Phase 535 后的 eraser behavior/API feasibility。 +- `docs/phase-539-drawing-primitive-model-gate`:future candidate,用于 Phase 535 后的 rectangle/freehand drawing primitive model decisions。 +- `docs/phase-540-whiteboard-render-persistence-gate`:future candidate,用于 drawing model decisions 后的 persistence/render-layer readiness。 ## UI 验证策略 @@ -586,4 +590,5 @@ Phase 534 通过 GitHub #191 / `avalonia-node-map-lzy` 新增 lasso visual gestu - Phase 529 是 GitHub #181 / `avalonia-node-map-jrm`;它记录 whiteboard/lasso/eraser feasibility audit,不做 runtime UI behavior changes、public API changes、renderer changes、screenshot manifest expansion、strict visual-baseline enforcement、retained API removal 或 whiteboard implementation。 - Phase 530 是 GitHub #183 / `avalonia-node-map-8um`;它新增 backend/editor lasso selection query contract,不做 Avalonia gesture capture、pointer-mode state machine、eraser behavior、drawing primitives、persistence、renderer changes、screenshot manifest expansion、strict visual-baseline enforcement、retained API removal 或 full React Flow whiteboard parity claim。 - Phase 534 是 GitHub #191 / `avalonia-node-map-lzy`;它新增 transient lasso visual gesture feedback,不做 toolbar UX、lasso screenshot route、eraser behavior、drawing primitives、persistence、renderer changes、screenshot manifest expansion、strict visual-baseline enforcement、retained API removal 或 full React Flow whiteboard parity claim。 -- Phase 478、Phase 484、Phase 490、Phase 491、Phase 492、Phase 493、Phase 494、Phase 495、Phase 497、Phase 498、Phase 499、Phase 500、Phase 501、Phase 502、Phase 503、Phase 504、Phase 505、Phase 506、Phase 507、Phase 508、Phase 509、Phase 510、Phase 511、Phase 512、Phase 513、Phase 520、Phase 521、Phase 522、Phase 523、Phase 524、Phase 525、Phase 526、Phase 527、Phase 528 和 Phase 529 都不修改产品代码;除非 focused test 证明存在具体 missing contract。 +- Phase 535 是 GitHub #193 / `avalonia-node-map-8l6`;它刷新 post-Phase-534 parity queue,不做 runtime behavior changes、public API changes、UI redesign、screenshot manifest expansion、strict pixel baseline enforcement、retained API removal 或 whiteboard implementation。 +- Phase 478、Phase 484、Phase 490、Phase 491、Phase 492、Phase 493、Phase 494、Phase 495、Phase 497、Phase 498、Phase 499、Phase 500、Phase 501、Phase 502、Phase 503、Phase 504、Phase 505、Phase 506、Phase 507、Phase 508、Phase 509、Phase 510、Phase 511、Phase 512、Phase 513、Phase 520、Phase 521、Phase 522、Phase 523、Phase 524、Phase 525、Phase 526、Phase 527、Phase 528、Phase 529 和 Phase 535 都不修改产品代码;除非 focused test 证明存在具体 missing contract。 diff --git a/tests/AsterGraph.Demo.Tests/PostPhase506VisualQueueDocsTests.cs b/tests/AsterGraph.Demo.Tests/PostPhase506VisualQueueDocsTests.cs index 00471314..75737747 100644 --- a/tests/AsterGraph.Demo.Tests/PostPhase506VisualQueueDocsTests.cs +++ b/tests/AsterGraph.Demo.Tests/PostPhase506VisualQueueDocsTests.cs @@ -59,17 +59,23 @@ private static void AssertClosedVisualQueue(string contents) private static void AssertCurrentQueue(string table) { - Assert.Contains("| #169 | `avalonia-node-map-bp0` | Phase 523: refresh React Flow parity issue wave after retained readiness audit", table, StringComparison.Ordinal); - Assert.Contains("Phase 524: built-in component parity matrix for MiniMap, Controls, Background, Panel", table, StringComparison.Ordinal); - Assert.Contains("Phase 525: MiniMap interaction and customization parity gate", table, StringComparison.Ordinal); - Assert.Contains("Phase 526: Controls interactivity/custom-button parity gate", table, StringComparison.Ordinal); - Assert.Contains("Phase 527: Background variant public surface gate", table, StringComparison.Ordinal); - Assert.Contains("Phase 528: Panel versus viewport-attached overlay boundary", table, StringComparison.Ordinal); - Assert.Contains("Phase 529: whiteboard/lasso/eraser feasibility audit", table, StringComparison.Ordinal); + Assert.Contains("| #193 | `avalonia-node-map-8l6` | Phase 535: refresh post-lasso visual feedback parity queue", table, StringComparison.Ordinal); + Assert.Contains("Phase 536: lasso screenshot route and Cookbook proof boundary", table, StringComparison.Ordinal); + Assert.Contains("Phase 537: lasso toolbar UX and public activation ergonomics boundary", table, StringComparison.Ordinal); + Assert.Contains("Phase 538: eraser behavior/API feasibility gate", table, StringComparison.Ordinal); + Assert.Contains("Phase 539: rectangle/freehand drawing primitive model gate", table, StringComparison.Ordinal); + Assert.Contains("Phase 540: whiteboard persistence and render-layer readiness gate", table, StringComparison.Ordinal); Assert.DoesNotContain("| #161 | `avalonia-node-map-rs5` | Phase 519: refresh parity roadmap after dynamic announcement proof", table, StringComparison.Ordinal); Assert.DoesNotContain("| #162 | `avalonia-node-map-vdc` | Phase 520: define declarative host composition API gate", table, StringComparison.Ordinal); Assert.DoesNotContain("| #163 | `avalonia-node-map-ayx` | Phase 521: define strict pixel-baseline comparator readiness gate", table, StringComparison.Ordinal); Assert.DoesNotContain("| #164 | `avalonia-node-map-ecx` | Phase 522: audit retained migration removal readiness", table, StringComparison.Ordinal); + Assert.DoesNotContain("| #169 | `avalonia-node-map-bp0` | Phase 523: refresh React Flow parity issue wave after retained readiness audit", table, StringComparison.Ordinal); + Assert.DoesNotContain("Phase 524: built-in component parity matrix for MiniMap, Controls, Background, Panel", table, StringComparison.Ordinal); + Assert.DoesNotContain("Phase 525: MiniMap interaction and customization parity gate", table, StringComparison.Ordinal); + Assert.DoesNotContain("Phase 526: Controls interactivity/custom-button parity gate", table, StringComparison.Ordinal); + Assert.DoesNotContain("Phase 527: Background variant public surface gate", table, StringComparison.Ordinal); + Assert.DoesNotContain("Phase 528: Panel versus viewport-attached overlay boundary", table, StringComparison.Ordinal); + Assert.DoesNotContain("Phase 529: whiteboard/lasso/eraser feasibility audit", table, StringComparison.Ordinal); Assert.DoesNotContain("| #137 | `avalonia-node-map-3tw` | Phase 507: post-Phase-506 visual queue refresh", table, StringComparison.Ordinal); Assert.DoesNotContain("| #143 | `avalonia-node-map-1j4` | Phase 512: pixel-baseline drift measurement", table, StringComparison.Ordinal); Assert.DoesNotContain("| #149 | `avalonia-node-map-d8q` | Phase 513: post-Phase-512 roadmap refresh", table, StringComparison.Ordinal); diff --git a/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs b/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs index 62804d9d..6a7fba4f 100644 --- a/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs +++ b/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs @@ -936,6 +936,36 @@ public void ParityRoadmapDocs_RecordPhase534LassoVisualGestureFeedbackRouteInBot AssertWhiteboardLassoEraserFeasibilityAudit(ExtractWhiteboardLassoEraserFeasibilityAudit(chineseParity)); } + [Fact] + public void ParityRoadmapDocs_RecordPhase535PostLassoQueueRefreshInBothLocales() + { + var englishParity = ReadRepoFile("docs/en/phase-0-reactflow-parity-audit.md"); + var chineseParity = ReadRepoFile("docs/zh-CN/phase-0-reactflow-parity-audit.md"); + + foreach (var contents in new[] { englishParity, chineseParity }) + { + Assert.Contains("Phase 535", contents, StringComparison.Ordinal); + Assert.Contains("GitHub #193", contents, StringComparison.Ordinal); + Assert.Contains("avalonia-node-map-8l6", contents, StringComparison.Ordinal); + Assert.Contains("post-Phase-534 parity queue refresh", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("lasso screenshot proof", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("lasso toolbar UX", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("eraser behavior/API feasibility", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("rectangle/freehand drawing primitives", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("whiteboard persistence/render-layer readiness", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no runtime behavior changes", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no public API changes", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no UI redesign", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no screenshot manifest expansion", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no strict pixel baseline enforcement", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no retained API removal", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no whiteboard implementation", contents, StringComparison.OrdinalIgnoreCase); + } + + AssertPostPhase534Queue(ExtractIssueWaveTable(englishParity)); + AssertPostPhase534Queue(ExtractIssueWaveTable(chineseParity)); + } + [Fact] public void ParityRoadmapDocs_RecordPhase501PostPhase500QueueRefreshInBothLocales() { @@ -998,28 +1028,17 @@ public void ParityRoadmapDocs_RecordPhase502RendererVirtualizationExecutionProof private static void AssertPostPhase518Queue(string table) { - Assert.Contains("| #169 | `avalonia-node-map-bp0` | Phase 523: refresh React Flow parity issue wave after retained readiness audit", table, StringComparison.Ordinal); - Assert.Contains("Phase 524: built-in component parity matrix for MiniMap, Controls, Background, Panel", table, StringComparison.Ordinal); - Assert.Contains("Phase 525: MiniMap interaction and customization parity gate", table, StringComparison.Ordinal); - Assert.Contains("Phase 526: Controls interactivity/custom-button parity gate", table, StringComparison.Ordinal); - Assert.Contains("Phase 527: Background variant public surface gate", table, StringComparison.Ordinal); - Assert.Contains("Phase 528: Panel versus viewport-attached overlay boundary", table, StringComparison.Ordinal); - Assert.Contains("| #181 | `avalonia-node-map-jrm` | Phase 529: whiteboard/lasso/eraser feasibility audit", table, StringComparison.Ordinal); + AssertPostPhase534Queue(table); Assert.Contains("P2", table, StringComparison.Ordinal); Assert.Contains("P3", table, StringComparison.Ordinal); Assert.Contains("P4", table, StringComparison.Ordinal); Assert.Contains("parity roadmap docs", table, StringComparison.OrdinalIgnoreCase); Assert.Contains("focused docs tests", table, StringComparison.OrdinalIgnoreCase); - Assert.Contains("feature catalog", table, StringComparison.OrdinalIgnoreCase); - Assert.Contains("GraphMiniMap", table, StringComparison.Ordinal); - Assert.Contains("AsterGraphControls", table, StringComparison.Ordinal); - Assert.Contains("background/grid", table, StringComparison.OrdinalIgnoreCase); - Assert.Contains("AsterGraphPanel", table, StringComparison.Ordinal); Assert.True( table.Contains("Blocks the next implementation wave", StringComparison.OrdinalIgnoreCase) || table.Contains("阻塞下一批 implementation wave", StringComparison.OrdinalIgnoreCase)); Assert.True( - table.Contains("Can run in parallel", StringComparison.OrdinalIgnoreCase) + table.Contains("in parallel", StringComparison.OrdinalIgnoreCase) || table.Contains("可与", StringComparison.OrdinalIgnoreCase)); Assert.DoesNotContain("Current docs/API-policy slice", table, StringComparison.OrdinalIgnoreCase); Assert.DoesNotContain("Ready after Phase 519", table, StringComparison.OrdinalIgnoreCase); @@ -1034,6 +1053,31 @@ private static void AssertPostPhase518Queue(string table) Assert.DoesNotContain("| #143 | `avalonia-node-map-1j4` | Phase 512: pixel-baseline drift measurement | P3 | drift measurement docs/tests/artifact metadata | Current owned slice", table, StringComparison.Ordinal); } + private static void AssertPostPhase534Queue(string table) + { + Assert.Contains("| #193 | `avalonia-node-map-8l6` | Phase 535: refresh post-lasso visual feedback parity queue", table, StringComparison.Ordinal); + Assert.Contains("Phase 536: lasso screenshot route and Cookbook proof boundary", table, StringComparison.Ordinal); + Assert.Contains("Phase 537: lasso toolbar UX and public activation ergonomics boundary", table, StringComparison.Ordinal); + Assert.Contains("Phase 538: eraser behavior/API feasibility gate", table, StringComparison.Ordinal); + Assert.Contains("Phase 539: rectangle/freehand drawing primitive model gate", table, StringComparison.Ordinal); + Assert.Contains("Phase 540: whiteboard persistence and render-layer readiness gate", table, StringComparison.Ordinal); + Assert.Contains("TBD", table, StringComparison.Ordinal); + Assert.Contains("Cookbook screenshot manifest", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("hosted authoring tools", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("editor selection/delete commands", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("Core/Editor model contract", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("persistence/schema planning", table, StringComparison.OrdinalIgnoreCase); + Assert.True( + table.Contains("Blocks the next implementation wave", StringComparison.OrdinalIgnoreCase) + || table.Contains("阻塞下一批 implementation wave", StringComparison.OrdinalIgnoreCase)); + Assert.True( + table.Contains("Can run after Phase 535 in parallel", StringComparison.OrdinalIgnoreCase) + || table.Contains("Phase 535 后可与", StringComparison.OrdinalIgnoreCase)); + Assert.DoesNotContain("| #191 | `avalonia-node-map-lzy` | Phase 534: lasso visual gesture feedback route", table, StringComparison.Ordinal); + Assert.DoesNotContain("Current Avalonia visual feedback slice", table, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("当前 Avalonia overlay feedback slice", table, StringComparison.OrdinalIgnoreCase); + } + private static void AssertBuiltInComponentMatrix(string table) { Assert.Contains("| Built-in |", table, StringComparison.Ordinal);