diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index c25b052a..7c327c58 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -399,7 +399,8 @@ {"_type":"issue","id":"avalonia-node-map-3um","title":"Phase 498: define retained migration removal execution gate","description":"## Context\n\nPhase 492 recorded the retained migration removal roadmap as an inventory-now/remove-later slice. Phase 497 has closed and the current parity roadmap lists Phase 498 as the next sequential retained migration removal execution gate.\n\nGitHub: #119\n\nThe project still needs a tracker-backed gate before any retained or compatibility-only API can be deleted. This bead defines that gate without performing deletion, runtime behavior change, public API baseline update, or UI change.\n\n## Scope\n\n- Inspect the current retained migration / compatibility-only inventory and public API baseline references.\n- Update bilingual React Flow parity audit docs to mark Phase 498 as the current retained migration removal execution-gate slice.\n- Define the exact evidence required before a later API-change issue may remove retained APIs: symbol list, blocker tests, support-window criteria, migration evidence, and baseline-update approval path.\n- Add focused docs/regression tests so the gate cannot be silently weakened or confused with actual deletion.\n- Keep this slice docs/tests-only.\n\n## Acceptance Criteria\n\n- Bilingual parity audit docs include a Phase 498 update tied to GitHub #119 and this Beads issue.\n- The Next Issue Wave marks Phase 498 as the current/owned slice and keeps Phase 499+ bounded.\n- The retained removal gate names exact symbol categories or concrete symbols that require evidence before deletion.\n- The docs state that no retained API removal, public API baseline change, runtime behavior change, or UI change is authorized by this slice.\n- Focused docs tests assert the Phase 498 gate in both locales.\n- `dotnet test tests\\\\AsterGraph.Demo.Tests\\\\AsterGraph.Demo.Tests.csproj --configuration Debug --no-restore --filter \"FullyQualifiedName~ReactFlowParityRoadmapDocsTests\"` passes after restore if needed.\n- `dotnet build AsterGraph.sln --configuration Release` passes.\n\n## Out of Scope\n\n- No public API deletion.\n- No `eng/public-api-baseline.txt` mutation except analysis references.\n- No runtime behavior changes.\n- No Demo UI or screenshot-gate changes.\n- No retained bridge removal PR in this slice.\n- No renderer virtualization work.\n\n## Source\n\nSelected from the Phase 497 parity roadmap Next Issue Wave.\r\n","status":"closed","priority":3,"issue_type":"task","assignee":"ExplodingUFO","owner":"1034917216@qq.com","created_at":"2026-05-11T17:23:21Z","created_by":"ExplodingUFO","updated_at":"2026-05-11T17:44:05Z","closed_at":"2026-05-11T17:44:05Z","close_reason":"Completed Phase 498 retained migration removal execution gate. PR #120 merged at ebe8525. Bilingual parity docs now mark GitHub #119 / avalonia-node-map-3um as the current retained removal gate slice, retained migration recipe defines exact pre-removal evidence requirements and candidate surfaces, and focused docs tests guard the no-removal/no-baseline/no-runtime/no-UI boundary. Verified focused ReactFlowParityRoadmapDocsTests, RetainedRouteComparisonClosureDocsTests, Release build, git diff --check, and PR CI run 25686448701 including release-validation.","labels":["docs","parity-roadmap","phase-498","retained-migration"],"dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"avalonia-node-map-j8v","title":"Phase 492: inventory retained migration surfaces and define removal roadmap","description":"GitHub #107. Docs/tests-first retained migration removal planning slice. Inventory retained migration bridge and compatibility-only/removal-policy surfaces, define removal gates before any API deletion, update bilingual parity roadmap, and add focused docs tests. Out of scope: runtime/API/UI changes, deleting retained migration surfaces, or public API baseline updates.","acceptance_criteria":"Bilingual Phase 0 parity docs replace retained migration TBD with GitHub #107 and this bead; public API/support docs include retained migration removal roadmap gates; focused docs/API tests guard retained surface inventory and no-delete-before-policy boundary; focused tests and solution build pass.","status":"closed","priority":3,"issue_type":"task","assignee":"ExplodingUFO","owner":"1034917216@qq.com","created_at":"2026-05-11T14:35:40Z","created_by":"ExplodingUFO","updated_at":"2026-05-11T14:57:18Z","started_at":"2026-05-11T14:35:47Z","closed_at":"2026-05-11T14:57:18Z","close_reason":"Completed Phase 492 retained migration removal roadmap. PR #108 merged at 4ea1e80. Bilingual parity docs now replace the retained migration TBD row with GitHub #107 / avalonia-node-map-j8v, public API inventory docs carry the inventory-now/remove-later removal gate, and focused docs/API tests guard tracker IDs, retained surface inventory, and no-delete-before-policy boundaries. Verified Release build, related Demo docs tests 37/37, related Editor compatibility/architecture tests 10/10, git diff --check, and all PR CI checks including release validation.","dependency_count":0,"dependent_count":0,"comment_count":0} {"_type":"issue","id":"avalonia-node-map-pjf","title":"Infra: Resolve bd doctor server-mode CLI remote warning","description":"After repairing the Windows Dolt path/chunk failure by removing the corrupt local .beads/dolt/avalonia_node_map mirror, bd dolt push succeeds against the Docker-backed server database, but bd doctor still reports Remote Consistency warning because it tries to query CLI remotes from the absent local mirror path. This appears to be a bd doctor/server-mode diagnostic mismatch rather than a sync blocker.","acceptance_criteria":"bd doctor no longer reports Remote Consistency warning in Docker/server mode, or the warning is documented and explicitly ignored for this repository when bd dolt test and bd dolt push both succeed.","notes":"Resolving server-mode bd doctor warning by suppressing known false-positive advisory checks for this Docker SQL-server setup only after confirming bd context uses dolt server mode and bd dolt test succeeds on 127.0.0.1:3306. No container stop/restart and no local Dolt mirror rebuild.","status":"closed","priority":3,"issue_type":"bug","assignee":"ExplodingUFO","owner":"1034917216@qq.com","created_at":"2026-04-28T07:06:28Z","created_by":"ExplodingUFO","updated_at":"2026-04-28T08:02:34Z","started_at":"2026-04-28T08:00:56Z","closed_at":"2026-04-28T08:02:34Z","close_reason":"Resolved by configuring bd doctor suppressions for known Docker/server-mode advisory false positives: doctor.suppress.remote-consistency=true and doctor.suppress.federation-remotesapi=true. Verified bd doctor --server passes all six server checks against 127.0.0.1:3306, bd dolt test succeeds, and normal bd doctor now only reports the expected uncommitted-export warning before commit. Docker container was not stopped or restarted.","dependencies":[{"issue_id":"avalonia-node-map-pjf","depends_on_id":"avalonia-node-map-c6a","type":"discovered-from","created_at":"2026-04-28T07:06:27Z","created_by":"ExplodingUFO","metadata":"{}"}],"dependency_count":0,"dependent_count":0,"comment_count":0} -{"_type":"issue","id":"avalonia-node-map-bck","title":"Phase 556: whiteboard primitive persistence implementation decision","description":"## Context\nGitHub issue: https://github.com/ExplodingUFO/AsterGraph/issues/230\n\nPhase 549 records that current whiteboard primitives are excluded from the current GraphDocument schema and should use a separate annotation surface until a later schema-changing issue proves migration and compatibility safety. After activation, pointer capture, toolbar/Cookbook UX, and eraser behavior have landed, persistence can be revisited as a separate policy-backed implementation phase.\n\nThis phase owns the first saved whiteboard primitive state route only if the preceding authoring behavior is stable and the schema/persistence boundary is still appropriate.\n\n## Scope\nImplement or explicitly defer the first saved whiteboard primitive state route:\n- revisit the Phase 549 separate annotation surface decision with current implementation evidence;\n- decide whether persisted whiteboard primitives belong in GraphDocument schema, a separate sidecar/annotation store, or remain deferred;\n- if implemented, define schema/version/migration behavior and compatibility coverage;\n- prove workspace persistence, clipboard/export boundaries, and screenshot artifact boundaries;\n- document migration and compatibility implications clearly.\n\n## Out of scope\nNo pointer coordinator redesign, no toolbar redesign, no eraser implementation, no renderer rewrite, no unrelated GraphDocument schema cleanup, no retained API removal, and no full React Flow whiteboard parity claim.\n\n## Dependency / stacking\nDepends on Phase 555 and must not merge before the eraser behavior route lands or is explicitly deferred by tracker decision.\r\n","acceptance_criteria":"The persistence route is either implemented with explicit schema/version/migration coverage or intentionally deferred with evidence; GraphDocument compatibility, workspace persistence, clipboard/export boundaries, and screenshot artifact boundaries are tested or explicitly ruled out; docs state the chosen persistence policy and migration implications; verification includes focused persistence/compatibility tests, full affected test project(s), and git diff --check.","notes":"2026-05-13: Claiming Phase 556 implementation prep. Starting stacked worktree .worktrees/phase-556-whiteboard-persistence-decision from feature/phase-555-whiteboard-eraser-behavior / PR #235. First pass is evidence-first: revisit Phase 549 separate annotation decision against the now-landed activation, pointer capture, toolbar/Cookbook UX, and eraser behavior; decide whether to implement sidecar/annotation persistence or intentionally defer. Scope excludes pointer coordinator redesign, toolbar redesign, eraser implementation, renderer rewrite, unrelated GraphDocument schema cleanup, retained API removal, and full React Flow whiteboard parity claim. Merge remains blocked until Phase 555 / PR #235 and lower stack land.\nImplemented Phase 556 as deferred whiteboard primitive persistence decision. PR: https://github.com/ExplodingUFO/AsterGraph/pull/236 (base feature/phase-555-whiteboard-eraser-behavior / PR #235). Verification: Editor.Tests Release full 882 passed; Demo.Tests Release full 301 passed; focused editor boundary slice 20 passed; focused docs/cookbook slice 74 passed; public API validation PUBLIC_API_DIFF_GATE_OK:True; git diff --check exit 0 with CRLF warnings only. Blocked until Phase 555 / PR #235 and lower stack land; lowest known blocker remains PR #200 review.\nPR #236 CI reached green on head 9d15413: hygiene-proof, framework-matrix net8.0/net9.0/net10.0, linux-validation, macos-validation, contract-proof, and release-validation all passed across the branch/PR check sets. PR remains BLOCKED only for stack order behind Phase 555 / PR #235 and lower stack; lowest known blocker remains PR #200 review.","status":"blocked","priority":4,"issue_type":"task","assignee":"ExplodingUFO","owner":"1034917216@qq.com","created_at":"2026-05-13T05:29:38Z","created_by":"ExplodingUFO","updated_at":"2026-05-13T11:50:47Z","started_at":"2026-05-13T11:06:23Z","external_ref":"gh-230","labels":["enhancement"],"dependencies":[{"issue_id":"avalonia-node-map-bck","depends_on_id":"avalonia-node-map-71c","type":"blocks","created_at":"2026-05-13T13:29:37Z","created_by":"ExplodingUFO","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"avalonia-node-map-zfe","title":"Phase 557: whiteboard annotation store contract gate","description":"## Context\nGitHub issue: https://github.com/ExplodingUFO/AsterGraph/issues/237\n\nPhase 556 / GitHub #230 intentionally deferred saved whiteboard primitive state until AsterGraph has a separate annotation-store contract. The current whiteboard stack now has internal primitive model, renderer-neutral projection, pointer gesture capture, hosted authoring actions, Cookbook route metadata, eraser-on-primitive behavior, and a persistence decision that keeps GraphDocument schema untouched.\n\nThis phase defines the next narrow contract gate for a separate whiteboard annotation store before any persisted primitive state, schema migration, or workspace behavior is implemented.\n\n## Scope\nCreate a docs/tests-only annotation-store contract gate that answers what a future implementation must define before saving whiteboard primitives:\n- store ownership and lifetime relative to GraphDocument, workspaces, clipboard fragments, scene export, and screenshot artifacts;\n- minimum annotation identity, primitive reference, style/geometry serialization, edit lifecycle, and migration metadata required by the contract;\n- read/write API boundary candidates without adding a public API or persistence implementation in this slice;\n- compatibility and migration proof requirements before a later issue may persist primitive state;\n- EN/ZH parity docs and focused tests that prevent accidental claims of saved whiteboard state.\n\n## Out of scope\nNo 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 rewrite, no pointer coordinator edits, no toolbar changes, no eraser changes, no retained API removal, and no full React Flow whiteboard parity claim.\n\n## Dependency / stacking\nDepends on Phase 556 / PR #236 and must not merge before Phase 556 and the lower whiteboard stack land. May be implemented as a stacked docs/tests branch on top of feature/phase-556-whiteboard-persistence-decision while PR #236 is blocked.","acceptance_criteria":"EN/ZH React Flow parity audit docs record Phase 557 with GitHub #237 and this Beads issue; docs define a separate annotation-store contract gate with ownership, lifetime, identity, serialization, migration, workspace, clipboard/export, screenshot, and compatibility requirements; docs explicitly state that Phase 557 does not implement saved whiteboard primitive state or mutate GraphDocument/workspace/clipboard/export/screenshot behavior; focused docs tests fail if the annotation-store gate is missing, claims persistence is implemented, or omits the required boundaries; verification includes focused Phase 557 roadmap-doc tests, full ReactFlowParityRoadmapDocsTests, full AsterGraph.Demo.Tests, and git diff --check.","notes":"2026-05-13: Claiming Phase 557 docs/tests-only annotation-store contract gate. Starting stacked branch after Phase 556 / PR #236; must remain blocked for stack ordering behind PR #236 and lower whiteboard stack. Scope is contract documentation and focused guard tests 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 rewrite, no pointer coordinator edits, no toolbar/eraser changes, no retained API removal, and no full React Flow whiteboard parity claim.\nImplemented Phase 557 docs/tests-only annotation-store contract gate. PR: https://github.com/ExplodingUFO/AsterGraph/pull/238 (base feature/phase-556-whiteboard-persistence-decision / PR #236). Verification passed: focused Phase 557 roadmap-doc test 1/1; ReactFlowParityRoadmapDocsTests 57/57; full AsterGraph.Demo.Tests 302/302; git diff --check exit 0 with CRLF notices only. Scope remains contract docs/tests 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, and no full React Flow whiteboard parity. Blocked until Phase 556 / PR #236 and lower stack land; lowest known blocker remains PR #200 review.\n2026-05-13: PR #238 CI reached green on head 06545a6: hygiene-proof, framework-matrix net8.0/net9.0/net10.0, linux-validation, macos-validation, contract-proof, and release-validation all passed across branch/PR check sets. Keep BLOCKED only for stacked merge ordering behind Phase 556 / PR #236 and lower stack; lowest known blocker remains PR #200 review.\n2026-05-13: PR #238 final head a3c1e67 also reached green after the CI handoff commit: hygiene-proof, framework-matrix net8.0/net9.0/net10.0, linux-validation, macos-validation, contract-proof, and release-validation all passed across branch/PR check sets. PR remains BLOCKED only for stack ordering behind Phase 556 / PR #236 and lower stack; lowest known blocker remains PR #200 review.","status":"blocked","priority":4,"issue_type":"task","assignee":"ExplodingUFO","owner":"1034917216@qq.com","created_at":"2026-05-13T12:13:39Z","created_by":"ExplodingUFO","updated_at":"2026-05-13T12:50:41Z","started_at":"2026-05-13T12:13:59Z","external_ref":"gh-237","labels":["enhancement"],"dependencies":[{"issue_id":"avalonia-node-map-zfe","depends_on_id":"avalonia-node-map-bck","type":"blocks","created_at":"2026-05-13T20:13:58Z","created_by":"ExplodingUFO","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} +{"_type":"issue","id":"avalonia-node-map-bck","title":"Phase 556: whiteboard primitive persistence implementation decision","description":"## Context\nGitHub issue: https://github.com/ExplodingUFO/AsterGraph/issues/230\n\nPhase 549 records that current whiteboard primitives are excluded from the current GraphDocument schema and should use a separate annotation surface until a later schema-changing issue proves migration and compatibility safety. After activation, pointer capture, toolbar/Cookbook UX, and eraser behavior have landed, persistence can be revisited as a separate policy-backed implementation phase.\n\nThis phase owns the first saved whiteboard primitive state route only if the preceding authoring behavior is stable and the schema/persistence boundary is still appropriate.\n\n## Scope\nImplement or explicitly defer the first saved whiteboard primitive state route:\n- revisit the Phase 549 separate annotation surface decision with current implementation evidence;\n- decide whether persisted whiteboard primitives belong in GraphDocument schema, a separate sidecar/annotation store, or remain deferred;\n- if implemented, define schema/version/migration behavior and compatibility coverage;\n- prove workspace persistence, clipboard/export boundaries, and screenshot artifact boundaries;\n- document migration and compatibility implications clearly.\n\n## Out of scope\nNo pointer coordinator redesign, no toolbar redesign, no eraser implementation, no renderer rewrite, no unrelated GraphDocument schema cleanup, no retained API removal, and no full React Flow whiteboard parity claim.\n\n## Dependency / stacking\nDepends on Phase 555 and must not merge before the eraser behavior route lands or is explicitly deferred by tracker decision.\r\n","acceptance_criteria":"The persistence route is either implemented with explicit schema/version/migration coverage or intentionally deferred with evidence; GraphDocument compatibility, workspace persistence, clipboard/export boundaries, and screenshot artifact boundaries are tested or explicitly ruled out; docs state the chosen persistence policy and migration implications; verification includes focused persistence/compatibility tests, full affected test project(s), and git diff --check.","notes":"2026-05-13: Claiming Phase 556 implementation prep. Starting stacked worktree .worktrees/phase-556-whiteboard-persistence-decision from feature/phase-555-whiteboard-eraser-behavior / PR #235. First pass is evidence-first: revisit Phase 549 separate annotation decision against the now-landed activation, pointer capture, toolbar/Cookbook UX, and eraser behavior; decide whether to implement sidecar/annotation persistence or intentionally defer. Scope excludes pointer coordinator redesign, toolbar redesign, eraser implementation, renderer rewrite, unrelated GraphDocument schema cleanup, retained API removal, and full React Flow whiteboard parity claim. Merge remains blocked until Phase 555 / PR #235 and lower stack land.\nImplemented Phase 556 as deferred whiteboard primitive persistence decision. PR: https://github.com/ExplodingUFO/AsterGraph/pull/236 (base feature/phase-555-whiteboard-eraser-behavior / PR #235). Verification: Editor.Tests Release full 882 passed; Demo.Tests Release full 301 passed; focused editor boundary slice 20 passed; focused docs/cookbook slice 74 passed; public API validation PUBLIC_API_DIFF_GATE_OK:True; git diff --check exit 0 with CRLF warnings only. Blocked until Phase 555 / PR #235 and lower stack land; lowest known blocker remains PR #200 review.\nPR #236 CI reached green on head 9d15413: hygiene-proof, framework-matrix net8.0/net9.0/net10.0, linux-validation, macos-validation, contract-proof, and release-validation all passed across the branch/PR check sets. PR remains BLOCKED only for stack order behind Phase 555 / PR #235 and lower stack; lowest known blocker remains PR #200 review.","status":"blocked","priority":4,"issue_type":"task","assignee":"ExplodingUFO","owner":"1034917216@qq.com","created_at":"2026-05-13T05:29:38Z","created_by":"ExplodingUFO","updated_at":"2026-05-13T11:50:47Z","started_at":"2026-05-13T11:06:23Z","external_ref":"gh-230","labels":["enhancement"],"dependencies":[{"issue_id":"avalonia-node-map-bck","depends_on_id":"avalonia-node-map-71c","type":"blocks","created_at":"2026-05-13T13:29:37Z","created_by":"ExplodingUFO","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} {"_type":"issue","id":"avalonia-node-map-3c9","title":"Phase 551: post-Phase-550 whiteboard authoring interaction queue refresh","description":"## Context\nGitHub issue: https://github.com/ExplodingUFO/AsterGraph/issues/225\n\nPhase 550 / PR #224 records the first whiteboard primitive Cookbook screenshot implementation gate on top of the stacked Phase 547-549 model, renderer-adapter, and persistence-decision work. That stack is currently blocked behind the required review on PR #200, but the next authoring wave still needs to be split before any public drawing tool, pointer coordinator, toolbar UX, eraser behavior, or persisted whiteboard primitive claim is attempted.\n\nAsterGraph now has internal whiteboard primitive model/projection/policy/visual-proof evidence in the stacked PR series, but it still does not have React Flow-style whiteboard authoring parity. The next step should be another docs/tests-only queue refresh that turns the remaining authoring pressure into small, dependency-aware issues with explicit write sets.\n\n## Scope\nCreate a bounded post-Phase-550 whiteboard authoring interaction queue refresh:\n- inspect the current Phase 547-550 roadmap entries and stacked PR boundaries;\n- identify the smallest next tracker-backed slices for public drawing tool activation, pointer gesture capture, authoring toolbar/Cookbook UX, eraser-on-primitive behavior, and any later persistence/schema work;\n- create GitHub and Beads follow-up issues for the selected next slices with priorities, dependencies, and parallelism notes;\n- update EN/ZH React Flow parity roadmap docs with Phase 551 plus the new follow-up rows;\n- add focused docs tests that fail if the post-Phase-550 authoring wave is still implicit or TBD;\n- preserve the stack ordering behind PR #224 and do not merge this before Phase 550.\n\n## Out of scope\nNo runtime behavior changes, no public API changes, no pointer coordinator edits, no toolbar implementation, no eraser implementation, no persistence/schema changes, no renderer rewrite, no screenshot manifest expansion, no UI redesign, no retained API removal, and no full React Flow whiteboard parity claim.\n\n## Dependency / stacking\nThis issue should be implemented as a stacked docs/tests branch on top of `feature/phase-550-whiteboard-cookbook-screenshot-gate` / PR #224 and must not merge before Phase 550. It should not disturb the existing blocked stack behind PR #200.\r\n","acceptance_criteria":"EN/ZH parity docs record Phase 551 with GitHub #225 and this Beads ID; docs convert post-Phase-550 authoring pressure into concrete tracker-backed follow-up rows with GitHub and Beads IDs, priorities, write sets, dependencies, and parallelism guidance; follow-up rows explicitly separate public tool activation, pointer gesture capture, toolbar/Cookbook UX, eraser behavior, and persistence/schema work; focused docs tests guard the Phase 551 queue in both locales and fail if the next authoring wave remains TBD or implies full React Flow whiteboard parity; verification includes the focused Phase 551 roadmap-doc test, full ReactFlowParityRoadmapDocsTests, full AsterGraph.Demo.Tests, and git diff --check.","notes":"2026-05-13: Created GitHub #225 for Phase 551 as a docs/tests-only post-Phase-550 authoring interaction queue refresh. It depends on Phase 550 / avalonia-node-map-wjr and should be implemented as a stacked branch on feature/phase-550-whiteboard-cookbook-screenshot-gate / PR #224. Scope excludes runtime behavior, public API, pointer coordinator, toolbar, eraser, persistence/schema, renderer, screenshot manifest, UI redesign, retained API removal, and full React Flow whiteboard parity.\n2026-05-13: Created isolated stacked worktree .worktrees/phase-551-whiteboard-authoring-queue on branch docs/phase-551-whiteboard-authoring-queue from feature/phase-550-whiteboard-cookbook-screenshot-gate at bcd8a5b. Baseline verification passed: dotnet test tests/AsterGraph.Demo.Tests/AsterGraph.Demo.Tests.csproj -c Release --filter FullyQualifiedName~ReactFlowParityRoadmapDocsTests --verbosity minimal (50 passed) and git diff --check. Next work should update EN/ZH parity docs plus focused roadmap-doc tests only.\n2026-05-13: Implemented Phase 551 docs/tests-only queue refresh on commit df935ff and opened stacked PR https://github.com/ExplodingUFO/AsterGraph/pull/231 against feature/phase-550-whiteboard-cookbook-screenshot-gate / PR #224. Verification passed: focused Phase 551 roadmap-doc test 1/1, ReactFlowParityRoadmapDocsTests 51/51, full AsterGraph.Demo.Tests 294/294, dotnet build AsterGraph.sln -c Release -v:minimal 0 warnings/0 errors, and git diff --check exit 0 with LF-to-CRLF notices only. PR #231 is mergeable but initially UNSTABLE while GitHub CI is running; keep blocked for stack ordering and do not merge before Phase 550 / PR #224 and earlier stack land.\n2026-05-13: GitHub PR #231 reached CLEAN/MERGEABLE with all CI checks green on head df935ffc2eee91cac449b936d8476fe016d972bf: hygiene-proof, framework-matrix net8.0/net9.0/net10.0, linux-validation, macos-validation, contract-proof, and release-validation. Still blocked only for stacked merge ordering behind Phase 550 / PR #224 and earlier stack; do not merge out of order.","status":"blocked","priority":4,"issue_type":"task","assignee":"ExplodingUFO","owner":"1034917216@qq.com","created_at":"2026-05-13T05:24:41Z","created_by":"ExplodingUFO","updated_at":"2026-05-13T05:49:49Z","started_at":"2026-05-13T05:24:56Z","external_ref":"gh-225","labels":["documentation"],"dependencies":[{"issue_id":"avalonia-node-map-3c9","depends_on_id":"avalonia-node-map-wjr","type":"blocks","created_at":"2026-05-13T13:24:40Z","created_by":"ExplodingUFO","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} {"_type":"issue","id":"avalonia-node-map-0l9","title":"Phase 546: post-Phase-545 whiteboard implementation queue refresh","description":"## Context\nPhase 542 through Phase 545 recorded the whiteboard primitive model, renderer/hit-testing, persistence/schema, and Cookbook/screenshot proof gates as docs/tests-only slices. The PR stack is green but still review-blocked, so the next safe slice should not start runtime whiteboard implementation or widen parity claims.\n\n## Scope\nRefresh the React Flow parity roadmap after Phase 545 by recording Phase 545 as the latest whiteboard proof-route gate, replacing stale future-candidate wording for Phases 542-545 with completed/stacked gate status, defining the next tracker-backed follow-up candidates after the current stack, and keeping stacked PR order explicit.\n\n## Out of scope\nNo runtime behavior changes, no public API changes, no production model/schema changes, no renderer-layer changes, no screenshot manifest expansion, no Avalonia pointer coordinator edits, no UI redesign, no drawing tool implementation, no eraser behavior, no toolbar work, no retained API removal, and no full React Flow whiteboard parity claim.\n\n## Dependency\nDepends on Phase 545 and should be stacked after PR #214. This issue may be implemented as docs/tests-only while earlier PRs wait for review, but it must not claim those earlier PRs have merged.","acceptance_criteria":"Docs/tests record the post-Phase-545 queue in both locales; Phases 542-545 are no longer described as future candidates in the queue rows; at least two concrete next follow-up candidates are listed with write-set boundaries; no production/runtime/schema/renderer/screenshot-manifest files are changed.","notes":"2026-05-13: Implemented docs/tests-only Phase 546 on docs/phase-546-post-whiteboard-queue. PR #216 opened: https://github.com/ExplodingUFO/AsterGraph/pull/216. Local verification passed: focused Phase 546 docs test, ReactFlowParityRoadmapDocsTests 44/44, Release build 0 warnings/errors, AsterGraph.Demo.Tests 286/286, git diff --check with LF-to-CRLF warnings only. GitHub CI is green, including release-validation; PR #216 is mergeable/CLEAN. Blocked pending stacked PR order and review; do not merge before Phase 545 / PR #214.\n2026-05-13: Restacked PR #216 onto updated feature/phase-545-whiteboard-cookbook-screenshot-proof / PR #214 after Phase 545 was rebased. New head 90be547; PR is CLEAN/MERGEABLE with all GitHub checks passing. Local verification passed: focused Phase 546 roadmap-doc test, full ReactFlowParityRoadmapDocsTests, full AsterGraph.Demo.Tests, and git diff --check. Still do not merge before PR #214 / Phase 545 and earlier stack.","status":"blocked","priority":4,"issue_type":"task","assignee":"ExplodingUFO","owner":"1034917216@qq.com","created_at":"2026-05-12T22:31:25Z","created_by":"ExplodingUFO","updated_at":"2026-05-13T04:05:44Z","started_at":"2026-05-12T22:31:36Z","external_ref":"gh-215","labels":["documentation"],"dependencies":[{"issue_id":"avalonia-node-map-0l9","depends_on_id":"avalonia-node-map-7ns","type":"blocks","created_at":"2026-05-13T06:31:36Z","created_by":"ExplodingUFO","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} {"_type":"issue","id":"avalonia-node-map-7ns","title":"Phase 545: whiteboard Cookbook and screenshot proof route gate","description":"## Context\nReact Flow parity claims need demo and visual proof, but AsterGraph must not add screenshot manifest rows before the model, renderer, and persistence boundaries are clear.\n\n## Scope\nDefine the Cookbook/screenshot proof route for future whiteboard primitives:\n- decide what example route, shell state, and screenshot metadata would prove rectangle/freehand drawing primitives;\n- define before/after visual evidence and non-overlap requirements;\n- keep this as a proof-route gate until model, renderer, and persistence issues establish implementation behavior.\n\n## Out of scope\nNo screenshot manifest expansion in this gate, no UI redesign, no drawing tool implementation, no renderer changes, no persistence/schema changes, no pointer coordinator edits, no retained API removal, and no full React Flow whiteboard parity claim.\n\n## Dependency\nDepends on Phase 541 and should follow model/renderer/persistence readiness decisions.","acceptance_criteria":"The issue remains blocked until Phase 541 lands; docs/tests define the future Cookbook route, shell-state, screenshot metadata, and visual proof requirements; no screenshot manifest rows or UI behavior are added in the gate; acceptance keeps model, renderer, persistence, and pointer behavior as separate dependencies.","notes":"2026-05-13: Implemented docs/tests-only Phase 545 on feature/phase-545-whiteboard-cookbook-screenshot-proof. PR #214 opened: https://github.com/ExplodingUFO/AsterGraph/pull/214. Local verification passed: focused Phase 545 docs test, ReactFlowParityRoadmapDocsTests 43/43, AsterGraph.Demo.Tests 285/285, git diff --check with LF-to-CRLF warnings only. Blocked pending stacked PR order and CI/review.\n2026-05-13: Restacked PR #214 onto updated feature/phase-544-whiteboard-persistence-schema / PR #213 after Phase 544 was rebased. New head ab01076; PR is CLEAN/MERGEABLE with all GitHub checks passing. Local verification passed: focused Phase 545 roadmap-doc test, full ReactFlowParityRoadmapDocsTests, full AsterGraph.Demo.Tests, and git diff --check. Still do not merge before PR #213 / Phase 544 and earlier stack.","status":"blocked","priority":4,"issue_type":"task","assignee":"ExplodingUFO","owner":"1034917216@qq.com","created_at":"2026-05-12T21:30:06Z","created_by":"ExplodingUFO","updated_at":"2026-05-13T03:51:35Z","external_ref":"gh-209","labels":["documentation"],"dependencies":[{"issue_id":"avalonia-node-map-7ns","depends_on_id":"avalonia-node-map-2z1","type":"blocks","created_at":"2026-05-13T05:30:09Z","created_by":"ExplodingUFO","metadata":"{}"}],"dependency_count":1,"dependent_count":1,"comment_count":0} diff --git a/docs/en/phase-0-reactflow-parity-audit.md b/docs/en/phase-0-reactflow-parity-audit.md index abcc627a..db48c575 100644 --- a/docs/en/phase-0-reactflow-parity-audit.md +++ b/docs/en/phase-0-reactflow-parity-audit.md @@ -615,6 +615,8 @@ Phase 555 records the whiteboard primitive eraser behavior route through GitHub Phase 556 records the whiteboard primitive persistence deferred decision through GitHub #230 / `avalonia-node-map-bck`. It keeps `GraphWhiteboardPrimitivePersistenceOutcome.DeferredUntilSeparateAnnotationStoreContract` as the current outcome and records `GraphWhiteboardPrimitivePersistenceBoundary` coverage across `GraphDocumentCompatibility`, `WorkspacePersistence`, `ClipboardFragment`, `ScreenshotArtifact`, and `SceneExportArtifact`, while leaving 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 records the whiteboard annotation store contract gate through GitHub #237 / `avalonia-node-map-zfe`. It defines `WHITEBOARD_ANNOTATION_STORE_CONTRACT_GATE` as the next separate annotation-store contract before saved whiteboard primitives may exist: future work must define store ownership, store lifetime, annotation identity, primitive reference rules, style/geometry serialization, edit lifecycle serialization, migration metadata, read/write API boundary candidates, and compatibility proof across `GraphDocumentCompatibility`, `WorkspacePersistence`, `ClipboardFragment`, `SceneExportArtifact`, and `ScreenshotArtifact`. This gate 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. + | 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. | @@ -639,6 +641,7 @@ Phase 556 records the whiteboard primitive persistence deferred decision through | #228 | `avalonia-node-map-kpy` | Phase 554: whiteboard authoring toolbar and Cookbook UX route | P3 | hosted authoring actions, Cookbook route, screenshot proof metadata, and non-overlap visual evidence | Depends on Phase 553. Owns authoring toolbar/Cookbook UX after pointer capture; no new core model design, pointer coordinator redesign, eraser behavior, GraphDocument schema changes, persisted whiteboard primitive claim, renderer rewrite, or full whiteboard parity claim. | | #229 | `avalonia-node-map-71c` | Phase 555: whiteboard primitive eraser behavior route | P3 | eraser-on-primitive behavior tests, primitive hit-testing, and graph-deletion separation | Depends on Phase 554. Owns eraser-on-primitive behavior only; graph-selection delete remains separate and no broad eraser cursor redesign, GraphDocument schema changes, renderer rewrite, retained API removal, or full whiteboard parity claim is authorized. | | #230 | `avalonia-node-map-bck` | Phase 556: whiteboard primitive persistence implementation decision | P4 | persistence implementation decision, schema/version evidence, workspace and clipboard boundaries | Depends on Phase 555; 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. | ## Recommended Parallel Worktree Plan @@ -696,6 +699,7 @@ Phase 556 records the whiteboard primitive persistence deferred decision through - `visual/phase-554-whiteboard-authoring-cookbook`: owns #228 / `avalonia-node-map-kpy`; future hosted authoring toolbar and Cookbook UX worktree after Phase 553. - `feature/phase-555-whiteboard-eraser-behavior`: owns #229 / `avalonia-node-map-71c`; current stacked implementation worktree for eraser-on-primitive behavior after Phase 554, with graph `selection.delete`, persistence/schema, renderer rewrite, and full whiteboard parity out of scope. - `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. ## UI Verification Policy @@ -768,4 +772,5 @@ Current coverage includes scene-level route captures plus ten manifest-driven fu - Phase 554 is GitHub #228 / `avalonia-node-map-kpy`; it records the whiteboard authoring toolbar and Cookbook UX route through `whiteboard-authoring-cookbook-route`, `CreateWhiteboardDrawingToolActions(...)`, `AuthoringToolsChrome_ProjectsWhiteboardDrawingActionsThroughNodeCanvasDrawingMode`, `PART_WhiteboardDrawingRectangleButton`, `PART_WhiteboardDrawingFreehandButton`, `cookbook-whiteboard-authoring-cookbook-route`, `shell-cookbook-whiteboard-authoring-cookbook-route`, and `WHITEBOARD_AUTHORING_COOKBOOK_UX_OK`. New core model design, pointer coordinator redesign, eraser behavior, persisted whiteboard primitive state, GraphDocument schema changes, renderer rewrites, and full React Flow whiteboard parity remain out of scope. - Phase 555 is GitHub #229 / `avalonia-node-map-71c`; it records the whiteboard primitive eraser behavior route through `NodeCanvasWhiteboardDrawingMode.Eraser`, `whiteboard-drawing.eraser`, `PART_WhiteboardEraserButton`, `TryEraseWhiteboardPrimitive_RemovesTopmostHitPrimitiveWithoutClearingOthers`, and `HandlePressed_WithWhiteboardEraserMode_RemovesHitPrimitiveWithoutDeletingGraphSelection`. Graph-selection delete remains separate through graph `selection.delete`; broad eraser cursor redesign, persisted whiteboard primitive state, GraphDocument schema changes, renderer rewrites, retained API removal, and full React Flow whiteboard parity remain out of scope. - 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. -- Product code remains out of scope for Phase 478, Phase 484, Phase 490, Phase 491, Phase 492, Phase 493, Phase 494, Phase 495, Phase 497, Phase 498, Phase 499, Phase 500, Phase 501, Phase 502, Phase 503, Phase 504, Phase 505, Phase 506, Phase 507, Phase 508, Phase 509, Phase 510, Phase 511, Phase 512, Phase 513, Phase 520, Phase 521, Phase 522, Phase 523, Phase 524, Phase 525, Phase 526, Phase 527, Phase 528, Phase 529, Phase 535, Phase 539, Phase 540, Phase 541, Phase 546, Phase 550, and Phase 551 unless a focused test proves a specific missing contract. +- 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. +- 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 02e176c9..8203edf9 100644 --- a/docs/zh-CN/phase-0-reactflow-parity-audit.md +++ b/docs/zh-CN/phase-0-reactflow-parity-audit.md @@ -615,6 +615,8 @@ Phase 555 记录 whiteboard primitive eraser behavior route,通过 GitHub #229 Phase 556 记录 whiteboard primitive persistence deferred decision,通过 GitHub #230 / `avalonia-node-map-bck`。它把 `GraphWhiteboardPrimitivePersistenceOutcome.DeferredUntilSeparateAnnotationStoreContract` 保持为当前 outcome,并用 `GraphWhiteboardPrimitivePersistenceBoundary` 覆盖 `GraphDocumentCompatibility`、`WorkspacePersistence`、`ClipboardFragment`、`ScreenshotArtifact` 和 `SceneExportArtifact`;同时保持 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 记录 whiteboard annotation store contract gate,通过 GitHub #237 / `avalonia-node-map-zfe`。它把 `WHITEBOARD_ANNOTATION_STORE_CONTRACT_GATE` 定义为 saved whiteboard primitives 之前必须先具备的 separate annotation-store contract:后续实现必须明确 store ownership、store lifetime、annotation identity、primitive reference 规则、style/geometry serialization、edit lifecycle serialization、migration metadata、read/write API boundary candidates,以及覆盖 `GraphDocumentCompatibility`、`WorkspacePersistence`、`ClipboardFragment`、`SceneExportArtifact` 和 `ScreenshotArtifact` 的 compatibility proof。本 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 和 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。 | @@ -639,6 +641,7 @@ Phase 556 记录 whiteboard primitive persistence deferred decision,通过 Git | #228 | `avalonia-node-map-kpy` | Phase 554: whiteboard authoring toolbar and Cookbook UX route | P3 | hosted authoring actions、Cookbook route、screenshot proof metadata 和 non-overlap visual evidence | Depends on Phase 553。pointer capture 之后负责 authoring toolbar/Cookbook UX;不做 new core model design、pointer coordinator redesign、eraser behavior、GraphDocument schema changes、persisted whiteboard primitive claim、renderer rewrite 或 full whiteboard parity claim。 | | #229 | `avalonia-node-map-71c` | Phase 555: whiteboard primitive eraser behavior route | P3 | eraser-on-primitive behavior tests、primitive hit-testing 和 graph-deletion separation | Depends on Phase 554。只负责 eraser-on-primitive behavior;graph-selection delete 保持分离,不授权 broad eraser cursor redesign、GraphDocument schema changes、renderer rewrite、retained API removal 或 full whiteboard parity claim。 | | #230 | `avalonia-node-map-bck` | Phase 556: whiteboard primitive persistence implementation decision | P4 | persistence implementation decision、schema/version evidence、workspace and clipboard boundaries | Depends on Phase 555;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。 | ## 推荐并行 Worktree 计划 @@ -696,6 +699,7 @@ Phase 556 记录 whiteboard primitive persistence deferred decision,通过 Git - `visual/phase-554-whiteboard-authoring-cookbook`:负责 #228 / `avalonia-node-map-kpy`;Phase 553 之后的 future hosted authoring toolbar and Cookbook UX worktree。 - `feature/phase-555-whiteboard-eraser-behavior`:负责 #229 / `avalonia-node-map-71c`;Phase 554 之后的 current stacked implementation worktree,用于 eraser-on-primitive behavior,graph `selection.delete`、persistence/schema、renderer rewrite 和 full whiteboard parity 都保持 out of scope。 - `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。 ## UI 验证策略 @@ -768,4 +772,5 @@ Phase 556 记录 whiteboard primitive persistence deferred decision,通过 Git - Phase 554 是 GitHub #228 / `avalonia-node-map-kpy`;它通过 `whiteboard-authoring-cookbook-route`、`CreateWhiteboardDrawingToolActions(...)`、`AuthoringToolsChrome_ProjectsWhiteboardDrawingActionsThroughNodeCanvasDrawingMode`、`PART_WhiteboardDrawingRectangleButton`、`PART_WhiteboardDrawingFreehandButton`、`cookbook-whiteboard-authoring-cookbook-route`、`shell-cookbook-whiteboard-authoring-cookbook-route` 和 `WHITEBOARD_AUTHORING_COOKBOOK_UX_OK` 记录 whiteboard authoring toolbar and Cookbook UX route。New core model design、pointer coordinator redesign、eraser behavior、persisted whiteboard primitive state、GraphDocument schema changes、renderer rewrites 和 full React Flow whiteboard parity 都保持 out of scope。 - Phase 555 是 GitHub #229 / `avalonia-node-map-71c`;它通过 `NodeCanvasWhiteboardDrawingMode.Eraser`、`whiteboard-drawing.eraser`、`PART_WhiteboardEraserButton`、`TryEraseWhiteboardPrimitive_RemovesTopmostHitPrimitiveWithoutClearingOthers` 和 `HandlePressed_WithWhiteboardEraserMode_RemovesHitPrimitiveWithoutDeletingGraphSelection` 记录 whiteboard primitive eraser behavior route。Graph-selection delete 仍通过 graph `selection.delete` 分离;broad eraser cursor redesign、persisted whiteboard primitive state、GraphDocument schema changes、renderer rewrites、retained API removal 和 full React Flow whiteboard parity 都保持 out of scope。 - 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 478、Phase 484、Phase 490、Phase 491、Phase 492、Phase 493、Phase 494、Phase 495、Phase 497、Phase 498、Phase 499、Phase 500、Phase 501、Phase 502、Phase 503、Phase 504、Phase 505、Phase 506、Phase 507、Phase 508、Phase 509、Phase 510、Phase 511、Phase 512、Phase 513、Phase 520、Phase 521、Phase 522、Phase 523、Phase 524、Phase 525、Phase 526、Phase 527、Phase 528、Phase 529、Phase 535、Phase 539、Phase 540、Phase 541、Phase 546、Phase 550 和 Phase 551 都不修改产品代码;除非 focused test 证明存在具体 missing contract。 +- 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 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 badf217d..f2f5964f 100644 --- a/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs +++ b/tests/AsterGraph.Demo.Tests/ReactFlowParityRoadmapDocsTests.cs @@ -1795,6 +1795,59 @@ public void ParityRoadmapDocs_RecordPhase556WhiteboardPersistenceDeferredDecisio Assert.Contains("Phase 556 记录 whiteboard primitive persistence deferred decision", chineseParity, StringComparison.Ordinal); } + [Fact] + public void ParityRoadmapDocs_RecordPhase557WhiteboardAnnotationStoreContractGateInBothLocales() + { + 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 557", contents, StringComparison.Ordinal); + Assert.Contains("GitHub #237", contents, StringComparison.Ordinal); + Assert.Contains("avalonia-node-map-zfe", contents, StringComparison.Ordinal); + Assert.Contains("whiteboard annotation store contract gate", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("WHITEBOARD_ANNOTATION_STORE_CONTRACT_GATE", contents, StringComparison.Ordinal); + Assert.Contains("separate annotation-store contract", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("store ownership", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("store lifetime", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("annotation identity", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("primitive reference", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("style/geometry serialization", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("edit lifecycle", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("migration metadata", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("read/write API boundary", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("GraphDocumentCompatibility", contents, StringComparison.Ordinal); + Assert.Contains("WorkspacePersistence", contents, StringComparison.Ordinal); + Assert.Contains("ClipboardFragment", contents, StringComparison.Ordinal); + Assert.Contains("SceneExportArtifact", contents, StringComparison.Ordinal); + Assert.Contains("ScreenshotArtifact", contents, StringComparison.Ordinal); + Assert.Contains("no production annotation store", 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 change", contents, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no screenshot manifest expansion", 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); + } + + var englishIssueWave = ExtractIssueWaveTable(englishParity); + var chineseIssueWave = ExtractIssueWaveTable(chineseParity); + foreach (var table in new[] { englishIssueWave, chineseIssueWave }) + { + Assert.Contains("| #237 | `avalonia-node-map-zfe` | Phase 557: whiteboard annotation store contract gate", table, StringComparison.Ordinal); + Assert.Contains("Depends on Phase 556", table, StringComparison.OrdinalIgnoreCase); + Assert.Contains("no production annotation store", table, StringComparison.OrdinalIgnoreCase); + Assert.DoesNotContain("| TBD | TBD | Phase 557", table, StringComparison.Ordinal); + } + + Assert.Contains("Phase 557 records the whiteboard annotation store contract gate", englishParity, StringComparison.Ordinal); + Assert.Contains("Phase 557 记录 whiteboard annotation store contract gate", chineseParity, StringComparison.Ordinal); + } + [Fact] public void ParityRoadmapDocs_RecordPhase501PostPhase500QueueRefreshInBothLocales() {