diff --git a/docs/en/phase-0-reactflow-parity-audit.md b/docs/en/phase-0-reactflow-parity-audit.md index aa594f8a..5cb7cba0 100644 --- a/docs/en/phase-0-reactflow-parity-audit.md +++ b/docs/en/phase-0-reactflow-parity-audit.md @@ -246,6 +246,10 @@ Phase 549 is GitHub #221 / `avalonia-node-map-3l6`, the whiteboard primitive per Phase 550 is GitHub #223 / `avalonia-node-map-wjr`, the whiteboard primitive Cookbook screenshot implementation gate. This proof-only Demo/Cookbook slice records `WHITEBOARD_PRIMITIVE_COOKBOOK_SCREENSHOT_GATE`: `cookbook-whiteboard-primitive-screenshot-proof` and `shell-cookbook-whiteboard-primitive-screenshot-proof` reuse `selection-marquee-workbench` to provide whiteboard primitive visual proof with route metadata, shell state, and non-overlap evidence after the internal model, renderer adapter, and persistence decision gates. Phase 550 is stacked after PR #222 and must not merge before Phase 549. It authorizes no public drawing API, no pointer coordinator, no toolbar, no eraser, no persisted whiteboard primitive state, no GraphDocument schema change, no renderer rewrite, no UI redesign, no retained API removal, and no full React Flow whiteboard parity. +## Phase 551 Update + +Phase 551 is GitHub #225 / `avalonia-node-map-3c9`, the post-Phase-550 whiteboard authoring interaction queue refresh. This docs/tests-only slice records `WHITEBOARD_AUTHORING_INTERACTION_QUEUE_REFRESH`: after the internal model, renderer adapter, persistence decision, and Cookbook screenshot proof route gates, the next authoring work is split into tracker-backed follow-ups for Phase 552 public drawing tool activation, Phase 553 pointer gesture capture, Phase 554 authoring toolbar/Cookbook UX, Phase 555 eraser-on-primitive behavior, and Phase 556 persistence implementation decision. It authorizes no runtime behavior changes, no public API changes, no pointer coordinator edits, no toolbar implementation, no eraser implementation, no persistence/schema changes, no renderer rewrite, no screenshot manifest expansion, no UI redesign, no retained API removal, and no full React Flow whiteboard parity. + ## 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. @@ -579,6 +583,8 @@ Phase 549 records the whiteboard primitive persistence decision implementation g Phase 550 records the whiteboard primitive Cookbook screenshot implementation gate through GitHub #223 / `avalonia-node-map-wjr`. It adds only the proof route/state pair `cookbook-whiteboard-primitive-screenshot-proof` and `shell-cookbook-whiteboard-primitive-screenshot-proof`, plus route metadata, shell state, and non-overlap visual proof for existing internal whiteboard primitive decisions; public drawing APIs, pointer coordinators, toolbar work, eraser behavior, persisted whiteboard primitive state, GraphDocument schema changes, renderer rewrites, UI redesign, and full React Flow whiteboard parity remain out of scope. +Phase 551 records the post-Phase-550 whiteboard authoring interaction queue refresh through GitHub #225 / `avalonia-node-map-3c9`. It adds only `WHITEBOARD_AUTHORING_INTERACTION_QUEUE_REFRESH` and the next tracker-backed authoring split: public drawing tool activation, pointer gesture capture, authoring toolbar/Cookbook UX, eraser-on-primitive behavior, and persistence implementation decision. It does not implement runtime behavior, public API, pointer coordinator changes, toolbar UI, eraser behavior, persistence/schema changes, renderer changes, screenshot manifest expansion, UI redesign, or full React Flow whiteboard parity. + | GitHub | Bead | Title | Priority | Likely write set | Parallelism | | --- | --- | --- | --- | --- | --- | | #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. | @@ -597,6 +603,12 @@ Phase 550 records the whiteboard primitive Cookbook screenshot implementation ga | #219 | `avalonia-node-map-10p` | Phase 548: whiteboard primitive renderer adapter skeleton | P2 | renderer adapter tests, scene snapshot projection proof, and topmost primitive hit-testing evidence | Stacked after PR #218; do not merge before Phase 547. Must keep persistence/schema, Cookbook screenshot rows, pointer coordinators, and toolbar activation out of scope. | | #221 | `avalonia-node-map-3l6` | Phase 549: whiteboard primitive persistence decision implementation gate | P3 | persistence decision tests, schema/surface choice, migration criteria, and compatibility coverage | Stacked after PR #220; do not merge before Phase 548. Chooses separate annotation surface and keeps GraphDocument schema/version/workspace persistence unchanged before any saved whiteboard primitive claim. | | #223 | `avalonia-node-map-wjr` | Phase 550: whiteboard primitive Cookbook screenshot implementation gate | P3 | Cookbook screenshot implementation gate docs/tests, route metadata, shell state, and non-overlap visual proof | Stacked after PR #222; do not merge before Phase 549. Adds the whiteboard primitive visual proof route/state pair only, with no public drawing API, pointer coordinator, toolbar, eraser, persisted whiteboard primitive state, GraphDocument schema change, renderer rewrite, UI redesign, or full whiteboard parity claim. | +| #225 | `avalonia-node-map-3c9` | Phase 551: post-Phase-550 whiteboard authoring interaction queue refresh | P4 | parity roadmap docs and focused docs tests | Stacked after PR #224; do not merge before Phase 550. This docs/test queue refresh records the next authoring split without runtime/API/pointer/toolbar/eraser/persistence/renderer/screenshot-manifest behavior. | +| #226 | `avalonia-node-map-718` | Phase 552: whiteboard drawing tool public activation contract | P2 | public drawing tool activation contract, hosted/editor seam tests, and docs | Depends on Phase 551. Owns activation only; no pointer gesture capture, runtime drawing creation, toolbar UI, eraser behavior, persistence/schema changes, renderer rewrite, screenshot manifest expansion, or full whiteboard parity claim. | +| #227 | `avalonia-node-map-9f0` | Phase 553: whiteboard primitive pointer gesture capture | P2 | pointer gesture capture tests, editor/Avalonia interaction state, and lifecycle boundaries | Depends on Phase 552. Owns pointer gesture capture after activation; no toolbar UI implementation, eraser behavior, persisted whiteboard primitive state, GraphDocument schema changes, renderer rewrite, screenshot manifest expansion, or full whiteboard parity claim. | +| #228 | `avalonia-node-map-kpy` | Phase 554: whiteboard authoring toolbar and Cookbook UX route | P3 | hosted authoring actions, Cookbook route, screenshot proof metadata, and non-overlap visual evidence | Depends on Phase 553. Owns authoring toolbar/Cookbook UX after pointer capture; no new core model design, pointer coordinator redesign, eraser behavior, GraphDocument schema changes, persisted whiteboard primitive claim, renderer rewrite, or full whiteboard parity claim. | +| #229 | `avalonia-node-map-71c` | Phase 555: whiteboard primitive eraser behavior route | P3 | eraser-on-primitive behavior tests, primitive hit-testing, and graph-deletion separation | Depends on Phase 554. Owns eraser-on-primitive behavior only; graph-selection delete remains separate and no broad eraser cursor redesign, GraphDocument schema changes, renderer rewrite, retained API removal, or full whiteboard parity claim is authorized. | +| #230 | `avalonia-node-map-bck` | Phase 556: whiteboard primitive persistence implementation decision | P4 | persistence implementation decision, schema/version evidence, workspace and clipboard boundaries | Depends on Phase 555. Revisits persisted whiteboard primitive state only after authoring/eraser behavior; no pointer coordinator redesign, toolbar redesign, eraser implementation, renderer rewrite, unrelated GraphDocument cleanup, or full whiteboard parity claim. | ## Recommended Parallel Worktree Plan @@ -646,8 +658,14 @@ Phase 550 records the whiteboard primitive Cookbook screenshot implementation ga - `docs/phase-546-post-whiteboard-queue`: owns #215 / `avalonia-node-map-0l9`; current stacked docs/test queue refresh after the Phase 545 proof-route gate, with no runtime/API/model/schema/renderer/screenshot-manifest changes. - `feature/phase-547-whiteboard-primitive-model-skeleton`: owns #217 / `avalonia-node-map-rs0`; current stacked implementation worktree for the internal whiteboard primitive model skeleton after Phase 546, with renderer adapters, persistence/schema, pointer coordinators, screenshot manifests, toolbar UX, eraser behavior, and public API claim expansion out of scope. - `feature/phase-548-whiteboard-renderer-adapter-skeleton`: owns #219 / `avalonia-node-map-10p`; current stacked implementation worktree for the internal renderer-neutral whiteboard primitive renderer adapter and topmost primitive hit-testing proof after the Phase 547 model skeleton, with persistence/schema, pointer coordinators, toolbar, eraser, screenshot manifests, and Cookbook implementation out of scope. -- `feature/phase-549-whiteboard-persistence-decision`: future candidate for the first persistence decision implementation gate after model ownership is settled. -- `visual/phase-550-whiteboard-cookbook-screenshot-implementation`: future candidate for the Cookbook screenshot implementation gate after model, renderer, and persistence decisions. +- `feature/phase-549-whiteboard-persistence-decision`: owns #221 / `avalonia-node-map-3l6`; current stacked implementation gate for the separate annotation-surface persistence decision after the renderer adapter skeleton. +- `visual/phase-550-whiteboard-cookbook-screenshot-implementation`: owns #223 / `avalonia-node-map-wjr`; current stacked visual proof gate for the whiteboard primitive Cookbook route/state pair after the persistence decision. +- `docs/phase-551-whiteboard-authoring-queue`: owns #225 / `avalonia-node-map-3c9`; current stacked docs/test queue refresh after Phase 550, with no runtime/API/pointer/toolbar/eraser/persistence/renderer/screenshot-manifest changes. +- `feature/phase-552-whiteboard-tool-activation`: owns #226 / `avalonia-node-map-718`; future activation-contract worktree after Phase 551. +- `feature/phase-553-whiteboard-pointer-capture`: owns #227 / `avalonia-node-map-9f0`; future pointer gesture capture worktree after Phase 552. +- `visual/phase-554-whiteboard-authoring-cookbook`: owns #228 / `avalonia-node-map-kpy`; future hosted authoring toolbar and Cookbook UX worktree after Phase 553. +- `feature/phase-555-whiteboard-eraser-behavior`: owns #229 / `avalonia-node-map-71c`; future eraser-on-primitive behavior worktree after Phase 554. +- `feature/phase-556-whiteboard-persistence-decision`: owns #230 / `avalonia-node-map-bck`; future persistence implementation decision worktree after Phase 555. ## UI Verification Policy @@ -714,4 +732,5 @@ Current coverage includes scene-level route captures plus ten manifest-driven fu - Phase 548 is GitHub #219 / `avalonia-node-map-10p`; it records `WHITEBOARD_PRIMITIVE_RENDERER_ADAPTER_SKELETON` with internal Core renderer-neutral projection and hit-testing tests only. GraphDocument schema changes, public drawing API, Avalonia renderer rewrites, NodeCanvasConnectionSceneRenderer edits, pointer coordinators, toolbar/tool activation, eraser behavior, persistence/schema work, screenshot manifests, Cookbook visual proof, retained API removal, and full React Flow whiteboard parity remain out of scope. - Phase 549 is GitHub #221 / `avalonia-node-map-3l6`; it records `WHITEBOARD_PRIMITIVE_PERSISTENCE_DECISION_GATE` with the internal `GraphWhiteboardPrimitivePersistenceDecision` policy contract only. GraphDocument schema changes, schema version bumps, workspace persistence behavior changes, public drawing APIs, pointer coordinators, toolbar/tool activation, eraser behavior, screenshot manifest expansion, UI redesign, retained API removal, and full React Flow whiteboard parity remain out of scope. - Phase 550 is GitHub #223 / `avalonia-node-map-wjr`; it records `WHITEBOARD_PRIMITIVE_COOKBOOK_SCREENSHOT_GATE` with `cookbook-whiteboard-primitive-screenshot-proof`, `shell-cookbook-whiteboard-primitive-screenshot-proof`, route metadata, shell state, non-overlap visual proof, and `WHITEBOARD_PRIMITIVE_SCREENSHOT_GATE_OK` only. Public drawing APIs, pointer coordinators, toolbar work, eraser behavior, persisted whiteboard primitive state, GraphDocument schema changes, renderer rewrites, UI redesign, retained API removal, and full React Flow whiteboard parity remain out of scope. -- 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, Phase 535, Phase 539, Phase 540, Phase 541, Phase 546, and Phase 550 unless a focused test proves a specific missing contract. +- Phase 551 is GitHub #225 / `avalonia-node-map-3c9`; it records `WHITEBOARD_AUTHORING_INTERACTION_QUEUE_REFRESH` and splits the next whiteboard authoring work into Phase 552 public drawing tool activation, Phase 553 pointer gesture capture, Phase 554 authoring toolbar/Cookbook UX, Phase 555 eraser-on-primitive behavior, and Phase 556 persistence implementation decision without implementing those behaviors. +- 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, Phase 535, Phase 539, Phase 540, Phase 541, Phase 546, Phase 550, and Phase 551 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 cdd37f7d..b131e365 100644 --- a/docs/zh-CN/phase-0-reactflow-parity-audit.md +++ b/docs/zh-CN/phase-0-reactflow-parity-audit.md @@ -246,6 +246,10 @@ Phase 549 是 GitHub #221 / `avalonia-node-map-3l6`,记录 whiteboard primitiv Phase 550 是 GitHub #223 / `avalonia-node-map-wjr`,记录 whiteboard primitive Cookbook screenshot implementation gate。本 proof-only Demo/Cookbook slice 记录 `WHITEBOARD_PRIMITIVE_COOKBOOK_SCREENSHOT_GATE`:`cookbook-whiteboard-primitive-screenshot-proof` 和 `shell-cookbook-whiteboard-primitive-screenshot-proof` 复用 `selection-marquee-workbench`,在 internal model、renderer adapter 和 persistence decision gates 之后提供带 route metadata、shell state 与 non-overlap evidence 的 whiteboard primitive visual proof。Phase 550 stacked after PR #222,不能早于 Phase 549 合并。它不授权 no public drawing API、no pointer coordinator、no toolbar、no eraser、no persisted whiteboard primitive state、no GraphDocument schema change、no renderer rewrite、no UI redesign、no retained API removal 或 no full React Flow whiteboard parity。 +## Phase 551 更新 + +Phase 551 是 GitHub #225 / `avalonia-node-map-3c9`,记录 post-Phase-550 whiteboard authoring interaction queue refresh。本 docs/tests-only slice 记录 `WHITEBOARD_AUTHORING_INTERACTION_QUEUE_REFRESH`:在 internal model、renderer adapter、persistence decision 和 Cookbook screenshot proof route gates 之后,把下一批 authoring work 拆成 tracker-backed follow-ups:Phase 552 public drawing tool activation、Phase 553 pointer gesture capture、Phase 554 authoring toolbar/Cookbook UX、Phase 555 eraser-on-primitive behavior 和 Phase 556 persistence implementation decision。它不授权 no runtime behavior changes、no public API changes、no pointer coordinator edits、no toolbar implementation、no eraser implementation、no persistence/schema changes、no renderer rewrite、no screenshot manifest expansion、no UI redesign、no retained API removal 或 no full React Flow whiteboard parity。 + ## 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。 @@ -579,6 +583,8 @@ Phase 549 记录 whiteboard primitive persistence decision implementation gate Phase 550 记录 whiteboard primitive Cookbook screenshot implementation gate,通过 GitHub #223 / `avalonia-node-map-wjr`。它只添加 proof route/state pair:`cookbook-whiteboard-primitive-screenshot-proof` 和 `shell-cookbook-whiteboard-primitive-screenshot-proof`,并为现有 internal whiteboard primitive decisions 记录 route metadata、shell state 和 non-overlap visual proof;public drawing APIs、pointer coordinators、toolbar work、eraser behavior、persisted whiteboard primitive state、GraphDocument schema changes、renderer rewrites、UI redesign 和 full React Flow whiteboard parity 都保持 out of scope。 +Phase 551 记录 post-Phase-550 whiteboard authoring interaction queue refresh,通过 GitHub #225 / `avalonia-node-map-3c9`。它只添加 `WHITEBOARD_AUTHORING_INTERACTION_QUEUE_REFRESH` 和下一批 tracker-backed authoring split:public drawing tool activation、pointer gesture capture、authoring toolbar/Cookbook UX、eraser-on-primitive behavior 和 persistence implementation decision。它不实现 runtime behavior、public API、pointer coordinator changes、toolbar UI、eraser behavior、persistence/schema changes、renderer changes、screenshot manifest expansion、UI redesign 或 full React Flow whiteboard parity。 + | GitHub | Bead | 标题 | 优先级 | 可能 write set | 并行边界 | | --- | --- | --- | --- | --- | --- | | #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。 | @@ -597,6 +603,12 @@ Phase 550 记录 whiteboard primitive Cookbook screenshot implementation gate, | #219 | `avalonia-node-map-10p` | Phase 548: whiteboard primitive renderer adapter skeleton | P2 | renderer adapter tests、scene snapshot projection proof 和 topmost primitive hit-testing evidence | Stacked after PR #218;do not merge before Phase 547。persistence/schema、Cookbook screenshot rows、pointer coordinators 和 toolbar activation 都保持 out of scope。 | | #221 | `avalonia-node-map-3l6` | Phase 549: whiteboard primitive persistence decision implementation gate | P3 | persistence decision tests、schema/surface choice、migration criteria 和 compatibility coverage | Stacked after PR #220;do not merge before Phase 548。本 slice 选择 separate annotation surface,并在任何 saved whiteboard primitive claim 前保持 GraphDocument schema/version/workspace persistence unchanged。 | | #223 | `avalonia-node-map-wjr` | Phase 550: whiteboard primitive Cookbook screenshot implementation gate | P3 | Cookbook screenshot implementation gate docs/tests、route metadata、shell state 和 non-overlap visual proof | Stacked after PR #222;do not merge before Phase 549。本 slice 只添加 whiteboard primitive visual proof route/state pair,不做 public drawing API、pointer coordinator、toolbar、eraser、persisted whiteboard primitive state、GraphDocument schema change、renderer rewrite、UI redesign 或 full whiteboard parity claim。 | +| #225 | `avalonia-node-map-3c9` | Phase 551: post-Phase-550 whiteboard authoring interaction queue refresh | P4 | parity roadmap docs 和 focused docs tests | Stacked after PR #224;do not merge before Phase 550。这个 docs/test queue refresh 只记录下一批 authoring split,不做 runtime/API/pointer/toolbar/eraser/persistence/renderer/screenshot-manifest behavior。 | +| #226 | `avalonia-node-map-718` | Phase 552: whiteboard drawing tool public activation contract | P2 | public drawing tool activation contract、hosted/editor seam tests 和 docs | Depends on Phase 551。只负责 activation;不做 pointer gesture capture、runtime drawing creation、toolbar UI、eraser behavior、persistence/schema changes、renderer rewrite、screenshot manifest expansion 或 full whiteboard parity claim。 | +| #227 | `avalonia-node-map-9f0` | Phase 553: whiteboard primitive pointer gesture capture | P2 | pointer gesture capture tests、editor/Avalonia interaction state 和 lifecycle boundaries | Depends on Phase 552。activation 之后只负责 pointer gesture capture;不做 toolbar UI implementation、eraser behavior、persisted whiteboard primitive state、GraphDocument schema changes、renderer rewrite、screenshot manifest expansion 或 full whiteboard parity claim。 | +| #228 | `avalonia-node-map-kpy` | Phase 554: whiteboard authoring toolbar and Cookbook UX route | P3 | hosted authoring actions、Cookbook route、screenshot proof metadata 和 non-overlap visual evidence | Depends on Phase 553。pointer capture 之后负责 authoring toolbar/Cookbook UX;不做 new core model design、pointer coordinator redesign、eraser behavior、GraphDocument schema changes、persisted whiteboard primitive claim、renderer rewrite 或 full whiteboard parity claim。 | +| #229 | `avalonia-node-map-71c` | Phase 555: whiteboard primitive eraser behavior route | P3 | eraser-on-primitive behavior tests、primitive hit-testing 和 graph-deletion separation | Depends on Phase 554。只负责 eraser-on-primitive behavior;graph-selection delete 保持分离,不授权 broad eraser cursor redesign、GraphDocument schema changes、renderer rewrite、retained API removal 或 full whiteboard parity claim。 | +| #230 | `avalonia-node-map-bck` | Phase 556: whiteboard primitive persistence implementation decision | P4 | persistence implementation decision、schema/version evidence、workspace and clipboard boundaries | Depends on Phase 555。只在 authoring/eraser behavior 之后重新评估 persisted whiteboard primitive state;不做 pointer coordinator redesign、toolbar redesign、eraser implementation、renderer rewrite、unrelated GraphDocument cleanup 或 full whiteboard parity claim。 | ## 推荐并行 Worktree 计划 @@ -646,8 +658,14 @@ Phase 550 记录 whiteboard primitive Cookbook screenshot implementation gate, - `docs/phase-546-post-whiteboard-queue`:负责 #215 / `avalonia-node-map-0l9`;当前 stacked docs/test queue refresh,承接 Phase 545 proof-route gate,不做 runtime/API/model/schema/renderer/screenshot-manifest changes。 - `feature/phase-547-whiteboard-primitive-model-skeleton`:负责 #217 / `avalonia-node-map-rs0`;当前 stacked implementation worktree,用于 Phase 546 后的 internal whiteboard primitive model skeleton。renderer adapters、persistence/schema、pointer coordinators、screenshot manifests、toolbar UX、eraser behavior 和 public API claim expansion 都保持 out of scope。 - `feature/phase-548-whiteboard-renderer-adapter-skeleton`:负责 #219 / `avalonia-node-map-10p`;当前 stacked implementation worktree,用于 Phase 547 model skeleton 后的 internal renderer-neutral whiteboard primitive renderer adapter 与 topmost primitive hit-testing proof。persistence/schema、pointer coordinators、toolbar、eraser、screenshot manifests 和 Cookbook implementation 都保持 out of scope。 -- `feature/phase-549-whiteboard-persistence-decision`:future candidate,用于 model ownership 稳定后的第一条 persistence decision implementation gate。 -- `visual/phase-550-whiteboard-cookbook-screenshot-implementation`:future candidate,用于 model、renderer 与 persistence decisions 后的 Cookbook screenshot implementation gate。 +- `feature/phase-549-whiteboard-persistence-decision`:负责 #221 / `avalonia-node-map-3l6`;当前 stacked implementation gate,用于 renderer adapter skeleton 之后的 separate annotation-surface persistence decision。 +- `visual/phase-550-whiteboard-cookbook-screenshot-implementation`:负责 #223 / `avalonia-node-map-wjr`;当前 stacked visual proof gate,用于 persistence decision 之后的 whiteboard primitive Cookbook route/state pair。 +- `docs/phase-551-whiteboard-authoring-queue`:负责 #225 / `avalonia-node-map-3c9`;当前 stacked docs/test queue refresh,承接 Phase 550 后续拆分,不做 runtime/API/pointer/toolbar/eraser/persistence/renderer/screenshot-manifest changes。 +- `feature/phase-552-whiteboard-tool-activation`:负责 #226 / `avalonia-node-map-718`;Phase 551 之后的 future activation-contract worktree。 +- `feature/phase-553-whiteboard-pointer-capture`:负责 #227 / `avalonia-node-map-9f0`;Phase 552 之后的 future pointer gesture capture worktree。 +- `visual/phase-554-whiteboard-authoring-cookbook`:负责 #228 / `avalonia-node-map-kpy`;Phase 553 之后的 future hosted authoring toolbar and Cookbook UX worktree。 +- `feature/phase-555-whiteboard-eraser-behavior`:负责 #229 / `avalonia-node-map-71c`;Phase 554 之后的 future eraser-on-primitive behavior worktree。 +- `feature/phase-556-whiteboard-persistence-decision`:负责 #230 / `avalonia-node-map-bck`;Phase 555 之后的 future persistence implementation decision worktree。 ## UI 验证策略 @@ -714,4 +732,5 @@ Phase 550 记录 whiteboard primitive Cookbook screenshot implementation gate, - Phase 548 是 GitHub #219 / `avalonia-node-map-10p`;它用 internal Core renderer-neutral projection 和 hit-testing tests 记录 `WHITEBOARD_PRIMITIVE_RENDERER_ADAPTER_SKELETON`。GraphDocument schema changes、public drawing API、Avalonia renderer rewrites、NodeCanvasConnectionSceneRenderer edits、pointer coordinators、toolbar/tool activation、eraser behavior、persistence/schema work、screenshot manifests、Cookbook visual proof、retained API removal 和 full React Flow whiteboard parity 都保持 out of scope。 - Phase 549 是 GitHub #221 / `avalonia-node-map-3l6`;它只用 internal `GraphWhiteboardPrimitivePersistenceDecision` policy contract 记录 `WHITEBOARD_PRIMITIVE_PERSISTENCE_DECISION_GATE`。GraphDocument schema changes、schema version bumps、workspace persistence behavior changes、public drawing APIs、pointer coordinators、toolbar/tool activation、eraser behavior、screenshot manifest expansion、UI redesign、retained API removal 和 full React Flow whiteboard parity 都保持 out of scope。 - Phase 550 是 GitHub #223 / `avalonia-node-map-wjr`;它只用 `cookbook-whiteboard-primitive-screenshot-proof`、`shell-cookbook-whiteboard-primitive-screenshot-proof`、route metadata、shell state、non-overlap visual proof 和 `WHITEBOARD_PRIMITIVE_SCREENSHOT_GATE_OK` 记录 `WHITEBOARD_PRIMITIVE_COOKBOOK_SCREENSHOT_GATE`。Public drawing APIs、pointer coordinators、toolbar work、eraser behavior、persisted whiteboard primitive state、GraphDocument schema changes、renderer rewrites、UI redesign、retained API removal 和 full React Flow whiteboard parity 都保持 out of scope。 -- 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、Phase 539、Phase 540、Phase 541、Phase 546 和 Phase 550 都不修改产品代码;除非 focused test 证明存在具体 missing contract。 +- Phase 551 是 GitHub #225 / `avalonia-node-map-3c9`;它记录 `WHITEBOARD_AUTHORING_INTERACTION_QUEUE_REFRESH`,并把下一批 whiteboard authoring work 拆成 Phase 552 public drawing tool activation、Phase 553 pointer gesture capture、Phase 554 authoring toolbar/Cookbook UX、Phase 555 eraser-on-primitive behavior 和 Phase 556 persistence implementation decision,但不实现这些行为。 +- 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、Phase 539、Phase 540、Phase 541、Phase 546、Phase 550 和 Phase 551 都不修改产品代码;除非 focused test 证明存在具体 missing contract。 diff --git a/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs b/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs index 87ddba2f..6accb1d2 100644 --- a/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs +++ b/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs @@ -1506,6 +1506,46 @@ public void ParityRoadmapDocs_RecordPhase550WhiteboardPrimitiveCookbookScreensho Assert.Contains("Phase 550 记录 whiteboard primitive Cookbook screenshot implementation gate", chineseParity, StringComparison.Ordinal); } + [Fact] + public void ParityRoadmapDocs_RecordPhase551WhiteboardAuthoringQueueRefreshInBothLocales() + { + 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 551", contents, StringComparison.Ordinal); + Assert.Contains("GitHub #225", contents, StringComparison.Ordinal); + Assert.Contains("avalonia-node-map-3c9", contents, StringComparison.Ordinal); + Assert.Contains("post-Phase-550 whiteboard authoring interaction queue refresh", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("WHITEBOARD_AUTHORING_INTERACTION_QUEUE_REFRESH", contents, StringComparison.Ordinal); + Assert.Contains("Phase 552", contents, StringComparison.Ordinal); + Assert.Contains("Phase 553", contents, StringComparison.Ordinal); + Assert.Contains("Phase 554", contents, StringComparison.Ordinal); + Assert.Contains("Phase 555", contents, StringComparison.Ordinal); + Assert.Contains("Phase 556", contents, StringComparison.Ordinal); + Assert.Contains("public drawing tool activation", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("pointer gesture capture", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("authoring toolbar/Cookbook UX", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("eraser-on-primitive behavior", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("persistence implementation decision", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no runtime behavior changes", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no public API changes", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no pointer coordinator edits", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no toolbar implementation", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no eraser implementation", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no persistence/schema changes", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no full React Flow whiteboard parity", contents, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("| TBD | TBD | Phase 552", contents, StringComparison.Ordinal); + Assert.DoesNotContain("full React Flow whiteboard parity is supported", contents, StringComparison.OrdinalIgnoreCase); + } + + AssertPostPhase551Queue(ExtractIssueWaveTable(englishParity)); + AssertPostPhase551Queue(ExtractIssueWaveTable(chineseParity)); + Assert.Contains("Phase 551 records the post-Phase-550 whiteboard authoring interaction queue refresh", englishParity, StringComparison.Ordinal); + Assert.Contains("Phase 551 记录 post-Phase-550 whiteboard authoring interaction queue refresh", chineseParity, StringComparison.Ordinal); + } + [Fact] public void ParityRoadmapDocs_RecordPhase501PostPhase500QueueRefreshInBothLocales() { @@ -1744,6 +1784,34 @@ private static void AssertPostPhase545Queue(string table) Assert.DoesNotContain("| TBD | TBD | Phase 550: whiteboard primitive Cookbook screenshot implementation gate", table, StringComparison.Ordinal); } + private static void AssertPostPhase551Queue(string table) + { + AssertPostPhase545Queue(table); + Assert.Contains("| #225 | `avalonia-node-map-3c9` | Phase 551: post-Phase-550 whiteboard authoring interaction queue refresh", table, StringComparison.Ordinal); + Assert.Contains("| #226 | `avalonia-node-map-718` | Phase 552: whiteboard drawing tool public activation contract", table, StringComparison.Ordinal); + Assert.Contains("| #227 | `avalonia-node-map-9f0` | Phase 553: whiteboard primitive pointer gesture capture", table, StringComparison.Ordinal); + Assert.Contains("| #228 | `avalonia-node-map-kpy` | Phase 554: whiteboard authoring toolbar and Cookbook UX route", table, StringComparison.Ordinal); + Assert.Contains("| #229 | `avalonia-node-map-71c` | Phase 555: whiteboard primitive eraser behavior route", table, StringComparison.Ordinal); + Assert.Contains("| #230 | `avalonia-node-map-bck` | Phase 556: whiteboard primitive persistence implementation decision", table, StringComparison.Ordinal); + Assert.Contains("public drawing tool activation", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("pointer gesture capture", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("hosted authoring actions", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("eraser-on-primitive behavior", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("persistence implementation decision", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("Stacked after PR #224", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("do not merge before Phase 550", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("Depends on Phase 552", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("Depends on Phase 553", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("Depends on Phase 554", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("Depends on Phase 555", table, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("| TBD | TBD | Phase 551", table, StringComparison.Ordinal); + Assert.DoesNotContain("| TBD | TBD | Phase 552", table, StringComparison.Ordinal); + Assert.DoesNotContain("| TBD | TBD | Phase 553", table, StringComparison.Ordinal); + Assert.DoesNotContain("| TBD | TBD | Phase 554", table, StringComparison.Ordinal); + Assert.DoesNotContain("| TBD | TBD | Phase 555", table, StringComparison.Ordinal); + Assert.DoesNotContain("| TBD | TBD | Phase 556", table, StringComparison.Ordinal); + } + private static void AssertBuiltInComponentMatrix(string table) { Assert.Contains("| Built-in |", table, StringComparison.Ordinal);