diff --git a/docs/en/phase-0-reactflow-parity-audit.md b/docs/en/phase-0-reactflow-parity-audit.md index 2329c474..89e46ab3 100644 --- a/docs/en/phase-0-reactflow-parity-audit.md +++ b/docs/en/phase-0-reactflow-parity-audit.md @@ -278,6 +278,10 @@ Phase 559 is GitHub #241 / `avalonia-node-map-8ca`, the post-annotation-store co Phase 563 is GitHub #245 / `avalonia-node-map-kri`, the whiteboard annotation screenshot and Cookbook proof expansion. It adds `WHITEBOARD_ANNOTATION_SCREENSHOT_COOKBOOK_PROOF_EXPANSION` as a docs/tests planning gate only: future implementation must define Cookbook route expectations, screenshot proof metadata, non-overlap requirements, and separation from persistence/serialization implementation before screenshot manifest expansion or any visual/demo route changes. This proof expansion keeps no screenshot manifest expansion, no new Cookbook route, no UI behavior change, no production annotation store, no file/database I/O, no GraphDocument schema change, no workspace persistence behavior change, no clipboard/export behavior change, no renderer or pointer behavior change, no public API exposure, no saved whiteboard primitive state, and no full React Flow whiteboard parity. +## Phase 564 Update + +Phase 564 is GitHub #246 / `avalonia-node-map-vyg`, the whiteboard annotation migration and compatibility proof. It adds `WHITEBOARD_ANNOTATION_MIGRATION_COMPATIBILITY_PROOF` as a docs/tests planning gate only: future implementation must define annotation-store versions, primitive references, style/geometry payloads, migration metadata validation, and coverage required before persistence, clipboard/export, or screenshot proof expands. It depends on Phase 560, Phase 561, and Phase 562 after Phase 559. This proof gate keeps no production migration implementation, no persisted annotation state, 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 public API exposure, 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. @@ -637,6 +641,8 @@ Phase 562 records the whiteboard annotation clipboard/export serialization bound Phase 563 records the whiteboard annotation screenshot and Cookbook proof expansion through GitHub #245 / `avalonia-node-map-kri`. It adds `WHITEBOARD_ANNOTATION_SCREENSHOT_COOKBOOK_PROOF_EXPANSION` as a docs/tests planning gate only: future implementation must define Cookbook route expectations, screenshot proof metadata, non-overlap requirements, and separation from persistence/serialization implementation before screenshot manifest expansion or any visual/demo route changes. This proof expansion keeps no screenshot manifest expansion, no new Cookbook route, no UI behavior change, no production annotation store, no file/database I/O, no GraphDocument schema change, no workspace persistence behavior change, no clipboard/export behavior change, no renderer or pointer behavior change, no public API exposure, no saved whiteboard primitive state, and no full React Flow whiteboard parity. +Phase 564 records the whiteboard annotation migration and compatibility proof through GitHub #246 / `avalonia-node-map-vyg`. It adds `WHITEBOARD_ANNOTATION_MIGRATION_COMPATIBILITY_PROOF` as a docs/tests planning gate only: future implementation must define annotation-store versions, primitive references, style/geometry payloads, migration metadata validation, and coverage required before persistence, clipboard/export, or screenshot proof expands. It depends on Phase 560, Phase 561, and Phase 562 after Phase 559. This proof gate keeps no production migration implementation, no persisted annotation state, 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 public API exposure, 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. | @@ -668,7 +674,7 @@ Phase 563 records the whiteboard annotation screenshot and Cookbook proof expans | #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 a policy gate only for workspace sidecar ownership, workspace-scoped lifetime, sidecar file naming, migration metadata, compatibility requirements, and verification requirements before workspace save/load behavior changes; no production persistence implementation, file/database I/O, GraphDocument schema change, schema version bump, workspace persistence behavior change, clipboard/export serialization behavior change, screenshot manifest expansion, renderer or pointer behavior change, public API exposure, saved whiteboard primitive state, or full whiteboard parity claim. | | #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 a boundary gate only for annotation identity/reference and primitive payload eligibility across clipboard fragments, scene export artifacts, and workspace sidecar persistence, with compatibility and migration proof required before serialization behavior changes; no production serialization implementation, clipboard/export behavior change, file/database I/O, GraphDocument schema change, schema version bump, workspace persistence behavior change, screenshot manifest expansion, renderer or pointer behavior change, public API exposure, saved whiteboard primitive state, or full whiteboard parity claim. | | #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, including Cookbook route expectations, screenshot proof metadata, non-overlap requirements, and separation from persistence/serialization implementation before screenshot manifest expansion, renderer changes, or toolbar/eraser changes. No screenshot manifest expansion, no new Cookbook route, no UI behavior change, no production annotation store, no file/database I/O, no GraphDocument schema change, no workspace persistence behavior change, no clipboard/export behavior change, no renderer or pointer behavior change, no public API exposure, no saved whiteboard primitive state, or full whiteboard parity claim. | -| #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. | +| #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 for annotation-store versions, primitive references, style/geometry payloads, migration metadata validation, and coverage required before persistence, clipboard/export, or screenshot proof expands. No production migration implementation, persisted annotation state, file/database I/O, GraphDocument schema change, schema version bump, workspace persistence behavior change, clipboard/export serialization behavior change, screenshot manifest expansion, renderer or pointer behavior change, public API exposure, schema version bumps, saved whiteboard primitive state, or full whiteboard parity claims. | ## Recommended Parallel Worktree Plan @@ -813,5 +819,5 @@ Current coverage includes scene-level route captures plus ten manifest-driven fu - Phase 561 is GitHub #243 / `avalonia-node-map-xd8`; it records `WHITEBOARD_ANNOTATION_WORKSPACE_SIDECAR_PERSISTENCE_POLICY` as a docs/tests policy gate for workspace sidecar ownership, workspace-scoped lifetime, sidecar file naming, migration metadata, compatibility requirements, and verification requirements before workspace save/load behavior changes, while keeping no production persistence implementation, 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 public API exposure, no saved whiteboard primitive state, and no full React Flow whiteboard parity. - Phase 562 is GitHub #244 / `avalonia-node-map-0gi`; it records `WHITEBOARD_ANNOTATION_CLIPBOARD_EXPORT_SERIALIZATION_BOUNDARY` as a docs/tests boundary gate for annotation identity/reference and primitive payload eligibility across clipboard fragments, scene export artifacts, and workspace sidecar persistence, with compatibility and migration proof required before serialization behavior changes, while keeping no production serialization implementation, no clipboard/export behavior change, no file/database I/O, no GraphDocument schema change, no schema version bump, no workspace persistence behavior 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 563 is GitHub #245 / `avalonia-node-map-kri`; it records `WHITEBOARD_ANNOTATION_SCREENSHOT_COOKBOOK_PROOF_EXPANSION` as a docs/tests planning gate for Cookbook route expectations, screenshot proof metadata, non-overlap requirements, and separation from persistence/serialization implementation before screenshot manifest expansion. It keeps no screenshot manifest expansion, no new Cookbook route, no UI behavior change, no production annotation store, no file/database I/O, no GraphDocument schema change, no workspace persistence behavior change, no clipboard/export behavior change, no renderer or pointer behavior change, no public API exposure, no saved whiteboard primitive state, and no full React Flow whiteboard parity. -- 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. +- Phase 564 is GitHub #246 / `avalonia-node-map-vyg`; it records `WHITEBOARD_ANNOTATION_MIGRATION_COMPATIBILITY_PROOF` as a docs/tests planning gate for annotation-store versions, primitive references, style/geometry payloads, migration metadata validation, and coverage required before persistence, clipboard/export, or screenshot proof expands. It depends on Phase 560, Phase 561, and Phase 562 after Phase 559, while keeping no production migration implementation, no persisted annotation state, 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 public API exposure, and no full React Flow whiteboard parity. - 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 1b1fd7df..1e9a4087 100644 --- a/docs/zh-CN/phase-0-reactflow-parity-audit.md +++ b/docs/zh-CN/phase-0-reactflow-parity-audit.md @@ -633,6 +633,8 @@ Phase 562 记录 whiteboard annotation clipboard/export serialization boundary Phase 563 记录 whiteboard annotation screenshot and Cookbook proof expansion,通过 GitHub #245 / `avalonia-node-map-kri`。它把 `WHITEBOARD_ANNOTATION_SCREENSHOT_COOKBOOK_PROOF_EXPANSION` 作为 docs/tests planning gate only:后续 implementation 必须先定义 Cookbook route expectations、screenshot proof metadata、non-overlap requirements,以及 separation from persistence/serialization implementation,再进入 screenshot manifest expansion 或任何 visual/demo route changes。本 proof expansion 保持 no screenshot manifest expansion、no new Cookbook route、no UI behavior change、no production annotation store、no file/database I/O、no GraphDocument schema change、no workspace persistence behavior change、no clipboard/export behavior change、no renderer or pointer behavior change、no public API exposure、no saved whiteboard primitive state 和 no full React Flow whiteboard parity。 +Phase 564 记录 whiteboard annotation migration and compatibility proof,通过 GitHub #246 / `avalonia-node-map-vyg`。它把 `WHITEBOARD_ANNOTATION_MIGRATION_COMPATIBILITY_PROOF` 作为 docs/tests planning gate only:后续 implementation 必须先定义 annotation-store versions、primitive references、style/geometry payloads、migration metadata validation,以及 coverage required before persistence, clipboard/export, or screenshot proof expands。它 depends on Phase 560, Phase 561, and Phase 562,且位于 Phase 559 之后。本 proof gate 保持 no production migration implementation、no persisted annotation state、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 public API exposure 和 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。 | @@ -664,7 +666,7 @@ Phase 563 记录 whiteboard annotation screenshot and Cookbook proof expansion | #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。只负责 policy gate only,用于定义 workspace sidecar ownership、workspace-scoped lifetime、sidecar file naming、migration metadata、compatibility requirements 和 verification requirements before workspace save/load behavior changes;不做 production persistence implementation、file/database I/O、GraphDocument schema change、schema version bump、workspace persistence behavior change、clipboard/export serialization behavior change、screenshot manifest expansion、renderer or pointer behavior change、public API exposure、saved whiteboard primitive state 或 full whiteboard parity claim。 | | #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。只负责 boundary gate only,用于定义 clipboard fragments、scene export artifacts 和 workspace sidecar persistence 中 annotation identity/reference 与 primitive payload eligibility,并要求 compatibility and migration proof required before serialization behavior changes;不做 production serialization implementation、clipboard/export behavior change、file/database I/O、GraphDocument schema change、schema version bump、workspace persistence behavior change、screenshot manifest expansion、renderer or pointer behavior change、public API exposure、saved whiteboard primitive state 或 full whiteboard parity claim。 | | #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 only,包括 Cookbook route expectations、screenshot proof metadata、non-overlap requirements,以及 separation from persistence/serialization implementation,先于 screenshot manifest expansion、renderer changes 或 toolbar/eraser changes;不做 no screenshot manifest expansion、no new Cookbook route、no UI behavior change、no production annotation store、no file/database I/O、no GraphDocument schema change、no workspace persistence behavior change、no clipboard/export behavior change、no renderer or pointer behavior change、no public API exposure、no saved whiteboard primitive state 或 full whiteboard parity claim。 | -| #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。 | +| #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, and Phase 562。只负责 migration/compatibility proof planning only,用于 annotation-store versions、primitive references、style/geometry payloads、migration metadata validation,以及 coverage required before persistence, clipboard/export, or screenshot proof expands;不做 no production migration implementation、no persisted annotation state、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 public API exposure、schema version bumps、saved whiteboard primitive state 或 full whiteboard parity claims。 | ## 推荐并行 Worktree 计划 @@ -809,5 +811,5 @@ Phase 563 记录 whiteboard annotation screenshot and Cookbook proof expansion - Phase 561 是 GitHub #243 / `avalonia-node-map-xd8`;它把 `WHITEBOARD_ANNOTATION_WORKSPACE_SIDECAR_PERSISTENCE_POLICY` 记录为 docs/tests policy gate,用于定义 workspace sidecar ownership、workspace-scoped lifetime、sidecar file naming、migration metadata、compatibility requirements 和 verification requirements before workspace save/load behavior changes,同时保持 no production persistence implementation、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 public API exposure、no saved whiteboard primitive state 和 no full React Flow whiteboard parity。 - Phase 562 是 GitHub #244 / `avalonia-node-map-0gi`;它把 `WHITEBOARD_ANNOTATION_CLIPBOARD_EXPORT_SERIALIZATION_BOUNDARY` 记录为 docs/tests boundary gate,用于定义 clipboard fragments、scene export artifacts 和 workspace sidecar persistence 中 annotation identity/reference 与 primitive payload eligibility,并要求 compatibility and migration proof required before serialization behavior changes,同时保持 no production serialization implementation、no clipboard/export behavior change、no file/database I/O、no GraphDocument schema change、no schema version bump、no workspace persistence behavior 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 563 是 GitHub #245 / `avalonia-node-map-kri`;它把 `WHITEBOARD_ANNOTATION_SCREENSHOT_COOKBOOK_PROOF_EXPANSION` 记录为 docs/tests planning gate,用于定义 Cookbook route expectations、screenshot proof metadata、non-overlap requirements,以及 separation from persistence/serialization implementation before screenshot manifest expansion。它保持 no screenshot manifest expansion、no new Cookbook route、no UI behavior change、no production annotation store、no file/database I/O、no GraphDocument schema change、no workspace persistence behavior change、no clipboard/export behavior change、no renderer or pointer behavior change、no public API exposure、no saved whiteboard primitive state 和 no full React Flow whiteboard parity。 -- Phase 564 是 GitHub #246 / `avalonia-node-map-vyg`;它排队承接 Phase 559,以及 adapter、persistence policy 和 serialization boundary decisions 之后的 whiteboard annotation migration/compatibility proof。 +- Phase 564 是 GitHub #246 / `avalonia-node-map-vyg`;它把 `WHITEBOARD_ANNOTATION_MIGRATION_COMPATIBILITY_PROOF` 记录为 docs/tests planning gate,用于 annotation-store versions、primitive references、style/geometry payloads、migration metadata validation,以及 coverage required before persistence, clipboard/export, or screenshot proof expands。它 depends on Phase 560, Phase 561, and Phase 562,且位于 Phase 559 之后,同时保持 no production migration implementation、no persisted annotation state、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 public API exposure 和 no full React Flow whiteboard parity。 - 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 e1392604..e812f580 100644 --- a/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs +++ b/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs @@ -2149,6 +2149,55 @@ public void ParityRoadmapDocs_RecordPhase563ScreenshotCookbookProofExpansionInBo Assert.Contains("Phase 563 记录 whiteboard annotation screenshot and Cookbook proof expansion", chineseParity, StringComparison.Ordinal); } + [Fact] + public void ParityRoadmapDocs_RecordPhase564MigrationCompatibilityProofInBothLocales() + { + 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 564", contents, StringComparison.Ordinal); + Assert.Contains("GitHub #246", contents, StringComparison.Ordinal); + Assert.Contains("avalonia-node-map-vyg", contents, StringComparison.Ordinal); + Assert.Contains("WHITEBOARD_ANNOTATION_MIGRATION_COMPATIBILITY_PROOF", contents, StringComparison.Ordinal); + Assert.Contains("annotation-store versions", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("primitive references", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("style/geometry payloads", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("migration metadata validation", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("coverage required before persistence, clipboard/export, or screenshot proof expands", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("depends on Phase 560, Phase 561, and Phase 562", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no production migration implementation", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no persisted annotation state", 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 public API exposure", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no full React Flow whiteboard parity", contents, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("whiteboard annotation migration is implemented", contents, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("GraphDocument schema now stores annotation migrations", contents, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("workspace persistence now migrates whiteboard annotations", contents, StringComparison.OrdinalIgnoreCase); + } + + foreach (var table in new[] { ExtractIssueWaveTable(englishParity), ExtractIssueWaveTable(chineseParity) }) + { + Assert.Contains("| #246 | `avalonia-node-map-vyg` | Phase 564: whiteboard annotation migration and compatibility proof", table, StringComparison.Ordinal); + Assert.Contains("Depends on Phase 559 plus Phase 560, Phase 561, and Phase 562", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("migration/compatibility proof planning only", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("schema policy criteria", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("compatibility test plan", table, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("| TBD | TBD | Phase 564", table, StringComparison.Ordinal); + Assert.DoesNotContain("migration implementation is complete", table, StringComparison.OrdinalIgnoreCase); + } + + Assert.Contains("Phase 564 records the whiteboard annotation migration and compatibility proof", englishParity, StringComparison.Ordinal); + Assert.Contains("Phase 564 记录 whiteboard annotation migration and compatibility proof", chineseParity, StringComparison.Ordinal); + } + [Fact] public void ParityRoadmapDocs_RecordPhase501PostPhase500QueueRefreshInBothLocales() {