diff --git a/docs/en/phase-0-reactflow-parity-audit.md b/docs/en/phase-0-reactflow-parity-audit.md index 0dceb013..fc8d86bd 100644 --- a/docs/en/phase-0-reactflow-parity-audit.md +++ b/docs/en/phase-0-reactflow-parity-audit.md @@ -270,6 +270,10 @@ Phase 555 is GitHub #229 / `avalonia-node-map-71c`, the whiteboard primitive era Phase 556 is GitHub #230 / `avalonia-node-map-bck`, the whiteboard primitive persistence implementation decision. It records `GraphWhiteboardPrimitivePersistenceOutcome.DeferredUntilSeparateAnnotationStoreContract` and `GraphWhiteboardPrimitivePersistenceBoundary` coverage for `GraphDocumentCompatibility`, `WorkspacePersistence`, `ClipboardFragment`, `ScreenshotArtifact`, and `SceneExportArtifact`. The current slice intentionally defers saved whiteboard primitive state until a separate annotation store contract exists, keeping `GraphDocumentSerializer`, `GraphDocumentCompatibility`, workspace save/load, clipboard fragments, scene export artifacts, and screenshot artifacts graph-scoped. Phase 556 is stacked on Phase 555 and must not merge before PR #235. It adds no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no saved whiteboard primitive state, no renderer rewrite, no retained API removal, and no full React Flow whiteboard parity. +## Phase 559 Update + +Phase 559 is GitHub #241 / `avalonia-node-map-8ca`, the post-annotation-store contract implementation queue refresh. This docs/tests-only slice records `WHITEBOARD_ANNOTATION_STORE_IMPLEMENTATION_QUEUE_REFRESH` after the annotation-store contract skeleton and splits the next work into in-memory annotation-store adapter, workspace/sidecar persistence policy, clipboard/export serialization boundary, screenshot/Cookbook proof expansion, and migration/compatibility proof follow-ups. It authorizes no production annotation store, no file/database I/O, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization behavior change, no screenshot manifest expansion, no renderer or pointer behavior change, no toolbar or eraser changes, no public API exposure, no saved whiteboard primitive state, 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. @@ -619,6 +623,8 @@ Phase 557 records the whiteboard annotation store contract gate through GitHub # Phase 558 records the whiteboard annotation store contract skeleton through GitHub #239 / `avalonia-node-map-84u`. It adds `WHITEBOARD_ANNOTATION_STORE_CONTRACT_SKELETON` as internal Core contract coverage only: `GraphWhiteboardAnnotationStoreContract`, `GraphWhiteboardAnnotationStoreMetadata`, `GraphWhiteboardAnnotationIdentity`, `GraphWhiteboardPrimitiveReference`, `GraphWhiteboardAnnotationPrimitivePayload`, `GraphWhiteboardAnnotationRecord`, `GraphWhiteboardAnnotationStoreSnapshot`, `GraphWhiteboardAnnotationMigrationMetadata`, and `IGraphWhiteboardAnnotationStoreBoundary` define store ownership, workspace-scoped lifetime, annotation identity, primitive reference, style/geometry/edit lifecycle payload shape, migration/schema metadata, and a persistence-neutral read/write boundary. This skeleton keeps no production annotation store, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization change, no screenshot manifest expansion, no renderer or pointer behavior change, no public API exposure, no saved whiteboard primitive state, and no full React Flow whiteboard parity. +Phase 559 records the post-annotation-store contract implementation queue refresh through GitHub #241 / `avalonia-node-map-8ca`. It adds only `WHITEBOARD_ANNOTATION_STORE_IMPLEMENTATION_QUEUE_REFRESH` and keeps the next annotation-store work split into Phase 560 in-memory annotation-store adapter, Phase 561 workspace/sidecar persistence policy, Phase 562 clipboard/export serialization boundary, Phase 563 screenshot/Cookbook proof expansion, and Phase 564 migration/compatibility proof. This queue refresh keeps no production annotation store, no file/database I/O, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization behavior change, no screenshot manifest expansion, no renderer or pointer behavior change, no toolbar or eraser changes, no public API exposure, no saved whiteboard primitive state, and no 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. | @@ -645,6 +651,12 @@ Phase 558 records the whiteboard annotation store contract skeleton through GitH | #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; stacked after PR #235 and do not merge before Phase 555. Records `DeferredUntilSeparateAnnotationStoreContract` with boundary coverage only; no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no saved whiteboard primitive state, or full whiteboard parity claim. | | #237 | `avalonia-node-map-zfe` | Phase 557: whiteboard annotation store contract gate | P4 | annotation-store contract docs, persistence boundary requirements, and focused docs tests | Depends on Phase 556; stacked after PR #236 and do not merge before Phase 556. Defines the separate annotation-store contract gate only; no production annotation store, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization change, no screenshot manifest expansion, no saved whiteboard primitive state, or full whiteboard parity claim. | | #239 | `avalonia-node-map-84u` | Phase 558: whiteboard annotation store contract skeleton | P4 | internal Core annotation-store contract types, boundary tests, and parity docs | Depends on Phase 557; stacked after PR #238 and do not merge before Phase 557. Adds the internal contract skeleton only; no production annotation store, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization change, no screenshot manifest expansion, no renderer or pointer behavior change, no public API exposure, no saved whiteboard primitive state, or full whiteboard parity claim. | +| #241 | `avalonia-node-map-8ca` | Phase 559: post-annotation-store contract implementation queue refresh | P4 | parity roadmap docs and focused docs tests | Depends on Phase 558; stacked after PR #240 and do not merge before Phase 558. This is a docs/test queue refresh only: it assigns Phase 560 through Phase 564 without production annotation store, file/database I/O, GraphDocument schema changes, workspace persistence behavior changes, clipboard/export serialization behavior changes, screenshot manifest expansion, renderer or pointer behavior changes, toolbar or eraser changes, public API exposure, saved whiteboard primitive state, or full whiteboard parity claim. | +| #242 | `avalonia-node-map-nia` | Phase 560: in-memory whiteboard annotation store adapter proof | P3 | in-memory annotation-store adapter tests and internal boundary proof | Depends on Phase 559. Owns an in-memory adapter proof only, with no file/database I/O, workspace persistence behavior change, GraphDocument schema change, public API exposure, or full whiteboard parity claim. | +| #243 | `avalonia-node-map-xd8` | Phase 561: whiteboard annotation workspace sidecar persistence policy | P4 | workspace/sidecar persistence policy docs and compatibility criteria | Depends on Phase 559. Owns sidecar policy decisions only, before any workspace persistence behavior change, schema version bump, or saved whiteboard primitive state. | +| #244 | `avalonia-node-map-0gi` | Phase 562: whiteboard annotation clipboard/export serialization boundary | P4 | clipboard/export serialization boundary docs and focused compatibility tests | Depends on Phase 559. Owns serialization boundary policy only, before any clipboard/export serialization behavior change or public API exposure. | +| #245 | `avalonia-node-map-kri` | Phase 563: whiteboard annotation screenshot and Cookbook proof expansion | P4 | screenshot/Cookbook proof planning, route criteria, and non-overlap evidence requirements | Depends on Phase 559. Owns screenshot/Cookbook proof expansion planning only, before screenshot manifest expansion, renderer changes, or toolbar/eraser changes. | +| #246 | `avalonia-node-map-vyg` | Phase 564: whiteboard annotation migration and compatibility proof | P4 | migration/compatibility proof docs, schema policy criteria, and compatibility test plan | Depends on Phase 559 plus Phase 560, Phase 561, and Phase 562. Owns migration/compatibility proof planning only, before schema version bumps, GraphDocument schema changes, saved whiteboard primitive state, or full whiteboard parity claims. | ## Recommended Parallel Worktree Plan @@ -704,6 +716,12 @@ Phase 558 records the whiteboard annotation store contract skeleton through GitH - `feature/phase-556-whiteboard-persistence-decision`: owns #230 / `avalonia-node-map-bck`; current stacked implementation/deferred-decision worktree after Phase 555, with no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no saved whiteboard primitive state, and no full React Flow whiteboard parity. - `docs/phase-557-whiteboard-annotation-store-contract`: owns #237 / `avalonia-node-map-zfe`; current stacked docs/test contract gate after Phase 556, with no production annotation store, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization change, no screenshot manifest expansion, and no saved whiteboard primitive state. - `feature/phase-558-whiteboard-annotation-store-contract-skeleton`: owns #239 / `avalonia-node-map-84u`; current stacked internal Core contract skeleton after Phase 557, with no production annotation store, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization change, no screenshot manifest expansion, no renderer or pointer behavior change, no public API exposure, and no saved whiteboard primitive state. +- `docs/phase-559-annotation-store-implementation-queue`: owns #241 / `avalonia-node-map-8ca`; current stacked docs/test queue refresh after Phase 558, with no production annotation store, no file/database I/O, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization behavior change, no screenshot manifest expansion, no renderer or pointer behavior change, no toolbar or eraser changes, no public API exposure, no saved whiteboard primitive state, and no full React Flow whiteboard parity. +- `feature/phase-560-whiteboard-annotation-store-memory-adapter`: owns #242 / `avalonia-node-map-nia`; future in-memory annotation-store adapter proof after Phase 559. +- `docs/phase-561-whiteboard-annotation-sidecar-persistence-policy`: owns #243 / `avalonia-node-map-xd8`; future workspace/sidecar persistence policy worktree after Phase 559. +- `docs/phase-562-whiteboard-annotation-clipboard-export-boundary`: owns #244 / `avalonia-node-map-0gi`; future clipboard/export serialization boundary worktree after Phase 559. +- `visual/phase-563-whiteboard-annotation-cookbook-screenshot-proof`: owns #245 / `avalonia-node-map-kri`; future screenshot/Cookbook proof expansion worktree after Phase 559. +- `docs/phase-564-whiteboard-annotation-migration-compatibility-proof`: owns #246 / `avalonia-node-map-vyg`; future migration/compatibility proof worktree after Phase 559 and the adapter/persistence/serialization boundary slices. ## UI Verification Policy @@ -778,4 +796,10 @@ Current coverage includes scene-level route captures plus ten manifest-driven fu - Phase 556 is GitHub #230 / `avalonia-node-map-bck`; it records the whiteboard primitive persistence implementation decision through `GraphWhiteboardPrimitivePersistenceOutcome.DeferredUntilSeparateAnnotationStoreContract` and `GraphWhiteboardPrimitivePersistenceBoundary` coverage for `GraphDocumentCompatibility`, `WorkspacePersistence`, `ClipboardFragment`, `ScreenshotArtifact`, and `SceneExportArtifact`. It keeps no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no saved whiteboard primitive state, and no full React Flow whiteboard parity. - Phase 557 is GitHub #237 / `avalonia-node-map-zfe`; it records the whiteboard annotation store contract gate and `WHITEBOARD_ANNOTATION_STORE_CONTRACT_GATE` with store ownership, store lifetime, annotation identity, primitive reference, style/geometry serialization, edit lifecycle serialization, migration metadata, read/write API boundary candidates, and compatibility requirements across GraphDocument, workspace, clipboard/export, scene export, and screenshot artifacts. It keeps no production annotation store, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization change, no screenshot manifest expansion, no saved whiteboard primitive state, and no full React Flow whiteboard parity. - Phase 558 is GitHub #239 / `avalonia-node-map-84u`; it records `WHITEBOARD_ANNOTATION_STORE_CONTRACT_SKELETON` with internal Core annotation-store contract types, annotation identity/reference records, primitive payload shape, migration metadata, and a persistence-neutral `IGraphWhiteboardAnnotationStoreBoundary`. It keeps no production annotation store, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization change, no screenshot manifest expansion, no renderer or pointer behavior change, no public API exposure, no saved whiteboard primitive state, and no full React Flow whiteboard parity. +- Phase 559 is GitHub #241 / `avalonia-node-map-8ca`; it records `WHITEBOARD_ANNOTATION_STORE_IMPLEMENTATION_QUEUE_REFRESH` and assigns Phase 560 through Phase 564 to the in-memory annotation-store adapter, workspace/sidecar persistence policy, clipboard/export serialization boundary, screenshot/Cookbook proof expansion, and migration/compatibility proof tracks. It keeps no production annotation store, no file/database I/O, no GraphDocument schema change, no schema version bump, no workspace persistence behavior change, no clipboard/export serialization behavior change, no screenshot manifest expansion, no renderer or pointer behavior change, no toolbar or eraser changes, no public API exposure, no saved whiteboard primitive state, and no full React Flow whiteboard parity. +- Phase 560 is GitHub #242 / `avalonia-node-map-nia`; it is queued for the in-memory whiteboard annotation store adapter proof after Phase 559. +- Phase 561 is GitHub #243 / `avalonia-node-map-xd8`; it is queued for the whiteboard annotation workspace/sidecar persistence policy after Phase 559. +- Phase 562 is GitHub #244 / `avalonia-node-map-0gi`; it is queued for the whiteboard annotation clipboard/export serialization boundary after Phase 559. +- Phase 563 is GitHub #245 / `avalonia-node-map-kri`; it is queued for the whiteboard annotation screenshot/Cookbook proof expansion after Phase 559. +- Phase 564 is GitHub #246 / `avalonia-node-map-vyg`; it is queued for the whiteboard annotation migration/compatibility proof after Phase 559 and after the adapter, persistence policy, and serialization boundary decisions. - 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, Phase 551, and Phase 557 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 3272a476..b11c1cea 100644 --- a/docs/zh-CN/phase-0-reactflow-parity-audit.md +++ b/docs/zh-CN/phase-0-reactflow-parity-audit.md @@ -270,6 +270,10 @@ Phase 555 是 GitHub #229 / `avalonia-node-map-71c`,记录 whiteboard primitiv Phase 556 是 GitHub #230 / `avalonia-node-map-bck`,记录 whiteboard primitive persistence implementation decision。它记录 `GraphWhiteboardPrimitivePersistenceOutcome.DeferredUntilSeparateAnnotationStoreContract`,并用 `GraphWhiteboardPrimitivePersistenceBoundary` 覆盖 `GraphDocumentCompatibility`、`WorkspacePersistence`、`ClipboardFragment`、`ScreenshotArtifact` 和 `SceneExportArtifact`。当前 slice 有意把 saved whiteboard primitive state deferred 到 separate annotation store contract 之后,让 `GraphDocumentSerializer`、`GraphDocumentCompatibility`、workspace save/load、clipboard fragments、scene export artifacts 和 screenshot artifacts 继续保持 graph-scoped。Phase 556 stacked on Phase 555,不能早于 PR #235 合并。它保持 no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no saved whiteboard primitive state、no renderer rewrite、no retained API removal 和 no full React Flow whiteboard parity。 +## Phase 559 更新 + +Phase 559 是 GitHub #241 / `avalonia-node-map-8ca`,记录 post-annotation-store contract implementation queue refresh。本 docs/tests-only slice 在 annotation-store contract skeleton 之后记录 `WHITEBOARD_ANNOTATION_STORE_IMPLEMENTATION_QUEUE_REFRESH`,并把下一批工作拆成 in-memory annotation-store adapter、workspace/sidecar persistence policy、clipboard/export serialization boundary、screenshot/Cookbook proof expansion 和 migration/compatibility proof follow-ups。它保持 no production annotation store、no file/database I/O、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization behavior change、no screenshot manifest expansion、no renderer or pointer behavior change、no toolbar or eraser changes、no public API exposure、no saved whiteboard primitive state 和 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。 @@ -619,6 +623,8 @@ Phase 557 记录 whiteboard annotation store contract gate,通过 GitHub #237 Phase 558 记录 whiteboard annotation store contract skeleton,通过 GitHub #239 / `avalonia-node-map-84u`。它只添加 internal Core contract coverage:`GraphWhiteboardAnnotationStoreContract`、`GraphWhiteboardAnnotationStoreMetadata`、`GraphWhiteboardAnnotationIdentity`、`GraphWhiteboardPrimitiveReference`、`GraphWhiteboardAnnotationPrimitivePayload`、`GraphWhiteboardAnnotationRecord`、`GraphWhiteboardAnnotationStoreSnapshot`、`GraphWhiteboardAnnotationMigrationMetadata` 和 `IGraphWhiteboardAnnotationStoreBoundary` 定义 store ownership、workspace-scoped lifetime、annotation identity、primitive reference、style/geometry/edit lifecycle payload shape、migration/schema metadata,以及 persistence-neutral read/write boundary。本 skeleton 保持 no production annotation store、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization change、no screenshot manifest expansion、no renderer or pointer behavior change、no public API exposure、no saved whiteboard primitive state 和 no full React Flow whiteboard parity。 +Phase 559 记录 post-annotation-store contract implementation queue refresh,通过 GitHub #241 / `avalonia-node-map-8ca`。它只添加 `WHITEBOARD_ANNOTATION_STORE_IMPLEMENTATION_QUEUE_REFRESH`,并把下一批 annotation-store work 拆成 Phase 560 in-memory annotation-store adapter、Phase 561 workspace/sidecar persistence policy、Phase 562 clipboard/export serialization boundary、Phase 563 screenshot/Cookbook proof expansion 和 Phase 564 migration/compatibility proof。本 queue refresh 保持 no production annotation store、no file/database I/O、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization behavior change、no screenshot manifest expansion、no renderer or pointer behavior change、no toolbar or eraser changes、no public API exposure、no saved whiteboard primitive state 和 no 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。 | @@ -645,6 +651,12 @@ Phase 558 记录 whiteboard annotation store contract skeleton,通过 GitHub # | #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;stacked after PR #235,并且 do not merge before Phase 555。只记录 `DeferredUntilSeparateAnnotationStoreContract` 和 boundary coverage;不做 no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no saved whiteboard primitive state 或 full whiteboard parity claim。 | | #237 | `avalonia-node-map-zfe` | Phase 557: whiteboard annotation store contract gate | P4 | annotation-store contract docs、persistence boundary requirements 和 focused docs tests | Depends on Phase 556;stacked after PR #236,并且 do not merge before Phase 556。只定义 separate annotation-store contract gate;不做 no production annotation store、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization change、no screenshot manifest expansion、no saved whiteboard primitive state 或 full whiteboard parity claim。 | | #239 | `avalonia-node-map-84u` | Phase 558: whiteboard annotation store contract skeleton | P4 | internal Core annotation-store contract types、boundary tests 和 parity docs | Depends on Phase 557;stacked after PR #238,并且 do not merge before Phase 557。只添加 internal contract skeleton only;不做 no production annotation store、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization change、no screenshot manifest expansion、no renderer or pointer behavior change、no public API exposure、no saved whiteboard primitive state 或 full whiteboard parity claim。 | +| #241 | `avalonia-node-map-8ca` | Phase 559: post-annotation-store contract implementation queue refresh | P4 | parity roadmap docs 和 focused docs tests | Depends on Phase 558;stacked after PR #240,并且 do not merge before Phase 558。This is a docs/test queue refresh only:分配 Phase 560 through Phase 564,不做 production annotation store、file/database I/O、GraphDocument schema changes、workspace persistence behavior changes、clipboard/export serialization behavior changes、screenshot manifest expansion、renderer or pointer behavior changes、toolbar or eraser changes、public API exposure、saved whiteboard primitive state 或 full whiteboard parity claim。 | +| #242 | `avalonia-node-map-nia` | Phase 560: in-memory whiteboard annotation store adapter proof | P3 | in-memory annotation-store adapter tests 和 internal boundary proof | Depends on Phase 559。只负责 in-memory adapter proof,不做 file/database I/O、workspace persistence behavior change、GraphDocument schema change、public API exposure 或 full whiteboard parity claim。 | +| #243 | `avalonia-node-map-xd8` | Phase 561: whiteboard annotation workspace sidecar persistence policy | P4 | workspace/sidecar persistence policy docs 和 compatibility criteria | Depends on Phase 559。只负责 sidecar policy decisions,先于任何 workspace persistence behavior change、schema version bump 或 saved whiteboard primitive state。 | +| #244 | `avalonia-node-map-0gi` | Phase 562: whiteboard annotation clipboard/export serialization boundary | P4 | clipboard/export serialization boundary docs 和 focused compatibility tests | Depends on Phase 559。只负责 serialization boundary policy,先于任何 clipboard/export serialization behavior change 或 public API exposure。 | +| #245 | `avalonia-node-map-kri` | Phase 563: whiteboard annotation screenshot and Cookbook proof expansion | P4 | screenshot/Cookbook proof planning、route criteria 和 non-overlap evidence requirements | Depends on Phase 559。只负责 screenshot/Cookbook proof expansion planning,先于 screenshot manifest expansion、renderer changes 或 toolbar/eraser changes。 | +| #246 | `avalonia-node-map-vyg` | Phase 564: whiteboard annotation migration and compatibility proof | P4 | migration/compatibility proof docs、schema policy criteria 和 compatibility test plan | Depends on Phase 559 plus Phase 560、Phase 561 和 Phase 562。只负责 migration/compatibility proof planning,先于 schema version bumps、GraphDocument schema changes、saved whiteboard primitive state 或 full whiteboard parity claims。 | ## 推荐并行 Worktree 计划 @@ -704,6 +716,12 @@ Phase 558 记录 whiteboard annotation store contract skeleton,通过 GitHub # - `feature/phase-556-whiteboard-persistence-decision`:负责 #230 / `avalonia-node-map-bck`;Phase 555 之后的 current stacked implementation/deferred-decision worktree,保持 no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no saved whiteboard primitive state 和 no full React Flow whiteboard parity。 - `docs/phase-557-whiteboard-annotation-store-contract`:负责 #237 / `avalonia-node-map-zfe`;Phase 556 之后的 current stacked docs/test contract gate,保持 no production annotation store、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization change、no screenshot manifest expansion 和 no saved whiteboard primitive state。 - `feature/phase-558-whiteboard-annotation-store-contract-skeleton`:负责 #239 / `avalonia-node-map-84u`;Phase 557 之后的 current stacked internal Core contract skeleton,保持 no production annotation store、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization change、no screenshot manifest expansion、no renderer or pointer behavior change、no public API exposure 和 no saved whiteboard primitive state。 +- `docs/phase-559-annotation-store-implementation-queue`:负责 #241 / `avalonia-node-map-8ca`;Phase 558 之后的 current stacked docs/test queue refresh,保持 no production annotation store、no file/database I/O、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization behavior change、no screenshot manifest expansion、no renderer or pointer behavior change、no toolbar or eraser changes、no public API exposure、no saved whiteboard primitive state 和 no full React Flow whiteboard parity。 +- `feature/phase-560-whiteboard-annotation-store-memory-adapter`:负责 #242 / `avalonia-node-map-nia`;Phase 559 之后的 future in-memory annotation-store adapter proof。 +- `docs/phase-561-whiteboard-annotation-sidecar-persistence-policy`:负责 #243 / `avalonia-node-map-xd8`;Phase 559 之后的 future workspace/sidecar persistence policy worktree。 +- `docs/phase-562-whiteboard-annotation-clipboard-export-boundary`:负责 #244 / `avalonia-node-map-0gi`;Phase 559 之后的 future clipboard/export serialization boundary worktree。 +- `visual/phase-563-whiteboard-annotation-cookbook-screenshot-proof`:负责 #245 / `avalonia-node-map-kri`;Phase 559 之后的 future screenshot/Cookbook proof expansion worktree。 +- `docs/phase-564-whiteboard-annotation-migration-compatibility-proof`:负责 #246 / `avalonia-node-map-vyg`;Phase 559 以及 adapter/persistence/serialization boundary slices 之后的 future migration/compatibility proof worktree。 ## UI 验证策略 @@ -778,4 +796,10 @@ Phase 558 记录 whiteboard annotation store contract skeleton,通过 GitHub # - Phase 556 是 GitHub #230 / `avalonia-node-map-bck`;它通过 `GraphWhiteboardPrimitivePersistenceOutcome.DeferredUntilSeparateAnnotationStoreContract` 和 `GraphWhiteboardPrimitivePersistenceBoundary` 覆盖 `GraphDocumentCompatibility`、`WorkspacePersistence`、`ClipboardFragment`、`ScreenshotArtifact` 与 `SceneExportArtifact`,记录 whiteboard primitive persistence implementation decision。它保持 no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no saved whiteboard primitive state 和 no full React Flow whiteboard parity。 - Phase 557 是 GitHub #237 / `avalonia-node-map-zfe`;它记录 whiteboard annotation store contract gate 和 `WHITEBOARD_ANNOTATION_STORE_CONTRACT_GATE`,要求明确 store ownership、store lifetime、annotation identity、primitive reference、style/geometry serialization、edit lifecycle serialization、migration metadata、read/write API boundary candidates,以及 GraphDocument、workspace、clipboard/export、scene export 和 screenshot artifacts compatibility requirements。它保持 no production annotation store、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization change、no screenshot manifest expansion、no saved whiteboard primitive state 和 no full React Flow whiteboard parity。 - Phase 558 是 GitHub #239 / `avalonia-node-map-84u`;它用 internal Core annotation-store contract types、annotation identity/reference records、primitive payload shape、migration metadata 和 persistence-neutral `IGraphWhiteboardAnnotationStoreBoundary` 记录 `WHITEBOARD_ANNOTATION_STORE_CONTRACT_SKELETON`。它保持 no production annotation store、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization change、no screenshot manifest expansion、no renderer or pointer behavior change、no public API exposure、no saved whiteboard primitive state 和 no full React Flow whiteboard parity。 +- Phase 559 是 GitHub #241 / `avalonia-node-map-8ca`;它记录 `WHITEBOARD_ANNOTATION_STORE_IMPLEMENTATION_QUEUE_REFRESH`,并把 Phase 560 through Phase 564 分配给 in-memory annotation-store adapter、workspace/sidecar persistence policy、clipboard/export serialization boundary、screenshot/Cookbook proof expansion 和 migration/compatibility proof tracks。它保持 no production annotation store、no file/database I/O、no GraphDocument schema change、no schema version bump、no workspace persistence behavior change、no clipboard/export serialization behavior change、no screenshot manifest expansion、no renderer or pointer behavior change、no toolbar or eraser changes、no public API exposure、no saved whiteboard primitive state 和 no full React Flow whiteboard parity。 +- Phase 560 是 GitHub #242 / `avalonia-node-map-nia`;它排队承接 Phase 559 之后的 in-memory whiteboard annotation store adapter proof。 +- Phase 561 是 GitHub #243 / `avalonia-node-map-xd8`;它排队承接 Phase 559 之后的 whiteboard annotation workspace/sidecar persistence policy。 +- Phase 562 是 GitHub #244 / `avalonia-node-map-0gi`;它排队承接 Phase 559 之后的 whiteboard annotation clipboard/export serialization boundary。 +- Phase 563 是 GitHub #245 / `avalonia-node-map-kri`;它排队承接 Phase 559 之后的 whiteboard annotation screenshot/Cookbook proof expansion。 +- Phase 564 是 GitHub #246 / `avalonia-node-map-vyg`;它排队承接 Phase 559,以及 adapter、persistence policy 和 serialization boundary decisions 之后的 whiteboard annotation migration/compatibility proof。 - 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 和 Phase 557 都不修改产品代码;除非 focused test 证明存在具体 missing contract。 diff --git a/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs b/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs index 8372a9cc..fb13f143 100644 --- a/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs +++ b/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs @@ -1900,6 +1900,70 @@ public void ParityRoadmapDocs_RecordPhase558WhiteboardAnnotationStoreContractSke Assert.Contains("Phase 558 记录 whiteboard annotation store contract skeleton", chineseParity, StringComparison.Ordinal); } + [Fact] + public void ParityRoadmapDocs_RecordPhase559AnnotationStoreImplementationQueueRefreshInBothLocales() + { + 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 559", contents, StringComparison.Ordinal); + Assert.Contains("GitHub #241", contents, StringComparison.Ordinal); + Assert.Contains("avalonia-node-map-8ca", contents, StringComparison.Ordinal); + Assert.Contains("post-annotation-store contract implementation queue refresh", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("WHITEBOARD_ANNOTATION_STORE_IMPLEMENTATION_QUEUE_REFRESH", contents, StringComparison.Ordinal); + Assert.Contains("in-memory annotation-store adapter", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("workspace/sidecar persistence policy", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("clipboard/export serialization boundary", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("screenshot/Cookbook proof expansion", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("migration/compatibility proof", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no production annotation store", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no file/database I/O", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no GraphDocument schema change", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no schema version bump", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no workspace persistence behavior change", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no clipboard/export serialization behavior change", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no screenshot manifest expansion", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no renderer or pointer behavior change", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no toolbar or eraser changes", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no public API exposure", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no saved whiteboard primitive state", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no full React Flow whiteboard parity", contents, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("whiteboard annotations are persisted", contents, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("saved whiteboard primitive state is implemented", contents, StringComparison.OrdinalIgnoreCase); + } + + foreach (var table in new[] { ExtractIssueWaveTable(englishParity), ExtractIssueWaveTable(chineseParity) }) + { + Assert.Contains("| #241 | `avalonia-node-map-8ca` | Phase 559: post-annotation-store contract implementation queue refresh", table, StringComparison.Ordinal); + Assert.Contains("Depends on Phase 558", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("docs/test queue refresh only", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("Phase 560: in-memory whiteboard annotation store adapter proof", table, StringComparison.Ordinal); + Assert.Contains("Phase 561: whiteboard annotation workspace sidecar persistence policy", table, StringComparison.Ordinal); + Assert.Contains("Phase 562: whiteboard annotation clipboard/export serialization boundary", table, StringComparison.Ordinal); + Assert.Contains("Phase 563: whiteboard annotation screenshot and Cookbook proof expansion", table, StringComparison.Ordinal); + Assert.Contains("Phase 564: whiteboard annotation migration and compatibility proof", table, StringComparison.Ordinal); + Assert.DoesNotContain("| TBD | TBD | Phase 559", table, StringComparison.Ordinal); + Assert.DoesNotContain("annotation persistence is implemented", table, StringComparison.OrdinalIgnoreCase); + } + + foreach (var plan in new[] { ExtractRecommendedWorktreePlan(englishParity), ExtractRecommendedWorktreePlan(chineseParity) }) + { + Assert.Contains("docs/phase-559-annotation-store-implementation-queue", plan, StringComparison.Ordinal); + Assert.Contains("avalonia-node-map-8ca", plan, StringComparison.Ordinal); + Assert.Contains("current stacked docs/test queue refresh", plan, StringComparison.OrdinalIgnoreCase); + Assert.Contains("feature/phase-560-whiteboard-annotation-store-memory-adapter", plan, StringComparison.Ordinal); + Assert.Contains("docs/phase-561-whiteboard-annotation-sidecar-persistence-policy", plan, StringComparison.Ordinal); + Assert.Contains("docs/phase-562-whiteboard-annotation-clipboard-export-boundary", plan, StringComparison.Ordinal); + Assert.Contains("visual/phase-563-whiteboard-annotation-cookbook-screenshot-proof", plan, StringComparison.Ordinal); + Assert.Contains("docs/phase-564-whiteboard-annotation-migration-compatibility-proof", plan, StringComparison.Ordinal); + } + + Assert.Contains("Phase 559 records the post-annotation-store contract implementation queue refresh", englishParity, StringComparison.Ordinal); + Assert.Contains("Phase 559 记录 post-annotation-store contract implementation queue refresh", chineseParity, StringComparison.Ordinal); + } + [Fact] public void ParityRoadmapDocs_RecordPhase501PostPhase500QueueRefreshInBothLocales() {