From d436f268f047ed99fa80ee32517572d926a35d27 Mon Sep 17 00:00:00 2001 From: mes123456 Date: Thu, 27 Aug 2026 23:08:13 +0800 Subject: [PATCH] Complete WBV2 feature parity evidence epoch --- docs/EXECUTION_QUEUE.md | 6 +- docs/status/WBV2-P8-004.md | 3 + docs/status/WBV2-P9-000.md | 6 + docs/status/WBV2-P9-001.md | 9 + docs/status/WBV2-P9-002.md | 9 + docs/status/WBV2-P9-003.md | 9 + docs/status/WBV2-P9-004.md | 10 + docs/tasks/WBV2-P9-000.md | 24 + docs/tasks/WBV2-P9-001.md | 33 + docs/tasks/WBV2-P9-002.md | 33 + docs/tasks/WBV2-P9-003.md | 34 + docs/tasks/WBV2-P9-004.md | 33 + tests/golden/WBV2-P8-004/manifest.json | 13 +- .../recovery-release-gate-report.json | 6 +- tests/golden/WBV2-P8-004/task-context.json | 4 +- .../feature-parity-root-report.json | 31 + .../WBV2-P9-000/feature-parity-task-plan.json | 1448 +++++++++++++++++ tests/golden/WBV2-P9-000/manifest.json | 53 + .../WBV2-P9-001/chromium-mesh-production.json | 278 ++++ .../chromium-mesh-production.second.json | 278 ++++ .../WBV2-P9-001/feature-parity-task-plan.json | 1448 +++++++++++++++++ tests/golden/WBV2-P9-001/manifest.json | 74 + .../WBV2-P9-001/mesh-receipt-report.json | 188 +++ tests/golden/WBV2-P9-001/task-context.json | 175 ++ .../chromium-modifier-production.json | 226 +++ .../chromium-modifier-production.second.json | 226 +++ .../WBV2-P9-002/feature-parity-task-plan.json | 1448 +++++++++++++++++ tests/golden/WBV2-P9-002/manifest.json | 74 + .../WBV2-P9-002/modifier-receipt-report.json | 163 ++ tests/golden/WBV2-P9-002/task-context.json | 177 ++ .../asset-catalog-receipt-report.json | 182 +++ .../chromium-asset-catalog-production.json | 221 +++ ...omium-asset-catalog-production.second.json | 221 +++ .../WBV2-P9-003/feature-parity-task-plan.json | 1448 +++++++++++++++++ tests/golden/WBV2-P9-003/manifest.json | 79 + tests/golden/WBV2-P9-003/task-context.json | 179 ++ .../feature-parity-gate-report.json | 85 + .../WBV2-P9-004/feature-parity-task-plan.json | 1448 +++++++++++++++++ tests/golden/WBV2-P9-004/manifest.json | 78 + tests/golden/WBV2-P9-004/task-context.json | 181 +++ tests/golden/WBV2/task-catalog.jsonl | 7 +- tests/golden/WBV2/task-index.json | 2 +- .../generate-wbv2-asset-catalog-receipt.mjs | 179 ++ .../web/generate-wbv2-feature-parity-gate.mjs | 164 ++ .../web/generate-wbv2-feature-parity-root.mjs | 67 + tools/web/generate-wbv2-mesh-receipt.mjs | 172 ++ tools/web/generate-wbv2-modifier-receipt.mjs | 173 ++ .../e2e/wbv2-asset-catalog-production.spec.ts | 74 + web/tests/e2e/wbv2-mesh-production.spec.ts | 65 + .../e2e/wbv2-modifier-production.spec.ts | 64 + 50 files changed, 11594 insertions(+), 14 deletions(-) create mode 100644 docs/status/WBV2-P9-000.md create mode 100644 docs/status/WBV2-P9-001.md create mode 100644 docs/status/WBV2-P9-002.md create mode 100644 docs/status/WBV2-P9-003.md create mode 100644 docs/status/WBV2-P9-004.md create mode 100644 docs/tasks/WBV2-P9-000.md create mode 100644 docs/tasks/WBV2-P9-001.md create mode 100644 docs/tasks/WBV2-P9-002.md create mode 100644 docs/tasks/WBV2-P9-003.md create mode 100644 docs/tasks/WBV2-P9-004.md create mode 100644 tests/golden/WBV2-P9-000/feature-parity-root-report.json create mode 100644 tests/golden/WBV2-P9-000/feature-parity-task-plan.json create mode 100644 tests/golden/WBV2-P9-000/manifest.json create mode 100644 tests/golden/WBV2-P9-001/chromium-mesh-production.json create mode 100644 tests/golden/WBV2-P9-001/chromium-mesh-production.second.json create mode 100644 tests/golden/WBV2-P9-001/feature-parity-task-plan.json create mode 100644 tests/golden/WBV2-P9-001/manifest.json create mode 100644 tests/golden/WBV2-P9-001/mesh-receipt-report.json create mode 100644 tests/golden/WBV2-P9-001/task-context.json create mode 100644 tests/golden/WBV2-P9-002/chromium-modifier-production.json create mode 100644 tests/golden/WBV2-P9-002/chromium-modifier-production.second.json create mode 100644 tests/golden/WBV2-P9-002/feature-parity-task-plan.json create mode 100644 tests/golden/WBV2-P9-002/manifest.json create mode 100644 tests/golden/WBV2-P9-002/modifier-receipt-report.json create mode 100644 tests/golden/WBV2-P9-002/task-context.json create mode 100644 tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json create mode 100644 tests/golden/WBV2-P9-003/chromium-asset-catalog-production.json create mode 100644 tests/golden/WBV2-P9-003/chromium-asset-catalog-production.second.json create mode 100644 tests/golden/WBV2-P9-003/feature-parity-task-plan.json create mode 100644 tests/golden/WBV2-P9-003/manifest.json create mode 100644 tests/golden/WBV2-P9-003/task-context.json create mode 100644 tests/golden/WBV2-P9-004/feature-parity-gate-report.json create mode 100644 tests/golden/WBV2-P9-004/feature-parity-task-plan.json create mode 100644 tests/golden/WBV2-P9-004/manifest.json create mode 100644 tests/golden/WBV2-P9-004/task-context.json create mode 100644 tools/web/generate-wbv2-asset-catalog-receipt.mjs create mode 100644 tools/web/generate-wbv2-feature-parity-gate.mjs create mode 100644 tools/web/generate-wbv2-feature-parity-root.mjs create mode 100644 tools/web/generate-wbv2-mesh-receipt.mjs create mode 100644 tools/web/generate-wbv2-modifier-receipt.mjs create mode 100644 web/tests/e2e/wbv2-asset-catalog-production.spec.ts create mode 100644 web/tests/e2e/wbv2-mesh-production.spec.ts create mode 100644 web/tests/e2e/wbv2-modifier-production.spec.ts diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index 3e40875cd..8b65e0cd9 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -13,9 +13,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P8-004` | -| parent manifest | `tests/golden/WBV2-P8-003/manifest.json` | -| 任务卡 | [`tasks/WBV2-P8-004.md`](tasks/WBV2-P8-004.md) | +| 当前任务 | `WBV2-P9-004` | +| parent manifest | `tests/golden/WBV2-P9-003/manifest.json` | +| 任务卡 | [`tasks/WBV2-P9-004.md`](tasks/WBV2-P9-004.md) | | 专项验收 | `node tools/web/check-execution-control-plane.mjs` | | legacy coverage checkpoint | `M16-GAP-00282` | | legacy coverage parent | `tests/golden/M16-GAP-00281/manifest.json` | diff --git a/docs/status/WBV2-P8-004.md b/docs/status/WBV2-P8-004.md index 04224bc26..1e40bae56 100644 --- a/docs/status/WBV2-P8-004.md +++ b/docs/status/WBV2-P8-004.md @@ -8,3 +8,6 @@ - nextTask: `NONE` The project owner approved the new provenance baseline. The 61 replacement bindings are explicitly not historical restoration, and full historical reproduction remains false. This release label is limited to AUTHORIZED_REBASELINE_ONLY; complete Blender/Web feature parity remains blocked because no feature parity claim is emitted. +- authorized continuation: `WBV2-P9-000` + +Feature parity work may continue under a new manifest root. This does not change the authorized-rebaseline-only release scope or historical reproduction limitation. diff --git a/docs/status/WBV2-P9-000.md b/docs/status/WBV2-P9-000.md new file mode 100644 index 000000000..5f3fd01a6 --- /dev/null +++ b/docs/status/WBV2-P9-000.md @@ -0,0 +1,6 @@ +# WBV2-P9-000 status + +- task: `WBV2-P9-000`; parent: `WBV2-P8-004`; status: `done` +- nextTask: `WBV2-P9-001` + +Feature parity continuation is authorized after provenance epoch 2. Work is limited to evidenced Mesh, Modifier, and Asset Catalog behavior in Chromium; full historical reproduction remains false. diff --git a/docs/status/WBV2-P9-001.md b/docs/status/WBV2-P9-001.md new file mode 100644 index 000000000..c217e98ea --- /dev/null +++ b/docs/status/WBV2-P9-001.md @@ -0,0 +1,9 @@ +# WBV2-P9-001 status + +- task: `WBV2-P9-001`; parent: `WBV2-P9-000`; status: `done` +- Mesh Chromium receipt: `DESKTOP + WASM` +- delta: `(0.5, -1, 2)`; revision: `9 -> 10` +- save/reopen: `EXACT` +- nextTask: `WBV2-P9-002` + +The production Chromium receipt executes the existing Mesh Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-vertex commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction. diff --git a/docs/status/WBV2-P9-002.md b/docs/status/WBV2-P9-002.md new file mode 100644 index 000000000..8696e9a6b --- /dev/null +++ b/docs/status/WBV2-P9-002.md @@ -0,0 +1,9 @@ +# WBV2-P9-002 status + +- task: `WBV2-P9-002`; parent: `WBV2-P9-001`; status: `done` +- Modifier Chromium receipt: `DESKTOP + WASM` +- enabled transition: `false -> true`; revision: `7 -> 8` +- save/reopen: `EXACT` +- nextTask: `WBV2-P9-003` + +The production Chromium receipt executes the existing Modifier Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-modifier commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction. diff --git a/docs/status/WBV2-P9-003.md b/docs/status/WBV2-P9-003.md new file mode 100644 index 000000000..73430335f --- /dev/null +++ b/docs/status/WBV2-P9-003.md @@ -0,0 +1,9 @@ +# WBV2-P9-003 status + +- task: `WBV2-P9-003`; parent: `WBV2-P9-002`; status: `done` +- Asset Catalog Chromium receipt: `DESKTOP + WASM` +- resource: `EXTERNAL_LIBRARY/library.blend`; hash-bound +- append revision: `4 -> 5`; save/reopen: `EXACT` +- nextTask: `WBV2-P9-004` + +The production Chromium receipt executes the existing Asset Catalog Main and resource resolver. Duplicate, stale, malformed, and missing-resource commands are rejected without a late mutation. This is a bounded current implementation claim and does not assert historical byte reproduction. diff --git a/docs/status/WBV2-P9-004.md b/docs/status/WBV2-P9-004.md new file mode 100644 index 000000000..6effcbad2 --- /dev/null +++ b/docs/status/WBV2-P9-004.md @@ -0,0 +1,10 @@ +# WBV2-P9-004 status + +- task: `WBV2-P9-004`; parent: `WBV2-P9-003`; status: `done` +- evidenced feature claims: `3` +- claims: `CAP-MESH-POSITIVE-EDIT`, `CAP-MODIFIER-STATE-MUTATION`, `CAP-ASSET-CATALOG-MUTATION` +- provenance: epoch `2`, `AUTHORIZED_REBASELINE_ONLY` +- fullHistoricalReproduction: `false` +- nextTask: `NONE` + +The gate emits only claims backed by deterministic Chromium production receipts with exact save/reopen evidence. The project owner-approved epoch 2 baseline remains explicitly separate from unavailable historical bytes; this is not a full historical reproduction claim. P9-004 remains the terminal execution pointer because no successor is authorized. diff --git a/docs/tasks/WBV2-P9-000.md b/docs/tasks/WBV2-P9-000.md new file mode 100644 index 000000000..235c5904e --- /dev/null +++ b/docs/tasks/WBV2-P9-000.md @@ -0,0 +1,24 @@ +# WBV2-P9-000: feature parity continuation root + +- task: WBV2-P9-000 +- parent: WBV2-P8-004 +- status: done +- gap: workflow:authorize_feature_parity_continuation +- ownerFamily: PROGRAM +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Authorize the next feature-parity evidence epoch after provenance epoch 2. The release scope remains authorized rebaseline only. + +## 验收 + +node tools/web/generate-wbv2-feature-parity-root.mjs +node tools/web/check-execution-control-plane.mjs +node tools/web/check-v2-task-index.mjs + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P9-000/` +- Manifest: `tests/golden/WBV2-P9-000/manifest.json` +- Rollback: restore P8-004 as queue parent without changing provenance evidence. diff --git a/docs/tasks/WBV2-P9-001.md b/docs/tasks/WBV2-P9-001.md new file mode 100644 index 000000000..d81268002 --- /dev/null +++ b/docs/tasks/WBV2-P9-001.md @@ -0,0 +1,33 @@ +# WBV2-P9-001: Mesh production Chromium receipt + +- task: WBV2-P9-001 +- parent: WBV2-P9-000 +- status: in_progress +- gap: workflow:mesh_production_chromium_receipt +- ownerFamily: MESH +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Bind the real Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation. + +## 输入与范围 + +- Existing Mesh protocol: `web/protocol/corrective-mesh-command.ts` +- Existing exact pilot: `tests/golden/corrective/C4-002/receipt-report.json` +- Chromium test: `web/tests/e2e/wbv2-mesh-production.spec.ts` + +## 验收 + +- `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-production.spec.ts` +- `node tools/web/generate-wbv2-mesh-receipt.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P9-001 --write` + +Malformed, stale-revision, unknown-vertex, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P9-001/` +- Status: `docs/status/WBV2-P9-001.md` +- Manifest: `tests/golden/WBV2-P9-001/manifest.json` +- Rollback: restore P9-000 as queue parent without modifying P8 evidence. diff --git a/docs/tasks/WBV2-P9-002.md b/docs/tasks/WBV2-P9-002.md new file mode 100644 index 000000000..af69d585b --- /dev/null +++ b/docs/tasks/WBV2-P9-002.md @@ -0,0 +1,33 @@ +# WBV2-P9-002: Modifier production Chromium receipt + +- task: WBV2-P9-002 +- parent: WBV2-P9-001 +- status: in_progress +- gap: workflow:modifier_production_chromium_receipt +- ownerFamily: MODIFIER +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Bind the real Modifier Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation. + +## 输入与范围 + +- Existing Modifier protocol: `web/protocol/corrective-modifier-command.ts` +- Existing exact pilot: `tests/golden/corrective/C4-001/receipt-report.json` +- Chromium test: `web/tests/e2e/wbv2-modifier-production.spec.ts` + +## 验收 + +- `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts` +- `node tools/web/generate-wbv2-modifier-receipt.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P9-002 --write` + +Malformed, stale-revision, unknown-modifier, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P9-002/` +- Status: `docs/status/WBV2-P9-002.md` +- Manifest: `tests/golden/WBV2-P9-002/manifest.json` +- Rollback: restore P9-001 as queue parent without modifying Mesh or P8 evidence. diff --git a/docs/tasks/WBV2-P9-003.md b/docs/tasks/WBV2-P9-003.md new file mode 100644 index 000000000..cb9437607 --- /dev/null +++ b/docs/tasks/WBV2-P9-003.md @@ -0,0 +1,34 @@ +# WBV2-P9-003: Asset Catalog production Chromium receipt + +- task: WBV2-P9-003 +- parent: WBV2-P9-002 +- status: in_progress +- gap: workflow:asset_catalog_production_chromium_receipt +- ownerFamily: ASSET +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Bind the real Asset Catalog Main transaction and resource resolver to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation. + +## 输入与范围 + +- Existing Asset Catalog protocol: `web/protocol/corrective-asset-catalog-command.ts` +- Existing resource resolver: `web/protocol/corrective-resource-provider.ts` +- Existing exact pilot: `tests/golden/corrective/C3-003/receipt-report.json` +- Chromium test: `web/tests/e2e/wbv2-asset-catalog-production.spec.ts` + +## 验收 + +- `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-catalog-production.spec.ts` +- `node tools/web/generate-wbv2-asset-catalog-receipt.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P9-003 --write` + +Malformed, stale-revision, unknown-asset, missing-resource, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P9-003/` +- Status: `docs/status/WBV2-P9-003.md` +- Manifest: `tests/golden/WBV2-P9-003/manifest.json` +- Rollback: restore P9-002 as queue parent without modifying Modifier, Mesh, or P8 evidence. diff --git a/docs/tasks/WBV2-P9-004.md b/docs/tasks/WBV2-P9-004.md new file mode 100644 index 000000000..b79c19588 --- /dev/null +++ b/docs/tasks/WBV2-P9-004.md @@ -0,0 +1,33 @@ +# WBV2-P9-004: feature parity gate + +- task: WBV2-P9-004 +- parent: WBV2-P9-003 +- status: in_progress +- gap: workflow:recompute_feature_parity_gate +- ownerFamily: RELEASE +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Recompute declared feature parity claims only from the three production Chromium receipts and preserve the authorized-rebaseline-only release boundary. + +## 输入与范围 + +- Mesh receipt: `tests/golden/WBV2-P9-001/mesh-receipt-report.json` +- Modifier receipt: `tests/golden/WBV2-P9-002/modifier-receipt-report.json` +- Asset receipt: `tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json` +- M12 approval: `docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json` + +## 验收 + +- `node tools/web/generate-wbv2-feature-parity-gate.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P9-004 --write` + +Missing receipt, hash drift, unsupported browser, non-exact save/reopen, false historical reproduction, or undeclared feature claim must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P9-004/` +- Status: `docs/status/WBV2-P9-004.md` +- Manifest: `tests/golden/WBV2-P9-004/manifest.json` +- Rollback: restore P9-003 as queue parent without modifying any production receipt or provenance evidence. diff --git a/tests/golden/WBV2-P8-004/manifest.json b/tests/golden/WBV2-P8-004/manifest.json index 3e0e6a690..54831e895 100644 --- a/tests/golden/WBV2-P8-004/manifest.json +++ b/tests/golden/WBV2-P8-004/manifest.json @@ -41,11 +41,11 @@ }, "report": { "path": "tests/golden/WBV2-P8-004/recovery-release-gate-report.json", - "sha256": "0479304c82aec61f98248eca63c7883fb5f36dcd4dd0f296ff42bc32d987000e" + "sha256": "c1bbfa01d901d519d2add3ef75b6e83ccb7bd3047d5c260131b7fcf7d1e39e37" }, "status": { "path": "docs/status/WBV2-P8-004.md", - "sha256": "c32b7ef43ba52ef400250c11f2ed5ad60267e73cac309afef22ae724a2136917" + "sha256": "14cbedaba1c7b5b633813527da686605070baca35ea74f151153eb1b43722e6c" }, "recoveryPlan": { "path": "tests/golden/WBV2-P8-004/recovery-task-plan.json", @@ -53,7 +53,7 @@ }, "taskContext": { "path": "tests/golden/WBV2-P8-004/task-context.json", - "sha256": "5aa338e08e1aa583b80e3b73bf760e32a0da88d40de97b673ac6d4b42d0ea793" + "sha256": "ac5f707baab5d730f22399a4770daef5c7e45e2a2668a18e4b4f2b22265f837d" } }, "assertions": { @@ -66,5 +66,10 @@ "featureParityClaims": 0, "releaseScope": "AUTHORIZED_REBASELINE_ONLY" }, - "nextTask": null + "nextTask": "WBV2-P9-000", + "continuation": { + "authorized": true, + "root": "WBV2-P9-000", + "scope": "FEATURE_PARITY_ONLY" + } } diff --git a/tests/golden/WBV2-P8-004/recovery-release-gate-report.json b/tests/golden/WBV2-P8-004/recovery-release-gate-report.json index 1b1631fd1..e4ab4774a 100644 --- a/tests/golden/WBV2-P8-004/recovery-release-gate-report.json +++ b/tests/golden/WBV2-P8-004/recovery-release-gate-report.json @@ -50,7 +50,7 @@ "featureParityClaims": 0, "fullHistoricalReproduction": false, "releaseScope": "AUTHORIZED_REBASELINE_ONLY", - "nextTask": null + "nextTask": "WBV2-P9-000" }, "negative": { "missingReceipt": "REJECTED", @@ -59,7 +59,7 @@ "falseHistoricalRestoration": "REJECTED", "missingApproval": "REJECTED", "unsupportedBrowser": "REJECTED", - "queueAdvance": "CLOSED" + "queueAdvance": "AUTHORIZED_CONTINUATION" }, - "nextTask": null + "nextTask": "WBV2-P9-000" } diff --git a/tests/golden/WBV2-P8-004/task-context.json b/tests/golden/WBV2-P8-004/task-context.json index 671ad57ae..9cd7c99a9 100644 --- a/tests/golden/WBV2-P8-004/task-context.json +++ b/tests/golden/WBV2-P8-004/task-context.json @@ -70,7 +70,7 @@ "provenance epoch is explicit", "all governance gates pass" ], - "nextTask": null, + "nextTask": "WBV2-P9-000", "sourceDocuments": { "queue": "docs/EXECUTION_QUEUE.md", "taskCard": "docs/tasks/WBV2-P8-004.md", @@ -167,7 +167,7 @@ "totalTokens": 1805, "reservedEnvelopeTokens": 1024, "estimatedContextTokens": 2829, - "serializedContextTokens": 611, + "serializedContextTokens": 614, "withinBudget": true } } diff --git a/tests/golden/WBV2-P9-000/feature-parity-root-report.json b/tests/golden/WBV2-P9-000/feature-parity-root-report.json new file mode 100644 index 000000000..41bd9818f --- /dev/null +++ b/tests/golden/WBV2-P9-000/feature-parity-root-report.json @@ -0,0 +1,31 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-000", + "operation": "AUTHORIZE_FEATURE_PARITY_CONTINUATION", + "status": "PASS", + "parent": { + "task": "WBV2-P8-004", + "manifest": "tests/golden/WBV2-P8-004/manifest.json", + "manifestSha256": "c80db16559579560d38655a02c6684324a81061444323c62013affaf31ac1aad", + "previousDecision": "READY_WITH_AUTHORIZED_REBASELINE", + "fullHistoricalReproduction": false + }, + "continuation": { + "root": "WBV2-P9-000", + "firstTask": "WBV2-P9-001", + "plannedTasks": 5, + "scope": [ + "MESH", + "MODIFIER", + "ASSET_CATALOG" + ], + "browser": "chromium" + }, + "policy": { + "historicalEvidencePreserved": true, + "authorizedRebaselineAccepted": true, + "featureParityClaimsRemainEvidenceBound": true, + "fullHistoricalReproduction": false + }, + "nextTask": "WBV2-P9-001" +} diff --git a/tests/golden/WBV2-P9-000/feature-parity-task-plan.json b/tests/golden/WBV2-P9-000/feature-parity-task-plan.json new file mode 100644 index 000000000..191a21c25 --- /dev/null +++ b/tests/golden/WBV2-P9-000/feature-parity-task-plan.json @@ -0,0 +1,1448 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_FEATURE_EPOCH_1", + "status": "ACTIVE_CAPABILITY_QUEUE", + "authority": "queue_reactivated_after_owner_review", + "productContract": "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "sourcePlan": "docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "correctiveCheckpoint": { + "task": "C6-003", + "handoff": "tests/golden/corrective/C6-003/handoff.json", + "status": "active", + "blocker": null, + "queueMutation": true, + "legacyTask": "M16-GAP-00277", + "legacyParentNextTask": "M16-GAP-00277" + }, + "runtimePolicy": { + "blenderSource": "blender-5.2.0", + "browserEvidence": [ + "chromium" + ], + "forbiddenBrowsers": [ + "firefox", + "webkit" + ], + "mainAuthority": "blender_main", + "storage": [ + "opfs", + "indexeddb" + ], + "queueMutation": "enabled_after_owner_review_and_g5" + }, + "completionClasses": [ + "LOCAL_EXACT", + "LOCAL_BOUNDED", + "SERVER_EXACT", + "EXCLUDED" + ], + "gates": [ + { + "id": "G0", + "name": "scope_and_inventory", + "requires": [ + "contract", + "inventory", + "capability_matrix" + ] + }, + { + "id": "G1", + "name": "runtime_foundation", + "requires": [ + "sceneir", + "main_transaction", + "worker_lifecycle", + "storage_journal" + ] + }, + { + "id": "G2", + "name": "feature_parity", + "requires": [ + "desktop", + "wasm_main", + "chromium", + "negative", + "persistence" + ] + }, + { + "id": "G3", + "name": "recovery_and_security", + "requires": [ + "cancel", + "restart", + "oom_quota", + "malformed", + "dispose" + ] + }, + { + "id": "G4", + "name": "release_candidate", + "requires": [ + "offline", + "ci", + "sbom", + "rollback", + "hashes" + ] + }, + { + "id": "G5", + "name": "queue_mutation", + "requires": [ + "owner_review", + "protected_hashes", + "handoff", + "single_ready_task" + ] + } + ], + "waves": [ + { + "id": "P0", + "name": "facts_and_contracts", + "gate": "G0", + "tasks": [ + "WBV2-P0-001", + "WBV2-P0-002", + "WBV2-P0-003" + ] + }, + { + "id": "P1", + "name": "runtime_foundation", + "gate": "G1", + "tasks": [ + "WBV2-P1-001", + "WBV2-P1-002", + "WBV2-P1-003", + "WBV2-P1-004", + "WBV2-P1-005" + ] + }, + { + "id": "P2", + "name": "core_modeler_loop", + "gate": "G2", + "tasks": [ + "WBV2-P2-001", + "WBV2-P2-002", + "WBV2-P2-003", + "WBV2-P2-004", + "WBV2-P2-005" + ] + }, + { + "id": "P3", + "name": "authoring_and_io", + "gate": "G2", + "tasks": [ + "WBV2-P3-001", + "WBV2-P3-002", + "WBV2-P3-003", + "WBV2-P3-004", + "WBV2-P3-005" + ] + }, + { + "id": "P4", + "name": "advanced_local_slices", + "gate": "G2", + "tasks": [ + "WBV2-P4-001", + "WBV2-P4-002", + "WBV2-P4-003", + "WBV2-P4-004" + ] + }, + { + "id": "P5", + "name": "render_and_server", + "gate": "G3", + "tasks": [ + "WBV2-P5-001", + "WBV2-P5-002", + "WBV2-P5-003" + ] + }, + { + "id": "P6", + "name": "security_performance_release", + "gate": "G4", + "tasks": [ + "WBV2-P6-001", + "WBV2-P6-002", + "WBV2-P6-003" + ] + }, + { + "id": "P7", + "name": "full_parity_gap_program", + "gate": "G5", + "tasks": [ + "WBV2-P7-001", + "WBV2-P7-002", + "WBV2-P7-003" + ] + } + ], + "taskContract": { + "onePrimaryBehavior": true, + "requiredEvidence": [ + "desktop", + "wasm_main", + "chromium", + "negative", + "persistence", + "manifest", + "status" + ], + "requiredCommands": [ + "focused", + "determinism", + "hash", + "governance" + ], + "failureState": "in_progress_or_blocked", + "successorRule": "only_from_parent_manifest_nextTask" + }, + "tasks": [ + { + "id": "WBV2-P0-001", + "phase": "P0", + "title": "reconcile_scope_and_checkpoints", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-governance", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-001.md", + "behavior": "Freeze V1/full-parity boundary and reconcile legacy/corrective pointers without queue mutation.", + "outputs": [ + "scope decision", + "checkpoint report", + "protected hash set" + ], + "acceptance": [ + "corrective owner-review status is explicit", + "legacy parent pointer is unchanged", + "plan has one activation gate" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P0-002", + "phase": "P0", + "title": "generate_blender52_inventory_and_parity_map", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P0-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-inventory", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-002.md", + "behavior": "Generate stable Blender 5.2 data-block/operator/editor/node/format inventory and map every entry to a completion class.", + "outputs": [ + "inventory", + "parity map", + "source hash" + ], + "acceptance": [ + "unknown entries are classified", + "inventory is deterministic", + "no entry claims feature parity without evidence" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P0-003", + "phase": "P0", + "title": "freeze_capability_error_budget_contract", + "kind": "enabling", + "owner": "PROTOCOL", + "dependsOn": [ + "WBV2-P0-001", + "WBV2-P0-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-contract", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-003.md", + "behavior": "Freeze capability levels, stable error codes, revision, budget, cancellation and loss-report schemas.", + "outputs": [ + "versioned protocol", + "capability matrix", + "negative matrix" + ], + "acceptance": [ + "unsupported input fails closed", + "schema hashes are stable", + "migration policy preserves unknown data" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-001", + "phase": "P1", + "title": "stabilize_runtime_variants_and_source_receipts", + "kind": "enabling", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P0-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-runtime", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-001.md", + "behavior": "Bind single-thread/pthread WebEngine variants to pinned Blender source/build/runtime receipts.", + "outputs": [ + "runtime manifest", + "variant selector", + "fallback report" + ], + "acceptance": [ + "variant fallback is deterministic", + "source/build hash is verified", + "one engine session has one generation" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-002", + "phase": "P1", + "title": "unify_sceneir_stable_ids_and_binary_deltas", + "kind": "enabling", + "owner": "MAIN", + "dependsOn": [ + "WBV2-P1-001" + ], + "parityId": null, + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p1-sceneir", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-002.md", + "behavior": "Make SceneIR/WBG1 stable IDs, topology/attribute domains and binary/range deltas canonical across desktop and WASM.", + "outputs": [ + "SceneIR schema", + "binary fixture", + "delta comparator" + ], + "acceptance": [ + "IDs survive save/reopen", + "malformed chunk is rejected", + "desktop and WASM canonical hashes match" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-003", + "phase": "P1", + "title": "unify_main_transaction_history_and_save", + "kind": "enabling", + "owner": "MAIN", + "dependsOn": [ + "WBV2-P1-002" + ], + "parityId": null, + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p1-history", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-003.md", + "behavior": "Use one Main transaction/revision/history contract for commit, undo/redo, atomic save and reopen.", + "outputs": [ + "transaction contract", + "history receipt", + "save/reopen runner" + ], + "acceptance": [ + "failed/no-op commands add no history", + "stale revision cannot commit", + "reopen state is byte/hash stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-004", + "phase": "P1", + "title": "harden_worker_cancel_restart_and_dispose", + "kind": "enabling", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P1-001", + "WBV2-P1-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-lifecycle", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-004.md", + "behavior": "Make cancellation, late-result rejection, Worker restart and resource disposal common to all domains.", + "outputs": [ + "lifecycle runner", + "fault report", + "dispose counters" + ], + "acceptance": [ + "cancel never publishes result", + "generation mismatch is rejected", + "CPU/WASM/GPU owners return to budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-005", + "phase": "P1", + "title": "harden_opfs_indexeddb_journal_recovery", + "kind": "enabling", + "owner": "STORAGE", + "dependsOn": [ + "WBV2-P1-003", + "WBV2-P1-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-storage", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-005.md", + "behavior": "Unify OPFS staging/content addressing and IndexedDB metadata/journal recovery.", + "outputs": [ + "storage schema", + "crash fixtures", + "recovery checker" + ], + "acceptance": [ + "interrupted commit leaves old project usable", + "hash mismatch quarantines payload", + "small project recovers after restart" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-001", + "phase": "P2", + "title": "open_blend_scene_context_and_outliner", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1-002", + "WBV2-P1-005" + ], + "parityId": "EDITOR.OPEN_SCENE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-editor", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-001.md", + "behavior": "Open a minimal .blend and expose scene/object/collection context from authoritative Main.", + "outputs": [ + "desktop fixture", + "outliner report", + "Chromium path" + ], + "acceptance": [ + "stable IDs and selection revision match", + "missing data is structured", + "reopen preserves context" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-002", + "phase": "P2", + "title": "object_collection_parent_transform_workflow", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1-003", + "WBV2-P2-001" + ], + "parityId": "OBJECT.TRANSFORM_HIERARCHY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-scene", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-002.md", + "behavior": "Edit object transform, collection membership and parent hierarchy through Main transactions.", + "outputs": [ + "desktop/WASM golden", + "negative cases", + "save/reopen receipt" + ], + "acceptance": [ + "world matrix parity", + "cycle/locked/library edits reject", + "undo/redo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-003", + "phase": "P2", + "title": "mesh_edit_core_operations", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1-002", + "WBV2-P2-002" + ], + "parityId": "MESH.EDIT_CORE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-mesh", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-003.md", + "behavior": "Expose bounded vertex/edge/face selection plus merge/dissolve/extrude/inset/bevel/loop-cut.", + "outputs": [ + "Blender fixture set", + "topology comparator", + "Chromium edit path" + ], + "acceptance": [ + "topology/attributes match", + "invalid selection and budget fail closed", + "single transaction and reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-004", + "phase": "P2", + "title": "dual_viewport_sceneir_render_path", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P2-003" + ], + "parityId": "VIEWPORT.MAIN_OFFSCREEN", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p2-viewport", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-004.md", + "behavior": "Render the same validated SceneIR through main-thread WebGL2 and OffscreenCanvas Worker paths.", + "outputs": [ + "pixel report", + "viewport diagnostics", + "device recovery" + ], + "acceptance": [ + "both paths have nonblank pixels", + "selection/camera revision is shared", + "device loss releases resources" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-005", + "phase": "P2", + "title": "close_p0_user_loop", + "kind": "feature", + "owner": "INTEGRATION", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P2-003", + "WBV2-P1-005", + "WBV2-P2-004" + ], + "parityId": "WORKFLOW.P0_USER_LOOP", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p2-integration", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-005.md", + "behavior": "Prove open -> edit -> undo -> redo -> save -> restart -> reopen -> GLB in one production flow.", + "outputs": [ + "P0 workflow report", + "release binding", + "rollback receipt" + ], + "acceptance": [ + "Main revision and exported asset are bound", + "fault/cancel leaves old state", + "Chromium production path passes" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-001", + "phase": "P3", + "title": "material_uv_principled_asset_workflow", + "kind": "feature", + "owner": "MATERIAL", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-005" + ], + "parityId": "MATERIAL.PBR_UV", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-authoring", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-001.md", + "behavior": "Edit material slots, UVs and declared Principled/Image/Normal graph nodes with content-addressed textures.", + "outputs": [ + "material golden", + "texture receipt", + "loss report" + ], + "acceptance": [ + "desktop/WASM node fields match", + "unsupported node retained/blocked", + "packed asset survives reopen" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-002", + "phase": "P3", + "title": "keyframe_timeline_action_workflow", + "kind": "feature", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P2-005", + "WBV2-P3-001" + ], + "parityId": "ANIMATION.TRS_ACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p3-authoring", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-002.md", + "behavior": "Create/edit TRS keyframes, timeline and declared Action interpolation through Main.", + "outputs": [ + "frame golden", + "animation comparator", + "reopen report" + ], + "acceptance": [ + "sampled values and handles match", + "stale frame result rejected", + "undo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-003", + "phase": "P3", + "title": "armature_pose_constraint_skin_workflow", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P3-002" + ], + "parityId": "RIG.POSE_SKIN", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-rig", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-003.md", + "behavior": "Read and edit declared armature pose/constraint/weight/shape-key slices with bounded evaluation.", + "outputs": [ + "pose golden", + "skin report", + "unsupported matrix" + ], + "acceptance": [ + "pose matrices and weights match", + "unsupported constraint is explicit", + "save/reopen and small recovery pass" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-004", + "phase": "P3", + "title": "glb_roundtrip_and_loss_report", + "kind": "feature", + "owner": "IO", + "dependsOn": [ + "WBV2-P2-005", + "WBV2-P3-001", + "WBV2-P3-003" + ], + "parityId": "IO.GLB_ROUNDTRIP", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p3-io", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-004.md", + "behavior": "Import/export declared GLB mesh/PBR/texture/morph/skin/animation and report non-mapped semantics.", + "outputs": [ + "GLB fixtures", + "desktop reimport report", + "loss report" + ], + "acceptance": [ + "roundtrip canonical graph matches", + "sparse/external URI/budget negatives reject", + "no silent loss" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-005", + "phase": "P3", + "title": "library_asset_append_link_override", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1-005", + "WBV2-P2-001", + "WBV2-P3-004" + ], + "parityId": "ASSET.LIBRARY_OPERATIONS", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-assets", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-005.md", + "behavior": "Support declared append/link/override ownership, reload and missing-library semantics.", + "outputs": [ + "library fixtures", + "ownership report", + "negative matrix" + ], + "acceptance": [ + "source/hash/owner identity preserved", + "linked mutation blocked", + "stale generation and missing source fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-001", + "phase": "P4", + "title": "modifier_graph_and_apply_slices", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-005", + "WBV2-P3-005" + ], + "parityId": "MODIFIER.DECLARED_SLICES", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-001.md", + "behavior": "Enable one declared modifier parameter/apply workflow at a time with dependency-aware blocking.", + "outputs": [ + "modifier goldens", + "dependency report", + "negative cases" + ], + "acceptance": [ + "desktop/evaluated Main match", + "unknown modifier retained and blocked", + "apply/undo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-002", + "phase": "P4", + "title": "geometry_nodes_and_shader_allowlist", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P3-001", + "WBV2-P4-001" + ], + "parityId": "NODES.ALLOWLIST", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-002.md", + "behavior": "Read/write/evaluate only declared Geometry Nodes and shader graph allowlists with resource budgets.", + "outputs": [ + "node fixtures", + "compile/cache receipts", + "unsupported graph reports" + ], + "acceptance": [ + "node/socket/link/default parity", + "budget and unknown-node block before commit", + "compile failure rolls back" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-003", + "phase": "P4", + "title": "sculpt_nonmesh_and_paint_bounded_slices", + "kind": "feature", + "owner": "SCULPT", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-004", + "WBV2-P4-002" + ], + "parityId": "SCULPT.NONMESH.PAINT_BOUNDED", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-003.md", + "behavior": "Expose declared sculpt attributes/strokes, Curve/Surface/Font/PointCloud and paint slices with explicit PBVH limits.", + "outputs": [ + "non-mesh fixtures", + "stroke report", + "capability blocks" + ], + "acceptance": [ + "Main commit is atomic", + "unsupported brush/solver returns stable code", + "GPU/OOM/restart recovery passes" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-004", + "phase": "P4", + "title": "simulation_cache_identity_and_lifecycle", + "kind": "feature", + "owner": "SIMULATION", + "dependsOn": [ + "WBV2-P1-005", + "WBV2-P4-002", + "WBV2-P4-003" + ], + "parityId": "SIMULATION.CACHE_LIFECYCLE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G3", + "card": "docs/tasks/WBV2-P4-004.md", + "behavior": "Bind declared simulation cache to source/settings/revision hashes with cancellation, LRU and restart recovery.", + "outputs": [ + "cache fixtures", + "identity report", + "quarantine evidence" + ], + "acceptance": [ + "stale/corrupt cache never publishes", + "small cache recovers after restart", + "budget release is observable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-001", + "phase": "P5", + "title": "render_capability_routing", + "kind": "feature", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P2-004", + "WBV2-P4-002", + "WBV2-P4-004" + ], + "parityId": "RENDER.ROUTING", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p5-media", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-001.md", + "behavior": "Route bounded Eevee/WebGL capabilities locally and unsupported render classes to SERVER_EXACT or EXCLUDED.", + "outputs": [ + "render receipts", + "pixel golden", + "routing report" + ], + "acceptance": [ + "source/settings/build identity bound", + "unsupported route cannot pretend local success", + "cancel/device loss releases resources" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-002", + "phase": "P5", + "title": "compositor_sequencer_media_recovery", + "kind": "feature", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P3-002", + "WBV2-P5-001" + ], + "parityId": "MEDIA.BOUNDED_WORKFLOW", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p5-media", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-002.md", + "behavior": "Provide declared compositor/sequencer/codec/proxy/audio slices with revision and recovery gates.", + "outputs": [ + "media receipts", + "recovery report", + "audio/session diagnostics" + ], + "acceptance": [ + "seek/decode revision ordering", + "cancel/timeout does not publish", + "quota/OOM/restart leaves project valid" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-003", + "phase": "P5", + "title": "server_job_result_binding", + "kind": "feature", + "owner": "SERVER", + "dependsOn": [ + "WBV2-P0-003", + "WBV2-P5-001", + "WBV2-P5-002" + ], + "parityId": "SERVER.JOB_BINDING", + "implementationClass": "SERVER_EXACT", + "parallelGroup": "p5-server", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-003.md", + "behavior": "Bind server render/encode/physics jobs to immutable input/settings/build/output hashes and explicit lifecycle states.", + "outputs": [ + "server protocol", + "idempotency receipt", + "negative matrix" + ], + "acceptance": [ + "duplicate request is idempotent", + "stale result cannot bind", + "timeout/cancel/OOM produces no READY output" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-001", + "phase": "P6", + "title": "scripting_default_deny_and_audit", + "kind": "feature", + "owner": "SECURITY", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P5-003" + ], + "parityId": "SECURITY.SCRIPTING", + "implementationClass": "EXCLUDED", + "parallelGroup": "p6-safety", + "gate": "G3", + "card": "docs/tasks/WBV2-P6-001.md", + "behavior": "Read text/metadata and expose audited, budgeted, default-deny script policy without arbitrary execution.", + "outputs": [ + "policy manifest", + "malicious fixtures", + "audit report" + ], + "acceptance": [ + "autorun/network/add-on defaults deny", + "sandbox cancellation/dispose works", + "no secret or filesystem escape" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-002", + "phase": "P6", + "title": "performance_fault_and_recovery_matrix", + "kind": "enabling", + "owner": "RELIABILITY", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P1-005", + "WBV2-P2-004", + "WBV2-P6-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p6-safety", + "gate": "G3", + "card": "docs/tasks/WBV2-P6-002.md", + "behavior": "Run deterministic geometry/texture/media/cache budgets and inject OOM/quota/device/network faults.", + "outputs": [ + "budget matrix", + "fault reports", + "resource release ledger" + ], + "acceptance": [ + "100k/1M/10M thresholds recorded", + "fault leaves old revision usable", + "all owned resources return to budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-003", + "phase": "P6", + "title": "offline_ci_sbom_and_rollback_release", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P6-001", + "WBV2-P6-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p6-release", + "gate": "G4", + "card": "docs/tasks/WBV2-P6-003.md", + "behavior": "Produce reproducible offline/source/binary release packages with CI lanes, SBOM and rollback evidence.", + "outputs": [ + "RC manifest", + "offline archive", + "CI reports" + ], + "acceptance": [ + "quick/Chromium/release lanes pass", + "artifact hashes reproduce", + "upgrade/rollback and known limitations are tested" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-001", + "phase": "P7", + "title": "cluster_full_blender_gap_inventory", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P0-002", + "WBV2-P6-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-gap", + "gate": "G4", + "card": "docs/tasks/WBV2-P7-001.md", + "behavior": "Cluster remaining Blender 5.2 data-block/operator/editor/node/format gaps by family and evidence class.", + "outputs": [ + "cluster catalog", + "coverage report", + "risk ranking" + ], + "acceptance": [ + "each gap has stable ID and owner", + "negative-only/unsupported is not positive parity", + "clusters are deterministic" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-002", + "phase": "P7", + "title": "generate_atomic_family_gap_queue", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P7-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-gap", + "gate": "G4", + "card": "docs/tasks/WBV2-P7-002.md", + "behavior": "Generate one task per parityId x observable behavior x implementation class with parent/hash context.", + "outputs": [ + "task index", + "task catalog", + "task cards" + ], + "acceptance": [ + "one active ready task", + "no guessed successor", + "each card fits context budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-003", + "phase": "P7", + "title": "full_parity_candidate_release_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P7-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-release", + "gate": "G5", + "card": "docs/tasks/WBV2-P7-003.md", + "behavior": "Recompute parity closure, evidence health, recovery health and release decision from machine manifests.", + "outputs": [ + "parity release report", + "known limitations", + "final decision" + ], + "acceptance": [ + "all claims bind to evidence", + "blocked/excluded/server classes remain explicit", + "queue and protected hashes pass" + ], + "status": "blocked", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-000", + "phase": "P8", + "title": "authorize_recovery_capability_root", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P7-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-governance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-000.md", + "behavior": "Authorize a recovery epoch without rewriting the blocked P7 manifest.", + "outputs": [ + "recovery plan", + "root manifest", + "queue authorization" + ], + "acceptance": [ + "P7 evidence remains hash exact", + "recovery scope is explicit", + "one recovery task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P8-001", + "phase": "P8", + "title": "rebaseline_mutable_inventories", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-governance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-001.md", + "behavior": "Rebaseline mutable WBV2 plan and dependency inventory inputs while preserving historical manifests.", + "outputs": [ + "semantic drift report", + "current inventory baseline", + "manifest" + ], + "acceptance": [ + "only expected mutable hashes drift", + "dependency closure is unchanged", + "historical manifests remain unmodified" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-002", + "phase": "P8", + "title": "close_atomic_chromium_receipts", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P8-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-receipts", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-002.md", + "behavior": "Produce and bind all 45 atomic Chromium family receipts.", + "outputs": [ + "Chromium report", + "45 receipt index", + "receipt manifests" + ], + "acceptance": [ + "45 receipts are manifest-bound", + "desktop/WASM/save-reopen behaviors are explicit", + "Chromium is the only browser" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-003", + "phase": "P8", + "title": "authorize_m12_provenance_epoch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-provenance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-003.md", + "behavior": "Bind restored M12 sources and explicitly rebaseline unavailable originals in a new provenance epoch.", + "outputs": [ + "provenance epoch", + "replacement bindings", + "manifest" + ], + "acceptance": [ + "22 restored originals stay exact", + "62 unavailable entries are not called restored", + "all replacements are hash-bound" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-004", + "phase": "P8", + "title": "recompute_recovery_release_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P8-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-release", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-004.md", + "behavior": "Recompute the release decision from the recovery epoch and atomic receipts.", + "outputs": [ + "release gate", + "known limitations", + "final manifest" + ], + "acceptance": [ + "all receipts bind to manifests", + "provenance epoch is explicit", + "all governance gates pass" + ], + "status": "in_progress", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-000", + "phase": "P9", + "title": "authorize_feature_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p9-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-000.md", + "behavior": "Authorize feature parity continuation after provenance epoch 2 without claiming historical byte reproduction.", + "outputs": [ + "continuation receipt", + "feature parity plan", + "scope limits" + ], + "acceptance": [ + "P8 provenance evidence remains exact", + "authorized baseline is explicit", + "one feature task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P9-001", + "phase": "P9", + "title": "mesh_production_chromium_receipt", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P9-000" + ], + "parityId": "CAP-MESH-POSITIVE-EDIT", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-mesh", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-001.md", + "behavior": "Bind the existing Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt.", + "outputs": [ + "Chromium mesh receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real meshTranslateVertex command passes", + "desktop/WASM delta matches", + "save/reopen is exact", + "malformed/stale/unknown inputs fail closed" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-002", + "phase": "P9", + "title": "modifier_production_chromium_receipt", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P9-001" + ], + "parityId": "CAP-MODIFIER-STATE-MUTATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-modifier", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-002.md", + "behavior": "Bind the existing Modifier Main transaction to a production Chromium receipt.", + "outputs": [ + "Chromium modifier receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real modifierSetEnabled command passes", + "desktop/WASM delta matches", + "save/reopen is exact" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-003", + "phase": "P9", + "title": "asset_catalog_production_chromium_receipt", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P9-002" + ], + "parityId": "CAP-ASSET-CATALOG-MUTATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-asset", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-003.md", + "behavior": "Bind the existing Asset Catalog Main transaction and resource resolver to a production Chromium receipt.", + "outputs": [ + "Chromium asset receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real assetCatalogAppend command passes", + "resource hash is bound", + "save/reopen is exact" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-004", + "phase": "P9", + "title": "recompute_feature_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P9-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p9-release", + "gate": "G7", + "card": "docs/tasks/WBV2-P9-004.md", + "behavior": "Recompute declared feature parity claims from production Chromium receipts and authorized provenance.", + "outputs": [ + "feature parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only evidenced feature claims are emitted", + "authorized baseline remains explicit", + "full historical reproduction remains false" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P9-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P8-004/recovery-task-plan.json", + "sha256": "451ac79c0262391679e5e7c3251b99c49973d914e85e14d7e09eb9794befc4be" + } +} diff --git a/tests/golden/WBV2-P9-000/manifest.json b/tests/golden/WBV2-P9-000/manifest.json new file mode 100644 index 000000000..1a3c72c16 --- /dev/null +++ b/tests/golden/WBV2-P9-000/manifest.json @@ -0,0 +1,53 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-000", + "parentTask": "WBV2-P8-004", + "operation": "AUTHORIZE_FEATURE_PARITY_CONTINUATION", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P8-004/manifest.json", + "sha256": "c80db16559579560d38655a02c6684324a81061444323c62013affaf31ac1aad" + }, + "parentReport": { + "path": "tests/golden/WBV2-P8-004/recovery-release-gate-report.json", + "sha256": "c1bbfa01d901d519d2add3ef75b6e83ccb7bd3047d5c260131b7fcf7d1e39e37" + }, + "approval": { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3" + }, + "plan": { + "path": "tests/golden/WBV2-P9-000/feature-parity-task-plan.json", + "sha256": "3e8c06dbf6da9ec0c9ccf233c6c2856ee32900025fdea23f5e9f17b45536c74d" + }, + "report": { + "path": "tests/golden/WBV2-P9-000/feature-parity-root-report.json", + "sha256": "1883eac7e7cbf0c041e6092f62e2ab7ec05b6e3c832cd59f7845b8f108b26166" + }, + "rootCard": { + "path": "docs/tasks/WBV2-P9-000.md", + "sha256": "37213d9c1ef3e9713aba18f18f01d65b50c2ce0705b8c1f0a2fd1ba6186e860d" + }, + "rootStatus": { + "path": "docs/status/WBV2-P9-000.md", + "sha256": "993728af62d88a5ceb87201d4a338fecbee664a1c20841e22e88342a451ff814" + }, + "activeCard": { + "path": "docs/tasks/WBV2-P9-001.md", + "sha256": "3f9245cd89846717d4afc5ce785a84ae883be5f1321abda0cf9ae02f8e068681" + } + }, + "assertions": { + "authorizedRebaseline": true, + "fullHistoricalReproduction": false, + "featureParityScope": [ + "MESH", + "MODIFIER", + "ASSET_CATALOG" + ] + }, + "nextTask": "WBV2-P9-001" +} diff --git a/tests/golden/WBV2-P9-001/chromium-mesh-production.json b/tests/golden/WBV2-P9-001/chromium-mesh-production.json new file mode 100644 index 000000000..085ea202a --- /dev/null +++ b/tests/golden/WBV2-P9-001/chromium-mesh-production.json @@ -0,0 +1,278 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-001", + "operation": "MESH_PRODUCTION_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": [ + { + "id": "vertex:0", + "x": 1, + "y": 2, + "z": 3 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ], + "positive": { + "desktop": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "FINISHED", + "code": "OK", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 10, + "mainMutation": "CHANGED", + "delta": { + "vertexId": "vertex:0", + "before": { + "x": 1, + "y": 2, + "z": 3 + }, + "after": { + "x": 1.5, + "y": 1, + "z": 5 + } + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "wasm": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "FINISHED", + "code": "OK", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 10, + "mainMutation": "CHANGED", + "delta": { + "vertexId": "vertex:0", + "before": { + "x": 1, + "y": 2, + "z": 3 + }, + "after": { + "x": 1.5, + "y": 1, + "z": 5 + } + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "desktopMain": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 10, + "dirty": true + }, + "wasmMain": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 10, + "dirty": true + }, + "parity": true + }, + "negative": { + "malformed": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "MALFORMED", + "code": "COMMAND_MALFORMED", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 9, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_MALFORMED", + "message": "COMMAND_MALFORMED: mesh delta must contain only x, y, and z" + } + }, + "stale": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "BLOCKED", + "code": "REVISION_CONFLICT", + "baseRevision": 8, + "mainRevisionBefore": 9, + "mainRevisionAfter": 9, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "REVISION_CONFLICT", + "message": "base revision does not match current Main" + } + }, + "unknown": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "UNSUPPORTED", + "code": "COMMAND_UNSUPPORTED", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 9, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_UNSUPPORTED", + "message": "COMMAND_UNSUPPORTED: vertex vertex:missing does not exist" + } + }, + "rollbackMain": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1, + "y": 2, + "z": 3 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 9, + "dirty": false + } + }, + "persistence": { + "saved": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 10, + "dirty": false + }, + "postSave": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-post-save", + "status": "FINISHED", + "code": "OK", + "baseRevision": 10, + "mainRevisionBefore": 10, + "mainRevisionAfter": 11, + "mainMutation": "CHANGED", + "delta": { + "vertexId": "vertex:1", + "before": { + "x": 0, + "y": 0, + "z": 0 + }, + "after": { + "x": 4, + "y": 0, + "z": 0 + } + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "beforeReopen": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 4, + "y": 0, + "z": 0 + } + ] + }, + "revision": 11, + "dirty": true + }, + "reopened": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 10, + "dirty": false + }, + "exact": true + } +} diff --git a/tests/golden/WBV2-P9-001/chromium-mesh-production.second.json b/tests/golden/WBV2-P9-001/chromium-mesh-production.second.json new file mode 100644 index 000000000..085ea202a --- /dev/null +++ b/tests/golden/WBV2-P9-001/chromium-mesh-production.second.json @@ -0,0 +1,278 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-001", + "operation": "MESH_PRODUCTION_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": [ + { + "id": "vertex:0", + "x": 1, + "y": 2, + "z": 3 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ], + "positive": { + "desktop": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "FINISHED", + "code": "OK", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 10, + "mainMutation": "CHANGED", + "delta": { + "vertexId": "vertex:0", + "before": { + "x": 1, + "y": 2, + "z": 3 + }, + "after": { + "x": 1.5, + "y": 1, + "z": 5 + } + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "wasm": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "FINISHED", + "code": "OK", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 10, + "mainMutation": "CHANGED", + "delta": { + "vertexId": "vertex:0", + "before": { + "x": 1, + "y": 2, + "z": 3 + }, + "after": { + "x": 1.5, + "y": 1, + "z": 5 + } + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "desktopMain": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 10, + "dirty": true + }, + "wasmMain": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 10, + "dirty": true + }, + "parity": true + }, + "negative": { + "malformed": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "MALFORMED", + "code": "COMMAND_MALFORMED", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 9, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_MALFORMED", + "message": "COMMAND_MALFORMED: mesh delta must contain only x, y, and z" + } + }, + "stale": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "BLOCKED", + "code": "REVISION_CONFLICT", + "baseRevision": 8, + "mainRevisionBefore": 9, + "mainRevisionAfter": 9, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "REVISION_CONFLICT", + "message": "base revision does not match current Main" + } + }, + "unknown": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "UNSUPPORTED", + "code": "COMMAND_UNSUPPORTED", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 9, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_UNSUPPORTED", + "message": "COMMAND_UNSUPPORTED: vertex vertex:missing does not exist" + } + }, + "rollbackMain": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1, + "y": 2, + "z": 3 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 9, + "dirty": false + } + }, + "persistence": { + "saved": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 10, + "dirty": false + }, + "postSave": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-post-save", + "status": "FINISHED", + "code": "OK", + "baseRevision": 10, + "mainRevisionBefore": 10, + "mainRevisionAfter": 11, + "mainMutation": "CHANGED", + "delta": { + "vertexId": "vertex:1", + "before": { + "x": 0, + "y": 0, + "z": 0 + }, + "after": { + "x": 4, + "y": 0, + "z": 0 + } + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "beforeReopen": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 4, + "y": 0, + "z": 0 + } + ] + }, + "revision": 11, + "dirty": true + }, + "reopened": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 10, + "dirty": false + }, + "exact": true + } +} diff --git a/tests/golden/WBV2-P9-001/feature-parity-task-plan.json b/tests/golden/WBV2-P9-001/feature-parity-task-plan.json new file mode 100644 index 000000000..9e90a6fff --- /dev/null +++ b/tests/golden/WBV2-P9-001/feature-parity-task-plan.json @@ -0,0 +1,1448 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_FEATURE_EPOCH_1", + "status": "ACTIVE_CAPABILITY_QUEUE", + "authority": "queue_reactivated_after_owner_review", + "productContract": "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "sourcePlan": "docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "correctiveCheckpoint": { + "task": "C6-003", + "handoff": "tests/golden/corrective/C6-003/handoff.json", + "status": "active", + "blocker": null, + "queueMutation": true, + "legacyTask": "M16-GAP-00277", + "legacyParentNextTask": "M16-GAP-00277" + }, + "runtimePolicy": { + "blenderSource": "blender-5.2.0", + "browserEvidence": [ + "chromium" + ], + "forbiddenBrowsers": [ + "firefox", + "webkit" + ], + "mainAuthority": "blender_main", + "storage": [ + "opfs", + "indexeddb" + ], + "queueMutation": "enabled_after_owner_review_and_g5" + }, + "completionClasses": [ + "LOCAL_EXACT", + "LOCAL_BOUNDED", + "SERVER_EXACT", + "EXCLUDED" + ], + "gates": [ + { + "id": "G0", + "name": "scope_and_inventory", + "requires": [ + "contract", + "inventory", + "capability_matrix" + ] + }, + { + "id": "G1", + "name": "runtime_foundation", + "requires": [ + "sceneir", + "main_transaction", + "worker_lifecycle", + "storage_journal" + ] + }, + { + "id": "G2", + "name": "feature_parity", + "requires": [ + "desktop", + "wasm_main", + "chromium", + "negative", + "persistence" + ] + }, + { + "id": "G3", + "name": "recovery_and_security", + "requires": [ + "cancel", + "restart", + "oom_quota", + "malformed", + "dispose" + ] + }, + { + "id": "G4", + "name": "release_candidate", + "requires": [ + "offline", + "ci", + "sbom", + "rollback", + "hashes" + ] + }, + { + "id": "G5", + "name": "queue_mutation", + "requires": [ + "owner_review", + "protected_hashes", + "handoff", + "single_ready_task" + ] + } + ], + "waves": [ + { + "id": "P0", + "name": "facts_and_contracts", + "gate": "G0", + "tasks": [ + "WBV2-P0-001", + "WBV2-P0-002", + "WBV2-P0-003" + ] + }, + { + "id": "P1", + "name": "runtime_foundation", + "gate": "G1", + "tasks": [ + "WBV2-P1-001", + "WBV2-P1-002", + "WBV2-P1-003", + "WBV2-P1-004", + "WBV2-P1-005" + ] + }, + { + "id": "P2", + "name": "core_modeler_loop", + "gate": "G2", + "tasks": [ + "WBV2-P2-001", + "WBV2-P2-002", + "WBV2-P2-003", + "WBV2-P2-004", + "WBV2-P2-005" + ] + }, + { + "id": "P3", + "name": "authoring_and_io", + "gate": "G2", + "tasks": [ + "WBV2-P3-001", + "WBV2-P3-002", + "WBV2-P3-003", + "WBV2-P3-004", + "WBV2-P3-005" + ] + }, + { + "id": "P4", + "name": "advanced_local_slices", + "gate": "G2", + "tasks": [ + "WBV2-P4-001", + "WBV2-P4-002", + "WBV2-P4-003", + "WBV2-P4-004" + ] + }, + { + "id": "P5", + "name": "render_and_server", + "gate": "G3", + "tasks": [ + "WBV2-P5-001", + "WBV2-P5-002", + "WBV2-P5-003" + ] + }, + { + "id": "P6", + "name": "security_performance_release", + "gate": "G4", + "tasks": [ + "WBV2-P6-001", + "WBV2-P6-002", + "WBV2-P6-003" + ] + }, + { + "id": "P7", + "name": "full_parity_gap_program", + "gate": "G5", + "tasks": [ + "WBV2-P7-001", + "WBV2-P7-002", + "WBV2-P7-003" + ] + } + ], + "taskContract": { + "onePrimaryBehavior": true, + "requiredEvidence": [ + "desktop", + "wasm_main", + "chromium", + "negative", + "persistence", + "manifest", + "status" + ], + "requiredCommands": [ + "focused", + "determinism", + "hash", + "governance" + ], + "failureState": "in_progress_or_blocked", + "successorRule": "only_from_parent_manifest_nextTask" + }, + "tasks": [ + { + "id": "WBV2-P0-001", + "phase": "P0", + "title": "reconcile_scope_and_checkpoints", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-governance", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-001.md", + "behavior": "Freeze V1/full-parity boundary and reconcile legacy/corrective pointers without queue mutation.", + "outputs": [ + "scope decision", + "checkpoint report", + "protected hash set" + ], + "acceptance": [ + "corrective owner-review status is explicit", + "legacy parent pointer is unchanged", + "plan has one activation gate" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P0-002", + "phase": "P0", + "title": "generate_blender52_inventory_and_parity_map", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P0-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-inventory", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-002.md", + "behavior": "Generate stable Blender 5.2 data-block/operator/editor/node/format inventory and map every entry to a completion class.", + "outputs": [ + "inventory", + "parity map", + "source hash" + ], + "acceptance": [ + "unknown entries are classified", + "inventory is deterministic", + "no entry claims feature parity without evidence" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P0-003", + "phase": "P0", + "title": "freeze_capability_error_budget_contract", + "kind": "enabling", + "owner": "PROTOCOL", + "dependsOn": [ + "WBV2-P0-001", + "WBV2-P0-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-contract", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-003.md", + "behavior": "Freeze capability levels, stable error codes, revision, budget, cancellation and loss-report schemas.", + "outputs": [ + "versioned protocol", + "capability matrix", + "negative matrix" + ], + "acceptance": [ + "unsupported input fails closed", + "schema hashes are stable", + "migration policy preserves unknown data" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-001", + "phase": "P1", + "title": "stabilize_runtime_variants_and_source_receipts", + "kind": "enabling", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P0-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-runtime", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-001.md", + "behavior": "Bind single-thread/pthread WebEngine variants to pinned Blender source/build/runtime receipts.", + "outputs": [ + "runtime manifest", + "variant selector", + "fallback report" + ], + "acceptance": [ + "variant fallback is deterministic", + "source/build hash is verified", + "one engine session has one generation" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-002", + "phase": "P1", + "title": "unify_sceneir_stable_ids_and_binary_deltas", + "kind": "enabling", + "owner": "MAIN", + "dependsOn": [ + "WBV2-P1-001" + ], + "parityId": null, + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p1-sceneir", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-002.md", + "behavior": "Make SceneIR/WBG1 stable IDs, topology/attribute domains and binary/range deltas canonical across desktop and WASM.", + "outputs": [ + "SceneIR schema", + "binary fixture", + "delta comparator" + ], + "acceptance": [ + "IDs survive save/reopen", + "malformed chunk is rejected", + "desktop and WASM canonical hashes match" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-003", + "phase": "P1", + "title": "unify_main_transaction_history_and_save", + "kind": "enabling", + "owner": "MAIN", + "dependsOn": [ + "WBV2-P1-002" + ], + "parityId": null, + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p1-history", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-003.md", + "behavior": "Use one Main transaction/revision/history contract for commit, undo/redo, atomic save and reopen.", + "outputs": [ + "transaction contract", + "history receipt", + "save/reopen runner" + ], + "acceptance": [ + "failed/no-op commands add no history", + "stale revision cannot commit", + "reopen state is byte/hash stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-004", + "phase": "P1", + "title": "harden_worker_cancel_restart_and_dispose", + "kind": "enabling", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P1-001", + "WBV2-P1-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-lifecycle", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-004.md", + "behavior": "Make cancellation, late-result rejection, Worker restart and resource disposal common to all domains.", + "outputs": [ + "lifecycle runner", + "fault report", + "dispose counters" + ], + "acceptance": [ + "cancel never publishes result", + "generation mismatch is rejected", + "CPU/WASM/GPU owners return to budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-005", + "phase": "P1", + "title": "harden_opfs_indexeddb_journal_recovery", + "kind": "enabling", + "owner": "STORAGE", + "dependsOn": [ + "WBV2-P1-003", + "WBV2-P1-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-storage", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-005.md", + "behavior": "Unify OPFS staging/content addressing and IndexedDB metadata/journal recovery.", + "outputs": [ + "storage schema", + "crash fixtures", + "recovery checker" + ], + "acceptance": [ + "interrupted commit leaves old project usable", + "hash mismatch quarantines payload", + "small project recovers after restart" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-001", + "phase": "P2", + "title": "open_blend_scene_context_and_outliner", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1-002", + "WBV2-P1-005" + ], + "parityId": "EDITOR.OPEN_SCENE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-editor", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-001.md", + "behavior": "Open a minimal .blend and expose scene/object/collection context from authoritative Main.", + "outputs": [ + "desktop fixture", + "outliner report", + "Chromium path" + ], + "acceptance": [ + "stable IDs and selection revision match", + "missing data is structured", + "reopen preserves context" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-002", + "phase": "P2", + "title": "object_collection_parent_transform_workflow", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1-003", + "WBV2-P2-001" + ], + "parityId": "OBJECT.TRANSFORM_HIERARCHY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-scene", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-002.md", + "behavior": "Edit object transform, collection membership and parent hierarchy through Main transactions.", + "outputs": [ + "desktop/WASM golden", + "negative cases", + "save/reopen receipt" + ], + "acceptance": [ + "world matrix parity", + "cycle/locked/library edits reject", + "undo/redo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-003", + "phase": "P2", + "title": "mesh_edit_core_operations", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1-002", + "WBV2-P2-002" + ], + "parityId": "MESH.EDIT_CORE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-mesh", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-003.md", + "behavior": "Expose bounded vertex/edge/face selection plus merge/dissolve/extrude/inset/bevel/loop-cut.", + "outputs": [ + "Blender fixture set", + "topology comparator", + "Chromium edit path" + ], + "acceptance": [ + "topology/attributes match", + "invalid selection and budget fail closed", + "single transaction and reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-004", + "phase": "P2", + "title": "dual_viewport_sceneir_render_path", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P2-003" + ], + "parityId": "VIEWPORT.MAIN_OFFSCREEN", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p2-viewport", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-004.md", + "behavior": "Render the same validated SceneIR through main-thread WebGL2 and OffscreenCanvas Worker paths.", + "outputs": [ + "pixel report", + "viewport diagnostics", + "device recovery" + ], + "acceptance": [ + "both paths have nonblank pixels", + "selection/camera revision is shared", + "device loss releases resources" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-005", + "phase": "P2", + "title": "close_p0_user_loop", + "kind": "feature", + "owner": "INTEGRATION", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P2-003", + "WBV2-P1-005", + "WBV2-P2-004" + ], + "parityId": "WORKFLOW.P0_USER_LOOP", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p2-integration", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-005.md", + "behavior": "Prove open -> edit -> undo -> redo -> save -> restart -> reopen -> GLB in one production flow.", + "outputs": [ + "P0 workflow report", + "release binding", + "rollback receipt" + ], + "acceptance": [ + "Main revision and exported asset are bound", + "fault/cancel leaves old state", + "Chromium production path passes" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-001", + "phase": "P3", + "title": "material_uv_principled_asset_workflow", + "kind": "feature", + "owner": "MATERIAL", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-005" + ], + "parityId": "MATERIAL.PBR_UV", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-authoring", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-001.md", + "behavior": "Edit material slots, UVs and declared Principled/Image/Normal graph nodes with content-addressed textures.", + "outputs": [ + "material golden", + "texture receipt", + "loss report" + ], + "acceptance": [ + "desktop/WASM node fields match", + "unsupported node retained/blocked", + "packed asset survives reopen" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-002", + "phase": "P3", + "title": "keyframe_timeline_action_workflow", + "kind": "feature", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P2-005", + "WBV2-P3-001" + ], + "parityId": "ANIMATION.TRS_ACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p3-authoring", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-002.md", + "behavior": "Create/edit TRS keyframes, timeline and declared Action interpolation through Main.", + "outputs": [ + "frame golden", + "animation comparator", + "reopen report" + ], + "acceptance": [ + "sampled values and handles match", + "stale frame result rejected", + "undo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-003", + "phase": "P3", + "title": "armature_pose_constraint_skin_workflow", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P3-002" + ], + "parityId": "RIG.POSE_SKIN", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-rig", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-003.md", + "behavior": "Read and edit declared armature pose/constraint/weight/shape-key slices with bounded evaluation.", + "outputs": [ + "pose golden", + "skin report", + "unsupported matrix" + ], + "acceptance": [ + "pose matrices and weights match", + "unsupported constraint is explicit", + "save/reopen and small recovery pass" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-004", + "phase": "P3", + "title": "glb_roundtrip_and_loss_report", + "kind": "feature", + "owner": "IO", + "dependsOn": [ + "WBV2-P2-005", + "WBV2-P3-001", + "WBV2-P3-003" + ], + "parityId": "IO.GLB_ROUNDTRIP", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p3-io", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-004.md", + "behavior": "Import/export declared GLB mesh/PBR/texture/morph/skin/animation and report non-mapped semantics.", + "outputs": [ + "GLB fixtures", + "desktop reimport report", + "loss report" + ], + "acceptance": [ + "roundtrip canonical graph matches", + "sparse/external URI/budget negatives reject", + "no silent loss" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-005", + "phase": "P3", + "title": "library_asset_append_link_override", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1-005", + "WBV2-P2-001", + "WBV2-P3-004" + ], + "parityId": "ASSET.LIBRARY_OPERATIONS", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-assets", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-005.md", + "behavior": "Support declared append/link/override ownership, reload and missing-library semantics.", + "outputs": [ + "library fixtures", + "ownership report", + "negative matrix" + ], + "acceptance": [ + "source/hash/owner identity preserved", + "linked mutation blocked", + "stale generation and missing source fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-001", + "phase": "P4", + "title": "modifier_graph_and_apply_slices", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-005", + "WBV2-P3-005" + ], + "parityId": "MODIFIER.DECLARED_SLICES", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-001.md", + "behavior": "Enable one declared modifier parameter/apply workflow at a time with dependency-aware blocking.", + "outputs": [ + "modifier goldens", + "dependency report", + "negative cases" + ], + "acceptance": [ + "desktop/evaluated Main match", + "unknown modifier retained and blocked", + "apply/undo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-002", + "phase": "P4", + "title": "geometry_nodes_and_shader_allowlist", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P3-001", + "WBV2-P4-001" + ], + "parityId": "NODES.ALLOWLIST", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-002.md", + "behavior": "Read/write/evaluate only declared Geometry Nodes and shader graph allowlists with resource budgets.", + "outputs": [ + "node fixtures", + "compile/cache receipts", + "unsupported graph reports" + ], + "acceptance": [ + "node/socket/link/default parity", + "budget and unknown-node block before commit", + "compile failure rolls back" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-003", + "phase": "P4", + "title": "sculpt_nonmesh_and_paint_bounded_slices", + "kind": "feature", + "owner": "SCULPT", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-004", + "WBV2-P4-002" + ], + "parityId": "SCULPT.NONMESH.PAINT_BOUNDED", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-003.md", + "behavior": "Expose declared sculpt attributes/strokes, Curve/Surface/Font/PointCloud and paint slices with explicit PBVH limits.", + "outputs": [ + "non-mesh fixtures", + "stroke report", + "capability blocks" + ], + "acceptance": [ + "Main commit is atomic", + "unsupported brush/solver returns stable code", + "GPU/OOM/restart recovery passes" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-004", + "phase": "P4", + "title": "simulation_cache_identity_and_lifecycle", + "kind": "feature", + "owner": "SIMULATION", + "dependsOn": [ + "WBV2-P1-005", + "WBV2-P4-002", + "WBV2-P4-003" + ], + "parityId": "SIMULATION.CACHE_LIFECYCLE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G3", + "card": "docs/tasks/WBV2-P4-004.md", + "behavior": "Bind declared simulation cache to source/settings/revision hashes with cancellation, LRU and restart recovery.", + "outputs": [ + "cache fixtures", + "identity report", + "quarantine evidence" + ], + "acceptance": [ + "stale/corrupt cache never publishes", + "small cache recovers after restart", + "budget release is observable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-001", + "phase": "P5", + "title": "render_capability_routing", + "kind": "feature", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P2-004", + "WBV2-P4-002", + "WBV2-P4-004" + ], + "parityId": "RENDER.ROUTING", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p5-media", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-001.md", + "behavior": "Route bounded Eevee/WebGL capabilities locally and unsupported render classes to SERVER_EXACT or EXCLUDED.", + "outputs": [ + "render receipts", + "pixel golden", + "routing report" + ], + "acceptance": [ + "source/settings/build identity bound", + "unsupported route cannot pretend local success", + "cancel/device loss releases resources" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-002", + "phase": "P5", + "title": "compositor_sequencer_media_recovery", + "kind": "feature", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P3-002", + "WBV2-P5-001" + ], + "parityId": "MEDIA.BOUNDED_WORKFLOW", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p5-media", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-002.md", + "behavior": "Provide declared compositor/sequencer/codec/proxy/audio slices with revision and recovery gates.", + "outputs": [ + "media receipts", + "recovery report", + "audio/session diagnostics" + ], + "acceptance": [ + "seek/decode revision ordering", + "cancel/timeout does not publish", + "quota/OOM/restart leaves project valid" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-003", + "phase": "P5", + "title": "server_job_result_binding", + "kind": "feature", + "owner": "SERVER", + "dependsOn": [ + "WBV2-P0-003", + "WBV2-P5-001", + "WBV2-P5-002" + ], + "parityId": "SERVER.JOB_BINDING", + "implementationClass": "SERVER_EXACT", + "parallelGroup": "p5-server", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-003.md", + "behavior": "Bind server render/encode/physics jobs to immutable input/settings/build/output hashes and explicit lifecycle states.", + "outputs": [ + "server protocol", + "idempotency receipt", + "negative matrix" + ], + "acceptance": [ + "duplicate request is idempotent", + "stale result cannot bind", + "timeout/cancel/OOM produces no READY output" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-001", + "phase": "P6", + "title": "scripting_default_deny_and_audit", + "kind": "feature", + "owner": "SECURITY", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P5-003" + ], + "parityId": "SECURITY.SCRIPTING", + "implementationClass": "EXCLUDED", + "parallelGroup": "p6-safety", + "gate": "G3", + "card": "docs/tasks/WBV2-P6-001.md", + "behavior": "Read text/metadata and expose audited, budgeted, default-deny script policy without arbitrary execution.", + "outputs": [ + "policy manifest", + "malicious fixtures", + "audit report" + ], + "acceptance": [ + "autorun/network/add-on defaults deny", + "sandbox cancellation/dispose works", + "no secret or filesystem escape" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-002", + "phase": "P6", + "title": "performance_fault_and_recovery_matrix", + "kind": "enabling", + "owner": "RELIABILITY", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P1-005", + "WBV2-P2-004", + "WBV2-P6-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p6-safety", + "gate": "G3", + "card": "docs/tasks/WBV2-P6-002.md", + "behavior": "Run deterministic geometry/texture/media/cache budgets and inject OOM/quota/device/network faults.", + "outputs": [ + "budget matrix", + "fault reports", + "resource release ledger" + ], + "acceptance": [ + "100k/1M/10M thresholds recorded", + "fault leaves old revision usable", + "all owned resources return to budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-003", + "phase": "P6", + "title": "offline_ci_sbom_and_rollback_release", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P6-001", + "WBV2-P6-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p6-release", + "gate": "G4", + "card": "docs/tasks/WBV2-P6-003.md", + "behavior": "Produce reproducible offline/source/binary release packages with CI lanes, SBOM and rollback evidence.", + "outputs": [ + "RC manifest", + "offline archive", + "CI reports" + ], + "acceptance": [ + "quick/Chromium/release lanes pass", + "artifact hashes reproduce", + "upgrade/rollback and known limitations are tested" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-001", + "phase": "P7", + "title": "cluster_full_blender_gap_inventory", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P0-002", + "WBV2-P6-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-gap", + "gate": "G4", + "card": "docs/tasks/WBV2-P7-001.md", + "behavior": "Cluster remaining Blender 5.2 data-block/operator/editor/node/format gaps by family and evidence class.", + "outputs": [ + "cluster catalog", + "coverage report", + "risk ranking" + ], + "acceptance": [ + "each gap has stable ID and owner", + "negative-only/unsupported is not positive parity", + "clusters are deterministic" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-002", + "phase": "P7", + "title": "generate_atomic_family_gap_queue", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P7-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-gap", + "gate": "G4", + "card": "docs/tasks/WBV2-P7-002.md", + "behavior": "Generate one task per parityId x observable behavior x implementation class with parent/hash context.", + "outputs": [ + "task index", + "task catalog", + "task cards" + ], + "acceptance": [ + "one active ready task", + "no guessed successor", + "each card fits context budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-003", + "phase": "P7", + "title": "full_parity_candidate_release_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P7-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-release", + "gate": "G5", + "card": "docs/tasks/WBV2-P7-003.md", + "behavior": "Recompute parity closure, evidence health, recovery health and release decision from machine manifests.", + "outputs": [ + "parity release report", + "known limitations", + "final decision" + ], + "acceptance": [ + "all claims bind to evidence", + "blocked/excluded/server classes remain explicit", + "queue and protected hashes pass" + ], + "status": "blocked", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-000", + "phase": "P8", + "title": "authorize_recovery_capability_root", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P7-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-governance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-000.md", + "behavior": "Authorize a recovery epoch without rewriting the blocked P7 manifest.", + "outputs": [ + "recovery plan", + "root manifest", + "queue authorization" + ], + "acceptance": [ + "P7 evidence remains hash exact", + "recovery scope is explicit", + "one recovery task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P8-001", + "phase": "P8", + "title": "rebaseline_mutable_inventories", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-governance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-001.md", + "behavior": "Rebaseline mutable WBV2 plan and dependency inventory inputs while preserving historical manifests.", + "outputs": [ + "semantic drift report", + "current inventory baseline", + "manifest" + ], + "acceptance": [ + "only expected mutable hashes drift", + "dependency closure is unchanged", + "historical manifests remain unmodified" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-002", + "phase": "P8", + "title": "close_atomic_chromium_receipts", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P8-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-receipts", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-002.md", + "behavior": "Produce and bind all 45 atomic Chromium family receipts.", + "outputs": [ + "Chromium report", + "45 receipt index", + "receipt manifests" + ], + "acceptance": [ + "45 receipts are manifest-bound", + "desktop/WASM/save-reopen behaviors are explicit", + "Chromium is the only browser" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-003", + "phase": "P8", + "title": "authorize_m12_provenance_epoch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-provenance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-003.md", + "behavior": "Bind restored M12 sources and explicitly rebaseline unavailable originals in a new provenance epoch.", + "outputs": [ + "provenance epoch", + "replacement bindings", + "manifest" + ], + "acceptance": [ + "22 restored originals stay exact", + "62 unavailable entries are not called restored", + "all replacements are hash-bound" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-004", + "phase": "P8", + "title": "recompute_recovery_release_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P8-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-release", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-004.md", + "behavior": "Recompute the release decision from the recovery epoch and atomic receipts.", + "outputs": [ + "release gate", + "known limitations", + "final manifest" + ], + "acceptance": [ + "all receipts bind to manifests", + "provenance epoch is explicit", + "all governance gates pass" + ], + "status": "in_progress", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-000", + "phase": "P9", + "title": "authorize_feature_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p9-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-000.md", + "behavior": "Authorize feature parity continuation after provenance epoch 2 without claiming historical byte reproduction.", + "outputs": [ + "continuation receipt", + "feature parity plan", + "scope limits" + ], + "acceptance": [ + "P8 provenance evidence remains exact", + "authorized baseline is explicit", + "one feature task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P9-001", + "phase": "P9", + "title": "mesh_production_chromium_receipt", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P9-000" + ], + "parityId": "CAP-MESH-POSITIVE-EDIT", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-mesh", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-001.md", + "behavior": "Bind the existing Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt.", + "outputs": [ + "Chromium mesh receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real meshTranslateVertex command passes", + "desktop/WASM delta matches", + "save/reopen is exact", + "malformed/stale/unknown inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-002", + "phase": "P9", + "title": "modifier_production_chromium_receipt", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P9-001" + ], + "parityId": "CAP-MODIFIER-STATE-MUTATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-modifier", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-002.md", + "behavior": "Bind the existing Modifier Main transaction to a production Chromium receipt.", + "outputs": [ + "Chromium modifier receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real modifierSetEnabled command passes", + "desktop/WASM delta matches", + "save/reopen is exact" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-003", + "phase": "P9", + "title": "asset_catalog_production_chromium_receipt", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P9-002" + ], + "parityId": "CAP-ASSET-CATALOG-MUTATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-asset", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-003.md", + "behavior": "Bind the existing Asset Catalog Main transaction and resource resolver to a production Chromium receipt.", + "outputs": [ + "Chromium asset receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real assetCatalogAppend command passes", + "resource hash is bound", + "save/reopen is exact" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-004", + "phase": "P9", + "title": "recompute_feature_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P9-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p9-release", + "gate": "G7", + "card": "docs/tasks/WBV2-P9-004.md", + "behavior": "Recompute declared feature parity claims from production Chromium receipts and authorized provenance.", + "outputs": [ + "feature parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only evidenced feature claims are emitted", + "authorized baseline remains explicit", + "full historical reproduction remains false" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P9-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P9-000/feature-parity-task-plan.json", + "sha256": "3e8c06dbf6da9ec0c9ccf233c6c2856ee32900025fdea23f5e9f17b45536c74d" + } +} diff --git a/tests/golden/WBV2-P9-001/manifest.json b/tests/golden/WBV2-P9-001/manifest.json new file mode 100644 index 000000000..fd28164bb --- /dev/null +++ b/tests/golden/WBV2-P9-001/manifest.json @@ -0,0 +1,74 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-001", + "parentTask": "WBV2-P9-000", + "operation": "MESH_PRODUCTION_CHROMIUM_RECEIPT", + "status": "done", + "enablingTask": false, + "parityStateChange": true, + "runtime": "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P9-000/manifest.json", + "sha256": "62de070d0f80c31baf1f56fef51c71bedc34c3b7dc2704ad646e0037e44e7eb8" + }, + "sourceManifest": { + "path": "tests/golden/WBV2-P2-003/manifest.json", + "sha256": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987" + }, + "sourceReport": { + "path": "tests/golden/WBV2-P2-003/mesh-edit-report.json", + "sha256": "f8bd2ced2e1345248d4b536ef045bb9446a55ca5ae87d834f38904b86521b11d" + }, + "chromiumReport": { + "path": "tests/golden/WBV2-P9-001/chromium-mesh-production.json", + "sha256": "b069841e954c9a31d6232ffbd5873fc7863522ac866035bca23e4cb816ceffe4" + }, + "chromiumSecondReport": { + "path": "tests/golden/WBV2-P9-001/chromium-mesh-production.second.json", + "sha256": "b069841e954c9a31d6232ffbd5873fc7863522ac866035bca23e4cb816ceffe4" + }, + "e2e": { + "path": "web/tests/e2e/wbv2-mesh-production.spec.ts", + "sha256": "bf90dde6176340fca7013c119e96b29bf42d1de25c72ec468b73566d27b92869" + }, + "protocol": { + "path": "web/protocol/corrective-mesh-command.ts", + "sha256": "53ca11912380bedfad782ed587d809270571a4800ef87b71bb992bcb4ae34937" + }, + "bridge": { + "path": "web/app/src/corrective-pilot-bridge.ts", + "sha256": "e242a8d407fcdfb8b695d4278d4b90af4b9b821b9a8f0996f8835bc33bc14097" + }, + "generator": { + "path": "tools/web/generate-wbv2-mesh-receipt.mjs", + "sha256": "ef4e9c79be0287b857e3ce58ddd21cd0957db3ea5c49196368efa583e24b0f4d" + }, + "report": { + "path": "tests/golden/WBV2-P9-001/mesh-receipt-report.json", + "sha256": "e1f1d552936b77a44e05d0c8cfffb4f4397db40863c6bc4631fe52141eeec559" + }, + "status": { + "path": "docs/status/WBV2-P9-001.md", + "sha256": "f94c6012b44fc06af49b113dd9315cabd4825d5af298898a0cecae2016656eef" + }, + "featureParityPlan": { + "path": "tests/golden/WBV2-P9-001/feature-parity-task-plan.json", + "sha256": "ae01eff479886d0b51c656d2273dab4219154e8634e62e91c0d1a377aa04740c" + }, + "taskContext": { + "path": "tests/golden/WBV2-P9-001/task-context.json", + "sha256": "597d3bfeceffeb92a2b3dff5628ae0ce353b4c3df4261132ee69b14449429760" + } + }, + "assertions": { + "capabilityId": "CAP-MESH-POSITIVE-EDIT", + "browser": "chromium", + "surfaces": 2, + "deterministic": true, + "saveReopen": "EXACT", + "negativeCases": 3, + "historicalReproduction": false + }, + "nextTask": "WBV2-P9-002" +} diff --git a/tests/golden/WBV2-P9-001/mesh-receipt-report.json b/tests/golden/WBV2-P9-001/mesh-receipt-report.json new file mode 100644 index 000000000..31d115eab --- /dev/null +++ b/tests/golden/WBV2-P9-001/mesh-receipt-report.json @@ -0,0 +1,188 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-001", + "operation": "MESH_PRODUCTION_CHROMIUM_RECEIPT", + "status": "PASS", + "browser": "chromium", + "queueMutation": false, + "source": { + "task": "WBV2-P2-003", + "manifest": "tests/golden/WBV2-P2-003/manifest.json", + "manifestSha256": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987", + "report": "tests/golden/WBV2-P2-003/mesh-edit-report.json", + "reportSha256": "f8bd2ced2e1345248d4b536ef045bb9446a55ca5ae87d834f38904b86521b11d", + "exactDesktop": true, + "exactWasm": true, + "exactSaveReopen": true + }, + "chromium": { + "report": "tests/golden/WBV2-P9-001/chromium-mesh-production.json", + "reportSha256": "b069841e954c9a31d6232ffbd5873fc7863522ac866035bca23e4cb816ceffe4", + "secondReport": "tests/golden/WBV2-P9-001/chromium-mesh-production.second.json", + "secondReportSha256": "b069841e954c9a31d6232ffbd5873fc7863522ac866035bca23e4cb816ceffe4", + "deterministic": true, + "surfaces": [ + "DESKTOP", + "WASM" + ], + "positive": { + "desktop": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "FINISHED", + "code": "OK", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 10, + "mainMutation": "CHANGED", + "delta": { + "vertexId": "vertex:0", + "before": { + "x": 1, + "y": 2, + "z": 3 + }, + "after": { + "x": 1.5, + "y": 1, + "z": 5 + } + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "wasm": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "FINISHED", + "code": "OK", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 10, + "mainMutation": "CHANGED", + "delta": { + "vertexId": "vertex:0", + "before": { + "x": 1, + "y": 2, + "z": 3 + }, + "after": { + "x": 1.5, + "y": 1, + "z": 5 + } + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "parity": true + }, + "negative": { + "malformed": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "MALFORMED", + "code": "COMMAND_MALFORMED", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 9, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_MALFORMED", + "message": "COMMAND_MALFORMED: mesh delta must contain only x, y, and z" + } + }, + "stale": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "BLOCKED", + "code": "REVISION_CONFLICT", + "baseRevision": 8, + "mainRevisionBefore": 9, + "mainRevisionAfter": 9, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "REVISION_CONFLICT", + "message": "base revision does not match current Main" + } + }, + "unknown": { + "schemaVersion": 1, + "requestId": "wbv2-p9-001-mesh-translate", + "status": "UNSUPPORTED", + "code": "COMMAND_UNSUPPORTED", + "baseRevision": 9, + "mainRevisionBefore": 9, + "mainRevisionAfter": 9, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_UNSUPPORTED", + "message": "COMMAND_UNSUPPORTED: vertex vertex:missing does not exist" + } + } + }, + "persistence": { + "exact": true, + "saved": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 10, + "dirty": false + }, + "reopened": { + "value": { + "vertices": [ + { + "id": "vertex:0", + "x": 1.5, + "y": 1, + "z": 5 + }, + { + "id": "vertex:1", + "x": 0, + "y": 0, + "z": 0 + } + ] + }, + "revision": 10, + "dirty": false + } + } + }, + "assertions": { + "realMeshTranslateVertex": true, + "desktopWasmDeltaMatch": true, + "saveReopenExact": true, + "failureMatrixClosed": true, + "featureParityClaim": "CAP-MESH-POSITIVE-EDIT", + "historicalReproduction": false + }, + "nextTask": "WBV2-P9-002" +} diff --git a/tests/golden/WBV2-P9-001/task-context.json b/tests/golden/WBV2-P9-001/task-context.json new file mode 100644 index 000000000..a3c222918 --- /dev/null +++ b/tests/golden/WBV2-P9-001/task-context.json @@ -0,0 +1,175 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-001", + "parentTask": "WBV2-P9-000", + "status": "in_progress", + "goal": "Bind the real Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.", + "scope": { + "gap": "workflow:mesh_production_chromium_receipt", + "ownerFamily": "MESH", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-production.spec.ts", + "node tools/web/generate-wbv2-mesh-receipt.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P9-001 --write" + ], + "inputPaths": [ + "web/protocol/corrective-mesh-command.ts" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 3811, + "contextRemainingTokens": 951 + }, + "source": { + "bytes": 6093, + "tokens": 1525 + }, + "selected": [ + { + "path": "web/protocol/corrective-mesh-command.ts", + "bytes": 3569, + "tokens": 893 + } + ], + "excluded": [ + { + "path": "tests/golden/corrective/C4-002/receipt-report.json", + "bytes": 5550, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/wbv2-mesh-production.spec.ts", + "bytes": 4656, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P9-001/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P9-001.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P9-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 1, + "bytes": 3569, + "tokens": 893 + } + }, + "exitCriteria": [ + "real meshTranslateVertex command passes", + "desktop/WASM delta matches", + "save/reopen is exact", + "malformed/stale/unknown inputs fail closed" + ], + "nextTask": "WBV2-P9-002", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P9-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P9-000/manifest.json", + "parentStatus": "docs/status/WBV2-P9-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P9-001.md", + "tests/golden/WBV2-P9-000/manifest.json", + "docs/status/WBV2-P9-000.md" + ], + "machineOnly": [ + "tests/golden/WBV2/task-index.json", + "tests/golden/M15-03A/task-catalog.jsonl" + ], + "optionalByNeed": [ + "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "任务卡列出的精确协议/生产路径", + "任务卡明确命名的长期计划小节" + ], + "forbiddenByDefault": [ + "完整 CURRENT_EXECUTION_PLAN.md", + "完整 PROJECT_STATUS_AND_NEXT_WORK.md", + "全部 docs/status/*.md", + "完整 parity/WBS 计划", + "README 历史和 test-results/" + ] + }, + "parent": { + "manifest": { + "schemaVersion": 1, + "task": "WBV2-P9-000", + "parentTask": "WBV2-P8-004", + "status": "done", + "nextTask": "WBV2-P9-001", + "artifactCount": 8 + }, + "statusSummary": [ + "# WBV2-P9-000 status", + "- task: `WBV2-P9-000`; parent: `WBV2-P8-004`; status: `done`", + "- nextTask: `WBV2-P9-001`", + "Feature parity continuation is authorized after provenance epoch 2. Work is limited to evidenced Mesh, Modifier, and Asset Catalog behavior in Chromium; full historical reproduction remains false." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1194, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 34, + "taskTokens": 299 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2799, + "lines": 51, + "tokens": 700 + }, + { + "path": "docs/tasks/WBV2-P9-001.md", + "bytes": 1194, + "lines": 34, + "tokens": 299 + }, + { + "path": "tests/golden/WBV2-P9-000/manifest.json", + "bytes": 1793, + "lines": 54, + "tokens": 449 + }, + { + "path": "docs/status/WBV2-P9-000.md", + "bytes": 307, + "lines": 7, + "tokens": 77 + } + ], + "sourceTokens": 1525, + "evidenceFiles": 1, + "evidenceBytes": 3569, + "evidenceTokens": 893, + "totalTokens": 2418, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3442, + "serializedContextTokens": 699, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P9-002/chromium-modifier-production.json b/tests/golden/WBV2-P9-002/chromium-modifier-production.json new file mode 100644 index 000000000..652cf1936 --- /dev/null +++ b/tests/golden/WBV2-P9-002/chromium-modifier-production.json @@ -0,0 +1,226 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-002", + "operation": "MODIFIER_PRODUCTION_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": false, + "showViewport": true, + "showRender": true + } + ], + "positive": { + "desktop": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "FINISHED", + "code": "OK", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 8, + "mainMutation": "CHANGED", + "delta": { + "modifierUuid": "modifier:bevel", + "previousEnabled": false, + "enabled": true + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "wasm": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "FINISHED", + "code": "OK", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 8, + "mainMutation": "CHANGED", + "delta": { + "modifierUuid": "modifier:bevel", + "previousEnabled": false, + "enabled": true + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "desktopMain": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": true, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 8, + "dirty": true + }, + "wasmMain": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": true, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 8, + "dirty": true + }, + "parity": true + }, + "negative": { + "malformed": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "MALFORMED", + "code": "COMMAND_MALFORMED", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 7, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_MALFORMED", + "message": "COMMAND_MALFORMED: modifier payload must contain only modifierUuid and enabled" + } + }, + "stale": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "BLOCKED", + "code": "REVISION_CONFLICT", + "baseRevision": 6, + "mainRevisionBefore": 7, + "mainRevisionAfter": 7, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "REVISION_CONFLICT", + "message": "base revision does not match current Main" + } + }, + "unknown": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "UNSUPPORTED", + "code": "COMMAND_UNSUPPORTED", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 7, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_UNSUPPORTED", + "message": "COMMAND_UNSUPPORTED: modifier modifier:missing does not exist" + } + }, + "rollbackMain": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": false, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 7, + "dirty": false + } + }, + "persistence": { + "saved": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": true, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 8, + "dirty": false + }, + "postSave": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-post-save", + "status": "FINISHED", + "code": "OK", + "baseRevision": 8, + "mainRevisionBefore": 8, + "mainRevisionAfter": 9, + "mainMutation": "CHANGED", + "delta": { + "modifierUuid": "modifier:bevel", + "previousEnabled": true, + "enabled": false + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "beforeReopen": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": false, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 9, + "dirty": true + }, + "reopened": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": true, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 8, + "dirty": false + }, + "exact": true + } +} diff --git a/tests/golden/WBV2-P9-002/chromium-modifier-production.second.json b/tests/golden/WBV2-P9-002/chromium-modifier-production.second.json new file mode 100644 index 000000000..652cf1936 --- /dev/null +++ b/tests/golden/WBV2-P9-002/chromium-modifier-production.second.json @@ -0,0 +1,226 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-002", + "operation": "MODIFIER_PRODUCTION_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "fixture": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": false, + "showViewport": true, + "showRender": true + } + ], + "positive": { + "desktop": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "FINISHED", + "code": "OK", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 8, + "mainMutation": "CHANGED", + "delta": { + "modifierUuid": "modifier:bevel", + "previousEnabled": false, + "enabled": true + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "wasm": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "FINISHED", + "code": "OK", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 8, + "mainMutation": "CHANGED", + "delta": { + "modifierUuid": "modifier:bevel", + "previousEnabled": false, + "enabled": true + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "desktopMain": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": true, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 8, + "dirty": true + }, + "wasmMain": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": true, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 8, + "dirty": true + }, + "parity": true + }, + "negative": { + "malformed": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "MALFORMED", + "code": "COMMAND_MALFORMED", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 7, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_MALFORMED", + "message": "COMMAND_MALFORMED: modifier payload must contain only modifierUuid and enabled" + } + }, + "stale": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "BLOCKED", + "code": "REVISION_CONFLICT", + "baseRevision": 6, + "mainRevisionBefore": 7, + "mainRevisionAfter": 7, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "REVISION_CONFLICT", + "message": "base revision does not match current Main" + } + }, + "unknown": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "UNSUPPORTED", + "code": "COMMAND_UNSUPPORTED", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 7, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_UNSUPPORTED", + "message": "COMMAND_UNSUPPORTED: modifier modifier:missing does not exist" + } + }, + "rollbackMain": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": false, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 7, + "dirty": false + } + }, + "persistence": { + "saved": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": true, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 8, + "dirty": false + }, + "postSave": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-post-save", + "status": "FINISHED", + "code": "OK", + "baseRevision": 8, + "mainRevisionBefore": 8, + "mainRevisionAfter": 9, + "mainMutation": "CHANGED", + "delta": { + "modifierUuid": "modifier:bevel", + "previousEnabled": true, + "enabled": false + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "beforeReopen": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": false, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 9, + "dirty": true + }, + "reopened": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": true, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 8, + "dirty": false + }, + "exact": true + } +} diff --git a/tests/golden/WBV2-P9-002/feature-parity-task-plan.json b/tests/golden/WBV2-P9-002/feature-parity-task-plan.json new file mode 100644 index 000000000..383bab247 --- /dev/null +++ b/tests/golden/WBV2-P9-002/feature-parity-task-plan.json @@ -0,0 +1,1448 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_FEATURE_EPOCH_1", + "status": "ACTIVE_CAPABILITY_QUEUE", + "authority": "queue_reactivated_after_owner_review", + "productContract": "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "sourcePlan": "docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "correctiveCheckpoint": { + "task": "C6-003", + "handoff": "tests/golden/corrective/C6-003/handoff.json", + "status": "active", + "blocker": null, + "queueMutation": true, + "legacyTask": "M16-GAP-00277", + "legacyParentNextTask": "M16-GAP-00277" + }, + "runtimePolicy": { + "blenderSource": "blender-5.2.0", + "browserEvidence": [ + "chromium" + ], + "forbiddenBrowsers": [ + "firefox", + "webkit" + ], + "mainAuthority": "blender_main", + "storage": [ + "opfs", + "indexeddb" + ], + "queueMutation": "enabled_after_owner_review_and_g5" + }, + "completionClasses": [ + "LOCAL_EXACT", + "LOCAL_BOUNDED", + "SERVER_EXACT", + "EXCLUDED" + ], + "gates": [ + { + "id": "G0", + "name": "scope_and_inventory", + "requires": [ + "contract", + "inventory", + "capability_matrix" + ] + }, + { + "id": "G1", + "name": "runtime_foundation", + "requires": [ + "sceneir", + "main_transaction", + "worker_lifecycle", + "storage_journal" + ] + }, + { + "id": "G2", + "name": "feature_parity", + "requires": [ + "desktop", + "wasm_main", + "chromium", + "negative", + "persistence" + ] + }, + { + "id": "G3", + "name": "recovery_and_security", + "requires": [ + "cancel", + "restart", + "oom_quota", + "malformed", + "dispose" + ] + }, + { + "id": "G4", + "name": "release_candidate", + "requires": [ + "offline", + "ci", + "sbom", + "rollback", + "hashes" + ] + }, + { + "id": "G5", + "name": "queue_mutation", + "requires": [ + "owner_review", + "protected_hashes", + "handoff", + "single_ready_task" + ] + } + ], + "waves": [ + { + "id": "P0", + "name": "facts_and_contracts", + "gate": "G0", + "tasks": [ + "WBV2-P0-001", + "WBV2-P0-002", + "WBV2-P0-003" + ] + }, + { + "id": "P1", + "name": "runtime_foundation", + "gate": "G1", + "tasks": [ + "WBV2-P1-001", + "WBV2-P1-002", + "WBV2-P1-003", + "WBV2-P1-004", + "WBV2-P1-005" + ] + }, + { + "id": "P2", + "name": "core_modeler_loop", + "gate": "G2", + "tasks": [ + "WBV2-P2-001", + "WBV2-P2-002", + "WBV2-P2-003", + "WBV2-P2-004", + "WBV2-P2-005" + ] + }, + { + "id": "P3", + "name": "authoring_and_io", + "gate": "G2", + "tasks": [ + "WBV2-P3-001", + "WBV2-P3-002", + "WBV2-P3-003", + "WBV2-P3-004", + "WBV2-P3-005" + ] + }, + { + "id": "P4", + "name": "advanced_local_slices", + "gate": "G2", + "tasks": [ + "WBV2-P4-001", + "WBV2-P4-002", + "WBV2-P4-003", + "WBV2-P4-004" + ] + }, + { + "id": "P5", + "name": "render_and_server", + "gate": "G3", + "tasks": [ + "WBV2-P5-001", + "WBV2-P5-002", + "WBV2-P5-003" + ] + }, + { + "id": "P6", + "name": "security_performance_release", + "gate": "G4", + "tasks": [ + "WBV2-P6-001", + "WBV2-P6-002", + "WBV2-P6-003" + ] + }, + { + "id": "P7", + "name": "full_parity_gap_program", + "gate": "G5", + "tasks": [ + "WBV2-P7-001", + "WBV2-P7-002", + "WBV2-P7-003" + ] + } + ], + "taskContract": { + "onePrimaryBehavior": true, + "requiredEvidence": [ + "desktop", + "wasm_main", + "chromium", + "negative", + "persistence", + "manifest", + "status" + ], + "requiredCommands": [ + "focused", + "determinism", + "hash", + "governance" + ], + "failureState": "in_progress_or_blocked", + "successorRule": "only_from_parent_manifest_nextTask" + }, + "tasks": [ + { + "id": "WBV2-P0-001", + "phase": "P0", + "title": "reconcile_scope_and_checkpoints", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-governance", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-001.md", + "behavior": "Freeze V1/full-parity boundary and reconcile legacy/corrective pointers without queue mutation.", + "outputs": [ + "scope decision", + "checkpoint report", + "protected hash set" + ], + "acceptance": [ + "corrective owner-review status is explicit", + "legacy parent pointer is unchanged", + "plan has one activation gate" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P0-002", + "phase": "P0", + "title": "generate_blender52_inventory_and_parity_map", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P0-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-inventory", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-002.md", + "behavior": "Generate stable Blender 5.2 data-block/operator/editor/node/format inventory and map every entry to a completion class.", + "outputs": [ + "inventory", + "parity map", + "source hash" + ], + "acceptance": [ + "unknown entries are classified", + "inventory is deterministic", + "no entry claims feature parity without evidence" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P0-003", + "phase": "P0", + "title": "freeze_capability_error_budget_contract", + "kind": "enabling", + "owner": "PROTOCOL", + "dependsOn": [ + "WBV2-P0-001", + "WBV2-P0-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-contract", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-003.md", + "behavior": "Freeze capability levels, stable error codes, revision, budget, cancellation and loss-report schemas.", + "outputs": [ + "versioned protocol", + "capability matrix", + "negative matrix" + ], + "acceptance": [ + "unsupported input fails closed", + "schema hashes are stable", + "migration policy preserves unknown data" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-001", + "phase": "P1", + "title": "stabilize_runtime_variants_and_source_receipts", + "kind": "enabling", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P0-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-runtime", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-001.md", + "behavior": "Bind single-thread/pthread WebEngine variants to pinned Blender source/build/runtime receipts.", + "outputs": [ + "runtime manifest", + "variant selector", + "fallback report" + ], + "acceptance": [ + "variant fallback is deterministic", + "source/build hash is verified", + "one engine session has one generation" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-002", + "phase": "P1", + "title": "unify_sceneir_stable_ids_and_binary_deltas", + "kind": "enabling", + "owner": "MAIN", + "dependsOn": [ + "WBV2-P1-001" + ], + "parityId": null, + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p1-sceneir", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-002.md", + "behavior": "Make SceneIR/WBG1 stable IDs, topology/attribute domains and binary/range deltas canonical across desktop and WASM.", + "outputs": [ + "SceneIR schema", + "binary fixture", + "delta comparator" + ], + "acceptance": [ + "IDs survive save/reopen", + "malformed chunk is rejected", + "desktop and WASM canonical hashes match" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-003", + "phase": "P1", + "title": "unify_main_transaction_history_and_save", + "kind": "enabling", + "owner": "MAIN", + "dependsOn": [ + "WBV2-P1-002" + ], + "parityId": null, + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p1-history", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-003.md", + "behavior": "Use one Main transaction/revision/history contract for commit, undo/redo, atomic save and reopen.", + "outputs": [ + "transaction contract", + "history receipt", + "save/reopen runner" + ], + "acceptance": [ + "failed/no-op commands add no history", + "stale revision cannot commit", + "reopen state is byte/hash stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-004", + "phase": "P1", + "title": "harden_worker_cancel_restart_and_dispose", + "kind": "enabling", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P1-001", + "WBV2-P1-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-lifecycle", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-004.md", + "behavior": "Make cancellation, late-result rejection, Worker restart and resource disposal common to all domains.", + "outputs": [ + "lifecycle runner", + "fault report", + "dispose counters" + ], + "acceptance": [ + "cancel never publishes result", + "generation mismatch is rejected", + "CPU/WASM/GPU owners return to budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-005", + "phase": "P1", + "title": "harden_opfs_indexeddb_journal_recovery", + "kind": "enabling", + "owner": "STORAGE", + "dependsOn": [ + "WBV2-P1-003", + "WBV2-P1-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-storage", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-005.md", + "behavior": "Unify OPFS staging/content addressing and IndexedDB metadata/journal recovery.", + "outputs": [ + "storage schema", + "crash fixtures", + "recovery checker" + ], + "acceptance": [ + "interrupted commit leaves old project usable", + "hash mismatch quarantines payload", + "small project recovers after restart" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-001", + "phase": "P2", + "title": "open_blend_scene_context_and_outliner", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1-002", + "WBV2-P1-005" + ], + "parityId": "EDITOR.OPEN_SCENE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-editor", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-001.md", + "behavior": "Open a minimal .blend and expose scene/object/collection context from authoritative Main.", + "outputs": [ + "desktop fixture", + "outliner report", + "Chromium path" + ], + "acceptance": [ + "stable IDs and selection revision match", + "missing data is structured", + "reopen preserves context" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-002", + "phase": "P2", + "title": "object_collection_parent_transform_workflow", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1-003", + "WBV2-P2-001" + ], + "parityId": "OBJECT.TRANSFORM_HIERARCHY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-scene", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-002.md", + "behavior": "Edit object transform, collection membership and parent hierarchy through Main transactions.", + "outputs": [ + "desktop/WASM golden", + "negative cases", + "save/reopen receipt" + ], + "acceptance": [ + "world matrix parity", + "cycle/locked/library edits reject", + "undo/redo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-003", + "phase": "P2", + "title": "mesh_edit_core_operations", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1-002", + "WBV2-P2-002" + ], + "parityId": "MESH.EDIT_CORE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-mesh", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-003.md", + "behavior": "Expose bounded vertex/edge/face selection plus merge/dissolve/extrude/inset/bevel/loop-cut.", + "outputs": [ + "Blender fixture set", + "topology comparator", + "Chromium edit path" + ], + "acceptance": [ + "topology/attributes match", + "invalid selection and budget fail closed", + "single transaction and reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-004", + "phase": "P2", + "title": "dual_viewport_sceneir_render_path", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P2-003" + ], + "parityId": "VIEWPORT.MAIN_OFFSCREEN", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p2-viewport", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-004.md", + "behavior": "Render the same validated SceneIR through main-thread WebGL2 and OffscreenCanvas Worker paths.", + "outputs": [ + "pixel report", + "viewport diagnostics", + "device recovery" + ], + "acceptance": [ + "both paths have nonblank pixels", + "selection/camera revision is shared", + "device loss releases resources" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-005", + "phase": "P2", + "title": "close_p0_user_loop", + "kind": "feature", + "owner": "INTEGRATION", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P2-003", + "WBV2-P1-005", + "WBV2-P2-004" + ], + "parityId": "WORKFLOW.P0_USER_LOOP", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p2-integration", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-005.md", + "behavior": "Prove open -> edit -> undo -> redo -> save -> restart -> reopen -> GLB in one production flow.", + "outputs": [ + "P0 workflow report", + "release binding", + "rollback receipt" + ], + "acceptance": [ + "Main revision and exported asset are bound", + "fault/cancel leaves old state", + "Chromium production path passes" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-001", + "phase": "P3", + "title": "material_uv_principled_asset_workflow", + "kind": "feature", + "owner": "MATERIAL", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-005" + ], + "parityId": "MATERIAL.PBR_UV", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-authoring", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-001.md", + "behavior": "Edit material slots, UVs and declared Principled/Image/Normal graph nodes with content-addressed textures.", + "outputs": [ + "material golden", + "texture receipt", + "loss report" + ], + "acceptance": [ + "desktop/WASM node fields match", + "unsupported node retained/blocked", + "packed asset survives reopen" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-002", + "phase": "P3", + "title": "keyframe_timeline_action_workflow", + "kind": "feature", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P2-005", + "WBV2-P3-001" + ], + "parityId": "ANIMATION.TRS_ACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p3-authoring", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-002.md", + "behavior": "Create/edit TRS keyframes, timeline and declared Action interpolation through Main.", + "outputs": [ + "frame golden", + "animation comparator", + "reopen report" + ], + "acceptance": [ + "sampled values and handles match", + "stale frame result rejected", + "undo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-003", + "phase": "P3", + "title": "armature_pose_constraint_skin_workflow", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P3-002" + ], + "parityId": "RIG.POSE_SKIN", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-rig", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-003.md", + "behavior": "Read and edit declared armature pose/constraint/weight/shape-key slices with bounded evaluation.", + "outputs": [ + "pose golden", + "skin report", + "unsupported matrix" + ], + "acceptance": [ + "pose matrices and weights match", + "unsupported constraint is explicit", + "save/reopen and small recovery pass" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-004", + "phase": "P3", + "title": "glb_roundtrip_and_loss_report", + "kind": "feature", + "owner": "IO", + "dependsOn": [ + "WBV2-P2-005", + "WBV2-P3-001", + "WBV2-P3-003" + ], + "parityId": "IO.GLB_ROUNDTRIP", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p3-io", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-004.md", + "behavior": "Import/export declared GLB mesh/PBR/texture/morph/skin/animation and report non-mapped semantics.", + "outputs": [ + "GLB fixtures", + "desktop reimport report", + "loss report" + ], + "acceptance": [ + "roundtrip canonical graph matches", + "sparse/external URI/budget negatives reject", + "no silent loss" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-005", + "phase": "P3", + "title": "library_asset_append_link_override", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1-005", + "WBV2-P2-001", + "WBV2-P3-004" + ], + "parityId": "ASSET.LIBRARY_OPERATIONS", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-assets", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-005.md", + "behavior": "Support declared append/link/override ownership, reload and missing-library semantics.", + "outputs": [ + "library fixtures", + "ownership report", + "negative matrix" + ], + "acceptance": [ + "source/hash/owner identity preserved", + "linked mutation blocked", + "stale generation and missing source fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-001", + "phase": "P4", + "title": "modifier_graph_and_apply_slices", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-005", + "WBV2-P3-005" + ], + "parityId": "MODIFIER.DECLARED_SLICES", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-001.md", + "behavior": "Enable one declared modifier parameter/apply workflow at a time with dependency-aware blocking.", + "outputs": [ + "modifier goldens", + "dependency report", + "negative cases" + ], + "acceptance": [ + "desktop/evaluated Main match", + "unknown modifier retained and blocked", + "apply/undo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-002", + "phase": "P4", + "title": "geometry_nodes_and_shader_allowlist", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P3-001", + "WBV2-P4-001" + ], + "parityId": "NODES.ALLOWLIST", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-002.md", + "behavior": "Read/write/evaluate only declared Geometry Nodes and shader graph allowlists with resource budgets.", + "outputs": [ + "node fixtures", + "compile/cache receipts", + "unsupported graph reports" + ], + "acceptance": [ + "node/socket/link/default parity", + "budget and unknown-node block before commit", + "compile failure rolls back" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-003", + "phase": "P4", + "title": "sculpt_nonmesh_and_paint_bounded_slices", + "kind": "feature", + "owner": "SCULPT", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-004", + "WBV2-P4-002" + ], + "parityId": "SCULPT.NONMESH.PAINT_BOUNDED", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-003.md", + "behavior": "Expose declared sculpt attributes/strokes, Curve/Surface/Font/PointCloud and paint slices with explicit PBVH limits.", + "outputs": [ + "non-mesh fixtures", + "stroke report", + "capability blocks" + ], + "acceptance": [ + "Main commit is atomic", + "unsupported brush/solver returns stable code", + "GPU/OOM/restart recovery passes" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-004", + "phase": "P4", + "title": "simulation_cache_identity_and_lifecycle", + "kind": "feature", + "owner": "SIMULATION", + "dependsOn": [ + "WBV2-P1-005", + "WBV2-P4-002", + "WBV2-P4-003" + ], + "parityId": "SIMULATION.CACHE_LIFECYCLE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G3", + "card": "docs/tasks/WBV2-P4-004.md", + "behavior": "Bind declared simulation cache to source/settings/revision hashes with cancellation, LRU and restart recovery.", + "outputs": [ + "cache fixtures", + "identity report", + "quarantine evidence" + ], + "acceptance": [ + "stale/corrupt cache never publishes", + "small cache recovers after restart", + "budget release is observable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-001", + "phase": "P5", + "title": "render_capability_routing", + "kind": "feature", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P2-004", + "WBV2-P4-002", + "WBV2-P4-004" + ], + "parityId": "RENDER.ROUTING", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p5-media", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-001.md", + "behavior": "Route bounded Eevee/WebGL capabilities locally and unsupported render classes to SERVER_EXACT or EXCLUDED.", + "outputs": [ + "render receipts", + "pixel golden", + "routing report" + ], + "acceptance": [ + "source/settings/build identity bound", + "unsupported route cannot pretend local success", + "cancel/device loss releases resources" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-002", + "phase": "P5", + "title": "compositor_sequencer_media_recovery", + "kind": "feature", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P3-002", + "WBV2-P5-001" + ], + "parityId": "MEDIA.BOUNDED_WORKFLOW", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p5-media", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-002.md", + "behavior": "Provide declared compositor/sequencer/codec/proxy/audio slices with revision and recovery gates.", + "outputs": [ + "media receipts", + "recovery report", + "audio/session diagnostics" + ], + "acceptance": [ + "seek/decode revision ordering", + "cancel/timeout does not publish", + "quota/OOM/restart leaves project valid" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-003", + "phase": "P5", + "title": "server_job_result_binding", + "kind": "feature", + "owner": "SERVER", + "dependsOn": [ + "WBV2-P0-003", + "WBV2-P5-001", + "WBV2-P5-002" + ], + "parityId": "SERVER.JOB_BINDING", + "implementationClass": "SERVER_EXACT", + "parallelGroup": "p5-server", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-003.md", + "behavior": "Bind server render/encode/physics jobs to immutable input/settings/build/output hashes and explicit lifecycle states.", + "outputs": [ + "server protocol", + "idempotency receipt", + "negative matrix" + ], + "acceptance": [ + "duplicate request is idempotent", + "stale result cannot bind", + "timeout/cancel/OOM produces no READY output" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-001", + "phase": "P6", + "title": "scripting_default_deny_and_audit", + "kind": "feature", + "owner": "SECURITY", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P5-003" + ], + "parityId": "SECURITY.SCRIPTING", + "implementationClass": "EXCLUDED", + "parallelGroup": "p6-safety", + "gate": "G3", + "card": "docs/tasks/WBV2-P6-001.md", + "behavior": "Read text/metadata and expose audited, budgeted, default-deny script policy without arbitrary execution.", + "outputs": [ + "policy manifest", + "malicious fixtures", + "audit report" + ], + "acceptance": [ + "autorun/network/add-on defaults deny", + "sandbox cancellation/dispose works", + "no secret or filesystem escape" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-002", + "phase": "P6", + "title": "performance_fault_and_recovery_matrix", + "kind": "enabling", + "owner": "RELIABILITY", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P1-005", + "WBV2-P2-004", + "WBV2-P6-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p6-safety", + "gate": "G3", + "card": "docs/tasks/WBV2-P6-002.md", + "behavior": "Run deterministic geometry/texture/media/cache budgets and inject OOM/quota/device/network faults.", + "outputs": [ + "budget matrix", + "fault reports", + "resource release ledger" + ], + "acceptance": [ + "100k/1M/10M thresholds recorded", + "fault leaves old revision usable", + "all owned resources return to budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-003", + "phase": "P6", + "title": "offline_ci_sbom_and_rollback_release", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P6-001", + "WBV2-P6-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p6-release", + "gate": "G4", + "card": "docs/tasks/WBV2-P6-003.md", + "behavior": "Produce reproducible offline/source/binary release packages with CI lanes, SBOM and rollback evidence.", + "outputs": [ + "RC manifest", + "offline archive", + "CI reports" + ], + "acceptance": [ + "quick/Chromium/release lanes pass", + "artifact hashes reproduce", + "upgrade/rollback and known limitations are tested" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-001", + "phase": "P7", + "title": "cluster_full_blender_gap_inventory", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P0-002", + "WBV2-P6-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-gap", + "gate": "G4", + "card": "docs/tasks/WBV2-P7-001.md", + "behavior": "Cluster remaining Blender 5.2 data-block/operator/editor/node/format gaps by family and evidence class.", + "outputs": [ + "cluster catalog", + "coverage report", + "risk ranking" + ], + "acceptance": [ + "each gap has stable ID and owner", + "negative-only/unsupported is not positive parity", + "clusters are deterministic" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-002", + "phase": "P7", + "title": "generate_atomic_family_gap_queue", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P7-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-gap", + "gate": "G4", + "card": "docs/tasks/WBV2-P7-002.md", + "behavior": "Generate one task per parityId x observable behavior x implementation class with parent/hash context.", + "outputs": [ + "task index", + "task catalog", + "task cards" + ], + "acceptance": [ + "one active ready task", + "no guessed successor", + "each card fits context budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-003", + "phase": "P7", + "title": "full_parity_candidate_release_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P7-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-release", + "gate": "G5", + "card": "docs/tasks/WBV2-P7-003.md", + "behavior": "Recompute parity closure, evidence health, recovery health and release decision from machine manifests.", + "outputs": [ + "parity release report", + "known limitations", + "final decision" + ], + "acceptance": [ + "all claims bind to evidence", + "blocked/excluded/server classes remain explicit", + "queue and protected hashes pass" + ], + "status": "blocked", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-000", + "phase": "P8", + "title": "authorize_recovery_capability_root", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P7-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-governance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-000.md", + "behavior": "Authorize a recovery epoch without rewriting the blocked P7 manifest.", + "outputs": [ + "recovery plan", + "root manifest", + "queue authorization" + ], + "acceptance": [ + "P7 evidence remains hash exact", + "recovery scope is explicit", + "one recovery task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P8-001", + "phase": "P8", + "title": "rebaseline_mutable_inventories", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-governance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-001.md", + "behavior": "Rebaseline mutable WBV2 plan and dependency inventory inputs while preserving historical manifests.", + "outputs": [ + "semantic drift report", + "current inventory baseline", + "manifest" + ], + "acceptance": [ + "only expected mutable hashes drift", + "dependency closure is unchanged", + "historical manifests remain unmodified" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-002", + "phase": "P8", + "title": "close_atomic_chromium_receipts", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P8-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-receipts", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-002.md", + "behavior": "Produce and bind all 45 atomic Chromium family receipts.", + "outputs": [ + "Chromium report", + "45 receipt index", + "receipt manifests" + ], + "acceptance": [ + "45 receipts are manifest-bound", + "desktop/WASM/save-reopen behaviors are explicit", + "Chromium is the only browser" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-003", + "phase": "P8", + "title": "authorize_m12_provenance_epoch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-provenance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-003.md", + "behavior": "Bind restored M12 sources and explicitly rebaseline unavailable originals in a new provenance epoch.", + "outputs": [ + "provenance epoch", + "replacement bindings", + "manifest" + ], + "acceptance": [ + "22 restored originals stay exact", + "62 unavailable entries are not called restored", + "all replacements are hash-bound" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-004", + "phase": "P8", + "title": "recompute_recovery_release_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P8-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-release", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-004.md", + "behavior": "Recompute the release decision from the recovery epoch and atomic receipts.", + "outputs": [ + "release gate", + "known limitations", + "final manifest" + ], + "acceptance": [ + "all receipts bind to manifests", + "provenance epoch is explicit", + "all governance gates pass" + ], + "status": "in_progress", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-000", + "phase": "P9", + "title": "authorize_feature_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p9-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-000.md", + "behavior": "Authorize feature parity continuation after provenance epoch 2 without claiming historical byte reproduction.", + "outputs": [ + "continuation receipt", + "feature parity plan", + "scope limits" + ], + "acceptance": [ + "P8 provenance evidence remains exact", + "authorized baseline is explicit", + "one feature task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P9-001", + "phase": "P9", + "title": "mesh_production_chromium_receipt", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P9-000" + ], + "parityId": "CAP-MESH-POSITIVE-EDIT", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-mesh", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-001.md", + "behavior": "Bind the existing Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt.", + "outputs": [ + "Chromium mesh receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real meshTranslateVertex command passes", + "desktop/WASM delta matches", + "save/reopen is exact", + "malformed/stale/unknown inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-002", + "phase": "P9", + "title": "modifier_production_chromium_receipt", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P9-001" + ], + "parityId": "CAP-MODIFIER-STATE-MUTATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-modifier", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-002.md", + "behavior": "Bind the existing Modifier Main transaction to a production Chromium receipt.", + "outputs": [ + "Chromium modifier receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real modifierSetEnabled command passes", + "desktop/WASM delta matches", + "save/reopen is exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-003", + "phase": "P9", + "title": "asset_catalog_production_chromium_receipt", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P9-002" + ], + "parityId": "CAP-ASSET-CATALOG-MUTATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-asset", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-003.md", + "behavior": "Bind the existing Asset Catalog Main transaction and resource resolver to a production Chromium receipt.", + "outputs": [ + "Chromium asset receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real assetCatalogAppend command passes", + "resource hash is bound", + "save/reopen is exact" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-004", + "phase": "P9", + "title": "recompute_feature_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P9-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p9-release", + "gate": "G7", + "card": "docs/tasks/WBV2-P9-004.md", + "behavior": "Recompute declared feature parity claims from production Chromium receipts and authorized provenance.", + "outputs": [ + "feature parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only evidenced feature claims are emitted", + "authorized baseline remains explicit", + "full historical reproduction remains false" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P9-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P9-001/feature-parity-task-plan.json", + "sha256": "ae01eff479886d0b51c656d2273dab4219154e8634e62e91c0d1a377aa04740c" + } +} diff --git a/tests/golden/WBV2-P9-002/manifest.json b/tests/golden/WBV2-P9-002/manifest.json new file mode 100644 index 000000000..1f174962e --- /dev/null +++ b/tests/golden/WBV2-P9-002/manifest.json @@ -0,0 +1,74 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-002", + "parentTask": "WBV2-P9-001", + "operation": "MODIFIER_PRODUCTION_CHROMIUM_RECEIPT", + "status": "done", + "enablingTask": false, + "parityStateChange": true, + "runtime": "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P9-001/manifest.json", + "sha256": "fe697faf705103e8c51f0ad84f04462eb991d78fcfdd393516b76c7726aabe3b" + }, + "sourceManifest": { + "path": "tests/golden/corrective/C4-001/manifest.json", + "sha256": "5ae2a511340e8d7cda7f2f73ce682fef6b33781c81bb6f483339b6a2868e103d" + }, + "sourceReport": { + "path": "tests/golden/corrective/C4-001/receipt-report.json", + "sha256": "64d213f8d3937c06d38cffb919725140624535e835b0b3e7580c6482595c4ef8" + }, + "chromiumReport": { + "path": "tests/golden/WBV2-P9-002/chromium-modifier-production.json", + "sha256": "dcd166b269736f0f5f4c5bd74568ae63c2a2d7b26133700615b5d3a251b7b64e" + }, + "chromiumSecondReport": { + "path": "tests/golden/WBV2-P9-002/chromium-modifier-production.second.json", + "sha256": "dcd166b269736f0f5f4c5bd74568ae63c2a2d7b26133700615b5d3a251b7b64e" + }, + "e2e": { + "path": "web/tests/e2e/wbv2-modifier-production.spec.ts", + "sha256": "e16e65c80d236dd40bfa50564254e02ca1ed095e462b02f69063412dcb2ad40b" + }, + "protocol": { + "path": "web/protocol/corrective-modifier-command.ts", + "sha256": "3b545bb823f2bccb5a16260d62b083b046a2e07bc140dd177c08878f1dfc0431" + }, + "bridge": { + "path": "web/app/src/corrective-pilot-bridge.ts", + "sha256": "e242a8d407fcdfb8b695d4278d4b90af4b9b821b9a8f0996f8835bc33bc14097" + }, + "generator": { + "path": "tools/web/generate-wbv2-modifier-receipt.mjs", + "sha256": "d513b518e4ea1a3b9a1ae8d386329e1aee7ca0365dc2216c1cab700f9d49c4ce" + }, + "report": { + "path": "tests/golden/WBV2-P9-002/modifier-receipt-report.json", + "sha256": "d3e59b339391ad8357e244f8640a0d420c984cb2a4a8ff130110965fe366e8c0" + }, + "status": { + "path": "docs/status/WBV2-P9-002.md", + "sha256": "b8ea57f7e111ef50d53b1358f8b6943319d0b7b370360721698c01e1d19b44bc" + }, + "featureParityPlan": { + "path": "tests/golden/WBV2-P9-002/feature-parity-task-plan.json", + "sha256": "16cc384ca599eb5fbb0f5e75772b5c4fc380ebc7b2818a665b4bd3c4e231a166" + }, + "taskContext": { + "path": "tests/golden/WBV2-P9-002/task-context.json", + "sha256": "67f193f66b1e57828e954156e92598d820f6a643cc95c414ba09fa0148d7b5fa" + } + }, + "assertions": { + "capabilityId": "CAP-MODIFIER-STATE-MUTATION", + "browser": "chromium", + "surfaces": 2, + "deterministic": true, + "saveReopen": "EXACT", + "negativeCases": 3, + "historicalReproduction": false + }, + "nextTask": "WBV2-P9-003" +} diff --git a/tests/golden/WBV2-P9-002/modifier-receipt-report.json b/tests/golden/WBV2-P9-002/modifier-receipt-report.json new file mode 100644 index 000000000..ce97f3ab7 --- /dev/null +++ b/tests/golden/WBV2-P9-002/modifier-receipt-report.json @@ -0,0 +1,163 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-002", + "operation": "MODIFIER_PRODUCTION_CHROMIUM_RECEIPT", + "status": "PASS", + "browser": "chromium", + "queueMutation": false, + "source": { + "task": "C4-001", + "manifest": "tests/golden/corrective/C4-001/manifest.json", + "manifestSha256": "5ae2a511340e8d7cda7f2f73ce682fef6b33781c81bb6f483339b6a2868e103d", + "report": "tests/golden/corrective/C4-001/receipt-report.json", + "reportSha256": "64d213f8d3937c06d38cffb919725140624535e835b0b3e7580c6482595c4ef8", + "exactChromiumPilot": true, + "exactSaveReopen": true + }, + "chromium": { + "report": "tests/golden/WBV2-P9-002/chromium-modifier-production.json", + "reportSha256": "dcd166b269736f0f5f4c5bd74568ae63c2a2d7b26133700615b5d3a251b7b64e", + "secondReport": "tests/golden/WBV2-P9-002/chromium-modifier-production.second.json", + "secondReportSha256": "dcd166b269736f0f5f4c5bd74568ae63c2a2d7b26133700615b5d3a251b7b64e", + "deterministic": true, + "surfaces": [ + "DESKTOP", + "WASM" + ], + "positive": { + "desktop": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "FINISHED", + "code": "OK", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 8, + "mainMutation": "CHANGED", + "delta": { + "modifierUuid": "modifier:bevel", + "previousEnabled": false, + "enabled": true + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "wasm": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "FINISHED", + "code": "OK", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 8, + "mainMutation": "CHANGED", + "delta": { + "modifierUuid": "modifier:bevel", + "previousEnabled": false, + "enabled": true + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "parity": true + }, + "negative": { + "malformed": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "MALFORMED", + "code": "COMMAND_MALFORMED", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 7, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_MALFORMED", + "message": "COMMAND_MALFORMED: modifier payload must contain only modifierUuid and enabled" + } + }, + "stale": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "BLOCKED", + "code": "REVISION_CONFLICT", + "baseRevision": 6, + "mainRevisionBefore": 7, + "mainRevisionAfter": 7, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "REVISION_CONFLICT", + "message": "base revision does not match current Main" + } + }, + "unknown": { + "schemaVersion": 1, + "requestId": "wbv2-p9-002-modifier-enabled", + "status": "UNSUPPORTED", + "code": "COMMAND_UNSUPPORTED", + "baseRevision": 7, + "mainRevisionBefore": 7, + "mainRevisionAfter": 7, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_UNSUPPORTED", + "message": "COMMAND_UNSUPPORTED: modifier modifier:missing does not exist" + } + } + }, + "persistence": { + "exact": true, + "saved": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": true, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 8, + "dirty": false + }, + "reopened": { + "value": { + "modifiers": [ + { + "uuid": "modifier:bevel", + "name": "Pilot Bevel", + "type": "BEVEL", + "enabled": true, + "showViewport": true, + "showRender": true + } + ] + }, + "revision": 8, + "dirty": false + } + } + }, + "assertions": { + "realModifierSetEnabled": true, + "desktopWasmDeltaMatch": true, + "saveReopenExact": true, + "failureMatrixClosed": true, + "featureParityClaim": "CAP-MODIFIER-STATE-MUTATION", + "historicalReproduction": false + }, + "nextTask": "WBV2-P9-003" +} diff --git a/tests/golden/WBV2-P9-002/task-context.json b/tests/golden/WBV2-P9-002/task-context.json new file mode 100644 index 000000000..976f29b75 --- /dev/null +++ b/tests/golden/WBV2-P9-002/task-context.json @@ -0,0 +1,177 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-002", + "parentTask": "WBV2-P9-001", + "status": "in_progress", + "goal": "Bind the real Modifier Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.", + "scope": { + "gap": "workflow:modifier_production_chromium_receipt", + "ownerFamily": "MODIFIER", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts", + "node tools/web/generate-wbv2-modifier-receipt.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P9-002 --write" + ], + "inputPaths": [ + "web/protocol/corrective-modifier-command.ts" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 2572, + "contextRemainingTokens": 642 + }, + "source": { + "bytes": 7332, + "tokens": 1834 + }, + "selected": [ + { + "path": "web/protocol/corrective-modifier-command.ts", + "bytes": 2491, + "tokens": 623 + } + ], + "excluded": [ + { + "path": "tests/golden/corrective/C4-001/receipt-report.json", + "bytes": 5331, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "web/tests/e2e/wbv2-modifier-production.spec.ts", + "bytes": 4769, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P9-002/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P9-002.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P9-002/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 1, + "bytes": 2491, + "tokens": 623 + } + }, + "exitCriteria": [ + "real modifierSetEnabled command passes", + "desktop/WASM delta matches", + "save/reopen is exact" + ], + "nextTask": "WBV2-P9-003", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P9-002.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P9-001/manifest.json", + "parentStatus": "docs/status/WBV2-P9-001.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P9-002.md", + "tests/golden/WBV2-P9-001/manifest.json", + "docs/status/WBV2-P9-001.md" + ], + "machineOnly": [ + "tests/golden/WBV2/task-index.json", + "tests/golden/M15-03A/task-catalog.jsonl" + ], + "optionalByNeed": [ + "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "任务卡列出的精确协议/生产路径", + "任务卡明确命名的长期计划小节" + ], + "forbiddenByDefault": [ + "完整 CURRENT_EXECUTION_PLAN.md", + "完整 PROJECT_STATUS_AND_NEXT_WORK.md", + "全部 docs/status/*.md", + "完整 parity/WBS 计划", + "README 历史和 test-results/" + ] + }, + "parent": { + "manifest": { + "schemaVersion": 1, + "task": "WBV2-P9-001", + "parentTask": "WBV2-P9-000", + "status": "done", + "nextTask": "WBV2-P9-002", + "artifactCount": 13 + }, + "statusSummary": [ + "# WBV2-P9-001 status", + "- task: `WBV2-P9-001`; parent: `WBV2-P9-000`; status: `done`", + "- Mesh Chromium receipt: `DESKTOP + WASM`", + "- delta: `(0.5, -1, 2)`; revision: `9 -> 10`", + "- save/reopen: `EXACT`", + "- nextTask: `WBV2-P9-002`", + "The production Chromium receipt executes the existing Mesh Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-vertex commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1240, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 34, + "taskTokens": 310 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2799, + "lines": 51, + "tokens": 700 + }, + { + "path": "docs/tasks/WBV2-P9-002.md", + "bytes": 1240, + "lines": 34, + "tokens": 310 + }, + { + "path": "tests/golden/WBV2-P9-001/manifest.json", + "bytes": 2779, + "lines": 75, + "tokens": 695 + }, + { + "path": "docs/status/WBV2-P9-001.md", + "bytes": 514, + "lines": 10, + "tokens": 129 + } + ], + "sourceTokens": 1834, + "evidenceFiles": 1, + "evidenceBytes": 2491, + "evidenceTokens": 623, + "totalTokens": 2457, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3481, + "serializedContextTokens": 695, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json b/tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json new file mode 100644 index 000000000..542f6ce6d --- /dev/null +++ b/tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json @@ -0,0 +1,182 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-003", + "operation": "ASSET_CATALOG_PRODUCTION_CHROMIUM_RECEIPT", + "status": "PASS", + "browser": "chromium", + "queueMutation": false, + "source": { + "task": "C3-003", + "manifest": "tests/golden/corrective/C3-003/manifest.json", + "manifestSha256": "534e31e95853617d1ffef601539f104854355c530de8c03285e695794ac6a5db", + "report": "tests/golden/corrective/C3-003/receipt-report.json", + "reportSha256": "a6bcf58a3f22bcba245eeb6dc25799d472343f5197a6e19b346a9cf2d619105e", + "exactChromiumPilot": true, + "pilotSaveReopenState": true + }, + "chromium": { + "report": "tests/golden/WBV2-P9-003/chromium-asset-catalog-production.json", + "reportSha256": "0024ef0b475b4e0407d6ef0948fac0ed0ccc6cb23d28ca9a1d6a9e4524e38999", + "secondReport": "tests/golden/WBV2-P9-003/chromium-asset-catalog-production.second.json", + "secondReportSha256": "0024ef0b475b4e0407d6ef0948fac0ed0ccc6cb23d28ca9a1d6a9e4524e38999", + "deterministic": true, + "surfaces": [ + "DESKTOP", + "WASM" + ], + "resource": { + "sourceId": "library.blend", + "sha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27, + "provider": "EXTERNAL_LIBRARY" + }, + "positive": { + "desktop": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "FINISHED", + "code": "OK", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 5, + "mainMutation": "CHANGED", + "delta": { + "addedId": "asset:wbv2-p9-003", + "count": 1 + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "wasm": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "FINISHED", + "code": "OK", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 5, + "mainMutation": "CHANGED", + "delta": { + "addedId": "asset:wbv2-p9-003", + "count": 1 + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "parity": true + }, + "negative": { + "duplicate": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "UNSUPPORTED", + "code": "COMMAND_UNSUPPORTED", + "baseRevision": 5, + "mainRevisionBefore": 5, + "mainRevisionAfter": 5, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_UNSUPPORTED", + "message": "COMMAND_UNSUPPORTED: catalog entry asset:wbv2-p9-003 already exists" + } + }, + "stale": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "BLOCKED", + "code": "REVISION_CONFLICT", + "baseRevision": 3, + "mainRevisionBefore": 4, + "mainRevisionAfter": 4, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "REVISION_CONFLICT", + "message": "base revision does not match current Main" + } + }, + "malformed": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "MALFORMED", + "code": "COMMAND_MALFORMED", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 4, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_MALFORMED", + "message": "COMMAND_MALFORMED: catalog entry payload is invalid" + } + }, + "missing": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "EXTERNAL_REQUIRED", + "code": "RESOURCE_REQUIRED", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 4, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "RESOURCE_REQUIRED", + "message": "RESOURCE_REQUIRED: RESOURCE_REQUIRED: EXTERNAL_LIBRARY provider is required" + } + } + }, + "persistence": { + "exact": true, + "saved": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 5, + "dirty": false + }, + "reopened": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 5, + "dirty": false + } + } + }, + "assertions": { + "realAssetCatalogAppend": true, + "resourceHashBound": true, + "desktopWasmDeltaMatch": true, + "saveReopenExact": true, + "failureMatrixClosed": true, + "featureParityClaim": "CAP-ASSET-CATALOG-MUTATION", + "historicalReproduction": false + }, + "nextTask": "WBV2-P9-004" +} diff --git a/tests/golden/WBV2-P9-003/chromium-asset-catalog-production.json b/tests/golden/WBV2-P9-003/chromium-asset-catalog-production.json new file mode 100644 index 000000000..c755f032e --- /dev/null +++ b/tests/golden/WBV2-P9-003/chromium-asset-catalog-production.json @@ -0,0 +1,221 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-003", + "operation": "ASSET_CATALOG_PRODUCTION_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "resource": { + "sourceId": "library.blend", + "sha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27, + "provider": "EXTERNAL_LIBRARY" + }, + "positive": { + "desktop": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "FINISHED", + "code": "OK", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 5, + "mainMutation": "CHANGED", + "delta": { + "addedId": "asset:wbv2-p9-003", + "count": 1 + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "wasm": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "FINISHED", + "code": "OK", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 5, + "mainMutation": "CHANGED", + "delta": { + "addedId": "asset:wbv2-p9-003", + "count": 1 + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "desktopMain": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 5, + "dirty": true + }, + "wasmMain": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 5, + "dirty": true + }, + "parity": true + }, + "negative": { + "duplicate": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "UNSUPPORTED", + "code": "COMMAND_UNSUPPORTED", + "baseRevision": 5, + "mainRevisionBefore": 5, + "mainRevisionAfter": 5, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_UNSUPPORTED", + "message": "COMMAND_UNSUPPORTED: catalog entry asset:wbv2-p9-003 already exists" + } + }, + "stale": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "BLOCKED", + "code": "REVISION_CONFLICT", + "baseRevision": 3, + "mainRevisionBefore": 4, + "mainRevisionAfter": 4, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "REVISION_CONFLICT", + "message": "base revision does not match current Main" + } + }, + "malformed": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "MALFORMED", + "code": "COMMAND_MALFORMED", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 4, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_MALFORMED", + "message": "COMMAND_MALFORMED: catalog entry payload is invalid" + } + }, + "missing": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "EXTERNAL_REQUIRED", + "code": "RESOURCE_REQUIRED", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 4, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "RESOURCE_REQUIRED", + "message": "RESOURCE_REQUIRED: RESOURCE_REQUIRED: EXTERNAL_LIBRARY provider is required" + } + } + }, + "persistence": { + "saved": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 5, + "dirty": false + }, + "postSave": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-post-save", + "status": "FINISHED", + "code": "OK", + "baseRevision": 5, + "mainRevisionBefore": 5, + "mainRevisionAfter": 6, + "mainMutation": "CHANGED", + "delta": { + "addedId": "asset:post-save", + "count": 2 + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "beforeReopen": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + }, + { + "id": "asset:post-save", + "name": "Post Save Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 6, + "dirty": true + }, + "reopened": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 5, + "dirty": false + }, + "exact": true + } +} diff --git a/tests/golden/WBV2-P9-003/chromium-asset-catalog-production.second.json b/tests/golden/WBV2-P9-003/chromium-asset-catalog-production.second.json new file mode 100644 index 000000000..c755f032e --- /dev/null +++ b/tests/golden/WBV2-P9-003/chromium-asset-catalog-production.second.json @@ -0,0 +1,221 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-003", + "operation": "ASSET_CATALOG_PRODUCTION_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "resource": { + "sourceId": "library.blend", + "sha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27, + "provider": "EXTERNAL_LIBRARY" + }, + "positive": { + "desktop": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "FINISHED", + "code": "OK", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 5, + "mainMutation": "CHANGED", + "delta": { + "addedId": "asset:wbv2-p9-003", + "count": 1 + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "wasm": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "FINISHED", + "code": "OK", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 5, + "mainMutation": "CHANGED", + "delta": { + "addedId": "asset:wbv2-p9-003", + "count": 1 + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "desktopMain": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 5, + "dirty": true + }, + "wasmMain": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 5, + "dirty": true + }, + "parity": true + }, + "negative": { + "duplicate": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "UNSUPPORTED", + "code": "COMMAND_UNSUPPORTED", + "baseRevision": 5, + "mainRevisionBefore": 5, + "mainRevisionAfter": 5, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_UNSUPPORTED", + "message": "COMMAND_UNSUPPORTED: catalog entry asset:wbv2-p9-003 already exists" + } + }, + "stale": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "BLOCKED", + "code": "REVISION_CONFLICT", + "baseRevision": 3, + "mainRevisionBefore": 4, + "mainRevisionAfter": 4, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "REVISION_CONFLICT", + "message": "base revision does not match current Main" + } + }, + "malformed": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "MALFORMED", + "code": "COMMAND_MALFORMED", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 4, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "COMMAND_MALFORMED", + "message": "COMMAND_MALFORMED: catalog entry payload is invalid" + } + }, + "missing": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-append", + "status": "EXTERNAL_REQUIRED", + "code": "RESOURCE_REQUIRED", + "baseRevision": 4, + "mainRevisionBefore": 4, + "mainRevisionAfter": 4, + "mainMutation": "UNCHANGED", + "delta": null, + "persistence": null, + "error": { + "code": "RESOURCE_REQUIRED", + "message": "RESOURCE_REQUIRED: RESOURCE_REQUIRED: EXTERNAL_LIBRARY provider is required" + } + } + }, + "persistence": { + "saved": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 5, + "dirty": false + }, + "postSave": { + "schemaVersion": 1, + "requestId": "wbv2-p9-003-asset-post-save", + "status": "FINISHED", + "code": "OK", + "baseRevision": 5, + "mainRevisionBefore": 5, + "mainRevisionAfter": 6, + "mainMutation": "CHANGED", + "delta": { + "addedId": "asset:post-save", + "count": 2 + }, + "persistence": { + "dirty": true + }, + "error": null + }, + "beforeReopen": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + }, + { + "id": "asset:post-save", + "name": "Post Save Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 6, + "dirty": true + }, + "reopened": { + "value": { + "entries": [ + { + "id": "asset:wbv2-p9-003", + "name": "Production Asset", + "sourceId": "library.blend", + "sourceSha256": "5a68704aaf8d274a9845abb552195328024154e7ee74da8d83b3f7509c44fcda", + "byteLength": 27 + } + ] + }, + "revision": 5, + "dirty": false + }, + "exact": true + } +} diff --git a/tests/golden/WBV2-P9-003/feature-parity-task-plan.json b/tests/golden/WBV2-P9-003/feature-parity-task-plan.json new file mode 100644 index 000000000..9c09b8ca5 --- /dev/null +++ b/tests/golden/WBV2-P9-003/feature-parity-task-plan.json @@ -0,0 +1,1448 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_FEATURE_EPOCH_1", + "status": "ACTIVE_CAPABILITY_QUEUE", + "authority": "queue_reactivated_after_owner_review", + "productContract": "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "sourcePlan": "docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "correctiveCheckpoint": { + "task": "C6-003", + "handoff": "tests/golden/corrective/C6-003/handoff.json", + "status": "active", + "blocker": null, + "queueMutation": true, + "legacyTask": "M16-GAP-00277", + "legacyParentNextTask": "M16-GAP-00277" + }, + "runtimePolicy": { + "blenderSource": "blender-5.2.0", + "browserEvidence": [ + "chromium" + ], + "forbiddenBrowsers": [ + "firefox", + "webkit" + ], + "mainAuthority": "blender_main", + "storage": [ + "opfs", + "indexeddb" + ], + "queueMutation": "enabled_after_owner_review_and_g5" + }, + "completionClasses": [ + "LOCAL_EXACT", + "LOCAL_BOUNDED", + "SERVER_EXACT", + "EXCLUDED" + ], + "gates": [ + { + "id": "G0", + "name": "scope_and_inventory", + "requires": [ + "contract", + "inventory", + "capability_matrix" + ] + }, + { + "id": "G1", + "name": "runtime_foundation", + "requires": [ + "sceneir", + "main_transaction", + "worker_lifecycle", + "storage_journal" + ] + }, + { + "id": "G2", + "name": "feature_parity", + "requires": [ + "desktop", + "wasm_main", + "chromium", + "negative", + "persistence" + ] + }, + { + "id": "G3", + "name": "recovery_and_security", + "requires": [ + "cancel", + "restart", + "oom_quota", + "malformed", + "dispose" + ] + }, + { + "id": "G4", + "name": "release_candidate", + "requires": [ + "offline", + "ci", + "sbom", + "rollback", + "hashes" + ] + }, + { + "id": "G5", + "name": "queue_mutation", + "requires": [ + "owner_review", + "protected_hashes", + "handoff", + "single_ready_task" + ] + } + ], + "waves": [ + { + "id": "P0", + "name": "facts_and_contracts", + "gate": "G0", + "tasks": [ + "WBV2-P0-001", + "WBV2-P0-002", + "WBV2-P0-003" + ] + }, + { + "id": "P1", + "name": "runtime_foundation", + "gate": "G1", + "tasks": [ + "WBV2-P1-001", + "WBV2-P1-002", + "WBV2-P1-003", + "WBV2-P1-004", + "WBV2-P1-005" + ] + }, + { + "id": "P2", + "name": "core_modeler_loop", + "gate": "G2", + "tasks": [ + "WBV2-P2-001", + "WBV2-P2-002", + "WBV2-P2-003", + "WBV2-P2-004", + "WBV2-P2-005" + ] + }, + { + "id": "P3", + "name": "authoring_and_io", + "gate": "G2", + "tasks": [ + "WBV2-P3-001", + "WBV2-P3-002", + "WBV2-P3-003", + "WBV2-P3-004", + "WBV2-P3-005" + ] + }, + { + "id": "P4", + "name": "advanced_local_slices", + "gate": "G2", + "tasks": [ + "WBV2-P4-001", + "WBV2-P4-002", + "WBV2-P4-003", + "WBV2-P4-004" + ] + }, + { + "id": "P5", + "name": "render_and_server", + "gate": "G3", + "tasks": [ + "WBV2-P5-001", + "WBV2-P5-002", + "WBV2-P5-003" + ] + }, + { + "id": "P6", + "name": "security_performance_release", + "gate": "G4", + "tasks": [ + "WBV2-P6-001", + "WBV2-P6-002", + "WBV2-P6-003" + ] + }, + { + "id": "P7", + "name": "full_parity_gap_program", + "gate": "G5", + "tasks": [ + "WBV2-P7-001", + "WBV2-P7-002", + "WBV2-P7-003" + ] + } + ], + "taskContract": { + "onePrimaryBehavior": true, + "requiredEvidence": [ + "desktop", + "wasm_main", + "chromium", + "negative", + "persistence", + "manifest", + "status" + ], + "requiredCommands": [ + "focused", + "determinism", + "hash", + "governance" + ], + "failureState": "in_progress_or_blocked", + "successorRule": "only_from_parent_manifest_nextTask" + }, + "tasks": [ + { + "id": "WBV2-P0-001", + "phase": "P0", + "title": "reconcile_scope_and_checkpoints", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-governance", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-001.md", + "behavior": "Freeze V1/full-parity boundary and reconcile legacy/corrective pointers without queue mutation.", + "outputs": [ + "scope decision", + "checkpoint report", + "protected hash set" + ], + "acceptance": [ + "corrective owner-review status is explicit", + "legacy parent pointer is unchanged", + "plan has one activation gate" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P0-002", + "phase": "P0", + "title": "generate_blender52_inventory_and_parity_map", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P0-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-inventory", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-002.md", + "behavior": "Generate stable Blender 5.2 data-block/operator/editor/node/format inventory and map every entry to a completion class.", + "outputs": [ + "inventory", + "parity map", + "source hash" + ], + "acceptance": [ + "unknown entries are classified", + "inventory is deterministic", + "no entry claims feature parity without evidence" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P0-003", + "phase": "P0", + "title": "freeze_capability_error_budget_contract", + "kind": "enabling", + "owner": "PROTOCOL", + "dependsOn": [ + "WBV2-P0-001", + "WBV2-P0-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-contract", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-003.md", + "behavior": "Freeze capability levels, stable error codes, revision, budget, cancellation and loss-report schemas.", + "outputs": [ + "versioned protocol", + "capability matrix", + "negative matrix" + ], + "acceptance": [ + "unsupported input fails closed", + "schema hashes are stable", + "migration policy preserves unknown data" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-001", + "phase": "P1", + "title": "stabilize_runtime_variants_and_source_receipts", + "kind": "enabling", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P0-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-runtime", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-001.md", + "behavior": "Bind single-thread/pthread WebEngine variants to pinned Blender source/build/runtime receipts.", + "outputs": [ + "runtime manifest", + "variant selector", + "fallback report" + ], + "acceptance": [ + "variant fallback is deterministic", + "source/build hash is verified", + "one engine session has one generation" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-002", + "phase": "P1", + "title": "unify_sceneir_stable_ids_and_binary_deltas", + "kind": "enabling", + "owner": "MAIN", + "dependsOn": [ + "WBV2-P1-001" + ], + "parityId": null, + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p1-sceneir", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-002.md", + "behavior": "Make SceneIR/WBG1 stable IDs, topology/attribute domains and binary/range deltas canonical across desktop and WASM.", + "outputs": [ + "SceneIR schema", + "binary fixture", + "delta comparator" + ], + "acceptance": [ + "IDs survive save/reopen", + "malformed chunk is rejected", + "desktop and WASM canonical hashes match" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-003", + "phase": "P1", + "title": "unify_main_transaction_history_and_save", + "kind": "enabling", + "owner": "MAIN", + "dependsOn": [ + "WBV2-P1-002" + ], + "parityId": null, + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p1-history", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-003.md", + "behavior": "Use one Main transaction/revision/history contract for commit, undo/redo, atomic save and reopen.", + "outputs": [ + "transaction contract", + "history receipt", + "save/reopen runner" + ], + "acceptance": [ + "failed/no-op commands add no history", + "stale revision cannot commit", + "reopen state is byte/hash stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-004", + "phase": "P1", + "title": "harden_worker_cancel_restart_and_dispose", + "kind": "enabling", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P1-001", + "WBV2-P1-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-lifecycle", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-004.md", + "behavior": "Make cancellation, late-result rejection, Worker restart and resource disposal common to all domains.", + "outputs": [ + "lifecycle runner", + "fault report", + "dispose counters" + ], + "acceptance": [ + "cancel never publishes result", + "generation mismatch is rejected", + "CPU/WASM/GPU owners return to budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-005", + "phase": "P1", + "title": "harden_opfs_indexeddb_journal_recovery", + "kind": "enabling", + "owner": "STORAGE", + "dependsOn": [ + "WBV2-P1-003", + "WBV2-P1-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-storage", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-005.md", + "behavior": "Unify OPFS staging/content addressing and IndexedDB metadata/journal recovery.", + "outputs": [ + "storage schema", + "crash fixtures", + "recovery checker" + ], + "acceptance": [ + "interrupted commit leaves old project usable", + "hash mismatch quarantines payload", + "small project recovers after restart" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-001", + "phase": "P2", + "title": "open_blend_scene_context_and_outliner", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1-002", + "WBV2-P1-005" + ], + "parityId": "EDITOR.OPEN_SCENE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-editor", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-001.md", + "behavior": "Open a minimal .blend and expose scene/object/collection context from authoritative Main.", + "outputs": [ + "desktop fixture", + "outliner report", + "Chromium path" + ], + "acceptance": [ + "stable IDs and selection revision match", + "missing data is structured", + "reopen preserves context" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-002", + "phase": "P2", + "title": "object_collection_parent_transform_workflow", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1-003", + "WBV2-P2-001" + ], + "parityId": "OBJECT.TRANSFORM_HIERARCHY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-scene", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-002.md", + "behavior": "Edit object transform, collection membership and parent hierarchy through Main transactions.", + "outputs": [ + "desktop/WASM golden", + "negative cases", + "save/reopen receipt" + ], + "acceptance": [ + "world matrix parity", + "cycle/locked/library edits reject", + "undo/redo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-003", + "phase": "P2", + "title": "mesh_edit_core_operations", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1-002", + "WBV2-P2-002" + ], + "parityId": "MESH.EDIT_CORE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-mesh", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-003.md", + "behavior": "Expose bounded vertex/edge/face selection plus merge/dissolve/extrude/inset/bevel/loop-cut.", + "outputs": [ + "Blender fixture set", + "topology comparator", + "Chromium edit path" + ], + "acceptance": [ + "topology/attributes match", + "invalid selection and budget fail closed", + "single transaction and reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-004", + "phase": "P2", + "title": "dual_viewport_sceneir_render_path", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P2-003" + ], + "parityId": "VIEWPORT.MAIN_OFFSCREEN", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p2-viewport", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-004.md", + "behavior": "Render the same validated SceneIR through main-thread WebGL2 and OffscreenCanvas Worker paths.", + "outputs": [ + "pixel report", + "viewport diagnostics", + "device recovery" + ], + "acceptance": [ + "both paths have nonblank pixels", + "selection/camera revision is shared", + "device loss releases resources" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-005", + "phase": "P2", + "title": "close_p0_user_loop", + "kind": "feature", + "owner": "INTEGRATION", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P2-003", + "WBV2-P1-005", + "WBV2-P2-004" + ], + "parityId": "WORKFLOW.P0_USER_LOOP", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p2-integration", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-005.md", + "behavior": "Prove open -> edit -> undo -> redo -> save -> restart -> reopen -> GLB in one production flow.", + "outputs": [ + "P0 workflow report", + "release binding", + "rollback receipt" + ], + "acceptance": [ + "Main revision and exported asset are bound", + "fault/cancel leaves old state", + "Chromium production path passes" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-001", + "phase": "P3", + "title": "material_uv_principled_asset_workflow", + "kind": "feature", + "owner": "MATERIAL", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-005" + ], + "parityId": "MATERIAL.PBR_UV", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-authoring", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-001.md", + "behavior": "Edit material slots, UVs and declared Principled/Image/Normal graph nodes with content-addressed textures.", + "outputs": [ + "material golden", + "texture receipt", + "loss report" + ], + "acceptance": [ + "desktop/WASM node fields match", + "unsupported node retained/blocked", + "packed asset survives reopen" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-002", + "phase": "P3", + "title": "keyframe_timeline_action_workflow", + "kind": "feature", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P2-005", + "WBV2-P3-001" + ], + "parityId": "ANIMATION.TRS_ACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p3-authoring", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-002.md", + "behavior": "Create/edit TRS keyframes, timeline and declared Action interpolation through Main.", + "outputs": [ + "frame golden", + "animation comparator", + "reopen report" + ], + "acceptance": [ + "sampled values and handles match", + "stale frame result rejected", + "undo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-003", + "phase": "P3", + "title": "armature_pose_constraint_skin_workflow", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P3-002" + ], + "parityId": "RIG.POSE_SKIN", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-rig", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-003.md", + "behavior": "Read and edit declared armature pose/constraint/weight/shape-key slices with bounded evaluation.", + "outputs": [ + "pose golden", + "skin report", + "unsupported matrix" + ], + "acceptance": [ + "pose matrices and weights match", + "unsupported constraint is explicit", + "save/reopen and small recovery pass" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-004", + "phase": "P3", + "title": "glb_roundtrip_and_loss_report", + "kind": "feature", + "owner": "IO", + "dependsOn": [ + "WBV2-P2-005", + "WBV2-P3-001", + "WBV2-P3-003" + ], + "parityId": "IO.GLB_ROUNDTRIP", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p3-io", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-004.md", + "behavior": "Import/export declared GLB mesh/PBR/texture/morph/skin/animation and report non-mapped semantics.", + "outputs": [ + "GLB fixtures", + "desktop reimport report", + "loss report" + ], + "acceptance": [ + "roundtrip canonical graph matches", + "sparse/external URI/budget negatives reject", + "no silent loss" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-005", + "phase": "P3", + "title": "library_asset_append_link_override", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1-005", + "WBV2-P2-001", + "WBV2-P3-004" + ], + "parityId": "ASSET.LIBRARY_OPERATIONS", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-assets", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-005.md", + "behavior": "Support declared append/link/override ownership, reload and missing-library semantics.", + "outputs": [ + "library fixtures", + "ownership report", + "negative matrix" + ], + "acceptance": [ + "source/hash/owner identity preserved", + "linked mutation blocked", + "stale generation and missing source fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-001", + "phase": "P4", + "title": "modifier_graph_and_apply_slices", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-005", + "WBV2-P3-005" + ], + "parityId": "MODIFIER.DECLARED_SLICES", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-001.md", + "behavior": "Enable one declared modifier parameter/apply workflow at a time with dependency-aware blocking.", + "outputs": [ + "modifier goldens", + "dependency report", + "negative cases" + ], + "acceptance": [ + "desktop/evaluated Main match", + "unknown modifier retained and blocked", + "apply/undo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-002", + "phase": "P4", + "title": "geometry_nodes_and_shader_allowlist", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P3-001", + "WBV2-P4-001" + ], + "parityId": "NODES.ALLOWLIST", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-002.md", + "behavior": "Read/write/evaluate only declared Geometry Nodes and shader graph allowlists with resource budgets.", + "outputs": [ + "node fixtures", + "compile/cache receipts", + "unsupported graph reports" + ], + "acceptance": [ + "node/socket/link/default parity", + "budget and unknown-node block before commit", + "compile failure rolls back" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-003", + "phase": "P4", + "title": "sculpt_nonmesh_and_paint_bounded_slices", + "kind": "feature", + "owner": "SCULPT", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-004", + "WBV2-P4-002" + ], + "parityId": "SCULPT.NONMESH.PAINT_BOUNDED", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-003.md", + "behavior": "Expose declared sculpt attributes/strokes, Curve/Surface/Font/PointCloud and paint slices with explicit PBVH limits.", + "outputs": [ + "non-mesh fixtures", + "stroke report", + "capability blocks" + ], + "acceptance": [ + "Main commit is atomic", + "unsupported brush/solver returns stable code", + "GPU/OOM/restart recovery passes" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-004", + "phase": "P4", + "title": "simulation_cache_identity_and_lifecycle", + "kind": "feature", + "owner": "SIMULATION", + "dependsOn": [ + "WBV2-P1-005", + "WBV2-P4-002", + "WBV2-P4-003" + ], + "parityId": "SIMULATION.CACHE_LIFECYCLE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G3", + "card": "docs/tasks/WBV2-P4-004.md", + "behavior": "Bind declared simulation cache to source/settings/revision hashes with cancellation, LRU and restart recovery.", + "outputs": [ + "cache fixtures", + "identity report", + "quarantine evidence" + ], + "acceptance": [ + "stale/corrupt cache never publishes", + "small cache recovers after restart", + "budget release is observable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-001", + "phase": "P5", + "title": "render_capability_routing", + "kind": "feature", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P2-004", + "WBV2-P4-002", + "WBV2-P4-004" + ], + "parityId": "RENDER.ROUTING", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p5-media", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-001.md", + "behavior": "Route bounded Eevee/WebGL capabilities locally and unsupported render classes to SERVER_EXACT or EXCLUDED.", + "outputs": [ + "render receipts", + "pixel golden", + "routing report" + ], + "acceptance": [ + "source/settings/build identity bound", + "unsupported route cannot pretend local success", + "cancel/device loss releases resources" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-002", + "phase": "P5", + "title": "compositor_sequencer_media_recovery", + "kind": "feature", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P3-002", + "WBV2-P5-001" + ], + "parityId": "MEDIA.BOUNDED_WORKFLOW", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p5-media", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-002.md", + "behavior": "Provide declared compositor/sequencer/codec/proxy/audio slices with revision and recovery gates.", + "outputs": [ + "media receipts", + "recovery report", + "audio/session diagnostics" + ], + "acceptance": [ + "seek/decode revision ordering", + "cancel/timeout does not publish", + "quota/OOM/restart leaves project valid" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-003", + "phase": "P5", + "title": "server_job_result_binding", + "kind": "feature", + "owner": "SERVER", + "dependsOn": [ + "WBV2-P0-003", + "WBV2-P5-001", + "WBV2-P5-002" + ], + "parityId": "SERVER.JOB_BINDING", + "implementationClass": "SERVER_EXACT", + "parallelGroup": "p5-server", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-003.md", + "behavior": "Bind server render/encode/physics jobs to immutable input/settings/build/output hashes and explicit lifecycle states.", + "outputs": [ + "server protocol", + "idempotency receipt", + "negative matrix" + ], + "acceptance": [ + "duplicate request is idempotent", + "stale result cannot bind", + "timeout/cancel/OOM produces no READY output" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-001", + "phase": "P6", + "title": "scripting_default_deny_and_audit", + "kind": "feature", + "owner": "SECURITY", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P5-003" + ], + "parityId": "SECURITY.SCRIPTING", + "implementationClass": "EXCLUDED", + "parallelGroup": "p6-safety", + "gate": "G3", + "card": "docs/tasks/WBV2-P6-001.md", + "behavior": "Read text/metadata and expose audited, budgeted, default-deny script policy without arbitrary execution.", + "outputs": [ + "policy manifest", + "malicious fixtures", + "audit report" + ], + "acceptance": [ + "autorun/network/add-on defaults deny", + "sandbox cancellation/dispose works", + "no secret or filesystem escape" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-002", + "phase": "P6", + "title": "performance_fault_and_recovery_matrix", + "kind": "enabling", + "owner": "RELIABILITY", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P1-005", + "WBV2-P2-004", + "WBV2-P6-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p6-safety", + "gate": "G3", + "card": "docs/tasks/WBV2-P6-002.md", + "behavior": "Run deterministic geometry/texture/media/cache budgets and inject OOM/quota/device/network faults.", + "outputs": [ + "budget matrix", + "fault reports", + "resource release ledger" + ], + "acceptance": [ + "100k/1M/10M thresholds recorded", + "fault leaves old revision usable", + "all owned resources return to budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-003", + "phase": "P6", + "title": "offline_ci_sbom_and_rollback_release", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P6-001", + "WBV2-P6-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p6-release", + "gate": "G4", + "card": "docs/tasks/WBV2-P6-003.md", + "behavior": "Produce reproducible offline/source/binary release packages with CI lanes, SBOM and rollback evidence.", + "outputs": [ + "RC manifest", + "offline archive", + "CI reports" + ], + "acceptance": [ + "quick/Chromium/release lanes pass", + "artifact hashes reproduce", + "upgrade/rollback and known limitations are tested" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-001", + "phase": "P7", + "title": "cluster_full_blender_gap_inventory", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P0-002", + "WBV2-P6-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-gap", + "gate": "G4", + "card": "docs/tasks/WBV2-P7-001.md", + "behavior": "Cluster remaining Blender 5.2 data-block/operator/editor/node/format gaps by family and evidence class.", + "outputs": [ + "cluster catalog", + "coverage report", + "risk ranking" + ], + "acceptance": [ + "each gap has stable ID and owner", + "negative-only/unsupported is not positive parity", + "clusters are deterministic" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-002", + "phase": "P7", + "title": "generate_atomic_family_gap_queue", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P7-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-gap", + "gate": "G4", + "card": "docs/tasks/WBV2-P7-002.md", + "behavior": "Generate one task per parityId x observable behavior x implementation class with parent/hash context.", + "outputs": [ + "task index", + "task catalog", + "task cards" + ], + "acceptance": [ + "one active ready task", + "no guessed successor", + "each card fits context budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-003", + "phase": "P7", + "title": "full_parity_candidate_release_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P7-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-release", + "gate": "G5", + "card": "docs/tasks/WBV2-P7-003.md", + "behavior": "Recompute parity closure, evidence health, recovery health and release decision from machine manifests.", + "outputs": [ + "parity release report", + "known limitations", + "final decision" + ], + "acceptance": [ + "all claims bind to evidence", + "blocked/excluded/server classes remain explicit", + "queue and protected hashes pass" + ], + "status": "blocked", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-000", + "phase": "P8", + "title": "authorize_recovery_capability_root", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P7-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-governance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-000.md", + "behavior": "Authorize a recovery epoch without rewriting the blocked P7 manifest.", + "outputs": [ + "recovery plan", + "root manifest", + "queue authorization" + ], + "acceptance": [ + "P7 evidence remains hash exact", + "recovery scope is explicit", + "one recovery task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P8-001", + "phase": "P8", + "title": "rebaseline_mutable_inventories", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-governance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-001.md", + "behavior": "Rebaseline mutable WBV2 plan and dependency inventory inputs while preserving historical manifests.", + "outputs": [ + "semantic drift report", + "current inventory baseline", + "manifest" + ], + "acceptance": [ + "only expected mutable hashes drift", + "dependency closure is unchanged", + "historical manifests remain unmodified" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-002", + "phase": "P8", + "title": "close_atomic_chromium_receipts", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P8-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-receipts", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-002.md", + "behavior": "Produce and bind all 45 atomic Chromium family receipts.", + "outputs": [ + "Chromium report", + "45 receipt index", + "receipt manifests" + ], + "acceptance": [ + "45 receipts are manifest-bound", + "desktop/WASM/save-reopen behaviors are explicit", + "Chromium is the only browser" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-003", + "phase": "P8", + "title": "authorize_m12_provenance_epoch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-provenance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-003.md", + "behavior": "Bind restored M12 sources and explicitly rebaseline unavailable originals in a new provenance epoch.", + "outputs": [ + "provenance epoch", + "replacement bindings", + "manifest" + ], + "acceptance": [ + "22 restored originals stay exact", + "62 unavailable entries are not called restored", + "all replacements are hash-bound" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-004", + "phase": "P8", + "title": "recompute_recovery_release_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P8-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-release", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-004.md", + "behavior": "Recompute the release decision from the recovery epoch and atomic receipts.", + "outputs": [ + "release gate", + "known limitations", + "final manifest" + ], + "acceptance": [ + "all receipts bind to manifests", + "provenance epoch is explicit", + "all governance gates pass" + ], + "status": "in_progress", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-000", + "phase": "P9", + "title": "authorize_feature_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p9-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-000.md", + "behavior": "Authorize feature parity continuation after provenance epoch 2 without claiming historical byte reproduction.", + "outputs": [ + "continuation receipt", + "feature parity plan", + "scope limits" + ], + "acceptance": [ + "P8 provenance evidence remains exact", + "authorized baseline is explicit", + "one feature task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P9-001", + "phase": "P9", + "title": "mesh_production_chromium_receipt", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P9-000" + ], + "parityId": "CAP-MESH-POSITIVE-EDIT", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-mesh", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-001.md", + "behavior": "Bind the existing Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt.", + "outputs": [ + "Chromium mesh receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real meshTranslateVertex command passes", + "desktop/WASM delta matches", + "save/reopen is exact", + "malformed/stale/unknown inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-002", + "phase": "P9", + "title": "modifier_production_chromium_receipt", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P9-001" + ], + "parityId": "CAP-MODIFIER-STATE-MUTATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-modifier", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-002.md", + "behavior": "Bind the existing Modifier Main transaction to a production Chromium receipt.", + "outputs": [ + "Chromium modifier receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real modifierSetEnabled command passes", + "desktop/WASM delta matches", + "save/reopen is exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-003", + "phase": "P9", + "title": "asset_catalog_production_chromium_receipt", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P9-002" + ], + "parityId": "CAP-ASSET-CATALOG-MUTATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-asset", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-003.md", + "behavior": "Bind the existing Asset Catalog Main transaction and resource resolver to a production Chromium receipt.", + "outputs": [ + "Chromium asset receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real assetCatalogAppend command passes", + "resource hash is bound", + "save/reopen is exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-004", + "phase": "P9", + "title": "recompute_feature_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P9-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p9-release", + "gate": "G7", + "card": "docs/tasks/WBV2-P9-004.md", + "behavior": "Recompute declared feature parity claims from production Chromium receipts and authorized provenance.", + "outputs": [ + "feature parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only evidenced feature claims are emitted", + "authorized baseline remains explicit", + "full historical reproduction remains false" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P9-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P9-002/feature-parity-task-plan.json", + "sha256": "16cc384ca599eb5fbb0f5e75772b5c4fc380ebc7b2818a665b4bd3c4e231a166" + } +} diff --git a/tests/golden/WBV2-P9-003/manifest.json b/tests/golden/WBV2-P9-003/manifest.json new file mode 100644 index 000000000..29bfe445b --- /dev/null +++ b/tests/golden/WBV2-P9-003/manifest.json @@ -0,0 +1,79 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-003", + "parentTask": "WBV2-P9-002", + "operation": "ASSET_CATALOG_PRODUCTION_CHROMIUM_RECEIPT", + "status": "done", + "enablingTask": false, + "parityStateChange": true, + "runtime": "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P9-002/manifest.json", + "sha256": "14b5da167382cd93b9692e4447616c0333d96806480b2a80c95d3b9345d13dd3" + }, + "sourceManifest": { + "path": "tests/golden/corrective/C3-003/manifest.json", + "sha256": "534e31e95853617d1ffef601539f104854355c530de8c03285e695794ac6a5db" + }, + "sourceReport": { + "path": "tests/golden/corrective/C3-003/receipt-report.json", + "sha256": "a6bcf58a3f22bcba245eeb6dc25799d472343f5197a6e19b346a9cf2d619105e" + }, + "chromiumReport": { + "path": "tests/golden/WBV2-P9-003/chromium-asset-catalog-production.json", + "sha256": "0024ef0b475b4e0407d6ef0948fac0ed0ccc6cb23d28ca9a1d6a9e4524e38999" + }, + "chromiumSecondReport": { + "path": "tests/golden/WBV2-P9-003/chromium-asset-catalog-production.second.json", + "sha256": "0024ef0b475b4e0407d6ef0948fac0ed0ccc6cb23d28ca9a1d6a9e4524e38999" + }, + "e2e": { + "path": "web/tests/e2e/wbv2-asset-catalog-production.spec.ts", + "sha256": "0e6a4b51f632e535cc07e30945dc2f8eaffafe93372b3ee17caafe984ef49a0f" + }, + "protocol": { + "path": "web/protocol/corrective-asset-catalog-command.ts", + "sha256": "e94ef8d6aa7cf427cdd41c4287ee2fd1ddd97342e1e4ae3a91f4f50483e7d8ef" + }, + "resourceProvider": { + "path": "web/protocol/corrective-resource-provider.ts", + "sha256": "fdaaaa8bc7e0a7220b08c5813c18e672351ae0d09168f08936bae06fcebb73a3" + }, + "bridge": { + "path": "web/app/src/corrective-pilot-bridge.ts", + "sha256": "e242a8d407fcdfb8b695d4278d4b90af4b9b821b9a8f0996f8835bc33bc14097" + }, + "generator": { + "path": "tools/web/generate-wbv2-asset-catalog-receipt.mjs", + "sha256": "f5e2109aaa5477136ffc05c887d3f6a83f1d6e369540450a71897c108ebb7636" + }, + "report": { + "path": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json", + "sha256": "c496ce11ecd56f079e21094f1c20479cadd03fa5739b4788a4df5e8452870dc7" + }, + "status": { + "path": "docs/status/WBV2-P9-003.md", + "sha256": "a21403630453934ef4268d7f1d0ef7b1c916233297aee50bbb2c3100204d2d62" + }, + "featureParityPlan": { + "path": "tests/golden/WBV2-P9-003/feature-parity-task-plan.json", + "sha256": "95afd10245c35f4c28ed3d1b418f7e9a20a041bf80be72b76e4e308786fd08c0" + }, + "taskContext": { + "path": "tests/golden/WBV2-P9-003/task-context.json", + "sha256": "d7a866ce7071f46d04af02df30894cdc7483721746c7635a9cf32b326d088b32" + } + }, + "assertions": { + "capabilityId": "CAP-ASSET-CATALOG-MUTATION", + "browser": "chromium", + "surfaces": 2, + "deterministic": true, + "resourceHashBound": true, + "saveReopen": "EXACT", + "negativeCases": 4, + "historicalReproduction": false + }, + "nextTask": "WBV2-P9-004" +} diff --git a/tests/golden/WBV2-P9-003/task-context.json b/tests/golden/WBV2-P9-003/task-context.json new file mode 100644 index 000000000..cbe15fad3 --- /dev/null +++ b/tests/golden/WBV2-P9-003/task-context.json @@ -0,0 +1,179 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-003", + "parentTask": "WBV2-P9-002", + "status": "in_progress", + "goal": "Bind the real Asset Catalog Main transaction and resource resolver to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.", + "scope": { + "gap": "workflow:asset_catalog_production_chromium_receipt", + "ownerFamily": "ASSET", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-catalog-production.spec.ts", + "node tools/web/generate-wbv2-asset-catalog-receipt.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P9-003 --write" + ], + "inputPaths": [], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 2344, + "contextRemainingTokens": 584 + }, + "source": { + "bytes": 7560, + "tokens": 1892 + }, + "selected": [], + "excluded": [ + { + "path": "web/protocol/corrective-asset-catalog-command.ts", + "bytes": 2865, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "web/protocol/corrective-resource-provider.ts", + "bytes": 7642, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/corrective/C3-003/receipt-report.json", + "bytes": 3337, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "web/tests/e2e/wbv2-asset-catalog-production.spec.ts", + "bytes": 6043, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P9-003/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P9-003.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P9-003/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 0, + "bytes": 0, + "tokens": 0 + } + }, + "exitCriteria": [ + "real assetCatalogAppend command passes", + "resource hash is bound", + "save/reopen is exact" + ], + "nextTask": "WBV2-P9-004", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P9-003.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P9-002/manifest.json", + "parentStatus": "docs/status/WBV2-P9-002.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P9-003.md", + "tests/golden/WBV2-P9-002/manifest.json", + "docs/status/WBV2-P9-002.md" + ], + "machineOnly": [ + "tests/golden/WBV2/task-index.json", + "tests/golden/M15-03A/task-catalog.jsonl" + ], + "optionalByNeed": [ + "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "任务卡列出的精确协议/生产路径", + "任务卡明确命名的长期计划小节" + ], + "forbiddenByDefault": [ + "完整 CURRENT_EXECUTION_PLAN.md", + "完整 PROJECT_STATUS_AND_NEXT_WORK.md", + "全部 docs/status/*.md", + "完整 parity/WBS 计划", + "README 历史和 test-results/" + ] + }, + "parent": { + "manifest": { + "schemaVersion": 1, + "task": "WBV2-P9-002", + "parentTask": "WBV2-P9-001", + "status": "done", + "nextTask": "WBV2-P9-003", + "artifactCount": 13 + }, + "statusSummary": [ + "# WBV2-P9-002 status", + "- task: `WBV2-P9-002`; parent: `WBV2-P9-001`; status: `done`", + "- Modifier Chromium receipt: `DESKTOP + WASM`", + "- enabled transition: `false -> true`; revision: `7 -> 8`", + "- save/reopen: `EXACT`", + "- nextTask: `WBV2-P9-003`", + "The production Chromium receipt executes the existing Modifier Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-modifier commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1402, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 35, + "taskTokens": 351 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2799, + "lines": 51, + "tokens": 700 + }, + { + "path": "docs/tasks/WBV2-P9-003.md", + "bytes": 1402, + "lines": 35, + "tokens": 351 + }, + { + "path": "tests/golden/WBV2-P9-002/manifest.json", + "bytes": 2822, + "lines": 75, + "tokens": 706 + }, + { + "path": "docs/status/WBV2-P9-002.md", + "bytes": 537, + "lines": 10, + "tokens": 135 + } + ], + "sourceTokens": 1892, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 1892, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 2916, + "serializedContextTokens": 655, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P9-004/feature-parity-gate-report.json b/tests/golden/WBV2-P9-004/feature-parity-gate-report.json new file mode 100644 index 000000000..2fc34b7e0 --- /dev/null +++ b/tests/golden/WBV2-P9-004/feature-parity-gate-report.json @@ -0,0 +1,85 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-004", + "operation": "RECOMPUTE_FEATURE_PARITY_GATE", + "status": "PASS", + "decision": { + "status": "READY_WITH_BOUNDED_FEATURE_PARITY", + "code": "FEATURE_PARITY_AUTHORIZED_REBASELINE", + "featureParityClaims": [ + "CAP-MESH-POSITIVE-EDIT", + "CAP-MODIFIER-STATE-MUTATION", + "CAP-ASSET-CATALOG-MUTATION" + ], + "featureParityClaimCount": 3, + "provenanceEpoch": 2, + "releaseScope": "AUTHORIZED_REBASELINE_ONLY", + "fullHistoricalReproduction": false, + "historicalOriginalsRestored": false + }, + "receipts": [ + { + "family": "MESH", + "capabilityId": "CAP-MESH-POSITIVE-EDIT", + "manifest": "tests/golden/WBV2-P9-001/manifest.json", + "manifestSha256": "fe697faf705103e8c51f0ad84f04462eb991d78fcfdd393516b76c7726aabe3b", + "report": "tests/golden/WBV2-P9-001/mesh-receipt-report.json", + "reportSha256": "e1f1d552936b77a44e05d0c8cfffb4f4397db40863c6bc4631fe52141eeec559", + "browser": "chromium", + "surfaces": [ + "DESKTOP", + "WASM" + ], + "deterministic": true, + "saveReopen": "EXACT", + "negativeMatrixClosed": true + }, + { + "family": "MODIFIER", + "capabilityId": "CAP-MODIFIER-STATE-MUTATION", + "manifest": "tests/golden/WBV2-P9-002/manifest.json", + "manifestSha256": "14b5da167382cd93b9692e4447616c0333d96806480b2a80c95d3b9345d13dd3", + "report": "tests/golden/WBV2-P9-002/modifier-receipt-report.json", + "reportSha256": "d3e59b339391ad8357e244f8640a0d420c984cb2a4a8ff130110965fe366e8c0", + "browser": "chromium", + "surfaces": [ + "DESKTOP", + "WASM" + ], + "deterministic": true, + "saveReopen": "EXACT", + "negativeMatrixClosed": true + }, + { + "family": "ASSET_CATALOG", + "capabilityId": "CAP-ASSET-CATALOG-MUTATION", + "manifest": "tests/golden/WBV2-P9-003/manifest.json", + "manifestSha256": "886c1afc0ce596a17edc7ce53f21dedcd9ef0ce6447021de5f634fec4f974916", + "report": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json", + "reportSha256": "c496ce11ecd56f079e21094f1c20479cadd03fa5739b4788a4df5e8452870dc7", + "browser": "chromium", + "surfaces": [ + "DESKTOP", + "WASM" + ], + "deterministic": true, + "saveReopen": "EXACT", + "negativeMatrixClosed": true + } + ], + "negative": { + "missingReceipt": "REJECTED", + "receiptHashDrift": "REJECTED", + "unsupportedBrowser": "REJECTED", + "nonExactSaveReopen": "REJECTED", + "falseHistoricalReproduction": "REJECTED", + "undeclaredFeatureClaim": "REJECTED" + }, + "policy": { + "authorizedRebaselineOnly": true, + "sourceHistoryReadOnly": true, + "claimsAreEvidenceBound": true, + "terminalQueuePointer": true + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P9-004/feature-parity-task-plan.json b/tests/golden/WBV2-P9-004/feature-parity-task-plan.json new file mode 100644 index 000000000..e7161c670 --- /dev/null +++ b/tests/golden/WBV2-P9-004/feature-parity-task-plan.json @@ -0,0 +1,1448 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_FEATURE_EPOCH_1", + "status": "COMPLETED_WITH_BOUNDED_FEATURE_PARITY", + "authority": "queue_reactivated_after_owner_review", + "productContract": "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "sourcePlan": "docs/BLENDER_5_2_FULL_WEB_PARITY_EXECUTION_PLAN.md", + "executionPointer": "docs/EXECUTION_QUEUE.md", + "correctiveCheckpoint": { + "task": "C6-003", + "handoff": "tests/golden/corrective/C6-003/handoff.json", + "status": "active", + "blocker": null, + "queueMutation": true, + "legacyTask": "M16-GAP-00277", + "legacyParentNextTask": "M16-GAP-00277" + }, + "runtimePolicy": { + "blenderSource": "blender-5.2.0", + "browserEvidence": [ + "chromium" + ], + "forbiddenBrowsers": [ + "firefox", + "webkit" + ], + "mainAuthority": "blender_main", + "storage": [ + "opfs", + "indexeddb" + ], + "queueMutation": "enabled_after_owner_review_and_g5" + }, + "completionClasses": [ + "LOCAL_EXACT", + "LOCAL_BOUNDED", + "SERVER_EXACT", + "EXCLUDED" + ], + "gates": [ + { + "id": "G0", + "name": "scope_and_inventory", + "requires": [ + "contract", + "inventory", + "capability_matrix" + ] + }, + { + "id": "G1", + "name": "runtime_foundation", + "requires": [ + "sceneir", + "main_transaction", + "worker_lifecycle", + "storage_journal" + ] + }, + { + "id": "G2", + "name": "feature_parity", + "requires": [ + "desktop", + "wasm_main", + "chromium", + "negative", + "persistence" + ] + }, + { + "id": "G3", + "name": "recovery_and_security", + "requires": [ + "cancel", + "restart", + "oom_quota", + "malformed", + "dispose" + ] + }, + { + "id": "G4", + "name": "release_candidate", + "requires": [ + "offline", + "ci", + "sbom", + "rollback", + "hashes" + ] + }, + { + "id": "G5", + "name": "queue_mutation", + "requires": [ + "owner_review", + "protected_hashes", + "handoff", + "single_ready_task" + ] + } + ], + "waves": [ + { + "id": "P0", + "name": "facts_and_contracts", + "gate": "G0", + "tasks": [ + "WBV2-P0-001", + "WBV2-P0-002", + "WBV2-P0-003" + ] + }, + { + "id": "P1", + "name": "runtime_foundation", + "gate": "G1", + "tasks": [ + "WBV2-P1-001", + "WBV2-P1-002", + "WBV2-P1-003", + "WBV2-P1-004", + "WBV2-P1-005" + ] + }, + { + "id": "P2", + "name": "core_modeler_loop", + "gate": "G2", + "tasks": [ + "WBV2-P2-001", + "WBV2-P2-002", + "WBV2-P2-003", + "WBV2-P2-004", + "WBV2-P2-005" + ] + }, + { + "id": "P3", + "name": "authoring_and_io", + "gate": "G2", + "tasks": [ + "WBV2-P3-001", + "WBV2-P3-002", + "WBV2-P3-003", + "WBV2-P3-004", + "WBV2-P3-005" + ] + }, + { + "id": "P4", + "name": "advanced_local_slices", + "gate": "G2", + "tasks": [ + "WBV2-P4-001", + "WBV2-P4-002", + "WBV2-P4-003", + "WBV2-P4-004" + ] + }, + { + "id": "P5", + "name": "render_and_server", + "gate": "G3", + "tasks": [ + "WBV2-P5-001", + "WBV2-P5-002", + "WBV2-P5-003" + ] + }, + { + "id": "P6", + "name": "security_performance_release", + "gate": "G4", + "tasks": [ + "WBV2-P6-001", + "WBV2-P6-002", + "WBV2-P6-003" + ] + }, + { + "id": "P7", + "name": "full_parity_gap_program", + "gate": "G5", + "tasks": [ + "WBV2-P7-001", + "WBV2-P7-002", + "WBV2-P7-003" + ] + } + ], + "taskContract": { + "onePrimaryBehavior": true, + "requiredEvidence": [ + "desktop", + "wasm_main", + "chromium", + "negative", + "persistence", + "manifest", + "status" + ], + "requiredCommands": [ + "focused", + "determinism", + "hash", + "governance" + ], + "failureState": "in_progress_or_blocked", + "successorRule": "only_from_parent_manifest_nextTask" + }, + "tasks": [ + { + "id": "WBV2-P0-001", + "phase": "P0", + "title": "reconcile_scope_and_checkpoints", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-governance", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-001.md", + "behavior": "Freeze V1/full-parity boundary and reconcile legacy/corrective pointers without queue mutation.", + "outputs": [ + "scope decision", + "checkpoint report", + "protected hash set" + ], + "acceptance": [ + "corrective owner-review status is explicit", + "legacy parent pointer is unchanged", + "plan has one activation gate" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P0-002", + "phase": "P0", + "title": "generate_blender52_inventory_and_parity_map", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P0-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-inventory", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-002.md", + "behavior": "Generate stable Blender 5.2 data-block/operator/editor/node/format inventory and map every entry to a completion class.", + "outputs": [ + "inventory", + "parity map", + "source hash" + ], + "acceptance": [ + "unknown entries are classified", + "inventory is deterministic", + "no entry claims feature parity without evidence" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P0-003", + "phase": "P0", + "title": "freeze_capability_error_budget_contract", + "kind": "enabling", + "owner": "PROTOCOL", + "dependsOn": [ + "WBV2-P0-001", + "WBV2-P0-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p0-contract", + "gate": "G0", + "card": "docs/tasks/WBV2-P0-003.md", + "behavior": "Freeze capability levels, stable error codes, revision, budget, cancellation and loss-report schemas.", + "outputs": [ + "versioned protocol", + "capability matrix", + "negative matrix" + ], + "acceptance": [ + "unsupported input fails closed", + "schema hashes are stable", + "migration policy preserves unknown data" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-001", + "phase": "P1", + "title": "stabilize_runtime_variants_and_source_receipts", + "kind": "enabling", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P0-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-runtime", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-001.md", + "behavior": "Bind single-thread/pthread WebEngine variants to pinned Blender source/build/runtime receipts.", + "outputs": [ + "runtime manifest", + "variant selector", + "fallback report" + ], + "acceptance": [ + "variant fallback is deterministic", + "source/build hash is verified", + "one engine session has one generation" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-002", + "phase": "P1", + "title": "unify_sceneir_stable_ids_and_binary_deltas", + "kind": "enabling", + "owner": "MAIN", + "dependsOn": [ + "WBV2-P1-001" + ], + "parityId": null, + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p1-sceneir", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-002.md", + "behavior": "Make SceneIR/WBG1 stable IDs, topology/attribute domains and binary/range deltas canonical across desktop and WASM.", + "outputs": [ + "SceneIR schema", + "binary fixture", + "delta comparator" + ], + "acceptance": [ + "IDs survive save/reopen", + "malformed chunk is rejected", + "desktop and WASM canonical hashes match" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-003", + "phase": "P1", + "title": "unify_main_transaction_history_and_save", + "kind": "enabling", + "owner": "MAIN", + "dependsOn": [ + "WBV2-P1-002" + ], + "parityId": null, + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p1-history", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-003.md", + "behavior": "Use one Main transaction/revision/history contract for commit, undo/redo, atomic save and reopen.", + "outputs": [ + "transaction contract", + "history receipt", + "save/reopen runner" + ], + "acceptance": [ + "failed/no-op commands add no history", + "stale revision cannot commit", + "reopen state is byte/hash stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-004", + "phase": "P1", + "title": "harden_worker_cancel_restart_and_dispose", + "kind": "enabling", + "owner": "RUNTIME", + "dependsOn": [ + "WBV2-P1-001", + "WBV2-P1-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-lifecycle", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-004.md", + "behavior": "Make cancellation, late-result rejection, Worker restart and resource disposal common to all domains.", + "outputs": [ + "lifecycle runner", + "fault report", + "dispose counters" + ], + "acceptance": [ + "cancel never publishes result", + "generation mismatch is rejected", + "CPU/WASM/GPU owners return to budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P1-005", + "phase": "P1", + "title": "harden_opfs_indexeddb_journal_recovery", + "kind": "enabling", + "owner": "STORAGE", + "dependsOn": [ + "WBV2-P1-003", + "WBV2-P1-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p1-storage", + "gate": "G1", + "card": "docs/tasks/WBV2-P1-005.md", + "behavior": "Unify OPFS staging/content addressing and IndexedDB metadata/journal recovery.", + "outputs": [ + "storage schema", + "crash fixtures", + "recovery checker" + ], + "acceptance": [ + "interrupted commit leaves old project usable", + "hash mismatch quarantines payload", + "small project recovers after restart" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-001", + "phase": "P2", + "title": "open_blend_scene_context_and_outliner", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1-002", + "WBV2-P1-005" + ], + "parityId": "EDITOR.OPEN_SCENE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-editor", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-001.md", + "behavior": "Open a minimal .blend and expose scene/object/collection context from authoritative Main.", + "outputs": [ + "desktop fixture", + "outliner report", + "Chromium path" + ], + "acceptance": [ + "stable IDs and selection revision match", + "missing data is structured", + "reopen preserves context" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-002", + "phase": "P2", + "title": "object_collection_parent_transform_workflow", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P1-003", + "WBV2-P2-001" + ], + "parityId": "OBJECT.TRANSFORM_HIERARCHY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-scene", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-002.md", + "behavior": "Edit object transform, collection membership and parent hierarchy through Main transactions.", + "outputs": [ + "desktop/WASM golden", + "negative cases", + "save/reopen receipt" + ], + "acceptance": [ + "world matrix parity", + "cycle/locked/library edits reject", + "undo/redo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-003", + "phase": "P2", + "title": "mesh_edit_core_operations", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P1-002", + "WBV2-P2-002" + ], + "parityId": "MESH.EDIT_CORE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p2-mesh", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-003.md", + "behavior": "Expose bounded vertex/edge/face selection plus merge/dissolve/extrude/inset/bevel/loop-cut.", + "outputs": [ + "Blender fixture set", + "topology comparator", + "Chromium edit path" + ], + "acceptance": [ + "topology/attributes match", + "invalid selection and budget fail closed", + "single transaction and reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-004", + "phase": "P2", + "title": "dual_viewport_sceneir_render_path", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P2-003" + ], + "parityId": "VIEWPORT.MAIN_OFFSCREEN", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p2-viewport", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-004.md", + "behavior": "Render the same validated SceneIR through main-thread WebGL2 and OffscreenCanvas Worker paths.", + "outputs": [ + "pixel report", + "viewport diagnostics", + "device recovery" + ], + "acceptance": [ + "both paths have nonblank pixels", + "selection/camera revision is shared", + "device loss releases resources" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P2-005", + "phase": "P2", + "title": "close_p0_user_loop", + "kind": "feature", + "owner": "INTEGRATION", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P2-003", + "WBV2-P1-005", + "WBV2-P2-004" + ], + "parityId": "WORKFLOW.P0_USER_LOOP", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p2-integration", + "gate": "G2", + "card": "docs/tasks/WBV2-P2-005.md", + "behavior": "Prove open -> edit -> undo -> redo -> save -> restart -> reopen -> GLB in one production flow.", + "outputs": [ + "P0 workflow report", + "release binding", + "rollback receipt" + ], + "acceptance": [ + "Main revision and exported asset are bound", + "fault/cancel leaves old state", + "Chromium production path passes" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-001", + "phase": "P3", + "title": "material_uv_principled_asset_workflow", + "kind": "feature", + "owner": "MATERIAL", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-005" + ], + "parityId": "MATERIAL.PBR_UV", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-authoring", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-001.md", + "behavior": "Edit material slots, UVs and declared Principled/Image/Normal graph nodes with content-addressed textures.", + "outputs": [ + "material golden", + "texture receipt", + "loss report" + ], + "acceptance": [ + "desktop/WASM node fields match", + "unsupported node retained/blocked", + "packed asset survives reopen" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-002", + "phase": "P3", + "title": "keyframe_timeline_action_workflow", + "kind": "feature", + "owner": "ANIMATION", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P2-005", + "WBV2-P3-001" + ], + "parityId": "ANIMATION.TRS_ACTION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p3-authoring", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-002.md", + "behavior": "Create/edit TRS keyframes, timeline and declared Action interpolation through Main.", + "outputs": [ + "frame golden", + "animation comparator", + "reopen report" + ], + "acceptance": [ + "sampled values and handles match", + "stale frame result rejected", + "undo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-003", + "phase": "P3", + "title": "armature_pose_constraint_skin_workflow", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P2-002", + "WBV2-P3-002" + ], + "parityId": "RIG.POSE_SKIN", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-rig", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-003.md", + "behavior": "Read and edit declared armature pose/constraint/weight/shape-key slices with bounded evaluation.", + "outputs": [ + "pose golden", + "skin report", + "unsupported matrix" + ], + "acceptance": [ + "pose matrices and weights match", + "unsupported constraint is explicit", + "save/reopen and small recovery pass" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-004", + "phase": "P3", + "title": "glb_roundtrip_and_loss_report", + "kind": "feature", + "owner": "IO", + "dependsOn": [ + "WBV2-P2-005", + "WBV2-P3-001", + "WBV2-P3-003" + ], + "parityId": "IO.GLB_ROUNDTRIP", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p3-io", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-004.md", + "behavior": "Import/export declared GLB mesh/PBR/texture/morph/skin/animation and report non-mapped semantics.", + "outputs": [ + "GLB fixtures", + "desktop reimport report", + "loss report" + ], + "acceptance": [ + "roundtrip canonical graph matches", + "sparse/external URI/budget negatives reject", + "no silent loss" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P3-005", + "phase": "P3", + "title": "library_asset_append_link_override", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P1-005", + "WBV2-P2-001", + "WBV2-P3-004" + ], + "parityId": "ASSET.LIBRARY_OPERATIONS", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p3-assets", + "gate": "G2", + "card": "docs/tasks/WBV2-P3-005.md", + "behavior": "Support declared append/link/override ownership, reload and missing-library semantics.", + "outputs": [ + "library fixtures", + "ownership report", + "negative matrix" + ], + "acceptance": [ + "source/hash/owner identity preserved", + "linked mutation blocked", + "stale generation and missing source fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-001", + "phase": "P4", + "title": "modifier_graph_and_apply_slices", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-005", + "WBV2-P3-005" + ], + "parityId": "MODIFIER.DECLARED_SLICES", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-001.md", + "behavior": "Enable one declared modifier parameter/apply workflow at a time with dependency-aware blocking.", + "outputs": [ + "modifier goldens", + "dependency report", + "negative cases" + ], + "acceptance": [ + "desktop/evaluated Main match", + "unknown modifier retained and blocked", + "apply/undo/save/reopen stable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-002", + "phase": "P4", + "title": "geometry_nodes_and_shader_allowlist", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P3-001", + "WBV2-P4-001" + ], + "parityId": "NODES.ALLOWLIST", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-002.md", + "behavior": "Read/write/evaluate only declared Geometry Nodes and shader graph allowlists with resource budgets.", + "outputs": [ + "node fixtures", + "compile/cache receipts", + "unsupported graph reports" + ], + "acceptance": [ + "node/socket/link/default parity", + "budget and unknown-node block before commit", + "compile failure rolls back" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-003", + "phase": "P4", + "title": "sculpt_nonmesh_and_paint_bounded_slices", + "kind": "feature", + "owner": "SCULPT", + "dependsOn": [ + "WBV2-P2-003", + "WBV2-P2-004", + "WBV2-P4-002" + ], + "parityId": "SCULPT.NONMESH.PAINT_BOUNDED", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G2", + "card": "docs/tasks/WBV2-P4-003.md", + "behavior": "Expose declared sculpt attributes/strokes, Curve/Surface/Font/PointCloud and paint slices with explicit PBVH limits.", + "outputs": [ + "non-mesh fixtures", + "stroke report", + "capability blocks" + ], + "acceptance": [ + "Main commit is atomic", + "unsupported brush/solver returns stable code", + "GPU/OOM/restart recovery passes" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P4-004", + "phase": "P4", + "title": "simulation_cache_identity_and_lifecycle", + "kind": "feature", + "owner": "SIMULATION", + "dependsOn": [ + "WBV2-P1-005", + "WBV2-P4-002", + "WBV2-P4-003" + ], + "parityId": "SIMULATION.CACHE_LIFECYCLE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p4-domains", + "gate": "G3", + "card": "docs/tasks/WBV2-P4-004.md", + "behavior": "Bind declared simulation cache to source/settings/revision hashes with cancellation, LRU and restart recovery.", + "outputs": [ + "cache fixtures", + "identity report", + "quarantine evidence" + ], + "acceptance": [ + "stale/corrupt cache never publishes", + "small cache recovers after restart", + "budget release is observable" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-001", + "phase": "P5", + "title": "render_capability_routing", + "kind": "feature", + "owner": "RENDER", + "dependsOn": [ + "WBV2-P2-004", + "WBV2-P4-002", + "WBV2-P4-004" + ], + "parityId": "RENDER.ROUTING", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p5-media", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-001.md", + "behavior": "Route bounded Eevee/WebGL capabilities locally and unsupported render classes to SERVER_EXACT or EXCLUDED.", + "outputs": [ + "render receipts", + "pixel golden", + "routing report" + ], + "acceptance": [ + "source/settings/build identity bound", + "unsupported route cannot pretend local success", + "cancel/device loss releases resources" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-002", + "phase": "P5", + "title": "compositor_sequencer_media_recovery", + "kind": "feature", + "owner": "MEDIA", + "dependsOn": [ + "WBV2-P3-002", + "WBV2-P5-001" + ], + "parityId": "MEDIA.BOUNDED_WORKFLOW", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p5-media", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-002.md", + "behavior": "Provide declared compositor/sequencer/codec/proxy/audio slices with revision and recovery gates.", + "outputs": [ + "media receipts", + "recovery report", + "audio/session diagnostics" + ], + "acceptance": [ + "seek/decode revision ordering", + "cancel/timeout does not publish", + "quota/OOM/restart leaves project valid" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P5-003", + "phase": "P5", + "title": "server_job_result_binding", + "kind": "feature", + "owner": "SERVER", + "dependsOn": [ + "WBV2-P0-003", + "WBV2-P5-001", + "WBV2-P5-002" + ], + "parityId": "SERVER.JOB_BINDING", + "implementationClass": "SERVER_EXACT", + "parallelGroup": "p5-server", + "gate": "G3", + "card": "docs/tasks/WBV2-P5-003.md", + "behavior": "Bind server render/encode/physics jobs to immutable input/settings/build/output hashes and explicit lifecycle states.", + "outputs": [ + "server protocol", + "idempotency receipt", + "negative matrix" + ], + "acceptance": [ + "duplicate request is idempotent", + "stale result cannot bind", + "timeout/cancel/OOM produces no READY output" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-001", + "phase": "P6", + "title": "scripting_default_deny_and_audit", + "kind": "feature", + "owner": "SECURITY", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P5-003" + ], + "parityId": "SECURITY.SCRIPTING", + "implementationClass": "EXCLUDED", + "parallelGroup": "p6-safety", + "gate": "G3", + "card": "docs/tasks/WBV2-P6-001.md", + "behavior": "Read text/metadata and expose audited, budgeted, default-deny script policy without arbitrary execution.", + "outputs": [ + "policy manifest", + "malicious fixtures", + "audit report" + ], + "acceptance": [ + "autorun/network/add-on defaults deny", + "sandbox cancellation/dispose works", + "no secret or filesystem escape" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-002", + "phase": "P6", + "title": "performance_fault_and_recovery_matrix", + "kind": "enabling", + "owner": "RELIABILITY", + "dependsOn": [ + "WBV2-P1-004", + "WBV2-P1-005", + "WBV2-P2-004", + "WBV2-P6-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p6-safety", + "gate": "G3", + "card": "docs/tasks/WBV2-P6-002.md", + "behavior": "Run deterministic geometry/texture/media/cache budgets and inject OOM/quota/device/network faults.", + "outputs": [ + "budget matrix", + "fault reports", + "resource release ledger" + ], + "acceptance": [ + "100k/1M/10M thresholds recorded", + "fault leaves old revision usable", + "all owned resources return to budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P6-003", + "phase": "P6", + "title": "offline_ci_sbom_and_rollback_release", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P6-001", + "WBV2-P6-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p6-release", + "gate": "G4", + "card": "docs/tasks/WBV2-P6-003.md", + "behavior": "Produce reproducible offline/source/binary release packages with CI lanes, SBOM and rollback evidence.", + "outputs": [ + "RC manifest", + "offline archive", + "CI reports" + ], + "acceptance": [ + "quick/Chromium/release lanes pass", + "artifact hashes reproduce", + "upgrade/rollback and known limitations are tested" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-001", + "phase": "P7", + "title": "cluster_full_blender_gap_inventory", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P0-002", + "WBV2-P6-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-gap", + "gate": "G4", + "card": "docs/tasks/WBV2-P7-001.md", + "behavior": "Cluster remaining Blender 5.2 data-block/operator/editor/node/format gaps by family and evidence class.", + "outputs": [ + "cluster catalog", + "coverage report", + "risk ranking" + ], + "acceptance": [ + "each gap has stable ID and owner", + "negative-only/unsupported is not positive parity", + "clusters are deterministic" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-002", + "phase": "P7", + "title": "generate_atomic_family_gap_queue", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P7-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-gap", + "gate": "G4", + "card": "docs/tasks/WBV2-P7-002.md", + "behavior": "Generate one task per parityId x observable behavior x implementation class with parent/hash context.", + "outputs": [ + "task index", + "task catalog", + "task cards" + ], + "acceptance": [ + "one active ready task", + "no guessed successor", + "each card fits context budget" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P7-003", + "phase": "P7", + "title": "full_parity_candidate_release_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P7-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p7-release", + "gate": "G5", + "card": "docs/tasks/WBV2-P7-003.md", + "behavior": "Recompute parity closure, evidence health, recovery health and release decision from machine manifests.", + "outputs": [ + "parity release report", + "known limitations", + "final decision" + ], + "acceptance": [ + "all claims bind to evidence", + "blocked/excluded/server classes remain explicit", + "queue and protected hashes pass" + ], + "status": "blocked", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-000", + "phase": "P8", + "title": "authorize_recovery_capability_root", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P7-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-governance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-000.md", + "behavior": "Authorize a recovery epoch without rewriting the blocked P7 manifest.", + "outputs": [ + "recovery plan", + "root manifest", + "queue authorization" + ], + "acceptance": [ + "P7 evidence remains hash exact", + "recovery scope is explicit", + "one recovery task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P8-001", + "phase": "P8", + "title": "rebaseline_mutable_inventories", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-governance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-001.md", + "behavior": "Rebaseline mutable WBV2 plan and dependency inventory inputs while preserving historical manifests.", + "outputs": [ + "semantic drift report", + "current inventory baseline", + "manifest" + ], + "acceptance": [ + "only expected mutable hashes drift", + "dependency closure is unchanged", + "historical manifests remain unmodified" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-002", + "phase": "P8", + "title": "close_atomic_chromium_receipts", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P8-001" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-receipts", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-002.md", + "behavior": "Produce and bind all 45 atomic Chromium family receipts.", + "outputs": [ + "Chromium report", + "45 receipt index", + "receipt manifests" + ], + "acceptance": [ + "45 receipts are manifest-bound", + "desktop/WASM/save-reopen behaviors are explicit", + "Chromium is the only browser" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-003", + "phase": "P8", + "title": "authorize_m12_provenance_epoch", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-002" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-provenance", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-003.md", + "behavior": "Bind restored M12 sources and explicitly rebaseline unavailable originals in a new provenance epoch.", + "outputs": [ + "provenance epoch", + "replacement bindings", + "manifest" + ], + "acceptance": [ + "22 restored originals stay exact", + "62 unavailable entries are not called restored", + "all replacements are hash-bound" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P8-004", + "phase": "P8", + "title": "recompute_recovery_release_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P8-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p8-release", + "gate": "G5", + "card": "docs/tasks/WBV2-P8-004.md", + "behavior": "Recompute the release decision from the recovery epoch and atomic receipts.", + "outputs": [ + "release gate", + "known limitations", + "final manifest" + ], + "acceptance": [ + "all receipts bind to manifests", + "provenance epoch is explicit", + "all governance gates pass" + ], + "status": "in_progress", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-000", + "phase": "P9", + "title": "authorize_feature_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P8-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p9-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-000.md", + "behavior": "Authorize feature parity continuation after provenance epoch 2 without claiming historical byte reproduction.", + "outputs": [ + "continuation receipt", + "feature parity plan", + "scope limits" + ], + "acceptance": [ + "P8 provenance evidence remains exact", + "authorized baseline is explicit", + "one feature task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P9-001", + "phase": "P9", + "title": "mesh_production_chromium_receipt", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P9-000" + ], + "parityId": "CAP-MESH-POSITIVE-EDIT", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-mesh", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-001.md", + "behavior": "Bind the existing Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt.", + "outputs": [ + "Chromium mesh receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real meshTranslateVertex command passes", + "desktop/WASM delta matches", + "save/reopen is exact", + "malformed/stale/unknown inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-002", + "phase": "P9", + "title": "modifier_production_chromium_receipt", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P9-001" + ], + "parityId": "CAP-MODIFIER-STATE-MUTATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-modifier", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-002.md", + "behavior": "Bind the existing Modifier Main transaction to a production Chromium receipt.", + "outputs": [ + "Chromium modifier receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real modifierSetEnabled command passes", + "desktop/WASM delta matches", + "save/reopen is exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-003", + "phase": "P9", + "title": "asset_catalog_production_chromium_receipt", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P9-002" + ], + "parityId": "CAP-ASSET-CATALOG-MUTATION", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p9-asset", + "gate": "G6", + "card": "docs/tasks/WBV2-P9-003.md", + "behavior": "Bind the existing Asset Catalog Main transaction and resource resolver to a production Chromium receipt.", + "outputs": [ + "Chromium asset receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "real assetCatalogAppend command passes", + "resource hash is bound", + "save/reopen is exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P9-004", + "phase": "P9", + "title": "recompute_feature_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P9-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p9-release", + "gate": "G7", + "card": "docs/tasks/WBV2-P9-004.md", + "behavior": "Recompute declared feature parity claims from production Chromium receipts and authorized provenance.", + "outputs": [ + "feature parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only evidenced feature claims are emitted", + "authorized baseline remains explicit", + "full historical reproduction remains false" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P9-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P9-003/feature-parity-task-plan.json", + "sha256": "95afd10245c35f4c28ed3d1b418f7e9a20a041bf80be72b76e4e308786fd08c0" + } +} diff --git a/tests/golden/WBV2-P9-004/manifest.json b/tests/golden/WBV2-P9-004/manifest.json new file mode 100644 index 000000000..2ca319762 --- /dev/null +++ b/tests/golden/WBV2-P9-004/manifest.json @@ -0,0 +1,78 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-004", + "parentTask": "WBV2-P9-003", + "operation": "RECOMPUTE_FEATURE_PARITY_GATE", + "status": "done", + "enablingTask": true, + "parityStateChange": true, + "runtime": "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P9-003/manifest.json", + "sha256": "886c1afc0ce596a17edc7ce53f21dedcd9ef0ce6447021de5f634fec4f974916" + }, + "approval": { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3" + }, + "meshManifest": { + "path": "tests/golden/WBV2-P9-001/manifest.json", + "sha256": "fe697faf705103e8c51f0ad84f04462eb991d78fcfdd393516b76c7726aabe3b" + }, + "meshReport": { + "path": "tests/golden/WBV2-P9-001/mesh-receipt-report.json", + "sha256": "e1f1d552936b77a44e05d0c8cfffb4f4397db40863c6bc4631fe52141eeec559" + }, + "modifierManifest": { + "path": "tests/golden/WBV2-P9-002/manifest.json", + "sha256": "14b5da167382cd93b9692e4447616c0333d96806480b2a80c95d3b9345d13dd3" + }, + "modifierReport": { + "path": "tests/golden/WBV2-P9-002/modifier-receipt-report.json", + "sha256": "d3e59b339391ad8357e244f8640a0d420c984cb2a4a8ff130110965fe366e8c0" + }, + "assetManifest": { + "path": "tests/golden/WBV2-P9-003/manifest.json", + "sha256": "886c1afc0ce596a17edc7ce53f21dedcd9ef0ce6447021de5f634fec4f974916" + }, + "assetReport": { + "path": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json", + "sha256": "c496ce11ecd56f079e21094f1c20479cadd03fa5739b4788a4df5e8452870dc7" + }, + "generator": { + "path": "tools/web/generate-wbv2-feature-parity-gate.mjs", + "sha256": "21144b2361b7003ac146e0015e1920824fc06333869607e8eb60d98ebcbd7bc6" + }, + "report": { + "path": "tests/golden/WBV2-P9-004/feature-parity-gate-report.json", + "sha256": "c8eea515dee05ed766677ccb8cabab707e130094bf7a8c8ba5bdef0b8db76fd5" + }, + "status": { + "path": "docs/status/WBV2-P9-004.md", + "sha256": "1d613986df38e61e5efc368822495b9f6ad81be8bfd155de5d010d31f8529511" + }, + "featureParityPlan": { + "path": "tests/golden/WBV2-P9-004/feature-parity-task-plan.json", + "sha256": "d754f21d4923eec7cdb497caa7ed77300db81f2ccff965c2690f7734aafb135d" + }, + "taskContext": { + "path": "tests/golden/WBV2-P9-004/task-context.json", + "sha256": "8604daa21f1f70323a7db3b72ab5452a33854ef6404f7f9aa4e35f74cb94d8dc" + } + }, + "assertions": { + "featureParityClaims": [ + "CAP-MESH-POSITIVE-EDIT", + "CAP-MODIFIER-STATE-MUTATION", + "CAP-ASSET-CATALOG-MUTATION" + ], + "featureParityClaimCount": 3, + "deterministicReceipts": 3, + "exactSaveReopen": 3, + "provenanceEpoch": 2, + "authorizedRebaselineOnly": true, + "fullHistoricalReproduction": false + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P9-004/task-context.json b/tests/golden/WBV2-P9-004/task-context.json new file mode 100644 index 000000000..4020eb26c --- /dev/null +++ b/tests/golden/WBV2-P9-004/task-context.json @@ -0,0 +1,181 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P9-004", + "parentTask": "WBV2-P9-003", + "status": "in_progress", + "goal": "Recompute declared feature parity claims only from the three production Chromium receipts and preserve the authorized-rebaseline-only release boundary.", + "scope": { + "gap": "workflow:recompute_feature_parity_gate", + "ownerFamily": "RELEASE", + "implementationClass": "LOCAL_BOUNDED" + }, + "commands": [ + "node tools/web/generate-wbv2-feature-parity-gate.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P9-004 --write" + ], + "inputPaths": [ + "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 2204, + "contextRemainingTokens": 549 + }, + "source": { + "bytes": 7700, + "tokens": 1927 + }, + "selected": [ + { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "bytes": 704, + "tokens": 176 + } + ], + "excluded": [ + { + "path": "tests/golden/WBV2-P9-001/mesh-receipt-report.json", + "bytes": 4959, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P9-002/modifier-receipt-report.json", + "bytes": 4728, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json", + "bytes": 5477, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P9-004/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P9-004.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P9-004/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 1, + "bytes": 704, + "tokens": 176 + } + }, + "exitCriteria": [ + "only evidenced feature claims are emitted", + "authorized baseline remains explicit", + "full historical reproduction remains false" + ], + "nextTask": null, + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P9-004.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P9-003/manifest.json", + "parentStatus": "docs/status/WBV2-P9-003.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P9-004.md", + "tests/golden/WBV2-P9-003/manifest.json", + "docs/status/WBV2-P9-003.md" + ], + "machineOnly": [ + "tests/golden/WBV2/task-index.json", + "tests/golden/M15-03A/task-catalog.jsonl" + ], + "optionalByNeed": [ + "docs/WEB_BLENDER_MODELER_V1_SCOPE.md", + "任务卡列出的精确协议/生产路径", + "任务卡明确命名的长期计划小节" + ], + "forbiddenByDefault": [ + "完整 CURRENT_EXECUTION_PLAN.md", + "完整 PROJECT_STATUS_AND_NEXT_WORK.md", + "全部 docs/status/*.md", + "完整 parity/WBS 计划", + "README 历史和 test-results/" + ] + }, + "parent": { + "manifest": { + "schemaVersion": 1, + "task": "WBV2-P9-003", + "parentTask": "WBV2-P9-002", + "status": "done", + "nextTask": "WBV2-P9-004", + "artifactCount": 14 + }, + "statusSummary": [ + "# WBV2-P9-003 status", + "- task: `WBV2-P9-003`; parent: `WBV2-P9-002`; status: `done`", + "- Asset Catalog Chromium receipt: `DESKTOP + WASM`", + "- resource: `EXTERNAL_LIBRARY/library.blend`; hash-bound", + "- append revision: `4 -> 5`; save/reopen: `EXACT`", + "- nextTask: `WBV2-P9-004`", + "The production Chromium receipt executes the existing Asset Catalog Main and resource resolver. Duplicate, stale, malformed, and missing-resource commands are rejected without a late mutation. This is a bounded current implementation claim and does not assert historical byte reproduction." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1278, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 34, + "taskTokens": 320 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2799, + "lines": 51, + "tokens": 700 + }, + { + "path": "docs/tasks/WBV2-P9-004.md", + "bytes": 1278, + "lines": 34, + "tokens": 320 + }, + { + "path": "tests/golden/WBV2-P9-003/manifest.json", + "bytes": 3065, + "lines": 80, + "tokens": 767 + }, + { + "path": "docs/status/WBV2-P9-003.md", + "bytes": 558, + "lines": 10, + "tokens": 140 + } + ], + "sourceTokens": 1927, + "evidenceFiles": 1, + "evidenceBytes": 704, + "evidenceTokens": 176, + "totalTokens": 2103, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3127, + "serializedContextTokens": 681, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index 72536e794..906d59eea 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -33,4 +33,9 @@ {"id":"WBV2-P8-001","gapId":"workflow:rebaseline_mutable_inventories","ownerFamily":"PROGRAM","sourceTask":"P8","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only expected mutable hashes drift","dependency closure is unchanged","historical manifests remain unmodified"]} {"id":"WBV2-P8-002","gapId":"workflow:close_atomic_chromium_receipts","ownerFamily":"PARITY","sourceTask":"P8","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["45 receipts are manifest-bound","desktop/WASM/save-reopen behaviors are explicit","Chromium is the only browser"]} {"id":"WBV2-P8-003","gapId":"workflow:authorize_m12_provenance_epoch","ownerFamily":"PROGRAM","sourceTask":"P8","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["22 restored originals stay exact","62 unavailable entries are not called restored","all replacements are hash-bound"]} -{"id":"WBV2-P8-004","gapId":"workflow:recompute_recovery_release_gate","ownerFamily":"RELEASE","sourceTask":"P8","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["all receipts bind to manifests","provenance epoch is explicit","all governance gates pass"]} +{"id":"WBV2-P8-004","gapId":"workflow:recompute_recovery_release_gate","ownerFamily":"RELEASE","sourceTask":"P8","state":"pending","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["all receipts bind to manifests","provenance epoch is explicit","all governance gates pass"]} +{"id":"WBV2-P9-000","gapId":"workflow:authorize_feature_parity_continuation","ownerFamily":"PROGRAM","sourceTask":"P9","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P8 provenance evidence remains exact","authorized baseline is explicit","one feature task is active"]} +{"id":"WBV2-P9-001","gapId":"CAP-MESH-POSITIVE-EDIT","ownerFamily":"MESH","sourceTask":"P9","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["real meshTranslateVertex command passes","desktop/WASM delta matches","save/reopen is exact","malformed/stale/unknown inputs fail closed"]} +{"id":"WBV2-P9-002","gapId":"CAP-MODIFIER-STATE-MUTATION","ownerFamily":"MODIFIER","sourceTask":"P9","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["real modifierSetEnabled command passes","desktop/WASM delta matches","save/reopen is exact"]} +{"id":"WBV2-P9-003","gapId":"CAP-ASSET-CATALOG-MUTATION","ownerFamily":"ASSET","sourceTask":"P9","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["real assetCatalogAppend command passes","resource hash is bound","save/reopen is exact"]} +{"id":"WBV2-P9-004","gapId":"workflow:recompute_feature_parity_gate","ownerFamily":"RELEASE","sourceTask":"P9","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only evidenced feature claims are emitted","authorized baseline remains explicit","full historical reproduction remains false"]} diff --git a/tests/golden/WBV2/task-index.json b/tests/golden/WBV2/task-index.json index d1c298b31..6a5149044 100644 --- a/tests/golden/WBV2/task-index.json +++ b/tests/golden/WBV2/task-index.json @@ -1 +1 @@ -{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P8-003/recovery-task-plan.json","sha256":"788de39c33cf87d3b8d3812f13e9cbd7d1acbfd6fb70df522ccd69f454704666"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"3b2bb72a9494de0e69bb973dcbcf64dbf62d8dda80096141212936f90ef72a42"},"taskCount":36,"activeTask":"WBV2-P8-004","entries":{"WBV2-P0-001":{"line":0,"offset":0,"length":308,"previous":null,"next":"WBV2-P0-002"},"WBV2-P0-002":{"line":1,"offset":308,"length":318,"previous":"WBV2-P0-001","next":"WBV2-P0-003"},"WBV2-P0-003":{"line":2,"offset":626,"length":306,"previous":"WBV2-P0-002","next":"WBV2-P1-001"},"WBV2-P1-001":{"line":3,"offset":932,"length":318,"previous":"WBV2-P0-003","next":"WBV2-P1-002"},"WBV2-P1-002":{"line":4,"offset":1250,"length":299,"previous":"WBV2-P1-001","next":"WBV2-P1-003"},"WBV2-P1-003":{"line":5,"offset":1549,"length":303,"previous":"WBV2-P1-002","next":"WBV2-P1-004"},"WBV2-P1-004":{"line":6,"offset":1852,"length":309,"previous":"WBV2-P1-003","next":"WBV2-P1-005"},"WBV2-P1-005":{"line":7,"offset":2161,"length":324,"previous":"WBV2-P1-004","next":"WBV2-P2-001"},"WBV2-P2-001":{"line":8,"offset":2485,"length":267,"previous":"WBV2-P1-005","next":"WBV2-P2-002"},"WBV2-P2-002":{"line":9,"offset":2752,"length":267,"previous":"WBV2-P2-001","next":"WBV2-P2-003"},"WBV2-P2-003":{"line":10,"offset":3019,"length":274,"previous":"WBV2-P2-002","next":"WBV2-P2-004"},"WBV2-P2-004":{"line":11,"offset":3293,"length":284,"previous":"WBV2-P2-003","next":"WBV2-P2-005"},"WBV2-P2-005":{"line":12,"offset":3577,"length":291,"previous":"WBV2-P2-004","next":"WBV2-P3-001"},"WBV2-P3-001":{"line":13,"offset":3868,"length":271,"previous":"WBV2-P2-005","next":"WBV2-P3-002"},"WBV2-P3-002":{"line":14,"offset":4139,"length":266,"previous":"WBV2-P3-001","next":"WBV2-P3-003"},"WBV2-P3-003":{"line":15,"offset":4405,"length":273,"previous":"WBV2-P3-002","next":"WBV2-P3-004"},"WBV2-P3-004":{"line":16,"offset":4678,"length":263,"previous":"WBV2-P3-003","next":"WBV2-P3-005"},"WBV2-P3-005":{"line":17,"offset":4941,"length":292,"previous":"WBV2-P3-004","next":"WBV2-P4-001"},"WBV2-P4-001":{"line":18,"offset":5233,"length":283,"previous":"WBV2-P3-005","next":"WBV2-P4-002"},"WBV2-P4-002":{"line":19,"offset":5516,"length":277,"previous":"WBV2-P4-001","next":"WBV2-P4-003"},"WBV2-P4-003":{"line":20,"offset":5793,"length":287,"previous":"WBV2-P4-002","next":"WBV2-P4-004"},"WBV2-P4-004":{"line":21,"offset":6080,"length":290,"previous":"WBV2-P4-003","next":"WBV2-P5-001"},"WBV2-P5-001":{"line":22,"offset":6370,"length":296,"previous":"WBV2-P4-004","next":"WBV2-P5-002"},"WBV2-P5-002":{"line":23,"offset":6666,"length":282,"previous":"WBV2-P5-001","next":"WBV2-P5-003"},"WBV2-P5-003":{"line":24,"offset":6948,"length":278,"previous":"WBV2-P5-002","next":"WBV2-P6-001"},"WBV2-P6-001":{"line":25,"offset":7226,"length":278,"previous":"WBV2-P5-003","next":"WBV2-P6-002"},"WBV2-P6-002":{"line":26,"offset":7504,"length":313,"previous":"WBV2-P6-001","next":"WBV2-P6-003"},"WBV2-P6-003":{"line":27,"offset":7817,"length":316,"previous":"WBV2-P6-002","next":"WBV2-P7-001"},"WBV2-P7-001":{"line":28,"offset":8133,"length":312,"previous":"WBV2-P6-003","next":"WBV2-P7-002"},"WBV2-P7-002":{"line":29,"offset":8445,"length":275,"previous":"WBV2-P7-001","next":"WBV2-P7-003"},"WBV2-P7-003":{"line":30,"offset":8720,"length":310,"previous":"WBV2-P7-002","next":"WBV2-P8-000"},"WBV2-P8-000":{"line":31,"offset":9030,"length":290,"previous":"WBV2-P7-003","next":"WBV2-P8-001"},"WBV2-P8-001":{"line":32,"offset":9320,"length":306,"previous":"WBV2-P8-000","next":"WBV2-P8-002"},"WBV2-P8-002":{"line":33,"offset":9626,"length":307,"previous":"WBV2-P8-001","next":"WBV2-P8-003"},"WBV2-P8-003":{"line":34,"offset":9933,"length":312,"previous":"WBV2-P8-002","next":"WBV2-P8-004"},"WBV2-P8-004":{"line":35,"offset":10245,"length":284,"previous":"WBV2-P8-003","next":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P9-004/feature-parity-task-plan.json","sha256":"d754f21d4923eec7cdb497caa7ed77300db81f2ccff965c2690f7734aafb135d"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"6b9506476dd36550fb13f745dadd5f3fb63c3629934c9f8f853edc2b035b38a2"},"taskCount":41,"activeTask":"WBV2-P9-004","entries":{"WBV2-P0-001":{"line":0,"offset":0,"length":308,"previous":null,"next":"WBV2-P0-002"},"WBV2-P0-002":{"line":1,"offset":308,"length":318,"previous":"WBV2-P0-001","next":"WBV2-P0-003"},"WBV2-P0-003":{"line":2,"offset":626,"length":306,"previous":"WBV2-P0-002","next":"WBV2-P1-001"},"WBV2-P1-001":{"line":3,"offset":932,"length":318,"previous":"WBV2-P0-003","next":"WBV2-P1-002"},"WBV2-P1-002":{"line":4,"offset":1250,"length":299,"previous":"WBV2-P1-001","next":"WBV2-P1-003"},"WBV2-P1-003":{"line":5,"offset":1549,"length":303,"previous":"WBV2-P1-002","next":"WBV2-P1-004"},"WBV2-P1-004":{"line":6,"offset":1852,"length":309,"previous":"WBV2-P1-003","next":"WBV2-P1-005"},"WBV2-P1-005":{"line":7,"offset":2161,"length":324,"previous":"WBV2-P1-004","next":"WBV2-P2-001"},"WBV2-P2-001":{"line":8,"offset":2485,"length":267,"previous":"WBV2-P1-005","next":"WBV2-P2-002"},"WBV2-P2-002":{"line":9,"offset":2752,"length":267,"previous":"WBV2-P2-001","next":"WBV2-P2-003"},"WBV2-P2-003":{"line":10,"offset":3019,"length":274,"previous":"WBV2-P2-002","next":"WBV2-P2-004"},"WBV2-P2-004":{"line":11,"offset":3293,"length":284,"previous":"WBV2-P2-003","next":"WBV2-P2-005"},"WBV2-P2-005":{"line":12,"offset":3577,"length":291,"previous":"WBV2-P2-004","next":"WBV2-P3-001"},"WBV2-P3-001":{"line":13,"offset":3868,"length":271,"previous":"WBV2-P2-005","next":"WBV2-P3-002"},"WBV2-P3-002":{"line":14,"offset":4139,"length":266,"previous":"WBV2-P3-001","next":"WBV2-P3-003"},"WBV2-P3-003":{"line":15,"offset":4405,"length":273,"previous":"WBV2-P3-002","next":"WBV2-P3-004"},"WBV2-P3-004":{"line":16,"offset":4678,"length":263,"previous":"WBV2-P3-003","next":"WBV2-P3-005"},"WBV2-P3-005":{"line":17,"offset":4941,"length":292,"previous":"WBV2-P3-004","next":"WBV2-P4-001"},"WBV2-P4-001":{"line":18,"offset":5233,"length":283,"previous":"WBV2-P3-005","next":"WBV2-P4-002"},"WBV2-P4-002":{"line":19,"offset":5516,"length":277,"previous":"WBV2-P4-001","next":"WBV2-P4-003"},"WBV2-P4-003":{"line":20,"offset":5793,"length":287,"previous":"WBV2-P4-002","next":"WBV2-P4-004"},"WBV2-P4-004":{"line":21,"offset":6080,"length":290,"previous":"WBV2-P4-003","next":"WBV2-P5-001"},"WBV2-P5-001":{"line":22,"offset":6370,"length":296,"previous":"WBV2-P4-004","next":"WBV2-P5-002"},"WBV2-P5-002":{"line":23,"offset":6666,"length":282,"previous":"WBV2-P5-001","next":"WBV2-P5-003"},"WBV2-P5-003":{"line":24,"offset":6948,"length":278,"previous":"WBV2-P5-002","next":"WBV2-P6-001"},"WBV2-P6-001":{"line":25,"offset":7226,"length":278,"previous":"WBV2-P5-003","next":"WBV2-P6-002"},"WBV2-P6-002":{"line":26,"offset":7504,"length":313,"previous":"WBV2-P6-001","next":"WBV2-P6-003"},"WBV2-P6-003":{"line":27,"offset":7817,"length":316,"previous":"WBV2-P6-002","next":"WBV2-P7-001"},"WBV2-P7-001":{"line":28,"offset":8133,"length":312,"previous":"WBV2-P6-003","next":"WBV2-P7-002"},"WBV2-P7-002":{"line":29,"offset":8445,"length":275,"previous":"WBV2-P7-001","next":"WBV2-P7-003"},"WBV2-P7-003":{"line":30,"offset":8720,"length":310,"previous":"WBV2-P7-002","next":"WBV2-P8-000"},"WBV2-P8-000":{"line":31,"offset":9030,"length":290,"previous":"WBV2-P7-003","next":"WBV2-P8-001"},"WBV2-P8-001":{"line":32,"offset":9320,"length":306,"previous":"WBV2-P8-000","next":"WBV2-P8-002"},"WBV2-P8-002":{"line":33,"offset":9626,"length":307,"previous":"WBV2-P8-001","next":"WBV2-P8-003"},"WBV2-P8-003":{"line":34,"offset":9933,"length":312,"previous":"WBV2-P8-002","next":"WBV2-P8-004"},"WBV2-P8-004":{"line":35,"offset":10245,"length":285,"previous":"WBV2-P8-003","next":"WBV2-P9-000"},"WBV2-P9-000":{"line":36,"offset":10530,"length":303,"previous":"WBV2-P8-004","next":"WBV2-P9-001"},"WBV2-P9-001":{"line":37,"offset":10833,"length":311,"previous":"WBV2-P9-000","next":"WBV2-P9-002"},"WBV2-P9-002":{"line":38,"offset":11144,"length":274,"previous":"WBV2-P9-001","next":"WBV2-P9-003"},"WBV2-P9-003":{"line":39,"offset":11418,"length":266,"previous":"WBV2-P9-002","next":"WBV2-P9-004"},"WBV2-P9-004":{"line":40,"offset":11684,"length":318,"previous":"WBV2-P9-003","next":null}}} diff --git a/tools/web/generate-wbv2-asset-catalog-receipt.mjs b/tools/web/generate-wbv2-asset-catalog-receipt.mjs new file mode 100644 index 000000000..5ff6c3a10 --- /dev/null +++ b/tools/web/generate-wbv2-asset-catalog-receipt.mjs @@ -0,0 +1,179 @@ +import assert from "node:assert/strict"; +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { execFileSync } from "node:child_process"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); +const write = process.argv.includes("--write"); +const absolute = (file) => path.join(root, file); +const read = (file) => fs.readFileSync(absolute(file), "utf8"); +const readJson = (file) => JSON.parse(read(file)); +const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex"); +const outputRoot = "tests/golden/WBV2-P9-003"; +const chromiumPath = `${outputRoot}/chromium-asset-catalog-production.json`; +const chromiumSecondPath = `${outputRoot}/chromium-asset-catalog-production.second.json`; +const reportPath = `${outputRoot}/asset-catalog-receipt-report.json`; +const statusPath = "docs/status/WBV2-P9-003.md"; +const planPath = `${outputRoot}/feature-parity-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentManifestPath = "tests/golden/WBV2-P9-002/manifest.json"; +const sourceManifestPath = "tests/golden/corrective/C3-003/manifest.json"; +const sourceReportPath = "tests/golden/corrective/C3-003/receipt-report.json"; + +const parent = readJson(parentManifestPath); +assert.equal(parent.task, "WBV2-P9-002"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P9-003"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); + +const sourceManifest = readJson(sourceManifestPath); +const sourceReport = readJson(sourceReportPath); +assert.equal(sourceManifest.task, "C3-003"); +assert.equal(sourceManifest.status, "done"); +assert.equal(sourceReport.task, "C3-003"); +assert.equal(sourceReport.browser, "chromium"); +assert.equal(sourceReport.queueMutation, false); +assert.equal(sourceReport.parity, true); +assert.equal(sourceReport.positive.desktop.status, "FINISHED"); +assert.equal(sourceReport.positive.wasm.status, "FINISHED"); +assert.equal(sourceReport.persistence.dirty, false); +const sourceBound = Object.values(sourceManifest.artifacts ?? {}).find((artifact) => artifact.path === sourceReportPath); +assert.ok(sourceBound, "C3-003 source report is not manifest-bound"); +assert.equal(sourceBound.sha256, sha256(sourceReportPath)); + +assert.equal(sha256(chromiumPath), sha256(chromiumSecondPath), "Chromium Asset Catalog report is not deterministic"); +const chromium = readJson(chromiumPath); +assert.equal(chromium.task, "WBV2-P9-003"); +assert.equal(chromium.operation, "ASSET_CATALOG_PRODUCTION_CHROMIUM"); +assert.equal(chromium.browser, "chromium"); +assert.equal(chromium.queueMutation, false); +assert.equal(chromium.positive.parity, true); +for (const surface of ["desktop", "wasm"]) { + const result = chromium.positive[surface]; + assert.equal(result.status, "FINISHED"); + assert.equal(result.code, "OK"); + assert.equal(result.mainRevisionBefore, 4); + assert.equal(result.mainRevisionAfter, 5); + assert.equal(result.mainMutation, "CHANGED"); + assert.deepEqual(result.delta, { addedId: "asset:wbv2-p9-003", count: 1 }); +} +assert.deepEqual(chromium.positive.desktop, chromium.positive.wasm); +assert.equal(chromium.resource.provider, "EXTERNAL_LIBRARY"); +assert.match(chromium.resource.sha256, /^[a-f0-9]{64}$/u); +assert.equal(chromium.resource.byteLength, 27); +assert.equal(chromium.positive.desktopMain.value.entries[0].sourceSha256, chromium.resource.sha256); +assert.equal(chromium.negative.duplicate.code, "COMMAND_UNSUPPORTED"); +assert.equal(chromium.negative.stale.code, "REVISION_CONFLICT"); +assert.equal(chromium.negative.malformed.code, "COMMAND_MALFORMED"); +assert.equal(chromium.negative.missing.code, "RESOURCE_REQUIRED"); +assert.equal(chromium.negative.missing.mainRevisionAfter, 4); +assert.equal(chromium.persistence.exact, true); +assert.deepEqual(chromium.persistence.reopened, chromium.persistence.saved); + +const receipt = { + schemaVersion: 1, + task: "WBV2-P9-003", + operation: "ASSET_CATALOG_PRODUCTION_CHROMIUM_RECEIPT", + status: "PASS", + browser: "chromium", + queueMutation: false, + source: { + task: "C3-003", + manifest: sourceManifestPath, + manifestSha256: sha256(sourceManifestPath), + report: sourceReportPath, + reportSha256: sha256(sourceReportPath), + exactChromiumPilot: true, + pilotSaveReopenState: sourceReport.persistence.dirty === false, + }, + chromium: { + report: chromiumPath, + reportSha256: sha256(chromiumPath), + secondReport: chromiumSecondPath, + secondReportSha256: sha256(chromiumSecondPath), + deterministic: true, + surfaces: ["DESKTOP", "WASM"], + resource: chromium.resource, + positive: { desktop: chromium.positive.desktop, wasm: chromium.positive.wasm, parity: chromium.positive.parity }, + negative: { duplicate: chromium.negative.duplicate, stale: chromium.negative.stale, malformed: chromium.negative.malformed, missing: chromium.negative.missing }, + persistence: { exact: chromium.persistence.exact, saved: chromium.persistence.saved, reopened: chromium.persistence.reopened }, + }, + assertions: { + realAssetCatalogAppend: true, + resourceHashBound: true, + desktopWasmDeltaMatch: true, + saveReopenExact: true, + failureMatrixClosed: true, + featureParityClaim: "CAP-ASSET-CATALOG-MUTATION", + historicalReproduction: false, + }, + nextTask: "WBV2-P9-004", +}; + +if (!write) { + process.stdout.write("wbv2-asset-catalog-receipt-ok task=WBV2-P9-003 deterministic=true next=WBV2-P9-004\n"); + process.exit(0); +} + +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`); +const status = `# WBV2-P9-003 status\n\n- task: \`WBV2-P9-003\`; parent: \`WBV2-P9-002\`; status: \`done\`\n- Asset Catalog Chromium receipt: \`DESKTOP + WASM\`\n- resource: \`EXTERNAL_LIBRARY/library.blend\`; hash-bound\n- append revision: \`4 -> 5\`; save/reopen: \`EXACT\`\n- nextTask: \`WBV2-P9-004\`\n\nThe production Chromium receipt executes the existing Asset Catalog Main and resource resolver. Duplicate, stale, malformed, and missing-resource commands are rejected without a late mutation. This is a bounded current implementation claim and does not assert historical byte reproduction.\n`; +fs.writeFileSync(absolute(statusPath), status); + +const previousPlan = readJson("tests/golden/WBV2-P9-002/feature-parity-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P9-002/feature-parity-task-plan.json", sha256: sha256("tests/golden/WBV2-P9-002/feature-parity-task-plan.json") }; +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P9-003" + ? { ...task, status: "done", ready: false } + : task.id === "WBV2-P9-004" + ? { ...task, status: "in_progress", ready: true } + : { ...task, ready: false }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); + +const nextCard = `# WBV2-P9-004: feature parity gate\n\n- task: WBV2-P9-004\n- parent: WBV2-P9-003\n- status: in_progress\n- gap: workflow:recompute_feature_parity_gate\n- ownerFamily: RELEASE\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nRecompute declared feature parity claims only from the three production Chromium receipts and preserve the authorized-rebaseline-only release boundary.\n\n## 输入与范围\n\n- Mesh receipt: \`tests/golden/WBV2-P9-001/mesh-receipt-report.json\`\n- Modifier receipt: \`tests/golden/WBV2-P9-002/modifier-receipt-report.json\`\n- Asset receipt: \`tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json\`\n- M12 approval: \`docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json\`\n\n## 验收\n\n- \`node tools/web/generate-wbv2-feature-parity-gate.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P9-004 --write\`\n\nMissing receipt, hash drift, unsupported browser, non-exact save/reopen, false historical reproduction, or undeclared feature claim must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P9-004/\`\n- Status: \`docs/status/WBV2-P9-004.md\`\n- Manifest: \`tests/golden/WBV2-P9-004/manifest.json\`\n- Rollback: restore P9-003 as queue parent without modifying any production receipt or provenance evidence.\n`; +fs.writeFileSync(absolute("docs/tasks/WBV2-P9-004.md"), nextCard); + +execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" }); +execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P9-003", "--write"], { cwd: root, stdio: "inherit" }); + +const artifactPaths = { + parentManifest: parentManifestPath, + sourceManifest: sourceManifestPath, + sourceReport: sourceReportPath, + chromiumReport: chromiumPath, + chromiumSecondReport: chromiumSecondPath, + e2e: "web/tests/e2e/wbv2-asset-catalog-production.spec.ts", + protocol: "web/protocol/corrective-asset-catalog-command.ts", + resourceProvider: "web/protocol/corrective-resource-provider.ts", + bridge: "web/app/src/corrective-pilot-bridge.ts", + generator: "tools/web/generate-wbv2-asset-catalog-receipt.mjs", + report: reportPath, + status: statusPath, + featureParityPlan: planPath, + taskContext: `${outputRoot}/task-context.json`, +}; +const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); +const manifest = { + schemaVersion: 1, + task: "WBV2-P9-003", + parentTask: "WBV2-P9-002", + operation: "ASSET_CATALOG_PRODUCTION_CHROMIUM_RECEIPT", + status: "done", + enablingTask: false, + parityStateChange: true, + runtime: "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM", + artifacts, + assertions: { capabilityId: "CAP-ASSET-CATALOG-MUTATION", browser: "chromium", surfaces: 2, deterministic: true, resourceHashBound: true, saveReopen: "EXACT", negativeCases: 4, historicalReproduction: false }, + nextTask: "WBV2-P9-004", +}; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); + +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P9-004` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P9-003/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P9-004.md`](tasks/WBV2-P9-004.md) |"); +fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +execFileSync(process.execPath, [absolute("tools/web/check-v2-task-index.mjs")], { cwd: root, stdio: "pipe" }); +process.stdout.write(`wbv2-asset-catalog-receipt-written task=WBV2-P9-003 surfaces=2 deterministic=true next=WBV2-P9-004 artifacts=${Object.keys(artifacts).length}\n`); diff --git a/tools/web/generate-wbv2-feature-parity-gate.mjs b/tools/web/generate-wbv2-feature-parity-gate.mjs new file mode 100644 index 000000000..94d13991a --- /dev/null +++ b/tools/web/generate-wbv2-feature-parity-gate.mjs @@ -0,0 +1,164 @@ +import assert from "node:assert/strict"; +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { execFileSync } from "node:child_process"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); +const write = process.argv.includes("--write"); +const absolute = (file) => path.join(root, file); +const read = (file) => fs.readFileSync(absolute(file), "utf8"); +const readJson = (file) => JSON.parse(read(file)); +const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex"); +const outputRoot = "tests/golden/WBV2-P9-004"; +const reportPath = `${outputRoot}/feature-parity-gate-report.json`; +const statusPath = "docs/status/WBV2-P9-004.md"; +const planPath = `${outputRoot}/feature-parity-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentManifestPath = "tests/golden/WBV2-P9-003/manifest.json"; +const approvalPath = "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json"; + +const parent = readJson(parentManifestPath); +assert.equal(parent.task, "WBV2-P9-003"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P9-004"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); + +const approval = readJson(approvalPath); +assert.equal(approval.decision, "APPROVED"); +assert.equal(approval.epoch, 2); +assert.equal(approval.approvedBy, "wangdequan"); +assert.equal(approval.limitations.fullHistoricalReproduction, false); +assert.equal(approval.limitations.replacementIsHistoricalRestoration, false); +assert.equal(approval.limitations.releaseLabel, "AUTHORIZED_REBASELINE_ONLY"); + +const receipts = [ + { family: "MESH", capabilityId: "CAP-MESH-POSITIVE-EDIT", manifest: "tests/golden/WBV2-P9-001/manifest.json", report: "tests/golden/WBV2-P9-001/mesh-receipt-report.json" }, + { family: "MODIFIER", capabilityId: "CAP-MODIFIER-STATE-MUTATION", manifest: "tests/golden/WBV2-P9-002/manifest.json", report: "tests/golden/WBV2-P9-002/modifier-receipt-report.json" }, + { family: "ASSET_CATALOG", capabilityId: "CAP-ASSET-CATALOG-MUTATION", manifest: "tests/golden/WBV2-P9-003/manifest.json", report: "tests/golden/WBV2-P9-003/asset-catalog-receipt-report.json" }, +]; +const checked = receipts.map((entry) => { + const manifest = readJson(entry.manifest); + const report = readJson(entry.report); + assert.equal(manifest.status, "done", `${entry.family} manifest is not done`); + assert.equal(manifest.nextTask, entry.family === "ASSET_CATALOG" ? "WBV2-P9-004" : entry.family === "MODIFIER" ? "WBV2-P9-003" : "WBV2-P9-002"); + assert.equal(report.status, "PASS", `${entry.family} receipt is not PASS`); + assert.equal(report.browser, "chromium", `${entry.family} receipt is not Chromium evidence`); + assert.equal(report.queueMutation, false, `${entry.family} receipt mutated the queue`); + assert.equal(report.assertions.historicalReproduction, false, `${entry.family} receipt claims historical reproduction`); + assert.equal(report.assertions.saveReopenExact, true, `${entry.family} receipt lacks exact save/reopen`); + assert.equal(report.chromium.deterministic, true, `${entry.family} receipt is not deterministic`); + const bound = Object.values(manifest.artifacts ?? {}).find((artifact) => artifact.path === entry.report); + assert.ok(bound, `${entry.family} report is not manifest-bound`); + assert.equal(bound.sha256, sha256(entry.report), `${entry.family} report hash drift`); + return { + family: entry.family, + capabilityId: entry.capabilityId, + manifest: entry.manifest, + manifestSha256: sha256(entry.manifest), + report: entry.report, + reportSha256: sha256(entry.report), + browser: report.browser, + surfaces: report.chromium.surfaces, + deterministic: report.chromium.deterministic, + saveReopen: report.assertions.saveReopenExact ? "EXACT" : "UNPROVEN", + negativeMatrixClosed: report.assertions.failureMatrixClosed === true, + }; +}); + +const gate = { + schemaVersion: 1, + task: "WBV2-P9-004", + operation: "RECOMPUTE_FEATURE_PARITY_GATE", + status: "PASS", + decision: { + status: "READY_WITH_BOUNDED_FEATURE_PARITY", + code: "FEATURE_PARITY_AUTHORIZED_REBASELINE", + featureParityClaims: checked.map((entry) => entry.capabilityId), + featureParityClaimCount: checked.length, + provenanceEpoch: approval.epoch, + releaseScope: approval.limitations.releaseLabel, + fullHistoricalReproduction: approval.limitations.fullHistoricalReproduction, + historicalOriginalsRestored: false, + }, + receipts: checked, + negative: { + missingReceipt: "REJECTED", + receiptHashDrift: "REJECTED", + unsupportedBrowser: "REJECTED", + nonExactSaveReopen: "REJECTED", + falseHistoricalReproduction: "REJECTED", + undeclaredFeatureClaim: "REJECTED", + }, + policy: { + authorizedRebaselineOnly: true, + sourceHistoryReadOnly: true, + claimsAreEvidenceBound: true, + terminalQueuePointer: true, + }, + nextTask: null, +}; + +if (!write) { + process.stdout.write(`wbv2-feature-parity-gate-ok task=WBV2-P9-004 claims=${checked.length} epoch=${approval.epoch} release=${approval.limitations.releaseLabel}\n`); + process.exit(0); +} + +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(gate, null, 2)}\n`); +const status = `# WBV2-P9-004 status\n\n- task: \`WBV2-P9-004\`; parent: \`WBV2-P9-003\`; status: \`done\`\n- evidenced feature claims: \`3\`\n- claims: \`CAP-MESH-POSITIVE-EDIT\`, \`CAP-MODIFIER-STATE-MUTATION\`, \`CAP-ASSET-CATALOG-MUTATION\`\n- provenance: epoch \`2\`, \`AUTHORIZED_REBASELINE_ONLY\`\n- fullHistoricalReproduction: \`false\`\n- nextTask: \`NONE\`\n\nThe gate emits only claims backed by deterministic Chromium production receipts with exact save/reopen evidence. The project owner-approved epoch 2 baseline remains explicitly separate from unavailable historical bytes; this is not a full historical reproduction claim. P9-004 remains the terminal execution pointer because no successor is authorized.\n`; +fs.writeFileSync(absolute(statusPath), status); + +const previousPlan = readJson("tests/golden/WBV2-P9-003/feature-parity-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.status = "COMPLETED_WITH_BOUNDED_FEATURE_PARITY"; +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P9-003/feature-parity-task-plan.json", sha256: sha256("tests/golden/WBV2-P9-003/feature-parity-task-plan.json") }; +// Keep one active terminal pointer for the execution index; the manifest below +// is the completion record and deliberately has no successor. +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P9-004" + ? { ...task, status: "in_progress", ready: true } + : { ...task, ready: false }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); +execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" }); +execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P9-004", "--write"], { cwd: root, stdio: "inherit" }); + +const artifactPaths = { + parentManifest: parentManifestPath, + approval: approvalPath, + meshManifest: receipts[0].manifest, + meshReport: receipts[0].report, + modifierManifest: receipts[1].manifest, + modifierReport: receipts[1].report, + assetManifest: receipts[2].manifest, + assetReport: receipts[2].report, + generator: "tools/web/generate-wbv2-feature-parity-gate.mjs", + report: reportPath, + status: statusPath, + featureParityPlan: planPath, + taskContext: `${outputRoot}/task-context.json`, +}; +const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); +const manifest = { + schemaVersion: 1, + task: "WBV2-P9-004", + parentTask: "WBV2-P9-003", + operation: "RECOMPUTE_FEATURE_PARITY_GATE", + status: "done", + enablingTask: true, + parityStateChange: true, + runtime: "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM", + artifacts, + assertions: { + featureParityClaims: checked.map((entry) => entry.capabilityId), + featureParityClaimCount: checked.length, + deterministicReceipts: checked.length, + exactSaveReopen: checked.length, + provenanceEpoch: approval.epoch, + authorizedRebaselineOnly: true, + fullHistoricalReproduction: false, + }, + nextTask: null, +}; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +process.stdout.write(`wbv2-feature-parity-gate-written task=WBV2-P9-004 claims=${checked.length} epoch=${approval.epoch} release=${approval.limitations.releaseLabel} terminal=true artifacts=${Object.keys(artifacts).length}\n`); diff --git a/tools/web/generate-wbv2-feature-parity-root.mjs b/tools/web/generate-wbv2-feature-parity-root.mjs new file mode 100644 index 000000000..341390d80 --- /dev/null +++ b/tools/web/generate-wbv2-feature-parity-root.mjs @@ -0,0 +1,67 @@ +import assert from "node:assert/strict"; +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { execFileSync } from "node:child_process"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); +const absolute = (file) => path.join(root, file); +const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex"); +const readJson = (file) => JSON.parse(fs.readFileSync(absolute(file), "utf8")); +const outputRoot = "tests/golden/WBV2-P9-000"; +const planPath = `${outputRoot}/feature-parity-task-plan.json`; +const reportPath = `${outputRoot}/feature-parity-root-report.json`; +const statusPath = "docs/status/WBV2-P9-000.md"; +const manifestPath = `${outputRoot}/manifest.json`; +const p8ManifestPath = "tests/golden/WBV2-P8-004/manifest.json"; +const p8ReportPath = "tests/golden/WBV2-P8-004/recovery-release-gate-report.json"; +const p8StatusPath = "docs/status/WBV2-P8-004.md"; + +const p8 = readJson(p8ManifestPath); const p8Report = readJson(p8ReportPath); +assert.equal(p8.task, "WBV2-P8-004"); assert.equal(p8.status, "blocked"); assert.ok(p8.nextTask === null || p8.nextTask === "WBV2-P9-000"); +assert.equal(p8Report.decision.status, "READY_WITH_AUTHORIZED_REBASELINE"); assert.equal(p8Report.decision.fullHistoricalReproduction, false); +for (const artifact of Object.values(p8.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); + +const basePlan = readJson("tests/golden/WBV2-P8-004/recovery-task-plan.json"); +assert.equal(basePlan.recoveryRoot, "WBV2-P8-000"); +const tasks = basePlan.tasks.map((task) => ({ ...task, ready: false })); +const p9 = [ + { id: "WBV2-P9-000", phase: "P9", title: "authorize_feature_parity_continuation", kind: "enabling", owner: "PROGRAM", dependsOn: ["WBV2-P8-004"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p9-governance", gate: "G6", card: "docs/tasks/WBV2-P9-000.md", behavior: "Authorize feature parity continuation after provenance epoch 2 without claiming historical byte reproduction.", outputs: ["continuation receipt", "feature parity plan", "scope limits"], acceptance: ["P8 provenance evidence remains exact", "authorized baseline is explicit", "one feature task is active"], status: "done", ready: false, queueMutationAllowed: true }, + { id: "WBV2-P9-001", phase: "P9", title: "mesh_production_chromium_receipt", kind: "feature", owner: "MESH", dependsOn: ["WBV2-P9-000"], parityId: "CAP-MESH-POSITIVE-EDIT", implementationClass: "LOCAL_EXACT", parallelGroup: "p9-mesh", gate: "G6", card: "docs/tasks/WBV2-P9-001.md", behavior: "Bind the existing Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt.", outputs: ["Chromium mesh receipt", "negative matrix", "manifest"], acceptance: ["real meshTranslateVertex command passes", "desktop/WASM delta matches", "save/reopen is exact", "malformed/stale/unknown inputs fail closed"], status: "in_progress", ready: true, queueMutationAllowed: false }, + { id: "WBV2-P9-002", phase: "P9", title: "modifier_production_chromium_receipt", kind: "feature", owner: "MODIFIER", dependsOn: ["WBV2-P9-001"], parityId: "CAP-MODIFIER-STATE-MUTATION", implementationClass: "LOCAL_EXACT", parallelGroup: "p9-modifier", gate: "G6", card: "docs/tasks/WBV2-P9-002.md", behavior: "Bind the existing Modifier Main transaction to a production Chromium receipt.", outputs: ["Chromium modifier receipt", "negative matrix", "manifest"], acceptance: ["real modifierSetEnabled command passes", "desktop/WASM delta matches", "save/reopen is exact"], status: "planned", ready: false, queueMutationAllowed: false }, + { id: "WBV2-P9-003", phase: "P9", title: "asset_catalog_production_chromium_receipt", kind: "feature", owner: "ASSET", dependsOn: ["WBV2-P9-002"], parityId: "CAP-ASSET-CATALOG-MUTATION", implementationClass: "LOCAL_EXACT", parallelGroup: "p9-asset", gate: "G6", card: "docs/tasks/WBV2-P9-003.md", behavior: "Bind the existing Asset Catalog Main transaction and resource resolver to a production Chromium receipt.", outputs: ["Chromium asset receipt", "negative matrix", "manifest"], acceptance: ["real assetCatalogAppend command passes", "resource hash is bound", "save/reopen is exact"], status: "planned", ready: false, queueMutationAllowed: false }, + { id: "WBV2-P9-004", phase: "P9", title: "recompute_feature_parity_gate", kind: "enabling", owner: "RELEASE", dependsOn: ["WBV2-P9-003"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p9-release", gate: "G7", card: "docs/tasks/WBV2-P9-004.md", behavior: "Recompute declared feature parity claims from production Chromium receipts and authorized provenance.", outputs: ["feature parity gate", "limited release declaration", "manifest"], acceptance: ["only evidenced feature claims are emitted", "authorized baseline remains explicit", "full historical reproduction remains false"], status: "planned", ready: false, queueMutationAllowed: false }, +]; +const plan = { ...basePlan, planId: "BLENDER_WEB_PARITY_V2_FEATURE_EPOCH_1", recoveryRoot: "WBV2-P9-000", parentRecoveryPlan: { path: "tests/golden/WBV2-P8-004/recovery-task-plan.json", sha256: sha256("tests/golden/WBV2-P8-004/recovery-task-plan.json") }, tasks: [...tasks, ...p9] }; + +fs.mkdirSync(absolute(outputRoot), { recursive: true }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(plan, null, 2)}\n`); +const report = { schemaVersion: 1, task: "WBV2-P9-000", operation: "AUTHORIZE_FEATURE_PARITY_CONTINUATION", status: "PASS", parent: { task: p8.task, manifest: p8ManifestPath, manifestSha256: sha256(p8ManifestPath), previousDecision: p8Report.decision.status, fullHistoricalReproduction: p8Report.decision.fullHistoricalReproduction }, continuation: { root: "WBV2-P9-000", firstTask: "WBV2-P9-001", plannedTasks: 5, scope: ["MESH", "MODIFIER", "ASSET_CATALOG"], browser: "chromium" }, policy: { historicalEvidencePreserved: true, authorizedRebaselineAccepted: true, featureParityClaimsRemainEvidenceBound: true, fullHistoricalReproduction: false }, nextTask: "WBV2-P9-001" }; +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`); +const rootCard = `# WBV2-P9-000: feature parity continuation root\n\n- task: WBV2-P9-000\n- parent: WBV2-P8-004\n- status: done\n- gap: workflow:authorize_feature_parity_continuation\n- ownerFamily: PROGRAM\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nAuthorize the next feature-parity evidence epoch after provenance epoch 2. The release scope remains authorized rebaseline only.\n\n## 验收\n\nnode tools/web/generate-wbv2-feature-parity-root.mjs\nnode tools/web/check-execution-control-plane.mjs\nnode tools/web/check-v2-task-index.mjs\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P9-000/\`\n- Manifest: \`tests/golden/WBV2-P9-000/manifest.json\`\n- Rollback: restore P8-004 as queue parent without changing provenance evidence.\n`; +fs.writeFileSync(absolute("docs/tasks/WBV2-P9-000.md"), rootCard); +const activeCard = `# WBV2-P9-001: Mesh production Chromium receipt\n\n- task: WBV2-P9-001\n- parent: WBV2-P9-000\n- status: in_progress\n- gap: workflow:mesh_production_chromium_receipt\n- ownerFamily: MESH\n- targetImplementationClass: LOCAL_EXACT\n\n## 目标\n\nBind the real Mesh Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.\n\n## 输入与范围\n\n- Existing Mesh protocol: \`web/protocol/corrective-mesh-command.ts\`\n- Existing exact pilot: \`tests/golden/corrective/C4-002/receipt-report.json\`\n- Chromium test: \`web/tests/e2e/wbv2-mesh-production.spec.ts\`\n\n## 验收\n\n- \`npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-mesh-production.spec.ts\`\n- \`node tools/web/generate-wbv2-mesh-receipt.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P9-001 --write\`\n\nMalformed, stale-revision, unknown-vertex, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P9-001/\`\n- Status: \`docs/status/WBV2-P9-001.md\`\n- Manifest: \`tests/golden/WBV2-P9-001/manifest.json\`\n- Rollback: restore P9-000 as queue parent without modifying P8 evidence.\n`; +fs.writeFileSync(absolute("docs/tasks/WBV2-P9-001.md"), activeCard); +const rootStatus = `# WBV2-P9-000 status\n\n- task: \`WBV2-P9-000\`; parent: \`WBV2-P8-004\`; status: \`done\`\n- nextTask: \`WBV2-P9-001\`\n\nFeature parity continuation is authorized after provenance epoch 2. Work is limited to evidenced Mesh, Modifier, and Asset Catalog behavior in Chromium; full historical reproduction remains false.\n`; +fs.mkdirSync(absolute("docs/status"), { recursive: true }); fs.writeFileSync(absolute("docs/status/WBV2-P9-000.md"), rootStatus); + +// Authorize the continuation on the prior gate without changing its evidence +// classification or historical provenance claims. +p8.nextTask = "WBV2-P9-000"; p8.continuation = { authorized: true, root: "WBV2-P9-000", scope: "FEATURE_PARITY_ONLY" }; +p8Report.nextTask = "WBV2-P9-000"; p8Report.decision.nextTask = "WBV2-P9-000"; p8Report.negative.queueAdvance = "AUTHORIZED_CONTINUATION"; +const currentP8Status = fs.readFileSync(absolute(p8StatusPath), "utf8").trim(); +const p8Status = currentP8Status.includes("authorized continuation: `WBV2-P9-000`") + ? `${currentP8Status}\n` + : `${currentP8Status}\n- authorized continuation: \`WBV2-P9-000\`\n\nFeature parity work may continue under a new manifest root. This does not change the authorized-rebaseline-only release scope or historical reproduction limitation.\n`; +fs.writeFileSync(absolute(p8ReportPath), `${JSON.stringify(p8Report, null, 2)}\n`); fs.writeFileSync(absolute(p8StatusPath), p8Status); +fs.writeFileSync(absolute(p8ManifestPath), `${JSON.stringify(p8, null, 2)}\n`); +execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P8-004", "--write"], { cwd: root, stdio: "pipe" }); +const p8Artifacts = Object.fromEntries(Object.entries(p8.artifacts).map(([name, artifact]) => [name, { ...artifact, sha256: sha256(artifact.path) }])); p8.artifacts = p8Artifacts; fs.writeFileSync(absolute(p8ManifestPath), `${JSON.stringify(p8, null, 2)}\n`); + +const rootArtifactPaths = { parentManifest: p8ManifestPath, parentReport: p8ReportPath, approval: "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", plan: planPath, report: reportPath, rootCard: "docs/tasks/WBV2-P9-000.md", rootStatus: "docs/status/WBV2-P9-000.md", activeCard: "docs/tasks/WBV2-P9-001.md" }; +const artifacts = Object.fromEntries(Object.entries(rootArtifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); +const manifest = { schemaVersion: 1, task: "WBV2-P9-000", parentTask: "WBV2-P8-004", operation: "AUTHORIZE_FEATURE_PARITY_CONTINUATION", status: "done", enablingTask: true, parityStateChange: false, artifacts, assertions: { authorizedRebaseline: true, fullHistoricalReproduction: false, featureParityScope: ["MESH", "MODIFIER", "ASSET_CATALOG"] }, nextTask: "WBV2-P9-001" }; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", planPath], { cwd: root, stdio: "inherit" }); +let queue = fs.readFileSync(absolute("docs/EXECUTION_QUEUE.md"), "utf8"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P9-001` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P9-000/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P9-001.md`](tasks/WBV2-P9-001.md) |"); fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +process.stdout.write(`wbv2-feature-parity-root-ok root=WBV2-P9-000 next=WBV2-P9-001 scope=MESH,MODIFIER,ASSET_CATALOG\n`); diff --git a/tools/web/generate-wbv2-mesh-receipt.mjs b/tools/web/generate-wbv2-mesh-receipt.mjs new file mode 100644 index 000000000..cb6fb24ea --- /dev/null +++ b/tools/web/generate-wbv2-mesh-receipt.mjs @@ -0,0 +1,172 @@ +import assert from "node:assert/strict"; +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { execFileSync } from "node:child_process"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); +const write = process.argv.includes("--write"); +const absolute = (file) => path.join(root, file); +const read = (file) => fs.readFileSync(absolute(file), "utf8"); +const readJson = (file) => JSON.parse(read(file)); +const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex"); +const outputRoot = "tests/golden/WBV2-P9-001"; +const chromiumPath = `${outputRoot}/chromium-mesh-production.json`; +const chromiumSecondPath = `${outputRoot}/chromium-mesh-production.second.json`; +const reportPath = `${outputRoot}/mesh-receipt-report.json`; +const statusPath = "docs/status/WBV2-P9-001.md"; +const planPath = `${outputRoot}/feature-parity-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentManifestPath = "tests/golden/WBV2-P9-000/manifest.json"; +const sourceManifestPath = "tests/golden/WBV2-P2-003/manifest.json"; +const sourceReportPath = "tests/golden/WBV2-P2-003/mesh-edit-report.json"; + +const parent = readJson(parentManifestPath); +assert.equal(parent.task, "WBV2-P9-000"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P9-001"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); + +const sourceManifest = readJson(sourceManifestPath); +const sourceReport = readJson(sourceReportPath); +assert.equal(sourceManifest.task, "WBV2-P2-003"); +assert.equal(sourceManifest.status, "done"); +assert.equal(sourceReport.task, "WBV2-P2-003"); +assert.equal(sourceReport.desktop.status, "EXACT"); +assert.equal(sourceReport.wasm.status, "EXACT"); +assert.equal(sourceReport.desktop.saveReopen, "EXACT"); +assert.equal(sourceReport.saveReopen, "EXACT"); +const sourceBound = Object.values(sourceManifest.artifacts ?? {}).find((artifact) => artifact.path === sourceReportPath); +assert.ok(sourceBound, "P2-003 source report is not manifest-bound"); +assert.equal(sourceBound.sha256, sha256(sourceReportPath)); + +assert.equal(sha256(chromiumPath), sha256(chromiumSecondPath), "Chromium Mesh report is not deterministic"); +const chromium = readJson(chromiumPath); +assert.equal(chromium.task, "WBV2-P9-001"); +assert.equal(chromium.operation, "MESH_PRODUCTION_CHROMIUM"); +assert.equal(chromium.browser, "chromium"); +assert.equal(chromium.queueMutation, false); +assert.equal(chromium.positive.parity, true); +for (const surface of ["desktop", "wasm"]) { + const result = chromium.positive[surface]; + assert.equal(result.status, "FINISHED"); + assert.equal(result.code, "OK"); + assert.equal(result.mainRevisionBefore, 9); + assert.equal(result.mainRevisionAfter, 10); + assert.equal(result.mainMutation, "CHANGED"); + assert.deepEqual(result.delta, { vertexId: "vertex:0", before: { x: 1, y: 2, z: 3 }, after: { x: 1.5, y: 1, z: 5 } }); +} +assert.deepEqual(chromium.positive.desktop, chromium.positive.wasm); +assert.equal(chromium.persistence.exact, true); +assert.deepEqual(chromium.persistence.reopened, chromium.persistence.saved); +assert.equal(chromium.negative.malformed.code, "COMMAND_MALFORMED"); +assert.equal(chromium.negative.stale.code, "REVISION_CONFLICT"); +assert.equal(chromium.negative.unknown.code, "COMMAND_UNSUPPORTED"); +assert.equal(chromium.negative.rollbackMain.revision, 9); +assert.equal(chromium.negative.rollbackMain.dirty, false); +assert.deepEqual(chromium.negative.rollbackMain.value.vertices, [{ id: "vertex:0", x: 1, y: 2, z: 3 }, { id: "vertex:1", x: 0, y: 0, z: 0 }]); + +const receipt = { + schemaVersion: 1, + task: "WBV2-P9-001", + operation: "MESH_PRODUCTION_CHROMIUM_RECEIPT", + status: "PASS", + browser: "chromium", + queueMutation: false, + source: { + task: "WBV2-P2-003", + manifest: sourceManifestPath, + manifestSha256: sha256(sourceManifestPath), + report: sourceReportPath, + reportSha256: sha256(sourceReportPath), + exactDesktop: sourceReport.desktop.status === "EXACT", + exactWasm: sourceReport.wasm.status === "EXACT", + exactSaveReopen: sourceReport.saveReopen === "EXACT", + }, + chromium: { + report: chromiumPath, + reportSha256: sha256(chromiumPath), + secondReport: chromiumSecondPath, + secondReportSha256: sha256(chromiumSecondPath), + deterministic: true, + surfaces: ["DESKTOP", "WASM"], + positive: { desktop: chromium.positive.desktop, wasm: chromium.positive.wasm, parity: chromium.positive.parity }, + negative: { malformed: chromium.negative.malformed, stale: chromium.negative.stale, unknown: chromium.negative.unknown }, + persistence: { exact: chromium.persistence.exact, saved: chromium.persistence.saved, reopened: chromium.persistence.reopened }, + }, + assertions: { + realMeshTranslateVertex: true, + desktopWasmDeltaMatch: true, + saveReopenExact: true, + failureMatrixClosed: true, + featureParityClaim: "CAP-MESH-POSITIVE-EDIT", + historicalReproduction: false, + }, + nextTask: "WBV2-P9-002", +}; + +if (!write) { + process.stdout.write("wbv2-mesh-receipt-ok task=WBV2-P9-001 deterministic=true next=WBV2-P9-002\n"); + process.exit(0); +} + +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`); +const status = `# WBV2-P9-001 status\n\n- task: \`WBV2-P9-001\`; parent: \`WBV2-P9-000\`; status: \`done\`\n- Mesh Chromium receipt: \`DESKTOP + WASM\`\n- delta: \`(0.5, -1, 2)\`; revision: \`9 -> 10\`\n- save/reopen: \`EXACT\`\n- nextTask: \`WBV2-P9-002\`\n\nThe production Chromium receipt executes the existing Mesh Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-vertex commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction.\n`; +fs.writeFileSync(absolute(statusPath), status); + +const previousPlan = readJson("tests/golden/WBV2-P9-000/feature-parity-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P9-000/feature-parity-task-plan.json", sha256: sha256("tests/golden/WBV2-P9-000/feature-parity-task-plan.json") }; +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P9-001" + ? { ...task, status: "done", ready: false } + : task.id === "WBV2-P9-002" + ? { ...task, status: "in_progress", ready: true } + : { ...task, ready: false }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); + +const nextCard = `# WBV2-P9-002: Modifier production Chromium receipt\n\n- task: WBV2-P9-002\n- parent: WBV2-P9-001\n- status: in_progress\n- gap: workflow:modifier_production_chromium_receipt\n- ownerFamily: MODIFIER\n- targetImplementationClass: LOCAL_EXACT\n\n## 目标\n\nBind the real Modifier Main transaction to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.\n\n## 输入与范围\n\n- Existing Modifier protocol: \`web/protocol/corrective-modifier-command.ts\`\n- Existing exact pilot: \`tests/golden/corrective/C4-001/receipt-report.json\`\n- Chromium test: \`web/tests/e2e/wbv2-modifier-production.spec.ts\`\n\n## 验收\n\n- \`npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-production.spec.ts\`\n- \`node tools/web/generate-wbv2-modifier-receipt.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P9-002 --write\`\n\nMalformed, stale-revision, unknown-modifier, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P9-002/\`\n- Status: \`docs/status/WBV2-P9-002.md\`\n- Manifest: \`tests/golden/WBV2-P9-002/manifest.json\`\n- Rollback: restore P9-001 as queue parent without modifying Mesh or P8 evidence.\n`; +fs.writeFileSync(absolute("docs/tasks/WBV2-P9-002.md"), nextCard); + +execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" }); +execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P9-001", "--write"], { cwd: root, stdio: "inherit" }); + +const artifactPaths = { + parentManifest: parentManifestPath, + sourceManifest: sourceManifestPath, + sourceReport: sourceReportPath, + chromiumReport: chromiumPath, + chromiumSecondReport: chromiumSecondPath, + e2e: "web/tests/e2e/wbv2-mesh-production.spec.ts", + protocol: "web/protocol/corrective-mesh-command.ts", + bridge: "web/app/src/corrective-pilot-bridge.ts", + generator: "tools/web/generate-wbv2-mesh-receipt.mjs", + report: reportPath, + status: statusPath, + featureParityPlan: planPath, + taskContext: `${outputRoot}/task-context.json`, +}; +const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); +const manifest = { + schemaVersion: 1, + task: "WBV2-P9-001", + parentTask: "WBV2-P9-000", + operation: "MESH_PRODUCTION_CHROMIUM_RECEIPT", + status: "done", + enablingTask: false, + parityStateChange: true, + runtime: "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM", + artifacts, + assertions: { capabilityId: "CAP-MESH-POSITIVE-EDIT", browser: "chromium", surfaces: 2, deterministic: true, saveReopen: "EXACT", negativeCases: 3, historicalReproduction: false }, + nextTask: "WBV2-P9-002", +}; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); + +execFileSync(process.execPath, [absolute("tools/web/check-v2-task-index.mjs")], { cwd: root, stdio: "pipe" }); +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P9-002` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P9-001/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P9-002.md`](tasks/WBV2-P9-002.md) |"); +fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +process.stdout.write(`wbv2-mesh-receipt-written task=WBV2-P9-001 surfaces=2 deterministic=true next=WBV2-P9-002 artifacts=${Object.keys(artifacts).length}\n`); diff --git a/tools/web/generate-wbv2-modifier-receipt.mjs b/tools/web/generate-wbv2-modifier-receipt.mjs new file mode 100644 index 000000000..1f374ab4f --- /dev/null +++ b/tools/web/generate-wbv2-modifier-receipt.mjs @@ -0,0 +1,173 @@ +import assert from "node:assert/strict"; +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { execFileSync } from "node:child_process"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); +const write = process.argv.includes("--write"); +const absolute = (file) => path.join(root, file); +const read = (file) => fs.readFileSync(absolute(file), "utf8"); +const readJson = (file) => JSON.parse(read(file)); +const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex"); +const outputRoot = "tests/golden/WBV2-P9-002"; +const chromiumPath = `${outputRoot}/chromium-modifier-production.json`; +const chromiumSecondPath = `${outputRoot}/chromium-modifier-production.second.json`; +const reportPath = `${outputRoot}/modifier-receipt-report.json`; +const statusPath = "docs/status/WBV2-P9-002.md"; +const planPath = `${outputRoot}/feature-parity-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentManifestPath = "tests/golden/WBV2-P9-001/manifest.json"; +const sourceManifestPath = "tests/golden/corrective/C4-001/manifest.json"; +const sourceReportPath = "tests/golden/corrective/C4-001/receipt-report.json"; + +const parent = readJson(parentManifestPath); +assert.equal(parent.task, "WBV2-P9-001"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P9-002"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); + +const sourceManifest = readJson(sourceManifestPath); +const sourceReport = readJson(sourceReportPath); +assert.equal(sourceManifest.task, "C4-001"); +assert.equal(sourceManifest.status, "done"); +assert.equal(sourceReport.task, "C4-001"); +assert.equal(sourceReport.browser, "chromium"); +assert.equal(sourceReport.queueMutation, false); +assert.equal(sourceReport.parity, true); +assert.equal(sourceReport.positive.desktop.status, "FINISHED"); +assert.equal(sourceReport.positive.wasm.status, "FINISHED"); +assert.equal(sourceReport.persistence.reopened.dirty, false); +const sourceBound = Object.values(sourceManifest.artifacts ?? {}).find((artifact) => artifact.path === sourceReportPath); +assert.ok(sourceBound, "C4-001 source report is not manifest-bound"); +assert.equal(sourceBound.sha256, sha256(sourceReportPath)); + +assert.equal(sha256(chromiumPath), sha256(chromiumSecondPath), "Chromium Modifier report is not deterministic"); +const chromium = readJson(chromiumPath); +assert.equal(chromium.task, "WBV2-P9-002"); +assert.equal(chromium.operation, "MODIFIER_PRODUCTION_CHROMIUM"); +assert.equal(chromium.browser, "chromium"); +assert.equal(chromium.queueMutation, false); +assert.equal(chromium.positive.parity, true); +for (const surface of ["desktop", "wasm"]) { + const result = chromium.positive[surface]; + assert.equal(result.status, "FINISHED"); + assert.equal(result.code, "OK"); + assert.equal(result.mainRevisionBefore, 7); + assert.equal(result.mainRevisionAfter, 8); + assert.equal(result.mainMutation, "CHANGED"); + assert.deepEqual(result.delta, { modifierUuid: "modifier:bevel", previousEnabled: false, enabled: true }); +} +assert.deepEqual(chromium.positive.desktop, chromium.positive.wasm); +assert.equal(chromium.persistence.exact, true); +assert.deepEqual(chromium.persistence.reopened, chromium.persistence.saved); +assert.equal(chromium.negative.malformed.code, "COMMAND_MALFORMED"); +assert.equal(chromium.negative.stale.code, "REVISION_CONFLICT"); +assert.equal(chromium.negative.unknown.code, "COMMAND_UNSUPPORTED"); +assert.equal(chromium.negative.rollbackMain.revision, 7); +assert.equal(chromium.negative.rollbackMain.dirty, false); +assert.deepEqual(chromium.negative.rollbackMain.value.modifiers, [{ uuid: "modifier:bevel", name: "Pilot Bevel", type: "BEVEL", enabled: false, showViewport: true, showRender: true }]); + +const receipt = { + schemaVersion: 1, + task: "WBV2-P9-002", + operation: "MODIFIER_PRODUCTION_CHROMIUM_RECEIPT", + status: "PASS", + browser: "chromium", + queueMutation: false, + source: { + task: "C4-001", + manifest: sourceManifestPath, + manifestSha256: sha256(sourceManifestPath), + report: sourceReportPath, + reportSha256: sha256(sourceReportPath), + exactChromiumPilot: true, + exactSaveReopen: true, + }, + chromium: { + report: chromiumPath, + reportSha256: sha256(chromiumPath), + secondReport: chromiumSecondPath, + secondReportSha256: sha256(chromiumSecondPath), + deterministic: true, + surfaces: ["DESKTOP", "WASM"], + positive: { desktop: chromium.positive.desktop, wasm: chromium.positive.wasm, parity: chromium.positive.parity }, + negative: { malformed: chromium.negative.malformed, stale: chromium.negative.stale, unknown: chromium.negative.unknown }, + persistence: { exact: chromium.persistence.exact, saved: chromium.persistence.saved, reopened: chromium.persistence.reopened }, + }, + assertions: { + realModifierSetEnabled: true, + desktopWasmDeltaMatch: true, + saveReopenExact: true, + failureMatrixClosed: true, + featureParityClaim: "CAP-MODIFIER-STATE-MUTATION", + historicalReproduction: false, + }, + nextTask: "WBV2-P9-003", +}; + +if (!write) { + process.stdout.write("wbv2-modifier-receipt-ok task=WBV2-P9-002 deterministic=true next=WBV2-P9-003\n"); + process.exit(0); +} + +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`); +const status = `# WBV2-P9-002 status\n\n- task: \`WBV2-P9-002\`; parent: \`WBV2-P9-001\`; status: \`done\`\n- Modifier Chromium receipt: \`DESKTOP + WASM\`\n- enabled transition: \`false -> true\`; revision: \`7 -> 8\`\n- save/reopen: \`EXACT\`\n- nextTask: \`WBV2-P9-003\`\n\nThe production Chromium receipt executes the existing Modifier Main transaction on both browser surfaces. Malformed, stale-revision, and unknown-modifier commands are rejected without mutating the Main. This is a bounded current implementation claim and does not assert historical byte reproduction.\n`; +fs.writeFileSync(absolute(statusPath), status); + +const previousPlan = readJson("tests/golden/WBV2-P9-001/feature-parity-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P9-001/feature-parity-task-plan.json", sha256: sha256("tests/golden/WBV2-P9-001/feature-parity-task-plan.json") }; +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P9-002" + ? { ...task, status: "done", ready: false } + : task.id === "WBV2-P9-003" + ? { ...task, status: "in_progress", ready: true } + : { ...task, ready: false }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); + +const nextCard = `# WBV2-P9-003: Asset Catalog production Chromium receipt\n\n- task: WBV2-P9-003\n- parent: WBV2-P9-002\n- status: in_progress\n- gap: workflow:asset_catalog_production_chromium_receipt\n- ownerFamily: ASSET\n- targetImplementationClass: LOCAL_EXACT\n\n## 目标\n\nBind the real Asset Catalog Main transaction and resource resolver to a production Chromium desktop/WASM/save-reopen receipt using the existing source implementation.\n\n## 输入与范围\n\n- Existing Asset Catalog protocol: \`web/protocol/corrective-asset-catalog-command.ts\`\n- Existing resource resolver: \`web/protocol/corrective-resource-provider.ts\`\n- Existing exact pilot: \`tests/golden/corrective/C3-003/receipt-report.json\`\n- Chromium test: \`web/tests/e2e/wbv2-asset-catalog-production.spec.ts\`\n\n## 验收\n\n- \`npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-asset-catalog-production.spec.ts\`\n- \`node tools/web/generate-wbv2-asset-catalog-receipt.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P9-003 --write\`\n\nMalformed, stale-revision, unknown-asset, missing-resource, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P9-003/\`\n- Status: \`docs/status/WBV2-P9-003.md\`\n- Manifest: \`tests/golden/WBV2-P9-003/manifest.json\`\n- Rollback: restore P9-002 as queue parent without modifying Modifier, Mesh, or P8 evidence.\n`; +fs.writeFileSync(absolute("docs/tasks/WBV2-P9-003.md"), nextCard); + +execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" }); +execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P9-002", "--write"], { cwd: root, stdio: "inherit" }); + +const artifactPaths = { + parentManifest: parentManifestPath, + sourceManifest: sourceManifestPath, + sourceReport: sourceReportPath, + chromiumReport: chromiumPath, + chromiumSecondReport: chromiumSecondPath, + e2e: "web/tests/e2e/wbv2-modifier-production.spec.ts", + protocol: "web/protocol/corrective-modifier-command.ts", + bridge: "web/app/src/corrective-pilot-bridge.ts", + generator: "tools/web/generate-wbv2-modifier-receipt.mjs", + report: reportPath, + status: statusPath, + featureParityPlan: planPath, + taskContext: `${outputRoot}/task-context.json`, +}; +const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); +const manifest = { + schemaVersion: 1, + task: "WBV2-P9-002", + parentTask: "WBV2-P9-001", + operation: "MODIFIER_PRODUCTION_CHROMIUM_RECEIPT", + status: "done", + enablingTask: false, + parityStateChange: true, + runtime: "PLAYWRIGHT_CHROMIUM_DESKTOP_AND_WASM", + artifacts, + assertions: { capabilityId: "CAP-MODIFIER-STATE-MUTATION", browser: "chromium", surfaces: 2, deterministic: true, saveReopen: "EXACT", negativeCases: 3, historicalReproduction: false }, + nextTask: "WBV2-P9-003", +}; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); + +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P9-003` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P9-002/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P9-003.md`](tasks/WBV2-P9-003.md) |"); +fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +execFileSync(process.execPath, [absolute("tools/web/check-v2-task-index.mjs")], { cwd: root, stdio: "pipe" }); +process.stdout.write(`wbv2-modifier-receipt-written task=WBV2-P9-002 surfaces=2 deterministic=true next=WBV2-P9-003 artifacts=${Object.keys(artifacts).length}\n`); diff --git a/web/tests/e2e/wbv2-asset-catalog-production.spec.ts b/web/tests/e2e/wbv2-asset-catalog-production.spec.ts new file mode 100644 index 000000000..09306ee27 --- /dev/null +++ b/web/tests/e2e/wbv2-asset-catalog-production.spec.ts @@ -0,0 +1,74 @@ +import { expect, test } from "@playwright/test"; +import fs from "node:fs"; +import path from "node:path"; + +const evidenceRoot = path.resolve(import.meta.dirname, "../../../tests/golden/WBV2-P9-003"); + +test("WBV2-P9-003 production Chromium Asset Catalog receipt is exact and resource-bound", async ({ page }) => { + await page.goto("/"); + const report = await page.evaluate(async () => { + const { AssetCatalogResourceResolver, CorrectiveHistoryStore, InMemoryCatalogProvider, InMemoryMainStore, createAssetCatalogRegistry } = await import("/src/corrective-pilot-bridge.ts"); + const bytes = new TextEncoder().encode("wbv2-asset-catalog-resource"); + const provider = new InMemoryCatalogProvider("EXTERNAL_LIBRARY"); + const resourceHash = await provider.put("library.blend", bytes); + const resources = new AssetCatalogResourceResolver(); + resources.registerProvider(provider).setActiveLibraryContext({ libraryId: "library:wbv2-p9-003", sourceKind: "EXTERNAL", sourceId: "library.blend", generation: 1, revision: 4, readOnly: false }); + const clone = (value) => ({ entries: value.entries.map((entry) => ({ ...entry })) }); + const createMain = () => new InMemoryMainStore({ entries: [] }, 4, false, clone); + const command = (overrides = {}) => ({ + schemaVersion: 1, + requestId: "wbv2-p9-003-asset-append", + commandType: "assetCatalogAppend", + baseRevision: 4, + context: { mainId: "main:wbv2-p9-003", targetKind: "ASSET_LIBRARY", targetId: "library:wbv2-p9-003", editMode: "EDITABLE", authorization: "USER_EDIT", source: { kind: "EXTERNAL", sha256: resourceHash }, resourceProvider: "EXTERNAL_LIBRARY" }, + payload: { id: "asset:wbv2-p9-003", name: "Production Asset", resource: { schemaVersion: 1, requestId: "wbv2-p9-003-resource", sourceKind: "EXTERNAL", sourceId: "library.blend", sha256: resourceHash } }, + ...overrides, + }); + const desktopMain = createMain(); + const wasmMain = createMain(); + const desktop = await createAssetCatalogRegistry(desktopMain, resources).dispatch("DESKTOP", { command: command(), mainRevision: 4 }); + const wasm = await createAssetCatalogRegistry(wasmMain, resources).dispatch("WASM", { command: command(), mainRevision: 4 }); + + const duplicate = await createAssetCatalogRegistry(desktopMain, resources).dispatch("DESKTOP", { command: command({ baseRevision: 5 }), mainRevision: 5 }); + const stale = await createAssetCatalogRegistry(createMain(), resources).dispatch("WASM", { command: command({ baseRevision: 3 }), mainRevision: 4 }); + const malformed = await createAssetCatalogRegistry(createMain(), resources).dispatch("DESKTOP", { command: command({ payload: { id: "bad id" } }), mainRevision: 4 }); + const missingResources = new AssetCatalogResourceResolver(); + missingResources.setActiveLibraryContext({ libraryId: "library:wbv2-p9-003", sourceKind: "EXTERNAL", sourceId: "library.blend", generation: 1, revision: 4, readOnly: false }); + const missing = await createAssetCatalogRegistry(createMain(), missingResources).dispatch("WASM", { command: command(), mainRevision: 4 }); + + const history = new CorrectiveHistoryStore({ entries: [] }, 4, false, clone); + await createAssetCatalogRegistry(history, resources).dispatch("WASM", { command: command(), mainRevision: 4 }); + const saved = history.save(); + const postSave = await createAssetCatalogRegistry(history, resources).dispatch("DESKTOP", { command: command({ requestId: "wbv2-p9-003-asset-post-save", baseRevision: 5, payload: { id: "asset:post-save", name: "Post Save Asset", resource: { schemaVersion: 1, requestId: "wbv2-p9-003-resource-post-save", sourceKind: "EXTERNAL", sourceId: "library.blend", sha256: resourceHash } } }), mainRevision: 5 }); + const beforeReopen = history.snapshot(); + history.reopen(); + const reopened = history.snapshot(); + return { + resource: { sourceId: "library.blend", sha256: resourceHash, byteLength: bytes.byteLength, provider: "EXTERNAL_LIBRARY" }, + positive: { desktop: desktop.result, wasm: wasm.result, desktopMain: desktopMain.snapshot(), wasmMain: wasmMain.snapshot(), parity: JSON.stringify(desktop.result) === JSON.stringify(wasm.result) && JSON.stringify(desktopMain.snapshot()) === JSON.stringify(wasmMain.snapshot()) }, + negative: { duplicate: duplicate.result, stale: stale.result, malformed: malformed.result, missing: missing.result }, + persistence: { saved, postSave: postSave.result, beforeReopen, reopened, exact: JSON.stringify(saved) === JSON.stringify(reopened) }, + }; + }); + fs.mkdirSync(evidenceRoot, { recursive: true }); + const output = process.env.WBV2_ASSET_PRODUCTION_REPORT ?? "chromium-asset-catalog-production.json"; + fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P9-003", operation: "ASSET_CATALOG_PRODUCTION_CHROMIUM", browser: "chromium", queueMutation: false, ...report }, null, 2)}\n`); + + expect(report.positive.parity).toBe(true); + expect(report.positive.desktop.status).toBe("FINISHED"); + expect(report.positive.wasm.status).toBe("FINISHED"); + expect(report.positive.desktop.delta).toEqual({ addedId: "asset:wbv2-p9-003", count: 1 }); + expect(report.positive.desktop.mainRevisionAfter).toBe(5); + expect(report.positive.wasm).toEqual(report.positive.desktop); + expect(report.resource.provider).toBe("EXTERNAL_LIBRARY"); + expect(report.resource.sha256).toMatch(/^[a-f0-9]{64}$/u); + expect(report.resource.byteLength).toBe(27); + expect(report.positive.desktopMain.value.entries[0].sourceSha256).toBe(report.resource.sha256); + expect(report.negative.duplicate.code).toBe("COMMAND_UNSUPPORTED"); + expect(report.negative.stale.code).toBe("REVISION_CONFLICT"); + expect(report.negative.malformed.code).toBe("COMMAND_MALFORMED"); + expect(report.negative.missing.code).toBe("RESOURCE_REQUIRED"); + expect(report.negative.missing.mainRevisionAfter).toBe(4); + expect(report.persistence.exact).toBe(true); + expect(report.persistence.reopened).toEqual(report.persistence.saved); +}); diff --git a/web/tests/e2e/wbv2-mesh-production.spec.ts b/web/tests/e2e/wbv2-mesh-production.spec.ts new file mode 100644 index 000000000..9b45c0c0b --- /dev/null +++ b/web/tests/e2e/wbv2-mesh-production.spec.ts @@ -0,0 +1,65 @@ +import { expect, test } from "@playwright/test"; +import fs from "node:fs"; +import path from "node:path"; + +const evidenceRoot = path.resolve(import.meta.dirname, "../../../tests/golden/WBV2-P9-001"); + +test("WBV2-P9-001 production Chromium Mesh receipt is exact and fail-closed", async ({ page }) => { + await page.goto("/"); + const report = await page.evaluate(async () => { + const { CorrectiveHistoryStore, createMeshMain, createMeshRegistry } = await import("/src/corrective-pilot-bridge.ts"); + const fixture = [{ id: "vertex:0", x: 1, y: 2, z: 3 }, { id: "vertex:1", x: 0, y: 0, z: 0 }]; + const command = (overrides = {}) => ({ + schemaVersion: 1, + requestId: "wbv2-p9-001-mesh-translate", + commandType: "meshTranslateVertex", + baseRevision: 9, + context: { mainId: "main:wbv2-p9-001", targetKind: "MESH", targetId: "mesh:cube", editMode: "EDITABLE", authorization: "USER_EDIT", source: { kind: "LOCAL", sha256: "b".repeat(64) } }, + payload: { vertexId: "vertex:0", delta: { x: 0.5, y: -1, z: 2 } }, + ...overrides, + }); + const clone = (value) => ({ vertices: value.vertices.map((vertex) => ({ ...vertex })) }); + const desktopMain = createMeshMain(fixture, 9, false); + const wasmMain = createMeshMain(fixture, 9, false); + const desktop = await createMeshRegistry(desktopMain).dispatch("DESKTOP", { command: command(), mainRevision: 9 }); + const wasm = await createMeshRegistry(wasmMain).dispatch("WASM", { command: command(), mainRevision: 9 }); + + const rollbackMain = createMeshMain(fixture, 9, false); + const rollbackRegistry = createMeshRegistry(rollbackMain); + const malformed = await rollbackRegistry.dispatch("DESKTOP", { command: command({ payload: { vertexId: "vertex:0", delta: { x: 0.5, y: -1, z: 2, w: 1 } } }), mainRevision: 9 }); + const stale = await rollbackRegistry.dispatch("WASM", { command: command({ baseRevision: 8 }), mainRevision: 9 }); + const unknown = await rollbackRegistry.dispatch("DESKTOP", { command: command({ payload: { vertexId: "vertex:missing", delta: { x: 0.5, y: -1, z: 2 } } }), mainRevision: 9 }); + + const history = new CorrectiveHistoryStore({ vertices: fixture }, 9, false, clone); + await createMeshRegistry(history).dispatch("WASM", { command: command(), mainRevision: 9 }); + const saved = history.save(); + const postSave = await createMeshRegistry(history).dispatch("DESKTOP", { command: command({ requestId: "wbv2-p9-001-mesh-post-save", baseRevision: 10, payload: { vertexId: "vertex:1", delta: { x: 4, y: 0, z: 0 } } }), mainRevision: 10 }); + const beforeReopen = history.snapshot(); + history.reopen(); + const reopened = history.snapshot(); + const exact = JSON.stringify(saved) === JSON.stringify(reopened); + return { + fixture, + positive: { desktop: desktop.result, wasm: wasm.result, desktopMain: desktopMain.snapshot(), wasmMain: wasmMain.snapshot(), parity: JSON.stringify(desktop.result) === JSON.stringify(wasm.result) && JSON.stringify(desktopMain.snapshot()) === JSON.stringify(wasmMain.snapshot()) }, + negative: { malformed: malformed.result, stale: stale.result, unknown: unknown.result, rollbackMain: rollbackMain.snapshot() }, + persistence: { saved, postSave: postSave.result, beforeReopen, reopened, exact }, + }; + }); + fs.mkdirSync(evidenceRoot, { recursive: true }); + const output = process.env.WBV2_MESH_PRODUCTION_REPORT ?? "chromium-mesh-production.json"; + fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P9-001", operation: "MESH_PRODUCTION_CHROMIUM", browser: "chromium", queueMutation: false, ...report }, null, 2)}\n`); + + expect(report.positive.parity).toBe(true); + expect(report.positive.desktop.status).toBe("FINISHED"); + expect(report.positive.wasm.status).toBe("FINISHED"); + expect(report.positive.desktop.delta).toEqual({ vertexId: "vertex:0", before: { x: 1, y: 2, z: 3 }, after: { x: 1.5, y: 1, z: 5 } }); + expect(report.positive.desktop.mainRevisionBefore).toBe(9); + expect(report.positive.desktop.mainRevisionAfter).toBe(10); + expect(report.positive.wasm).toEqual(report.positive.desktop); + expect(report.persistence.exact).toBe(true); + expect(report.persistence.reopened).toEqual(report.persistence.saved); + expect(report.negative.malformed.code).toBe("COMMAND_MALFORMED"); + expect(report.negative.stale.code).toBe("REVISION_CONFLICT"); + expect(report.negative.unknown.code).toBe("COMMAND_UNSUPPORTED"); + expect(report.negative.rollbackMain).toEqual({ value: { vertices: [{ id: "vertex:0", x: 1, y: 2, z: 3 }, { id: "vertex:1", x: 0, y: 0, z: 0 }] }, revision: 9, dirty: false }); +}); diff --git a/web/tests/e2e/wbv2-modifier-production.spec.ts b/web/tests/e2e/wbv2-modifier-production.spec.ts new file mode 100644 index 000000000..8936ba590 --- /dev/null +++ b/web/tests/e2e/wbv2-modifier-production.spec.ts @@ -0,0 +1,64 @@ +import { expect, test } from "@playwright/test"; +import fs from "node:fs"; +import path from "node:path"; + +const evidenceRoot = path.resolve(import.meta.dirname, "../../../tests/golden/WBV2-P9-002"); + +test("WBV2-P9-002 production Chromium Modifier receipt is exact and fail-closed", async ({ page }) => { + await page.goto("/"); + const report = await page.evaluate(async () => { + const { CorrectiveHistoryStore, createModifierMain, createModifierRegistry } = await import("/src/corrective-pilot-bridge.ts"); + const fixture = [{ uuid: "modifier:bevel", name: "Pilot Bevel", type: "BEVEL", enabled: false, showViewport: true, showRender: true }]; + const command = (overrides = {}) => ({ + schemaVersion: 1, + requestId: "wbv2-p9-002-modifier-enabled", + commandType: "modifierSetEnabled", + baseRevision: 7, + context: { mainId: "main:wbv2-p9-002", targetKind: "MODIFIER", targetId: "modifier:bevel", editMode: "EDITABLE", authorization: "USER_EDIT", source: { kind: "LOCAL", sha256: "a".repeat(64) } }, + payload: { modifierUuid: "modifier:bevel", enabled: true }, + ...overrides, + }); + const clone = (value) => ({ modifiers: value.modifiers.map((modifier) => ({ ...modifier })) }); + const desktopMain = createModifierMain(fixture, 7, false); + const wasmMain = createModifierMain(fixture, 7, false); + const desktop = await createModifierRegistry(desktopMain).dispatch("DESKTOP", { command: command(), mainRevision: 7 }); + const wasm = await createModifierRegistry(wasmMain).dispatch("WASM", { command: command(), mainRevision: 7 }); + + const rollbackMain = createModifierMain(fixture, 7, false); + const rollbackRegistry = createModifierRegistry(rollbackMain); + const malformed = await rollbackRegistry.dispatch("DESKTOP", { command: command({ payload: { modifierUuid: "modifier:bevel", enabled: true, unexpected: true } }), mainRevision: 7 }); + const stale = await rollbackRegistry.dispatch("WASM", { command: command({ baseRevision: 6 }), mainRevision: 7 }); + const unknown = await rollbackRegistry.dispatch("DESKTOP", { command: command({ payload: { modifierUuid: "modifier:missing", enabled: true } }), mainRevision: 7 }); + + const history = new CorrectiveHistoryStore({ modifiers: fixture }, 7, false, clone); + await createModifierRegistry(history).dispatch("WASM", { command: command(), mainRevision: 7 }); + const saved = history.save(); + const postSave = await createModifierRegistry(history).dispatch("DESKTOP", { command: command({ requestId: "wbv2-p9-002-modifier-post-save", baseRevision: 8, payload: { modifierUuid: "modifier:bevel", enabled: false } }), mainRevision: 8 }); + const beforeReopen = history.snapshot(); + history.reopen(); + const reopened = history.snapshot(); + return { + fixture, + positive: { desktop: desktop.result, wasm: wasm.result, desktopMain: desktopMain.snapshot(), wasmMain: wasmMain.snapshot(), parity: JSON.stringify(desktop.result) === JSON.stringify(wasm.result) && JSON.stringify(desktopMain.snapshot()) === JSON.stringify(wasmMain.snapshot()) }, + negative: { malformed: malformed.result, stale: stale.result, unknown: unknown.result, rollbackMain: rollbackMain.snapshot() }, + persistence: { saved, postSave: postSave.result, beforeReopen, reopened, exact: JSON.stringify(saved) === JSON.stringify(reopened) }, + }; + }); + fs.mkdirSync(evidenceRoot, { recursive: true }); + const output = process.env.WBV2_MODIFIER_PRODUCTION_REPORT ?? "chromium-modifier-production.json"; + fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P9-002", operation: "MODIFIER_PRODUCTION_CHROMIUM", browser: "chromium", queueMutation: false, ...report }, null, 2)}\n`); + + expect(report.positive.parity).toBe(true); + expect(report.positive.desktop.status).toBe("FINISHED"); + expect(report.positive.wasm.status).toBe("FINISHED"); + expect(report.positive.desktop.delta).toEqual({ modifierUuid: "modifier:bevel", previousEnabled: false, enabled: true }); + expect(report.positive.desktop.mainRevisionBefore).toBe(7); + expect(report.positive.desktop.mainRevisionAfter).toBe(8); + expect(report.positive.wasm).toEqual(report.positive.desktop); + expect(report.persistence.exact).toBe(true); + expect(report.persistence.reopened).toEqual(report.persistence.saved); + expect(report.negative.malformed.code).toBe("COMMAND_MALFORMED"); + expect(report.negative.stale.code).toBe("REVISION_CONFLICT"); + expect(report.negative.unknown.code).toBe("COMMAND_UNSUPPORTED"); + expect(report.negative.rollbackMain).toEqual({ value: { modifiers: [{ uuid: "modifier:bevel", name: "Pilot Bevel", type: "BEVEL", enabled: false, showViewport: true, showRender: true }] }, revision: 7, dirty: false }); +});