diff --git a/docs/en/phase-0-reactflow-parity-audit.md b/docs/en/phase-0-reactflow-parity-audit.md index c793b96b..79d73116 100644 --- a/docs/en/phase-0-reactflow-parity-audit.md +++ b/docs/en/phase-0-reactflow-parity-audit.md @@ -629,6 +629,8 @@ Phase 560 records the in-memory whiteboard annotation store adapter proof throug Phase 561 records the whiteboard annotation workspace sidecar persistence policy through GitHub #243 / `avalonia-node-map-xd8`. It adds `WHITEBOARD_ANNOTATION_WORKSPACE_SIDECAR_PERSISTENCE_POLICY` as a docs/tests policy gate only: future implementation must define workspace sidecar ownership, workspace-scoped lifetime, sidecar file naming, migration metadata, compatibility requirements, and verification requirements before workspace save/load behavior changes. This policy keeps 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 records the whiteboard annotation clipboard/export serialization boundary through GitHub #244 / `avalonia-node-map-0gi`. It adds `WHITEBOARD_ANNOTATION_CLIPBOARD_EXPORT_SERIALIZATION_BOUNDARY` as a docs/tests boundary gate only: future implementation must define annotation identity/reference and primitive payload eligibility separately for clipboard fragments, scene export artifacts, and workspace sidecar persistence, with compatibility and migration proof required before serialization behavior changes. This boundary keeps 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. + | 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. | @@ -658,7 +660,7 @@ Phase 561 records the whiteboard annotation workspace sidecar persistence policy | #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 through `InMemoryGraphWhiteboardAnnotationStoreBoundary`, with snapshot create/read/update/delete coverage and no 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, toolbar or eraser changes, public API exposure, saved whiteboard primitive state, 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 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 serialization boundary policy only, before any clipboard/export serialization behavior change or public API exposure. | +| #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, 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. | @@ -803,7 +805,7 @@ Current coverage includes scene-level route captures plus ten manifest-driven fu - 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 records `IN_MEMORY_WHITEBOARD_ANNOTATION_STORE_ADAPTER_PROOF` with the internal session-scoped `InMemoryGraphWhiteboardAnnotationStoreBoundary` and focused snapshot create/read/update/delete tests, while keeping 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 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 is queued for the whiteboard annotation clipboard/export serialization boundary after Phase 559. +- 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 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 4d2c75e3..a6dbe7be 100644 --- a/docs/zh-CN/phase-0-reactflow-parity-audit.md +++ b/docs/zh-CN/phase-0-reactflow-parity-audit.md @@ -629,6 +629,8 @@ Phase 560 记录 in-memory whiteboard annotation store adapter proof,通过 Gi Phase 561 记录 whiteboard annotation workspace sidecar persistence policy,通过 GitHub #243 / `avalonia-node-map-xd8`。它把 `WHITEBOARD_ANNOTATION_WORKSPACE_SIDECAR_PERSISTENCE_POLICY` 作为 docs/tests policy gate only:后续 implementation 必须先定义 workspace sidecar ownership、workspace-scoped lifetime、sidecar file naming、migration metadata、compatibility requirements,以及 verification requirements before workspace save/load behavior changes。本 policy 保持 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 记录 whiteboard annotation clipboard/export serialization boundary,通过 GitHub #244 / `avalonia-node-map-0gi`。它把 `WHITEBOARD_ANNOTATION_CLIPBOARD_EXPORT_SERIALIZATION_BOUNDARY` 作为 docs/tests boundary gate only:后续 implementation 必须分别定义 clipboard fragments、scene export artifacts 和 workspace sidecar persistence 中可进入 serialization 的 annotation identity/reference 与 primitive payload eligibility,并要求 compatibility and migration proof required before serialization behavior changes。本 boundary 保持 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。 + | 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。 | @@ -658,7 +660,7 @@ Phase 561 记录 whiteboard annotation workspace sidecar persistence policy, | #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。只通过 `InMemoryGraphWhiteboardAnnotationStoreBoundary` 负责 in-memory adapter proof only,并用 snapshot create/read/update/delete coverage 守住;不做 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、toolbar or eraser changes、public API exposure、saved whiteboard primitive state 或 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。只负责 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。只负责 serialization boundary policy,先于任何 clipboard/export serialization behavior change 或 public API exposure。 | +| #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,先于 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。 | @@ -803,7 +805,7 @@ Phase 561 记录 whiteboard annotation workspace sidecar persistence policy, - 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`;它用 internal session-scoped `InMemoryGraphWhiteboardAnnotationStoreBoundary` 和 focused snapshot create/read/update/delete tests 记录 `IN_MEMORY_WHITEBOARD_ANNOTATION_STORE_ADAPTER_PROOF`,同时保持 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 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`;它排队承接 Phase 559 之后的 whiteboard annotation clipboard/export serialization boundary。 +- 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`;它排队承接 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 6d77bec7..f3b83176 100644 --- a/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs +++ b/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs @@ -2054,6 +2054,53 @@ public void ParityRoadmapDocs_RecordPhase561WorkspaceSidecarPersistencePolicyInB Assert.Contains("Phase 561 记录 whiteboard annotation workspace sidecar persistence policy", chineseParity, StringComparison.Ordinal); } + [Fact] + public void ParityRoadmapDocs_RecordPhase562ClipboardExportSerializationBoundaryInBothLocales() + { + 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 562", contents, StringComparison.Ordinal); + Assert.Contains("GitHub #244", contents, StringComparison.Ordinal); + Assert.Contains("avalonia-node-map-0gi", contents, StringComparison.Ordinal); + Assert.Contains("WHITEBOARD_ANNOTATION_CLIPBOARD_EXPORT_SERIALIZATION_BOUNDARY", contents, StringComparison.Ordinal); + Assert.Contains("annotation identity/reference", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("primitive payload eligibility", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("clipboard fragments", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("scene export artifacts", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("workspace sidecar persistence", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("compatibility and migration proof required before serialization behavior changes", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no production serialization implementation", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no clipboard/export behavior change", 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 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 saved whiteboard primitive state", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no full React Flow whiteboard parity", contents, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("whiteboard annotations are serialized to clipboard", contents, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("scene export now includes whiteboard annotations", contents, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("clipboard/export now writes annotations", contents, StringComparison.OrdinalIgnoreCase); + } + + foreach (var table in new[] { ExtractIssueWaveTable(englishParity), ExtractIssueWaveTable(chineseParity) }) + { + Assert.Contains("| #244 | `avalonia-node-map-0gi` | Phase 562: whiteboard annotation clipboard/export serialization boundary", table, StringComparison.Ordinal); + Assert.Contains("Depends on Phase 559", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("boundary gate only", table, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("| TBD | TBD | Phase 562", table, StringComparison.Ordinal); + Assert.DoesNotContain("annotation serialization is implemented", table, StringComparison.OrdinalIgnoreCase); + } + + Assert.Contains("Phase 562 records the whiteboard annotation clipboard/export serialization boundary", englishParity, StringComparison.Ordinal); + Assert.Contains("Phase 562 记录 whiteboard annotation clipboard/export serialization boundary", chineseParity, StringComparison.Ordinal); + } + [Fact] public void ParityRoadmapDocs_RecordPhase501PostPhase500QueueRefreshInBothLocales() {