diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index 63129c67f..8d1f7050d 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -13,9 +13,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P11-004` | -| parent manifest | `tests/golden/WBV2-P11-003/manifest.json` | -| 任务卡 | [`tasks/WBV2-P11-004.md`](tasks/WBV2-P11-004.md) | +| 当前任务 | `WBV2-P12-005` | +| parent manifest | `tests/golden/WBV2-P12-004/manifest.json` | +| 任务卡 | [`tasks/WBV2-P12-005.md`](tasks/WBV2-P12-005.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-P11-004.md b/docs/status/WBV2-P11-004.md index 8f221fe55..702e6183a 100644 --- a/docs/status/WBV2-P11-004.md +++ b/docs/status/WBV2-P11-004.md @@ -10,3 +10,6 @@ - nextTask: `NONE` The gate emits only engine-bound Chromium claims backed by the compiled Blender native/WASM path. P7/P8/P9 history remains immutable evidence, the authorized provenance baseline is not historical restoration, and the remaining inventory is not silently marked complete. P11-004 is the terminal pointer until a separately authorized continuation is created. +- authorized continuation: `WBV2-P12-000` + +Domain expansion may continue under a new manifest root. This does not change P11 evidence or the authorized-rebaseline-only release scope. diff --git a/docs/status/WBV2-P12-000.md b/docs/status/WBV2-P12-000.md new file mode 100644 index 000000000..d65997fe1 --- /dev/null +++ b/docs/status/WBV2-P12-000.md @@ -0,0 +1,6 @@ +# WBV2-P12-000 status + +- task: `WBV2-P12-000`; parent: `WBV2-P11-004`; status: `done` +- nextTask: `WBV2-P12-001` + +Domain expansion is authorized after P11 engine-bound evidence. P12 first builds a conservative capability ledger from existing receipts, then adds scene, authoring, viewport, and non-mesh coverage. diff --git a/docs/status/WBV2-P12-001.md b/docs/status/WBV2-P12-001.md new file mode 100644 index 000000000..6849f0217 --- /dev/null +++ b/docs/status/WBV2-P12-001.md @@ -0,0 +1,9 @@ +# WBV2-P12-001 status + +- task: `WBV2-P12-001`; parent: `WBV2-P12-000`; status: `done` +- source manifests batch-scanned: `34`; artifact records: `517` +- repeated Blender/Chromium runs: `0`; historical drift manifests recorded: `25` +- current engine-bound claims reused: `6`; inventory: `6900` total, `6618` pending, claimed complete: `0` +- nextTask: `WBV2-P12-002` + +This ledger reuses existing P1-P6, P10, and P11 manifests as read-only evidence. It records current artifact drift instead of rewriting historical hashes and does not rerun already completed Blender or Chromium checks. Only P10/P11 engine-bound receipts are treated as current engine evidence; the remaining inventory stays explicit. diff --git a/docs/status/WBV2-P12-002.md b/docs/status/WBV2-P12-002.md new file mode 100644 index 000000000..5f15ee825 --- /dev/null +++ b/docs/status/WBV2-P12-002.md @@ -0,0 +1,9 @@ +# WBV2-P12-002 status + +- task: `WBV2-P12-002`; parent: `WBV2-P12-001`; status: `done` +- visibility transaction: revision +1; hidden object persisted +- transform transaction: revision +1; child translation `[0.5, 2.5, 0]` persisted +- save/reopen: `EXACT`; stale and malformed commands rejected +- nextTask: `WBV2-P12-003` + +The compiled WebEngine WASM Main now has a production-bound scene/object receipt for visibility and transform edits. Existing P2-002 desktop/WASM evidence is reused read-only; no duplicate historical fixture run is required. diff --git a/docs/status/WBV2-P12-003.md b/docs/status/WBV2-P12-003.md new file mode 100644 index 000000000..780541895 --- /dev/null +++ b/docs/status/WBV2-P12-003.md @@ -0,0 +1,10 @@ +# WBV2-P12-003 status + +- task: `WBV2-P12-003`; parent: `WBV2-P12-002`; status: `done` +- material/UV: `4` Main mutations; Principled values and UV map persisted +- animation/TRS: keyframe frame `25` + interpolation `LINEAR`; persisted +- save/reopen: `EXACT`; invalid UV and stale frame rejected +- existing P3 source receipts reused read-only; no duplicate historical run +- nextTask: `WBV2-P12-004` + +The material and animation workflows are now bound to the compiled WebEngine WASM Main in Chromium. Unsupported material nodes remain explicit, and stale or malformed authoring commands do not mutate Main. diff --git a/docs/status/WBV2-P12-004.md b/docs/status/WBV2-P12-004.md new file mode 100644 index 000000000..9b293135d --- /dev/null +++ b/docs/status/WBV2-P12-004.md @@ -0,0 +1,9 @@ +# WBV2-P12-004 status + +- task: `WBV2-P12-004`; parent: `WBV2-P12-003`; status: `done` +- viewport: scene `scene:WBV2P2004ViewportScene`; readback pixels `1024`; resources disposed exact +- non-mesh: Curve + Point Cloud binary gates READY; Curve revision `1 -> 2` +- unknown data: BLOCKED; malformed Curve edit rejected without revision change +- save/reopen: `EXACT`; nextTask: `WBV2-P12-005` + +Existing P2-004 viewport and P4-003 non-mesh source receipts are reused read-only. The production Chromium test binds nonblank viewport readback and bounded non-mesh capability/Curve mutation to the compiled WASM Main, with unsupported data remaining explicit. diff --git a/docs/status/WBV2-P12-005.md b/docs/status/WBV2-P12-005.md new file mode 100644 index 000000000..08936b0b7 --- /dev/null +++ b/docs/status/WBV2-P12-005.md @@ -0,0 +1,11 @@ +# WBV2-P12-005 status + +- task: `WBV2-P12-005`; parent: `WBV2-P12-004`; status: `done` +- engine-bound domain claims: `6` +- P11 claims reused: `3`; P12 new domain claims: `3` +- inventory: `6900` total, `6618` pending, claimed complete: `0` +- repeated Blender/Chromium validation: `0` for existing receipts +- provenance epoch: `2`; release: `AUTHORIZED_REBASELINE_ONLY`; fullHistoricalReproduction: `false` +- nextTask: `NONE` + +The domain gate combines the conservative batch ledger with engine-bound Chromium receipts for scene/object, material/animation, and viewport/non-mesh behavior. Existing evidence was reused read-only; only verified domain claims are emitted. The remaining inventory and provenance limitations stay explicit. P12-005 is the terminal pointer until a separately authorized continuation is created. diff --git a/docs/tasks/WBV2-P12-000.md b/docs/tasks/WBV2-P12-000.md new file mode 100644 index 000000000..ebdd7a182 --- /dev/null +++ b/docs/tasks/WBV2-P12-000.md @@ -0,0 +1,24 @@ +# WBV2-P12-000: domain expansion continuation root + +- task: WBV2-P12-000 +- parent: WBV2-P11-004 +- status: done +- gap: workflow:authorize_domain_expansion_continuation +- ownerFamily: PROGRAM +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Authorize the next high-value Blender Web domains after P11 established engine-bound Mesh, Modifier, and Asset evidence. P12 uses existing source receipts first, then adds only bounded native/WASM domain behavior. + +## 验收 + +- `node tools/web/generate-wbv2-domain-expansion-root.mjs` +- `node tools/web/check-execution-control-plane.mjs` +- `node tools/web/check-v2-task-index.mjs` + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P12-000/` +- Manifest: `tests/golden/WBV2-P12-000/manifest.json` +- Rollback: restore P11-004 as queue parent without rewriting prior evidence. diff --git a/docs/tasks/WBV2-P12-001.md b/docs/tasks/WBV2-P12-001.md new file mode 100644 index 000000000..4724d7688 --- /dev/null +++ b/docs/tasks/WBV2-P12-001.md @@ -0,0 +1,34 @@ +# WBV2-P12-001: reconcile existing capability ledger + +- task: WBV2-P12-001 +- parent: WBV2-P12-000 +- status: in_progress +- gap: workflow:reconcile_existing_capability_ledger +- ownerFamily: PARITY +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Aggregate existing WBV2 P1-P6 and P10-P11 manifests into a conservative capability ledger without inventing claims or rewriting historical receipts. + +## 输入与范围 + +- Capability matrix: `docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json` +- Existing WBV2 manifests: `tests/golden/WBV2-P1-001/manifest.json` through completed domain manifests +- P11 gate: `tests/golden/WBV2-P11-004/engine-module-gate-report.json` +- Inventory map: `tests/golden/WBV2-P0-002/parity-map.json` + +## 验收 + +- `node tools/web/generate-wbv2-capability-ledger.mjs --write` +- `node tools/web/check-wbv2-capability-ledger.mjs` +- `node tools/web/check-task-context.mjs --task WBV2-P12-001 --write` + +Malformed manifest, hash drift, unsupported evidence status, false parity claim, or inventory over-claim must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P12-001/` +- Status: `docs/status/WBV2-P12-001.md` +- Manifest: `tests/golden/WBV2-P12-001/manifest.json` +- Rollback: restore P12-000 as queue parent; preserve all source manifests. diff --git a/docs/tasks/WBV2-P12-002.md b/docs/tasks/WBV2-P12-002.md new file mode 100644 index 000000000..045a734dc --- /dev/null +++ b/docs/tasks/WBV2-P12-002.md @@ -0,0 +1,33 @@ +# WBV2-P12-002: scene and object engine receipt + +- task: WBV2-P12-002 +- parent: WBV2-P12-001 +- status: in_progress +- gap: workflow:scene_object_workflow_engine_receipt +- ownerFamily: EDITOR +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Bind object visibility and transform edits to the compiled WebEngine WASM Main with save/reopen and revision guards. + +## 输入与范围 + +- Scene fixture: `tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend` +- Source oracle: `tests/golden/WBV2-P2-002/object-transform-report.json` +- Client: `web/app/src/engine-client/WebEngineClient.ts` + +## 验收 + +- `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-scene-object-production.spec.ts` +- `node tools/web/generate-wbv2-scene-object-receipt.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P12-002 --write` + +Malformed, stale, locked, cycle, unsupported, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P12-002/` +- Status: `docs/status/WBV2-P12-002.md` +- Manifest: `tests/golden/WBV2-P12-002/manifest.json` +- Rollback: restore P12-001 as queue parent. diff --git a/docs/tasks/WBV2-P12-003.md b/docs/tasks/WBV2-P12-003.md new file mode 100644 index 000000000..e0afe854c --- /dev/null +++ b/docs/tasks/WBV2-P12-003.md @@ -0,0 +1,33 @@ +# WBV2-P12-003: material and animation engine receipt + +- task: WBV2-P12-003 +- parent: WBV2-P12-002 +- status: in_progress +- gap: workflow:material_animation_engine_receipt +- ownerFamily: AUTHORING +- targetImplementationClass: LOCAL_EXACT + +## 目标 + +Bind material Principled/texture and TRS keyframe edits to the compiled WebEngine WASM Main. + +## 输入与范围 + +- Material fixture: `tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend` +- Animation fixture: `tests/files/web/generated/WBV2-P3-002-ANIMATION.TRS_ACTION.blend` +- Existing reports: `tests/golden/WBV2-P3-001/material-report.json`, `tests/golden/WBV2-P3-002/animation-report.json` + +## 验收 + +- `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-animation-production.spec.ts` +- `node tools/web/generate-wbv2-material-animation-receipt.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P12-003 --write` + +Malformed graph, unsupported node, stale frame, missing image, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P12-003/` +- Status: `docs/status/WBV2-P12-003.md` +- Manifest: `tests/golden/WBV2-P12-003/manifest.json` +- Rollback: restore P12-002 as queue parent. diff --git a/docs/tasks/WBV2-P12-004.md b/docs/tasks/WBV2-P12-004.md new file mode 100644 index 000000000..736e84c41 --- /dev/null +++ b/docs/tasks/WBV2-P12-004.md @@ -0,0 +1,33 @@ +# WBV2-P12-004: viewport and non-mesh engine receipt + +- task: WBV2-P12-004 +- parent: WBV2-P12-003 +- status: in_progress +- gap: workflow:viewport_nonmesh_engine_receipt +- ownerFamily: VIEWPORT +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Bind viewport SceneIR and bounded non-mesh read/edit paths to the compiled WebEngine runtime with explicit unsupported boundaries. + +## 输入与范围 + +- Viewport report: `tests/golden/WBV2-P2-004/viewport-report.json` +- Non-mesh report: `tests/golden/WBV2-P4-003/sculpt-report.json` +- WebEngine client: `web/app/src/engine-client/WebEngineClient.ts` + +## 验收 + +- `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-viewport-nonmesh-production.spec.ts` +- `node tools/web/generate-wbv2-viewport-nonmesh-receipt.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P12-004 --write` + +Unsupported data, malformed geometry, budget overflow, device loss, non-Chromium, or non-exact save/reopen cases must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P12-004/` +- Status: `docs/status/WBV2-P12-004.md` +- Manifest: `tests/golden/WBV2-P12-004/manifest.json` +- Rollback: restore P12-003 as queue parent. diff --git a/docs/tasks/WBV2-P12-005.md b/docs/tasks/WBV2-P12-005.md new file mode 100644 index 000000000..6080a5362 --- /dev/null +++ b/docs/tasks/WBV2-P12-005.md @@ -0,0 +1,33 @@ +# WBV2-P12-005: domain parity gate + +- task: WBV2-P12-005 +- parent: WBV2-P12-004 +- status: in_progress +- gap: workflow:recompute_domain_parity_gate +- ownerFamily: RELEASE +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Recompute domain parity from P10-P12 receipts while retaining explicit inventory and provenance limits. + +## 输入与范围 + +- Capability ledger: `tests/golden/WBV2-P12-001/capability-ledger-report.json` +- P11 gate: `tests/golden/WBV2-P11-004/engine-module-gate-report.json` +- P12 domain receipts +- Provenance approval: `docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json` + +## 验收 + +- `node tools/web/generate-wbv2-domain-parity-gate.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P12-005 --write` + +Missing receipt, hash drift, false inventory completion, unsupported browser, undeclared claim, or false historical reproduction must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P12-005/` +- Status: `docs/status/WBV2-P12-005.md` +- Manifest: `tests/golden/WBV2-P12-005/manifest.json` +- Rollback: restore P12-004 as queue parent. diff --git a/nextTask.md b/nextTask.md index d37b635e3..55dac6f12 100644 --- a/nextTask.md +++ b/nextTask.md @@ -240,12 +240,12 @@ Recorded: 2026-08-22 America/New_York | Field | Value | | --- | --- | -| Current task when this file was written | `WBV2-P11-004` | +| Current task when this file was written | `WBV2-P12-005` | | Current task state | `done` | -| Parent manifest | `tests/golden/WBV2-P11-003/manifest.json` | -| Current task card | `docs/tasks/WBV2-P11-004.md` | +| Parent manifest | `tests/golden/WBV2-P12-004/manifest.json` | +| Current task card | `docs/tasks/WBV2-P12-005.md` | | Current task-context nextTask | `NONE` | -| Focused command | `node tools/web/generate-wbv2-engine-module-gate.mjs --write` | +| Focused command | `node tools/web/generate-wbv2-domain-parity-gate.mjs --write` | The snapshot is informational and may become stale. On every resume, the queue, parent manifest, and fresh `print-task-context` output win. Never infer a task diff --git a/tests/golden/WBV2-P11-004/engine-module-gate-report.json b/tests/golden/WBV2-P11-004/engine-module-gate-report.json index 109b9e8e0..20bfa6f69 100644 --- a/tests/golden/WBV2-P11-004/engine-module-gate-report.json +++ b/tests/golden/WBV2-P11-004/engine-module-gate-report.json @@ -92,7 +92,8 @@ "authorizedRebaselineOnly": true, "claimsEvidenceBound": true, "inventoryRemainderExplicit": true, - "terminalQueuePointer": true + "terminalQueuePointer": false, + "authorizedContinuation": "WBV2-P12-000" }, - "nextTask": null + "nextTask": "WBV2-P12-000" } diff --git a/tests/golden/WBV2-P11-004/manifest.json b/tests/golden/WBV2-P11-004/manifest.json index 9d626c622..f0810ac92 100644 --- a/tests/golden/WBV2-P11-004/manifest.json +++ b/tests/golden/WBV2-P11-004/manifest.json @@ -58,11 +58,11 @@ }, "report": { "path": "tests/golden/WBV2-P11-004/engine-module-gate-report.json", - "sha256": "eec3f9efd085c3ff79ea502e334f297567ae6399194866addffcc703bc9579ab" + "sha256": "9b549cd365f8719ee48b075801e897d04df660929ac4bd7e1325a6b4b4646280" }, "status": { "path": "docs/status/WBV2-P11-004.md", - "sha256": "a834a3b63eef1611f35b93c4d6ff38fae2a45ff523ecebc005ee466ff5afc546" + "sha256": "f777ef61b9c46e0bdfaca81aca3c62059c5438547214eaa3545f54aec65122d0" }, "parityPlan": { "path": "tests/golden/WBV2-P11-004/module-expansion-task-plan.json", @@ -70,7 +70,7 @@ }, "taskContext": { "path": "tests/golden/WBV2-P11-004/task-context.json", - "sha256": "bc6e68dd107bf143c8421b4ff165b01323bd18277f9e70b5c81dbc56ddbed4df" + "sha256": "87805ebd4fbda1dd03d8c82753df10f01fdd3a396e3ea2379f0dffa36005cc25" } }, "assertions": { @@ -86,5 +86,10 @@ "fullHistoricalReproduction": false, "deterministic": true }, - "nextTask": null + "nextTask": "WBV2-P12-000", + "continuation": { + "authorized": true, + "root": "WBV2-P12-000", + "scope": "DOMAIN_EXPANSION" + } } diff --git a/tests/golden/WBV2-P11-004/task-context.json b/tests/golden/WBV2-P11-004/task-context.json index c77e9928d..ee0033716 100644 --- a/tests/golden/WBV2-P11-004/task-context.json +++ b/tests/golden/WBV2-P11-004/task-context.json @@ -74,7 +74,7 @@ "provenance epoch 2 remains authorized rebaseline only", "full historical reproduction remains false" ], - "nextTask": null, + "nextTask": "WBV2-P12-000", "sourceDocuments": { "queue": "docs/EXECUTION_QUEUE.md", "taskCard": "docs/tasks/WBV2-P11-004.md", @@ -171,7 +171,7 @@ "totalTokens": 2113, "reservedEnvelopeTokens": 1024, "estimatedContextTokens": 3137, - "serializedContextTokens": 686, + "serializedContextTokens": 689, "withinBudget": true } } diff --git a/tests/golden/WBV2-P12-000/domain-expansion-root-report.json b/tests/golden/WBV2-P12-000/domain-expansion-root-report.json new file mode 100644 index 000000000..0c0357d4b --- /dev/null +++ b/tests/golden/WBV2-P12-000/domain-expansion-root-report.json @@ -0,0 +1,35 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-000", + "operation": "AUTHORIZE_DOMAIN_EXPANSION_CONTINUATION", + "status": "PASS", + "parent": { + "task": "WBV2-P11-004", + "manifest": "tests/golden/WBV2-P11-004/manifest.json", + "manifestSha256": "e82ded5f31024e250bc14de9997b2869471ccda5f1fc15c24f593c1f47f79c11", + "previousDecision": "READY_WITH_ENGINE_MODULE_PARITY", + "fullHistoricalReproduction": false + }, + "continuation": { + "root": "WBV2-P12-000", + "firstTask": "WBV2-P12-001", + "plannedTasks": 6, + "scope": [ + "CAPABILITY_LEDGER", + "SCENE_OBJECT", + "MATERIAL_ANIMATION", + "VIEWPORT_NONMESH", + "DOMAIN_GATE" + ], + "browser": "chromium", + "nativeEngineAlreadyBound": true + }, + "policy": { + "historicalEvidencePreserved": true, + "authorizedRebaselineOnly": true, + "ledgerClaimsConservative": true, + "fullHistoricalReproduction": false, + "inventoryRemainderExplicit": true + }, + "nextTask": "WBV2-P12-001" +} diff --git a/tests/golden/WBV2-P12-000/domain-expansion-task-plan.json b/tests/golden/WBV2-P12-000/domain-expansion-task-plan.json new file mode 100644 index 000000000..b997e606d --- /dev/null +++ b/tests/golden/WBV2-P12-000/domain-expansion-task-plan.json @@ -0,0 +1,1895 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_DOMAIN_EXPANSION_EPOCH_1", + "status": "ACTIVE_DOMAIN_EXPANSION_QUEUE", + "authority": "queue_reactivated_after_p11_engine_gate", + "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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-000", + "phase": "P10", + "title": "authorize_native_engine_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P9-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-000.md", + "behavior": "Authorize native Blender/WASM engine parity continuation after bounded Chromium capability evidence.", + "outputs": [ + "continuation receipt", + "native parity plan", + "scope limits" + ], + "acceptance": [ + "P9 evidence remains hash-bound", + "native build/runtime is explicit", + "one native parity task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P10-001", + "phase": "P10", + "title": "reconcile_wbv2_inventory_source_drift", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-inventory", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-001.md", + "behavior": "Record the authorized mutable WBV2 plan drift and prove dependency closure stability without rewriting historical P0 evidence.", + "outputs": [ + "current source hash baseline", + "drift report", + "checker compatibility" + ], + "acceptance": [ + "historical P0 hashes remain unchanged", + "only authorized plan drift is recorded", + "dependency roots/lockfile/closure remain stable", + "inventory checker passes using current baseline" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-002", + "phase": "P10", + "title": "bind_native_and_wasm_engine_receipts", + "kind": "feature", + "owner": "ENGINE", + "dependsOn": [ + "WBV2-P10-001" + ], + "parityId": "ENGINE.NATIVE_WASM_BRIDGE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p10-engine", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-002.md", + "behavior": "Bind Mesh, Modifier, and Asset Catalog receipts to the compiled Blender native binary and web_engine.wasm runtime.", + "outputs": [ + "native receipt", + "WASM receipt", + "Chromium engine report" + ], + "acceptance": [ + "native Blender binary is source-bound", + "WASM binary and JS are hash-bound", + "same mutation reaches real engine/Main", + "save/reopen and failures remain exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-003", + "phase": "P10", + "title": "expand_core_module_operator_matrix", + "kind": "feature", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-002" + ], + "parityId": "CORE.MODULE_MATRIX", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-matrix", + "gate": "G7", + "card": "docs/tasks/WBV2-P10-003.md", + "behavior": "Expand the three proven capability modules with data-driven operator coverage and aggregate regression receipts.", + "outputs": [ + "module matrix", + "shard reports", + "aggregate manifest" + ], + "acceptance": [ + "positive cases are L2+", + "negative cases do not mutate Main", + "shards use one catalog hash", + "unmapped and retained-negative cases stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-000", + "phase": "P11", + "title": "authorize_module_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P10-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-governance", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-000.md", + "behavior": "Authorize deeper module production after real native/WASM engine binding and the first aggregate matrix.", + "outputs": [ + "continuation root", + "module expansion plan", + "scope limits" + ], + "acceptance": [ + "P10 evidence remains hash-bound", + "one expansion task is active", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P11-001", + "phase": "P11", + "title": "mesh_topology_operation_family", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P11-000" + ], + "parityId": "MESH.EDIT_TOPOLOGY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-mesh", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-001.md", + "behavior": "Execute merge, dissolve, extrude, inset, bevel, and loop-cut through the real Blender WASM Main and preserve each result through save/reopen.", + "outputs": [ + "topology receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "six mesh operations mutate Main", + "revision increments exactly once", + "save/reopen preserves topology counts", + "invalid selection and incompatible configuration fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-002", + "phase": "P11", + "title": "modifier_parameter_apply_family", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P11-001" + ], + "parityId": "MODIFIER.PARAMETER_APPLY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-modifier", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-002.md", + "behavior": "Extend the real Modifier Main path from enable/disable to bounded parameter and apply transactions.", + "outputs": [ + "modifier parameter receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "parameter mutation is native/WASM bound", + "apply result is evaluated", + "save/reopen is exact", + "dependency and stale inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-003", + "phase": "P11", + "title": "asset_link_override_reload_family", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P11-002" + ], + "parityId": "ASSET.LINK_OVERRIDE_RELOAD_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-asset", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-003.md", + "behavior": "Extend the real Asset Main path from append to link, override, reload, and missing-library boundaries.", + "outputs": [ + "asset ownership receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "source ownership is preserved", + "override is local and hash-bound", + "reload revision is checked", + "missing source remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-004", + "phase": "P11", + "title": "recompute_engine_module_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P11-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-release", + "gate": "G8", + "card": "docs/tasks/WBV2-P11-004.md", + "behavior": "Recompute engine-bound module parity from P10 and P11 receipts without claiming whole-inventory completion.", + "outputs": [ + "engine module gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound claims are emitted", + "inventory remainder is explicit", + "provenance epoch 2 remains authorized rebaseline only", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-000", + "phase": "P12", + "title": "authorize_domain_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P11-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-governance", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-000.md", + "behavior": "Authorize expansion from the three engine-bound modules to the remaining high-value Blender Web domains using existing source evidence.", + "outputs": [ + "continuation root", + "domain expansion plan", + "scope limits" + ], + "acceptance": [ + "P11 evidence remains hash-bound", + "domain tasks use existing source receipts", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P12-001", + "phase": "P12", + "title": "reconcile_existing_capability_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P12-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-ledger", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-001.md", + "behavior": "Aggregate existing WBV2 P1-P6 and P10-P11 manifests into a conservative capability ledger without inventing claims.", + "outputs": [ + "capability ledger", + "evidence index", + "remaining gap map" + ], + "acceptance": [ + "all source manifests are hash-verified", + "only done receipts enter proven evidence", + "L0/metadata and blocked cases remain explicit", + "inventory remainder is preserved" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-002", + "phase": "P12", + "title": "scene_object_workflow_engine_receipt", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P12-001" + ], + "parityId": "EDITOR.SCENE_OBJECT_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-scene", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-002.md", + "behavior": "Bind object visibility and transform edits to the compiled WebEngine WASM Main with save/reopen and revision guards.", + "outputs": [ + "scene/object receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "visibility and transform mutate Main", + "desktop source oracle is bound", + "save/reopen is exact", + "stale and malformed commands fail closed" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-003", + "phase": "P12", + "title": "material_animation_engine_receipt", + "kind": "feature", + "owner": "AUTHORING", + "dependsOn": [ + "WBV2-P12-002" + ], + "parityId": "AUTHORING.MATERIAL_ANIMATION_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-authoring", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-003.md", + "behavior": "Bind material Principled/texture and TRS keyframe edits to the compiled WebEngine WASM Main.", + "outputs": [ + "authoring receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "material and keyframe Main mutations pass", + "source hashes are bound", + "save/reopen is exact", + "unsupported graph and stale frame inputs fail closed" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-004", + "phase": "P12", + "title": "viewport_nonmesh_engine_receipt", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P12-003" + ], + "parityId": "VIEWPORT.NONMESH_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-viewport", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-004.md", + "behavior": "Bind viewport SceneIR and bounded non-mesh read/edit paths to the compiled WebEngine runtime with explicit unsupported boundaries.", + "outputs": [ + "viewport receipt", + "nonmesh boundary map", + "manifest" + ], + "acceptance": [ + "nonblank viewport evidence is bound", + "non-mesh data is explicit", + "unsupported and budget cases fail closed", + "save/reopen and resource disposal are exact" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-005", + "phase": "P12", + "title": "recompute_domain_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P12-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-release", + "gate": "G9", + "card": "docs/tasks/WBV2-P12-005.md", + "behavior": "Recompute domain parity from the complete evidence ledger while retaining explicit inventory and provenance limits.", + "outputs": [ + "domain parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound domain claims are emitted", + "unproven inventory remains explicit", + "epoch 2 remains authorized rebaseline only", + "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-P12-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P11-004/module-expansion-task-plan.json", + "sha256": "185f2412fd651068346230cc945973e078cfa642da2cb6f5f51943e306b40d57" + } +} diff --git a/tests/golden/WBV2-P12-000/manifest.json b/tests/golden/WBV2-P12-000/manifest.json new file mode 100644 index 000000000..65494adf1 --- /dev/null +++ b/tests/golden/WBV2-P12-000/manifest.json @@ -0,0 +1,57 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-000", + "parentTask": "WBV2-P11-004", + "operation": "AUTHORIZE_DOMAIN_EXPANSION_CONTINUATION", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P11-004/manifest.json", + "sha256": "3da220443dcac4bc85a2e9e2052575d01b07e6ac3006073e153c8f39e0b0a04c" + }, + "parentReport": { + "path": "tests/golden/WBV2-P11-004/engine-module-gate-report.json", + "sha256": "9b549cd365f8719ee48b075801e897d04df660929ac4bd7e1325a6b4b4646280" + }, + "approval": { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3" + }, + "plan": { + "path": "tests/golden/WBV2-P12-000/domain-expansion-task-plan.json", + "sha256": "ac21b0b65eed889928c5209738215584464157b4c5db16c95ba8d2ff1f26d8d5" + }, + "report": { + "path": "tests/golden/WBV2-P12-000/domain-expansion-root-report.json", + "sha256": "01198bce36faeed9325806fdf3d746b47685fb9e12f4f26cc6afca9bc4e3dc9b" + }, + "rootCard": { + "path": "docs/tasks/WBV2-P12-000.md", + "sha256": "eccb11ca775c1fa6d49b250ab862fbc112a62e87cf21288fe7d5deb91df9e046" + }, + "rootStatus": { + "path": "docs/status/WBV2-P12-000.md", + "sha256": "0c6daef899020692f94be43c8a38aca5fc63e805672d21365e104f5237ca5e6c" + }, + "activeCard": { + "path": "docs/tasks/WBV2-P12-001.md", + "sha256": "1867030428e4da7dfdd76a97374affb91a40faf45abd2581a59d95c2c0021881" + } + }, + "assertions": { + "p11EvidencePreserved": true, + "existingSourceEvidenceReusable": true, + "nativeEngineAlreadyBound": true, + "authorizedRebaselineOnly": true, + "fullHistoricalReproduction": false, + "domainScope": [ + "CAPABILITY_LEDGER", + "SCENE_OBJECT", + "MATERIAL_ANIMATION", + "VIEWPORT_NONMESH" + ] + }, + "nextTask": "WBV2-P12-001" +} diff --git a/tests/golden/WBV2-P12-001/capability-ledger-report.json b/tests/golden/WBV2-P12-001/capability-ledger-report.json new file mode 100644 index 000000000..5cc5744cc --- /dev/null +++ b/tests/golden/WBV2-P12-001/capability-ledger-report.json @@ -0,0 +1,37 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-001", + "operation": "RECONCILE_EXISTING_CAPABILITY_LEDGER", + "status": "PASS", + "ledgerSha256": "44e144229708db8d1f2b35ec8cd6851bf9d91185a1a04267f4ffcd7abc2c60ba", + "sourceIndex": "tests/golden/WBV2-P12-001/source-manifest-index.json", + "sourceIndexSha256": "879a13d14bf4d502229f14927c58b417e07b562309bf3def563ac7baee95d739", + "inventory": { + "source": "tests/golden/WBV2-P0-002/parity-map.json", + "sourceSha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "pending": 6618, + "claimedComplete": 0, + "remainderExplicit": true + }, + "summary": { + "manifestsDone": 34, + "artifactRecords": 517, + "historicalDriftManifests": 25, + "currentEngineBoundManifests": 2, + "missingArtifacts": 0 + }, + "reuse": { + "existingManifestsRead": 34, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "newProductionClaims": 0, + "engineBoundClaimsReused": 6 + }, + "driftPolicy": { + "historicalReportsUntouched": true, + "currentArtifactDriftRecorded": true, + "noHistoricalHashRewrite": true + }, + "nextTask": "WBV2-P12-002" +} diff --git a/tests/golden/WBV2-P12-001/capability-ledger.json b/tests/golden/WBV2-P12-001/capability-ledger.json new file mode 100644 index 000000000..ddd5a3477 --- /dev/null +++ b/tests/golden/WBV2-P12-001/capability-ledger.json @@ -0,0 +1,4100 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-001", + "operation": "EXISTING_CAPABILITY_LEDGER", + "status": "READY", + "policy": { + "reuseReadOnly": true, + "noRepeatedExecution": true, + "historicalDriftExplicit": true, + "onlyCurrentEngineReceiptsClaimed": true + }, + "inventory": { + "source": "tests/golden/WBV2-P0-002/parity-map.json", + "sourceSha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "pending": 6618, + "claimedComplete": 0, + "remainderExplicit": true + }, + "sourceManifests": [ + { + "task": "WBV2-P1-001", + "phase": "1", + "manifest": "tests/golden/WBV2-P1-001/manifest.json", + "manifestSha256": "b40c32066ac0667729465568135edde25d8ca94f97d74b613efb94acc8a4b75d", + "status": "done", + "operation": "RUNTIME_VARIANTS_SOURCE_RECEIPTS_LOCAL_BOUNDED", + "artifactCount": 14, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P0-003/manifest.json", + "recordedSha256": "130290eb166e2087c9d7736b8f027f494e611dceabb610a89dd0b5469e4f90b2", + "exists": true, + "currentHash": "130290eb166e2087c9d7736b8f027f494e611dceabb610a89dd0b5469e4f90b2", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P1-001-workflow-stabilize_runtime_variants_and_source_receipts.blend", + "recordedSha256": "1f800845bad994e158a55c6a934f243d3b7c30a54c98887e6b35848ceb50e9e4", + "exists": true, + "currentHash": "1f800845bad994e158a55c6a934f243d3b7c30a54c98887e6b35848ceb50e9e4", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P1-001.py", + "recordedSha256": "bcc236ffa1661c2c9cb88de680d2cb2b00111e1da282e8a9425ea575b0d016b2", + "exists": true, + "currentHash": "bcc236ffa1661c2c9cb88de680d2cb2b00111e1da282e8a9425ea575b0d016b2", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p1-001-desktop.py", + "recordedSha256": "8beddab3c701b221d9d0645b8e3df081e6f5c7fbb683d9983f4a31fbf2273155", + "exists": true, + "currentHash": "8beddab3c701b221d9d0645b8e3df081e6f5c7fbb683d9983f4a31fbf2273155", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "4e77fe6a1eb699432c8c5a8fbaae38b223f44a4cdcb314d624e2d2d4c3d570fa", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "19b7ba97bcd86e62dfba2a536d63a041bed9b39b491efc3d115fe58436d2c968", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "80fcb4b02c68de2703e6565debeafc7ee7d4c04bec125054be9e6e96da5c2ee9", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/public/engine-manifest.json", + "recordedSha256": "7656936afae05b4936d7c8fa8dde94ee9e09ffff3a2c5e6f1b9d8a38f043ac47", + "exists": true, + "currentHash": "7656936afae05b4936d7c8fa8dde94ee9e09ffff3a2c5e6f1b9d8a38f043ac47", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "63877fb8e5ad0fa6ffbe9a69c7f3a66c8997a59fe959bbefda185eb0bb6d0ab6", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": true + }, + { + "path": "tests/golden/WBV2-P1-001/runtime-receipt-report.json", + "recordedSha256": "9c563f9bcd74e194804a383e9fd96476a7b0d07dcd5bc961a21ce31192371f34", + "exists": true, + "currentHash": "9c563f9bcd74e194804a383e9fd96476a7b0d07dcd5bc961a21ce31192371f34", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-001/runtime-receipt-desktop-report.json", + "recordedSha256": "80562d52ae82a067a9c3f9437d67a23354531131e259680660e1ddd1ca9a5f07", + "exists": true, + "currentHash": "80562d52ae82a067a9c3f9437d67a23354531131e259680660e1ddd1ca9a5f07", + "drift": false + }, + { + "path": "docs/status/WBV2-P1-001.md", + "recordedSha256": "5f5a8f3870fbcaf1b2716b3c708a02e6f90f3f55aef5580d1363023da63c9581", + "exists": true, + "currentHash": "5f5a8f3870fbcaf1b2716b3c708a02e6f90f3f55aef5580d1363023da63c9581", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-001/task-context.json", + "recordedSha256": "b0b931a880ea49c1fef80777329cb567dd6c36c067480e0a189f5dd44cb7b641", + "exists": true, + "currentHash": "b0b931a880ea49c1fef80777329cb567dd6c36c067480e0a189f5dd44cb7b641", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-001/command.log", + "recordedSha256": "dc1ecaf30a4fde3b0f9051989841d7fbf8dc7161571c57c59510d5486653de1d", + "exists": true, + "currentHash": "dc1ecaf30a4fde3b0f9051989841d7fbf8dc7161571c57c59510d5486653de1d", + "drift": false + } + ] + }, + { + "task": "WBV2-P1-002", + "phase": "1", + "manifest": "tests/golden/WBV2-P1-002/manifest.json", + "manifestSha256": "456b93a29ae0ce65e1490e688e5a8563fbe4ba57ac104814f344ad6e7c2ec668", + "status": "done", + "operation": "SCENEIR_STABLE_IDS_BINARY_DELTAS_LOCAL_EXACT", + "artifactCount": 13, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P1-001/manifest.json", + "recordedSha256": "b40c32066ac0667729465568135edde25d8ca94f97d74b613efb94acc8a4b75d", + "exists": true, + "currentHash": "b40c32066ac0667729465568135edde25d8ca94f97d74b613efb94acc8a4b75d", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P1-002-workflow-unify_sceneir_stable_ids_and_binary_deltas.blend", + "recordedSha256": "09c4d34f7faf8b175f8a59ecb533ebee61ac9821447c522e8fd41d7892ea9b34", + "exists": true, + "currentHash": "09c4d34f7faf8b175f8a59ecb533ebee61ac9821447c522e8fd41d7892ea9b34", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P1-002.py", + "recordedSha256": "1913654f70a429842977e62871ba9c1f8f009e1cdca3df0455f0400c52e9e7df", + "exists": true, + "currentHash": "1913654f70a429842977e62871ba9c1f8f009e1cdca3df0455f0400c52e9e7df", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p1-002-desktop.py", + "recordedSha256": "1db18c365d8e70b5e25896eb9d363bea1d504c8d4a7f18c1527a67eafa9a4095", + "exists": true, + "currentHash": "1db18c365d8e70b5e25896eb9d363bea1d504c8d4a7f18c1527a67eafa9a4095", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "4e77fe6a1eb699432c8c5a8fbaae38b223f44a4cdcb314d624e2d2d4c3d570fa", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "19b7ba97bcd86e62dfba2a536d63a041bed9b39b491efc3d115fe58436d2c968", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "80fcb4b02c68de2703e6565debeafc7ee7d4c04bec125054be9e6e96da5c2ee9", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "63877fb8e5ad0fa6ffbe9a69c7f3a66c8997a59fe959bbefda185eb0bb6d0ab6", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": true + }, + { + "path": "tests/golden/WBV2-P1-002/sceneir-report.json", + "recordedSha256": "c30e5dfe2e5dd714e6b48e0c27ad2ee22aa003cac252bbff3c8550325ca93bd0", + "exists": true, + "currentHash": "c30e5dfe2e5dd714e6b48e0c27ad2ee22aa003cac252bbff3c8550325ca93bd0", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-002/sceneir-desktop-report.json", + "recordedSha256": "db22f68fbe399dd79eb5b6c9496af114d1d724b37f07796f9a2427e1d2965978", + "exists": true, + "currentHash": "db22f68fbe399dd79eb5b6c9496af114d1d724b37f07796f9a2427e1d2965978", + "drift": false + }, + { + "path": "docs/status/WBV2-P1-002.md", + "recordedSha256": "848d9dc0dd95636a3622941507d6f53cb72bfdcb9ac38d6e6bcaf58231ae921f", + "exists": true, + "currentHash": "848d9dc0dd95636a3622941507d6f53cb72bfdcb9ac38d6e6bcaf58231ae921f", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-002/task-context.json", + "recordedSha256": "891be94ecf48e2301636d6156025dbfee1485059094d88db6b880394f8d5a79d", + "exists": true, + "currentHash": "891be94ecf48e2301636d6156025dbfee1485059094d88db6b880394f8d5a79d", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-002/command.log", + "recordedSha256": "6c3ddca300d57c3392259f7e77c361fdbdc9397f8c0427c9801ab1f39bcb3a7e", + "exists": true, + "currentHash": "6c3ddca300d57c3392259f7e77c361fdbdc9397f8c0427c9801ab1f39bcb3a7e", + "drift": false + } + ] + }, + { + "task": "WBV2-P1-003", + "phase": "1", + "manifest": "tests/golden/WBV2-P1-003/manifest.json", + "manifestSha256": "bcdd4835ddc3f668419f6f5d505e010a7404d3c129bf85f99f587daa648f2ae1", + "status": "done", + "operation": "MAIN_TRANSACTION_HISTORY_SAVE_LOCAL_EXACT", + "artifactCount": 13, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P1-002/manifest.json", + "recordedSha256": "456b93a29ae0ce65e1490e688e5a8563fbe4ba57ac104814f344ad6e7c2ec668", + "exists": true, + "currentHash": "456b93a29ae0ce65e1490e688e5a8563fbe4ba57ac104814f344ad6e7c2ec668", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P1-003-workflow-unify_main_transaction_history_and_save.blend", + "recordedSha256": "71f784357a7c65eea5525a14c2741a92a01cc255b5ffda0dd9ae0a86fffa8e88", + "exists": true, + "currentHash": "71f784357a7c65eea5525a14c2741a92a01cc255b5ffda0dd9ae0a86fffa8e88", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P1-003.py", + "recordedSha256": "1f014abd129a927f9cc5640387df8b3b7e59a68a3080cc8a8ea7137e8c354ce9", + "exists": true, + "currentHash": "1f014abd129a927f9cc5640387df8b3b7e59a68a3080cc8a8ea7137e8c354ce9", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p1-003-desktop.py", + "recordedSha256": "8303f691cad1d5991251a9c79bd003f7c510982f18843cd68d0aecfca483026a", + "exists": true, + "currentHash": "8303f691cad1d5991251a9c79bd003f7c510982f18843cd68d0aecfca483026a", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "4e77fe6a1eb699432c8c5a8fbaae38b223f44a4cdcb314d624e2d2d4c3d570fa", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "19b7ba97bcd86e62dfba2a536d63a041bed9b39b491efc3d115fe58436d2c968", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "80fcb4b02c68de2703e6565debeafc7ee7d4c04bec125054be9e6e96da5c2ee9", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "63877fb8e5ad0fa6ffbe9a69c7f3a66c8997a59fe959bbefda185eb0bb6d0ab6", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": true + }, + { + "path": "tests/golden/WBV2-P1-003/transaction-report.json", + "recordedSha256": "28183baa4ee71827b0556a5b4e4bb9c35861a5f3f97da4623a69a03c0ada860f", + "exists": true, + "currentHash": "28183baa4ee71827b0556a5b4e4bb9c35861a5f3f97da4623a69a03c0ada860f", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-003/transaction-desktop-report.json", + "recordedSha256": "325b5eedf9d4b94dbf3652d78c27bcb908c47f3acab3d271d108fb0920e36b8d", + "exists": true, + "currentHash": "325b5eedf9d4b94dbf3652d78c27bcb908c47f3acab3d271d108fb0920e36b8d", + "drift": false + }, + { + "path": "docs/status/WBV2-P1-003.md", + "recordedSha256": "16862eadadb85109b21e24485bfb901fed453b202d64008ba5fb79ca04330570", + "exists": true, + "currentHash": "16862eadadb85109b21e24485bfb901fed453b202d64008ba5fb79ca04330570", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-003/task-context.json", + "recordedSha256": "309f8636a783ccb8a246bc5aa5e4e4dd4789865711b02017b442aa5af02f01a5", + "exists": true, + "currentHash": "309f8636a783ccb8a246bc5aa5e4e4dd4789865711b02017b442aa5af02f01a5", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-003/command.log", + "recordedSha256": "a23b25e16e8e2773bb76d9e3d3efdcff466b7a6541ae21628f6aa593b908fbf2", + "exists": true, + "currentHash": "a23b25e16e8e2773bb76d9e3d3efdcff466b7a6541ae21628f6aa593b908fbf2", + "drift": false + } + ] + }, + { + "task": "WBV2-P1-004", + "phase": "1", + "manifest": "tests/golden/WBV2-P1-004/manifest.json", + "manifestSha256": "19d9cbcf2455df8ffad49907b1765aeab45d865bd33a5771ed16a153b29887a1", + "status": "done", + "operation": "WORKER_CANCEL_RESTART_DISPOSE_LOCAL_BOUNDED", + "artifactCount": 15, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P1-003/manifest.json", + "recordedSha256": "bcdd4835ddc3f668419f6f5d505e010a7404d3c129bf85f99f587daa648f2ae1", + "exists": true, + "currentHash": "bcdd4835ddc3f668419f6f5d505e010a7404d3c129bf85f99f587daa648f2ae1", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P1-004-workflow-harden_worker_cancel_restart_and_dispose.blend", + "recordedSha256": "c17cf938451b7bdbcda9a04b1e6436f217269e3167804cc785fd0d32e2d9d4bb", + "exists": true, + "currentHash": "c17cf938451b7bdbcda9a04b1e6436f217269e3167804cc785fd0d32e2d9d4bb", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P1-004.py", + "recordedSha256": "beea3a224b47bc2c16de09805e778afd223da44f043a04929148cafcdfe3d67e", + "exists": true, + "currentHash": "beea3a224b47bc2c16de09805e778afd223da44f043a04929148cafcdfe3d67e", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p1-004-desktop.py", + "recordedSha256": "2c305e8cc4d2c4651343a40513a038d6a5ce4cd82159df4c7497698908bf2f79", + "exists": true, + "currentHash": "2c305e8cc4d2c4651343a40513a038d6a5ce4cd82159df4c7497698908bf2f79", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "9aa7dd546473eaeb63e62dd3c9ccc6bfdbd50452f06201ad5bfa93cde661c375", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "8ea2d0ea85ad508fe447316e84ebc992c772b07907c61b0b23f6dac4800ad96e", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "9aa30f025af3bc0c1a690e7deaf6ed634179000b535019a7ab5571c463e14d6e", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "39f3e713d89fff92e1126108321ec1f102d777abf194404d4e2b27d31b123cb0", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": true + }, + { + "path": "tests/golden/WBV2-P1-004/worker-lifecycle-report.json", + "recordedSha256": "2587eae7937c8c6d2611cad8dc819d385ba43799a5897b2d48417e929bc31e52", + "exists": true, + "currentHash": "2587eae7937c8c6d2611cad8dc819d385ba43799a5897b2d48417e929bc31e52", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-004/worker-lifecycle-desktop-report.json", + "recordedSha256": "b8f7c388a5203fcf8abf56eff2d6ec685f69900a44f080e7529bf77a33edd7ad", + "exists": true, + "currentHash": "b8f7c388a5203fcf8abf56eff2d6ec685f69900a44f080e7529bf77a33edd7ad", + "drift": false + }, + { + "path": "docs/status/WBV2-P1-004.md", + "recordedSha256": "479be7cdc89d63b476d2b293e27d90d54ee7b96bad79063e11d66bc3601417c3", + "exists": true, + "currentHash": "479be7cdc89d63b476d2b293e27d90d54ee7b96bad79063e11d66bc3601417c3", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-004/task-context.json", + "recordedSha256": "879cb5c392344b6abad688011ae3f4ef9229727d64c9551628a94e3f442a3638", + "exists": true, + "currentHash": "879cb5c392344b6abad688011ae3f4ef9229727d64c9551628a94e3f442a3638", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-004/command.log", + "recordedSha256": "a6c1cdf44cf6feef1919a3621004ba37bd7b9e29dc652cd8ef6417caaa539c7a", + "exists": true, + "currentHash": "a6c1cdf44cf6feef1919a3621004ba37bd7b9e29dc652cd8ef6417caaa539c7a", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-004/wasm-build.log", + "recordedSha256": "6855f81eaebc59a24adce6f99171e849d56e994ade4b3f656fb05da666695652", + "exists": true, + "currentHash": "6855f81eaebc59a24adce6f99171e849d56e994ade4b3f656fb05da666695652", + "drift": false + } + ] + }, + { + "task": "WBV2-P1-005", + "phase": "1", + "manifest": "tests/golden/WBV2-P1-005/manifest.json", + "manifestSha256": "cb22c9c218ffcac0fd45527817eb864dbaf8f677e9b18775275f2f0fc8aa302d", + "status": "done", + "operation": "STORAGE_JOURNAL_RECOVERY_LOCAL_BOUNDED", + "artifactCount": 15, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P1-004/manifest.json", + "recordedSha256": "19d9cbcf2455df8ffad49907b1765aeab45d865bd33a5771ed16a153b29887a1", + "exists": true, + "currentHash": "19d9cbcf2455df8ffad49907b1765aeab45d865bd33a5771ed16a153b29887a1", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P1-005-workflow-harden_opfs_indexeddb_journal_recovery.blend", + "recordedSha256": "07455729e45c5b59caddfd2b06dbe76296ef4cb90d558d8a6c345d96f12ebdda", + "exists": true, + "currentHash": "07455729e45c5b59caddfd2b06dbe76296ef4cb90d558d8a6c345d96f12ebdda", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P1-005.py", + "recordedSha256": "de43529b8e5a593ae6e4d7794ab62b049dc19594ac898c0719a0f55cdc56f60d", + "exists": true, + "currentHash": "de43529b8e5a593ae6e4d7794ab62b049dc19594ac898c0719a0f55cdc56f60d", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p1-005-desktop.py", + "recordedSha256": "5f0623982e94c4d7e61c3ededd8a37f9188d9165fad211af4473d604f4532676", + "exists": true, + "currentHash": "5f0623982e94c4d7e61c3ededd8a37f9188d9165fad211af4473d604f4532676", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "5cd0dd03ee788f67fe2eb4543589fee4a47c21234a419a6f18b1e3e0c3a3c2e4", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "b9b14de9b38e894d607d851eda3a868c1936529c48f035bbf92a5738905f68f3", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "4df07c381505d7c06050f568c13905d053e7b02294bd210ac162a2dd32e3074b", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": true + }, + { + "path": "tests/golden/WBV2-P1-005/storage-journal-report.json", + "recordedSha256": "4dcbc6e11868610d71bde782fbfbb84bfd94afdd6168e588d4a4e51cfd728c34", + "exists": true, + "currentHash": "4dcbc6e11868610d71bde782fbfbb84bfd94afdd6168e588d4a4e51cfd728c34", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-005/storage-journal-desktop-report.json", + "recordedSha256": "c328c0ce9e3a672c79ae21fdbe5f369ce58bd02d3e818f769b395287708c1eed", + "exists": true, + "currentHash": "c328c0ce9e3a672c79ae21fdbe5f369ce58bd02d3e818f769b395287708c1eed", + "drift": false + }, + { + "path": "docs/status/WBV2-P1-005.md", + "recordedSha256": "b779068972c37706472da7090c2a58f222e0127430c38880ca524a41cdb4da13", + "exists": true, + "currentHash": "b779068972c37706472da7090c2a58f222e0127430c38880ca524a41cdb4da13", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-005/task-context.json", + "recordedSha256": "b8353597bffc19c8e005c4ca979916a12fd6cecab6c5e7e42b639e447000c287", + "exists": true, + "currentHash": "b8353597bffc19c8e005c4ca979916a12fd6cecab6c5e7e42b639e447000c287", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-005/command.log", + "recordedSha256": "582cbd1a810f1bf7c79948bff064949a6be65093602524ce0e04ffeed61052c1", + "exists": true, + "currentHash": "582cbd1a810f1bf7c79948bff064949a6be65093602524ce0e04ffeed61052c1", + "drift": false + }, + { + "path": "tests/golden/WBV2-P1-005/wasm-build.log", + "recordedSha256": "7f21f5446576da369e7d925095695103e12be1afdec7a7e899a1d42e468fc74c", + "exists": true, + "currentHash": "7f21f5446576da369e7d925095695103e12be1afdec7a7e899a1d42e468fc74c", + "drift": false + } + ] + }, + { + "task": "WBV2-P2-001", + "phase": "2", + "manifest": "tests/golden/WBV2-P2-001/manifest.json", + "manifestSha256": "ad6d73ac457d20f95fd080fcdacc38049d2ce9faa8c56f325f9f7f22074d1cb5", + "status": "done", + "operation": "EDITOR_OPEN_SCENE_LOCAL_EXACT", + "artifactCount": 14, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P1-005/manifest.json", + "recordedSha256": "cb22c9c218ffcac0fd45527817eb864dbaf8f677e9b18775275f2f0fc8aa302d", + "exists": true, + "currentHash": "cb22c9c218ffcac0fd45527817eb864dbaf8f677e9b18775275f2f0fc8aa302d", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P2-001-EDITOR.OPEN_SCENE.blend", + "recordedSha256": "b84250d06f42b32b5c4912cb2411b90dda2167c69681d0e7e861d84352eec78c", + "exists": true, + "currentHash": "b84250d06f42b32b5c4912cb2411b90dda2167c69681d0e7e861d84352eec78c", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P2-001.py", + "recordedSha256": "747c9d734e90673dc7d6b3e01411bfc9443ffda9c22dc61d55c46207740c0df6", + "exists": true, + "currentHash": "747c9d734e90673dc7d6b3e01411bfc9443ffda9c22dc61d55c46207740c0df6", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p2-001-desktop.py", + "recordedSha256": "17db8ed9655ccdf1bfe0283cba2eae501abfb9cdbccdf5bd7ed665a52ee819d2", + "exists": true, + "currentHash": "17db8ed9655ccdf1bfe0283cba2eae501abfb9cdbccdf5bd7ed665a52ee819d2", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "057753285f557b170cfda69dd0c116854b2042c9163948f2f33eddfb639d4904", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "754300d1fc9cdfffb4286e36054c0ab724c8bad067761e4b7c2718ed236b23e9", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "4df07c381505d7c06050f568c13905d053e7b02294bd210ac162a2dd32e3074b", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": true + }, + { + "path": "tests/golden/WBV2-P2-001/editor-open-scene-report.json", + "recordedSha256": "f602facfecca629e95f0231ff0e4de4a25b2e7a1b2a7f7103288f8e285be6c6d", + "exists": true, + "currentHash": "f602facfecca629e95f0231ff0e4de4a25b2e7a1b2a7f7103288f8e285be6c6d", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-001/editor-open-scene-desktop-report.json", + "recordedSha256": "644db9afdd919c938ca1067946e242d516d3aba90aa5a2f32d9754730df8a874", + "exists": true, + "currentHash": "644db9afdd919c938ca1067946e242d516d3aba90aa5a2f32d9754730df8a874", + "drift": false + }, + { + "path": "docs/status/WBV2-P2-001.md", + "recordedSha256": "29acd859aeb6d173ce4bbdff9fd103b699a0b6ff486c12b7ebecc123b7a1d82e", + "exists": true, + "currentHash": "29acd859aeb6d173ce4bbdff9fd103b699a0b6ff486c12b7ebecc123b7a1d82e", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-001/task-context.json", + "recordedSha256": "c2294208826024535cd505938658535352c6f1b8b8938e5bcd2ad90dbe2fe538", + "exists": true, + "currentHash": "c2294208826024535cd505938658535352c6f1b8b8938e5bcd2ad90dbe2fe538", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-001/command.log", + "recordedSha256": "1ff373478efc0559ff869c17e13087856d4fb88609d715193f77dce819b292bd", + "exists": true, + "currentHash": "1ff373478efc0559ff869c17e13087856d4fb88609d715193f77dce819b292bd", + "drift": false + } + ] + }, + { + "task": "WBV2-P2-002", + "phase": "2", + "manifest": "tests/golden/WBV2-P2-002/manifest.json", + "manifestSha256": "fa65312256f556ce80609206e266f7fc3ccbeda34eae3da179040f8e80dd017c", + "status": "done", + "operation": "OBJECT_TRANSFORM_HIERARCHY_LOCAL_EXACT", + "artifactCount": 17, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P2-001/manifest.json", + "recordedSha256": "ad6d73ac457d20f95fd080fcdacc38049d2ce9faa8c56f325f9f7f22074d1cb5", + "exists": true, + "currentHash": "ad6d73ac457d20f95fd080fcdacc38049d2ce9faa8c56f325f9f7f22074d1cb5", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", + "recordedSha256": "62c70feb65822a58c38024d604d4cf93809372c3b7e79493f7829c4039ae01e6", + "exists": true, + "currentHash": "62c70feb65822a58c38024d604d4cf93809372c3b7e79493f7829c4039ae01e6", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P2-002.py", + "recordedSha256": "17f6a47ab91b92a8128829b011a3341ba7f9cb67192cb7bc81c1a09f72227d65", + "exists": true, + "currentHash": "17f6a47ab91b92a8128829b011a3341ba7f9cb67192cb7bc81c1a09f72227d65", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p2-002-desktop.py", + "recordedSha256": "d1568d92ccfda05d7b580ab1c8e4a709e617cb65f78bcb995df7da88373c14c5", + "exists": true, + "currentHash": "d1568d92ccfda05d7b580ab1c8e4a709e617cb65f78bcb995df7da88373c14c5", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "recordedSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "exists": true, + "currentHash": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "recordedSha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "exists": true, + "currentHash": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "ed85b49db9539efe2080d47365274e7731175b18e8e02812980fb86c792203cf", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "9eb8feba27f073b79a03f3285a8ffb45aa1c89008931656e4b195d9da21f7002", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-002/object-transform-report.json", + "recordedSha256": "17ede4ecd88d750dfb88e4ef3ab8467d55eb3be221e0d0f58b47bf20b80e646f", + "exists": true, + "currentHash": "17ede4ecd88d750dfb88e4ef3ab8467d55eb3be221e0d0f58b47bf20b80e646f", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-002/object-transform-desktop-report.json", + "recordedSha256": "045543872dd311216d21d57b6f33285234e444c9c77532c7d53f66708d7293fc", + "exists": true, + "currentHash": "045543872dd311216d21d57b6f33285234e444c9c77532c7d53f66708d7293fc", + "drift": false + }, + { + "path": "docs/status/WBV2-P2-002.md", + "recordedSha256": "380a34433691aea47a6e34a7deb1c506dfde8dac2d1773d1e4b11579fc08b7a3", + "exists": true, + "currentHash": "380a34433691aea47a6e34a7deb1c506dfde8dac2d1773d1e4b11579fc08b7a3", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-002/task-context.json", + "recordedSha256": "e72ab724eb1f096ec1927091fac80c121343ea8a3e0a675f33032f84d47840be", + "exists": true, + "currentHash": "e72ab724eb1f096ec1927091fac80c121343ea8a3e0a675f33032f84d47840be", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-002/command.log", + "recordedSha256": "790054e07e23af09908cb2d2518cbe8607c503d6f4384a166cc25b5276b1445d", + "exists": true, + "currentHash": "790054e07e23af09908cb2d2518cbe8607c503d6f4384a166cc25b5276b1445d", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-002/wasm-build.log", + "recordedSha256": "a74e9b6691395cb4fea394bf711716774a5fc9349196706f8701c5ba285bf95e", + "exists": true, + "currentHash": "a74e9b6691395cb4fea394bf711716774a5fc9349196706f8701c5ba285bf95e", + "drift": false + } + ] + }, + { + "task": "WBV2-P2-003", + "phase": "2", + "manifest": "tests/golden/WBV2-P2-003/manifest.json", + "manifestSha256": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987", + "status": "done", + "operation": "MESH_EDIT_CORE_LOCAL_EXACT", + "artifactCount": 17, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P2-002/manifest.json", + "recordedSha256": "fa65312256f556ce80609206e266f7fc3ccbeda34eae3da179040f8e80dd017c", + "exists": true, + "currentHash": "fa65312256f556ce80609206e266f7fc3ccbeda34eae3da179040f8e80dd017c", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", + "recordedSha256": "1a9a894c4106d73a4533485d9fdddfe2883f75e4692b8e53dc174308e12fe60b", + "exists": true, + "currentHash": "1a9a894c4106d73a4533485d9fdddfe2883f75e4692b8e53dc174308e12fe60b", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P2-003.py", + "recordedSha256": "65d90913dfd63b345c5efc7851bf312330b0a37ed31c4fdb928ba36fb25e77b6", + "exists": true, + "currentHash": "65d90913dfd63b345c5efc7851bf312330b0a37ed31c4fdb928ba36fb25e77b6", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p2-003-desktop.py", + "recordedSha256": "640048eb905b3849669f6b74bb19ca126851c8cbd4e525c9b7d00d70fe40e3e6", + "exists": true, + "currentHash": "640048eb905b3849669f6b74bb19ca126851c8cbd4e525c9b7d00d70fe40e3e6", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "recordedSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "exists": true, + "currentHash": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "recordedSha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "exists": true, + "currentHash": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "29582f7109c8e2b8584e85d7cd15dc2f91ce4f276a580eccae249ae8d4a2095f", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "4f38de9f1502b6676cfba72942af965aa040708c40345e36854d3240f8c82729", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-003/mesh-edit-report.json", + "recordedSha256": "f8bd2ced2e1345248d4b536ef045bb9446a55ca5ae87d834f38904b86521b11d", + "exists": true, + "currentHash": "f8bd2ced2e1345248d4b536ef045bb9446a55ca5ae87d834f38904b86521b11d", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-003/mesh-edit-desktop-report.json", + "recordedSha256": "de03b2c0f35e8d437d164b8d010438c1fbc004f933f8a13470874f02247b74c8", + "exists": true, + "currentHash": "de03b2c0f35e8d437d164b8d010438c1fbc004f933f8a13470874f02247b74c8", + "drift": false + }, + { + "path": "docs/status/WBV2-P2-003.md", + "recordedSha256": "b861926c45ab96465e419fccabbcd01d887359d5493e477e12c1d23a1ee1c645", + "exists": true, + "currentHash": "b861926c45ab96465e419fccabbcd01d887359d5493e477e12c1d23a1ee1c645", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-003/task-context.json", + "recordedSha256": "41ab5af171f582c766a47e1dd39c748b6a0709333b45264843ba8cf75216b890", + "exists": true, + "currentHash": "41ab5af171f582c766a47e1dd39c748b6a0709333b45264843ba8cf75216b890", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-003/command.log", + "recordedSha256": "fec55388964c4f0c2288b35a5046a73779eb918d96225909b9070614c07eb3c1", + "exists": true, + "currentHash": "fec55388964c4f0c2288b35a5046a73779eb918d96225909b9070614c07eb3c1", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-003/wasm-build.log", + "recordedSha256": "90e0120b3f5a5806c188408c5c5a0b3c4b5adade16d66a99640b9ed011ee22c5", + "exists": true, + "currentHash": "90e0120b3f5a5806c188408c5c5a0b3c4b5adade16d66a99640b9ed011ee22c5", + "drift": false + } + ] + }, + { + "task": "WBV2-P2-004", + "phase": "2", + "manifest": "tests/golden/WBV2-P2-004/manifest.json", + "manifestSha256": "9a511f9620bdc886ab4684ac449dcaa156086cde76c0b95d16795f0f51a304f2", + "status": "done", + "operation": "VIEWPORT_MAIN_OFFSCREEN_LOCAL_BOUNDED", + "artifactCount": 20, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P2-003/manifest.json", + "recordedSha256": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987", + "exists": true, + "currentHash": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P2-004-VIEWPORT.MAIN_OFFSCREEN.blend", + "recordedSha256": "69cb86102cad7f6a8e747ed29b3456761ba4a1de7f33e7c0d6dc7d3b5dbd2e17", + "exists": true, + "currentHash": "69cb86102cad7f6a8e747ed29b3456761ba4a1de7f33e7c0d6dc7d3b5dbd2e17", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P2-004.py", + "recordedSha256": "fad8f75b84b5c4c1757645e94d81af265aba8f911d2ffd1c05abcffc24b24a51", + "exists": true, + "currentHash": "fad8f75b84b5c4c1757645e94d81af265aba8f911d2ffd1c05abcffc24b24a51", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p2-004-desktop.py", + "recordedSha256": "cd936e328b79a83db910099a20136bac694c446509d8618cd199d6f8c7d34625", + "exists": true, + "currentHash": "cd936e328b79a83db910099a20136bac694c446509d8618cd199d6f8c7d34625", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "29582f7109c8e2b8584e85d7cd15dc2f91ce4f276a580eccae249ae8d4a2095f", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "4f38de9f1502b6676cfba72942af965aa040708c40345e36854d3240f8c82729", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/three-adapter/offscreen-viewport-protocol.ts", + "recordedSha256": "d79367b6361036a4d5b8cf0d12d9ffce783e3e2b6d686b5b5b152aa40ac9ae2e", + "exists": true, + "currentHash": "d79367b6361036a4d5b8cf0d12d9ffce783e3e2b6d686b5b5b152aa40ac9ae2e", + "drift": false + }, + { + "path": "web/app/src/three-adapter/offscreen-viewport.ts", + "recordedSha256": "1d7d18146d34245e07392022a703ff16f6432093fb88e788927e1347556ffd71", + "exists": true, + "currentHash": "1d7d18146d34245e07392022a703ff16f6432093fb88e788927e1347556ffd71", + "drift": false + }, + { + "path": "web/app/src/workers/viewport-render.worker.ts", + "recordedSha256": "9643724d2530a0af434613d4734f66fb18620a11e9f487d4d9d9e6312374c14b", + "exists": true, + "currentHash": "9643724d2530a0af434613d4734f66fb18620a11e9f487d4d9d9e6312374c14b", + "drift": false + }, + { + "path": "web/app/src/three-adapter/viewport.ts", + "recordedSha256": "e8d97cb59fd4eca3789aeeb35221a70cf47ef048a5665383d809d0efc49f7119", + "exists": true, + "currentHash": "e8d97cb59fd4eca3789aeeb35221a70cf47ef048a5665383d809d0efc49f7119", + "drift": false + }, + { + "path": "web/package.json", + "recordedSha256": "40b7f14d4f568ae94bedde83e02115c127e0c714e5eb32a6a97b1e1084c4fa68", + "exists": true, + "currentHash": "40b7f14d4f568ae94bedde83e02115c127e0c714e5eb32a6a97b1e1084c4fa68", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-004/viewport-report.json", + "recordedSha256": "a38e7ff8da3042a82f4d20f9f6c60300ebd6ee393cf3625901c770ebff674dac", + "exists": true, + "currentHash": "a38e7ff8da3042a82f4d20f9f6c60300ebd6ee393cf3625901c770ebff674dac", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-004/viewport-desktop-report.json", + "recordedSha256": "24383a87477efe6d72f457819260143d0b5f1a5b5c918a8e39279a13a3bfdc0c", + "exists": true, + "currentHash": "24383a87477efe6d72f457819260143d0b5f1a5b5c918a8e39279a13a3bfdc0c", + "drift": false + }, + { + "path": "docs/status/WBV2-P2-004.md", + "recordedSha256": "56194bd7e40632398823467ab5cc1fd9b633f4605086bd40acc3865a94cfb268", + "exists": true, + "currentHash": "56194bd7e40632398823467ab5cc1fd9b633f4605086bd40acc3865a94cfb268", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-004/task-context.json", + "recordedSha256": "7071c819b734d543cda60f3ac833d6b004befc1f3484c1396ebd9c96afd7c679", + "exists": true, + "currentHash": "7071c819b734d543cda60f3ac833d6b004befc1f3484c1396ebd9c96afd7c679", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-004/command.log", + "recordedSha256": "a2f494634f16d33ed5d341d241b190a4dd34c9b0ba39f0834afc1f48f7c67867", + "exists": true, + "currentHash": "a2f494634f16d33ed5d341d241b190a4dd34c9b0ba39f0834afc1f48f7c67867", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-004/browser-build.log", + "recordedSha256": "60187c83b43444ff22d02e505e74a94dc3c4b058d4c4f280ae67701089ab67af", + "exists": true, + "currentHash": "60187c83b43444ff22d02e505e74a94dc3c4b058d4c4f280ae67701089ab67af", + "drift": false + } + ] + }, + { + "task": "WBV2-P2-005", + "phase": "2", + "manifest": "tests/golden/WBV2-P2-005/manifest.json", + "manifestSha256": "284eda53bb4191da68a30b4fcb8e02801cb83299864846f7e52875f4d976b7be", + "status": "done", + "operation": "WORKFLOW_P0_USER_LOOP_LOCAL_BOUNDED", + "artifactCount": 17, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P2-004/manifest.json", + "recordedSha256": "9a511f9620bdc886ab4684ac449dcaa156086cde76c0b95d16795f0f51a304f2", + "exists": true, + "currentHash": "9a511f9620bdc886ab4684ac449dcaa156086cde76c0b95d16795f0f51a304f2", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P2-005-WORKFLOW.P0_USER_LOOP.blend", + "recordedSha256": "51788408d7b1a273583872b749eec36191db441d431b2d4ddcfffecddb256999", + "exists": true, + "currentHash": "51788408d7b1a273583872b749eec36191db441d431b2d4ddcfffecddb256999", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P2-005.py", + "recordedSha256": "96f6788bbe901f98d1bb2b50ec49e6d0418a8ec3c784e95dce54e7a1eab49e19", + "exists": true, + "currentHash": "96f6788bbe901f98d1bb2b50ec49e6d0418a8ec3c784e95dce54e7a1eab49e19", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p2-005-desktop.py", + "recordedSha256": "176359ff0665ec2fc1b62b0ac9a5af96dbc70977c7e5100c99aed5fd22b5e524", + "exists": true, + "currentHash": "176359ff0665ec2fc1b62b0ac9a5af96dbc70977c7e5100c99aed5fd22b5e524", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "0f979e0f5f14a5db97d2f7cb24a8c4e13980db64268d4161cc9b520cad1ac4fa", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "e3460ba1f57bab2b17d98faec55dedc16bc4bcea4c23945196285dd7688f8cfd", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/app/App.tsx", + "recordedSha256": "5861988f3dfbb8c05d36aee3033a72514de53a0cb4ec6f3d832418ef6b5cc8b2", + "exists": true, + "currentHash": "5861988f3dfbb8c05d36aee3033a72514de53a0cb4ec6f3d832418ef6b5cc8b2", + "drift": false + }, + { + "path": "web/app/src/engine-client/WebEngineClient.ts", + "recordedSha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b", + "exists": true, + "currentHash": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b", + "drift": false + }, + { + "path": "web/protocol/glb-export.ts", + "recordedSha256": "a5d342827860a9e55b49a3bb3a196a01b1e53546325d6e594778afb9360c3125", + "exists": true, + "currentHash": "a5d342827860a9e55b49a3bb3a196a01b1e53546325d6e594778afb9360c3125", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-005/workflow-report.json", + "recordedSha256": "aee794bac23af8acaaabe8ed808fad27a97dc628ed1cadd6224db2573b0a77ec", + "exists": true, + "currentHash": "aee794bac23af8acaaabe8ed808fad27a97dc628ed1cadd6224db2573b0a77ec", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-005/workflow-desktop-report.json", + "recordedSha256": "4a39d9dccfb2fa80992ca6abab2afcfd33052e427e3fd5f602c6bfb96622bdbe", + "exists": true, + "currentHash": "4a39d9dccfb2fa80992ca6abab2afcfd33052e427e3fd5f602c6bfb96622bdbe", + "drift": false + }, + { + "path": "docs/status/WBV2-P2-005.md", + "recordedSha256": "f6be0ed47988bf3cab9a562ee36e31057919189fc589e17ced60c313ebf8fcee", + "exists": true, + "currentHash": "f6be0ed47988bf3cab9a562ee36e31057919189fc589e17ced60c313ebf8fcee", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-005/task-context.json", + "recordedSha256": "9b494efbfa077f3d37b186a42631029e11108cef83a40aae1cab98f41312a276", + "exists": true, + "currentHash": "9b494efbfa077f3d37b186a42631029e11108cef83a40aae1cab98f41312a276", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-005/command.log", + "recordedSha256": "a12ee0d21a00299b7d64be7814e479c4ab350e8e799b406af6849527feb2027d", + "exists": true, + "currentHash": "a12ee0d21a00299b7d64be7814e479c4ab350e8e799b406af6849527feb2027d", + "drift": false + } + ] + }, + { + "task": "WBV2-P3-001", + "phase": "3", + "manifest": "tests/golden/WBV2-P3-001/manifest.json", + "manifestSha256": "e3b037fdcf55b5e64fd770c6fa90d0b72e96b3e764a305df0ceee378fa167191", + "status": "done", + "operation": "MATERIAL_PBR_UV_LOCAL_BOUNDED", + "artifactCount": 14, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P2-005/manifest.json", + "recordedSha256": "284eda53bb4191da68a30b4fcb8e02801cb83299864846f7e52875f4d976b7be", + "exists": true, + "currentHash": "284eda53bb4191da68a30b4fcb8e02801cb83299864846f7e52875f4d976b7be", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend", + "recordedSha256": "cdf3a13e88a2084e9ac46b998a9ad1975c5e20e2bc0f2a68038c62de8801ed22", + "exists": true, + "currentHash": "cdf3a13e88a2084e9ac46b998a9ad1975c5e20e2bc0f2a68038c62de8801ed22", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P3-001.py", + "recordedSha256": "1fa6f39ccb9470e8fe9fc7763b9a96e084b75e75f5a73a88de5f7bf321a317d2", + "exists": true, + "currentHash": "1fa6f39ccb9470e8fe9fc7763b9a96e084b75e75f5a73a88de5f7bf321a317d2", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p3-001-desktop.py", + "recordedSha256": "28b11bcb36bd52d5bb2968719bbc22874c46253f5eb62bfe1c6acad7f993dd1e", + "exists": true, + "currentHash": "28b11bcb36bd52d5bb2968719bbc22874c46253f5eb62bfe1c6acad7f993dd1e", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "b26901f733040884038f38e12bd607da27cd91891776e7b67a774b000180fab6", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "e3460ba1f57bab2b17d98faec55dedc16bc4bcea4c23945196285dd7688f8cfd", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-001/material-report.json", + "recordedSha256": "8ab3dd49364a2f6c5404249f1433fc1f2085d9deaf9a6d126732dbd7ca9d262c", + "exists": true, + "currentHash": "8ab3dd49364a2f6c5404249f1433fc1f2085d9deaf9a6d126732dbd7ca9d262c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-001/material-desktop-report.json", + "recordedSha256": "7635ae921b318f82bb8f3b0b1bbfadad4239eae2ef68195f4628f94bc996b6f6", + "exists": true, + "currentHash": "7635ae921b318f82bb8f3b0b1bbfadad4239eae2ef68195f4628f94bc996b6f6", + "drift": false + }, + { + "path": "docs/status/WBV2-P3-001.md", + "recordedSha256": "f0550ca889d8a3991a966b7a8eefc2e15efd19d326bbc0a697b69d74a777d736", + "exists": true, + "currentHash": "f0550ca889d8a3991a966b7a8eefc2e15efd19d326bbc0a697b69d74a777d736", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-001/task-context.json", + "recordedSha256": "fceb8038a8535494c54363b43d01fe1e2166c3c2d658e3ebec045e292f3f02a9", + "exists": true, + "currentHash": "fceb8038a8535494c54363b43d01fe1e2166c3c2d658e3ebec045e292f3f02a9", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-001/command.log", + "recordedSha256": "f93d4c2526d3b22fd3c017804bb3cb8be57828a4a7943703bf15a570184acdf5", + "exists": true, + "currentHash": "f93d4c2526d3b22fd3c017804bb3cb8be57828a4a7943703bf15a570184acdf5", + "drift": false + } + ] + }, + { + "task": "WBV2-P3-002", + "phase": "3", + "manifest": "tests/golden/WBV2-P3-002/manifest.json", + "manifestSha256": "cc36b933a2b6d817ea7226c07d0617ecdf2f89575136a83cb15de4e7c8f59188", + "status": "done", + "operation": "ANIMATION_TRS_ACTION_LOCAL_EXACT", + "artifactCount": 14, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P3-001/manifest.json", + "recordedSha256": "e3b037fdcf55b5e64fd770c6fa90d0b72e96b3e764a305df0ceee378fa167191", + "exists": true, + "currentHash": "e3b037fdcf55b5e64fd770c6fa90d0b72e96b3e764a305df0ceee378fa167191", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P3-002-ANIMATION.TRS_ACTION.blend", + "recordedSha256": "63b8b79115cf7305931cd92cacaef3a2d7ee68b8690056f402bd129048460b1d", + "exists": true, + "currentHash": "63b8b79115cf7305931cd92cacaef3a2d7ee68b8690056f402bd129048460b1d", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P3-002.py", + "recordedSha256": "554cb2f010c3ad641fd9889fecffb3c229db6d17f0da5d1b3565ae1ecb7b7264", + "exists": true, + "currentHash": "554cb2f010c3ad641fd9889fecffb3c229db6d17f0da5d1b3565ae1ecb7b7264", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p3-002-desktop.py", + "recordedSha256": "a0a245d402129eb1440be22a061f10a73e432ab26d3078edc8d8bbfa182464dd", + "exists": true, + "currentHash": "a0a245d402129eb1440be22a061f10a73e432ab26d3078edc8d8bbfa182464dd", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "1f1528c1e365c52013d41c1b4b9b5457e763e536bedc35d8569d38e4c2fdb883", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "fd6f32cc1527dd950d95684b8cf20b2ce513637f7a3e7eaa05f1442986c94d61", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-002/animation-report.json", + "recordedSha256": "ac7bb8bbfa6db703c6d128ba5772213f46370be3a986cefcc2da99a1a9aad843", + "exists": true, + "currentHash": "ac7bb8bbfa6db703c6d128ba5772213f46370be3a986cefcc2da99a1a9aad843", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-002/animation-desktop-report.json", + "recordedSha256": "b4f6021f1d1f8a3619fe2c6d31438ff06c27ea32f220952b00afbb93cf990b3c", + "exists": true, + "currentHash": "b4f6021f1d1f8a3619fe2c6d31438ff06c27ea32f220952b00afbb93cf990b3c", + "drift": false + }, + { + "path": "docs/status/WBV2-P3-002.md", + "recordedSha256": "c98a2b482dbe0ab075c6d093a596a8fc0907f2d4136abd88379bea862471f434", + "exists": true, + "currentHash": "c98a2b482dbe0ab075c6d093a596a8fc0907f2d4136abd88379bea862471f434", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-002/task-context.json", + "recordedSha256": "cd7b2b40ffa32edf31d99d6c05a37a946c2edd9d3d0fd58c3da365bcba4ab01f", + "exists": true, + "currentHash": "cd7b2b40ffa32edf31d99d6c05a37a946c2edd9d3d0fd58c3da365bcba4ab01f", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-002/command.log", + "recordedSha256": "a7ce194f072c321bb9f4ed5739ffc98a8b80c0c596cfb3567f152c802372450b", + "exists": true, + "currentHash": "a7ce194f072c321bb9f4ed5739ffc98a8b80c0c596cfb3567f152c802372450b", + "drift": false + } + ] + }, + { + "task": "WBV2-P3-003", + "phase": "3", + "manifest": "tests/golden/WBV2-P3-003/manifest.json", + "manifestSha256": "1b97d2ca9add58a6185a21137729edc4c8b11a2d21be1682793e3d05b9ef9011", + "status": "done", + "operation": "RIG_POSE_SKIN_LOCAL_BOUNDED", + "artifactCount": 14, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P3-002/manifest.json", + "recordedSha256": "cc36b933a2b6d817ea7226c07d0617ecdf2f89575136a83cb15de4e7c8f59188", + "exists": true, + "currentHash": "cc36b933a2b6d817ea7226c07d0617ecdf2f89575136a83cb15de4e7c8f59188", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend", + "recordedSha256": "1044ac6b81561ef0f5f22578c279de82fcb2d543eff822d0375d59f35bb6d142", + "exists": true, + "currentHash": "1044ac6b81561ef0f5f22578c279de82fcb2d543eff822d0375d59f35bb6d142", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P3-003.py", + "recordedSha256": "a811e8bd42890c17cffa0575f8e629a8fe42db2751cef629ed9c2ca5f8cab821", + "exists": true, + "currentHash": "a811e8bd42890c17cffa0575f8e629a8fe42db2751cef629ed9c2ca5f8cab821", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p3-003-desktop.py", + "recordedSha256": "830a084420632c31ec64fc2a4d68d7007a3e5730d8ff29ab0841c6bc8a6a9923", + "exists": true, + "currentHash": "830a084420632c31ec64fc2a4d68d7007a3e5730d8ff29ab0841c6bc8a6a9923", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "2ce9756a1c2f2a858413adf6051aa4147ad0313b2207e02018fc6f6ed3348a6f", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "273702e48f09e29f06f2918a0450a5a5a1852f94f10e3e22bc3a7a91262a7d84", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-003/rig-report.json", + "recordedSha256": "13b1227a6dcb02fbbf0d618b6fc8d504fa81a9e7babec1973e9814639a5ea028", + "exists": true, + "currentHash": "13b1227a6dcb02fbbf0d618b6fc8d504fa81a9e7babec1973e9814639a5ea028", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-003/rig-desktop-report.json", + "recordedSha256": "6331aeeabdfa3a48ab9c1d8fd6cd6fd986b204f1a89d899098539ddbeb678b8f", + "exists": true, + "currentHash": "6331aeeabdfa3a48ab9c1d8fd6cd6fd986b204f1a89d899098539ddbeb678b8f", + "drift": false + }, + { + "path": "docs/status/WBV2-P3-003.md", + "recordedSha256": "1267edaa74e65c4fa898d574460a8ddad995b501cab6d11542ea585fcebf4b52", + "exists": true, + "currentHash": "1267edaa74e65c4fa898d574460a8ddad995b501cab6d11542ea585fcebf4b52", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-003/task-context.json", + "recordedSha256": "a12d0be9cafbb644c7e74946e1d7e5cac4d0bcb212c2cfab8362445c29d90052", + "exists": true, + "currentHash": "a12d0be9cafbb644c7e74946e1d7e5cac4d0bcb212c2cfab8362445c29d90052", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-003/command.log", + "recordedSha256": "19b83f9e589ff9a81c109b4df70bdb728cd3374a75b5ad7d51e4f5b0c5fbb0dd", + "exists": true, + "currentHash": "19b83f9e589ff9a81c109b4df70bdb728cd3374a75b5ad7d51e4f5b0c5fbb0dd", + "drift": false + } + ] + }, + { + "task": "WBV2-P3-004", + "phase": "3", + "manifest": "tests/golden/WBV2-P3-004/manifest.json", + "manifestSha256": "bb4f2783eaa78a0104045048fc9f5d925a78e5a2539f5f1b9e699a067d05fa27", + "status": "done", + "operation": "IO_GLB_ROUNDTRIP_LOCAL_EXACT", + "artifactCount": 14, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P3-003/manifest.json", + "recordedSha256": "1b97d2ca9add58a6185a21137729edc4c8b11a2d21be1682793e3d05b9ef9011", + "exists": true, + "currentHash": "1b97d2ca9add58a6185a21137729edc4c8b11a2d21be1682793e3d05b9ef9011", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P3-004-IO.GLB_ROUNDTRIP.blend", + "recordedSha256": "64279933b4c2fb00b02496f8e1322893a6c95f8fb99a996c06b8f8323bfbec5d", + "exists": true, + "currentHash": "64279933b4c2fb00b02496f8e1322893a6c95f8fb99a996c06b8f8323bfbec5d", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P3-004.py", + "recordedSha256": "b5406e2c3612264c1708f2d8bfb7b90a39b8b179a0beee6fc5a21108e7d1c78c", + "exists": true, + "currentHash": "b5406e2c3612264c1708f2d8bfb7b90a39b8b179a0beee6fc5a21108e7d1c78c", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p3-004-desktop.py", + "recordedSha256": "ff45538a4695331c36f3332a29dc3f745d2cf70c23667ae79988eae654ddae13", + "exists": true, + "currentHash": "ff45538a4695331c36f3332a29dc3f745d2cf70c23667ae79988eae654ddae13", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "7c7a0f4a499a186dac777e0f5c1d7b33dba5daa2b507c9a76f560c5c243942e4", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "158e60e76aace9dd55da0ee5edf986886a7fa288bd256c31695d91064cd83e2a", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-004/glb-report.json", + "recordedSha256": "9f642f50c7764928909346e91ab11becc5e7e3794760e53ea1d3cef9055e8626", + "exists": true, + "currentHash": "9f642f50c7764928909346e91ab11becc5e7e3794760e53ea1d3cef9055e8626", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-004/glb-desktop-report.json", + "recordedSha256": "cae8772fde2b760ed0dbbb72cbbaeaccba185470267689b283191e549544a18d", + "exists": true, + "currentHash": "cae8772fde2b760ed0dbbb72cbbaeaccba185470267689b283191e549544a18d", + "drift": false + }, + { + "path": "docs/status/WBV2-P3-004.md", + "recordedSha256": "b219d5102db552d7cb0fb2e0697f6a24ccb071beb5a9c0a1c4b87ca513fdd20a", + "exists": true, + "currentHash": "b219d5102db552d7cb0fb2e0697f6a24ccb071beb5a9c0a1c4b87ca513fdd20a", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-004/task-context.json", + "recordedSha256": "5c60c5b6f37956f7578723d7ec69374dcf2b19d177cac967b876e427d6791d05", + "exists": true, + "currentHash": "5c60c5b6f37956f7578723d7ec69374dcf2b19d177cac967b876e427d6791d05", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-004/command.log", + "recordedSha256": "2b4fb1a8dc840ebe2ddecff73727081af0a4690c0deed0946f99fdd2f9b3fbbe", + "exists": true, + "currentHash": "2b4fb1a8dc840ebe2ddecff73727081af0a4690c0deed0946f99fdd2f9b3fbbe", + "drift": false + } + ] + }, + { + "task": "WBV2-P3-005", + "phase": "3", + "manifest": "tests/golden/WBV2-P3-005/manifest.json", + "manifestSha256": "42dc02d198630c2735c5a0a1beab37f2a98ff0233927215099f67606d248c39e", + "status": "done", + "operation": "ASSET_LIBRARY_APPEND_LINK_OVERRIDE_LOCAL_BOUNDED", + "artifactCount": 15, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P3-004/manifest.json", + "recordedSha256": "bb4f2783eaa78a0104045048fc9f5d925a78e5a2539f5f1b9e699a067d05fa27", + "exists": true, + "currentHash": "bb4f2783eaa78a0104045048fc9f5d925a78e5a2539f5f1b9e699a067d05fa27", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P3-005-ASSET.LIBRARY_OPERATIONS.blend", + "recordedSha256": "86af081b949ac96d6431303464852b4e983cf8c3d05671cacb36e1de4267a425", + "exists": true, + "currentHash": "86af081b949ac96d6431303464852b4e983cf8c3d05671cacb36e1de4267a425", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2P3005Library.blend", + "recordedSha256": "dcda742db77c6af5e05b79e006a0bd89cf1e8ea8d438592cd1ed2e981c7aca76", + "exists": true, + "currentHash": "dcda742db77c6af5e05b79e006a0bd89cf1e8ea8d438592cd1ed2e981c7aca76", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P3-005.py", + "recordedSha256": "50e5f7b3db1fec8eb3e2aa22e7ce4a8d40cb1ef01c8ec8dda59a3a3fe06c0253", + "exists": true, + "currentHash": "50e5f7b3db1fec8eb3e2aa22e7ce4a8d40cb1ef01c8ec8dda59a3a3fe06c0253", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p3-005-desktop.py", + "recordedSha256": "4605e4a453e8b767fc187f0de69a51100a46a4d78d03a03d7ec1adb43fa376ee", + "exists": true, + "currentHash": "4605e4a453e8b767fc187f0de69a51100a46a4d78d03a03d7ec1adb43fa376ee", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "c3f5e581e460d9c44beea583b241e5b56ae0d163e134bd7862bc03d10a7bb13a", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "158dcb322959d845908a5414952ce9300e524de7cd85b3773472d05fe52549dd", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-005/library-report.json", + "recordedSha256": "0b572a5b480dd9b123cbb9c55c842fb002b1a8a6c96afd196af90bee1ebd9940", + "exists": true, + "currentHash": "0b572a5b480dd9b123cbb9c55c842fb002b1a8a6c96afd196af90bee1ebd9940", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-005/library-desktop-report.json", + "recordedSha256": "eb8512d3fd78e8588284b9acb2f6b3eaf72f2c36912483f1dc030da3464f8cdd", + "exists": true, + "currentHash": "eb8512d3fd78e8588284b9acb2f6b3eaf72f2c36912483f1dc030da3464f8cdd", + "drift": false + }, + { + "path": "docs/status/WBV2-P3-005.md", + "recordedSha256": "b1ef6eff8c5f0d64d651de2dffe0d2c914e8726711c42259ee7c0cc3bbcd1cd6", + "exists": true, + "currentHash": "b1ef6eff8c5f0d64d651de2dffe0d2c914e8726711c42259ee7c0cc3bbcd1cd6", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-005/task-context.json", + "recordedSha256": "df8ed12aa4ecb585e59eb212ea4d16fbc0dc1299668a44283fcde9886ddc912f", + "exists": true, + "currentHash": "df8ed12aa4ecb585e59eb212ea4d16fbc0dc1299668a44283fcde9886ddc912f", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-005/command.log", + "recordedSha256": "f72bc26c0000a8d38a6ccf91690567d17974d3fdd9226a314bfaf4720d2af6ab", + "exists": true, + "currentHash": "f72bc26c0000a8d38a6ccf91690567d17974d3fdd9226a314bfaf4720d2af6ab", + "drift": false + } + ] + }, + { + "task": "WBV2-P4-001", + "phase": "4", + "manifest": "tests/golden/WBV2-P4-001/manifest.json", + "manifestSha256": "6f1bee73c987f5e66733feb03d1d708e0f2dbd0776ac6634dbf694cde385143c", + "status": "done", + "operation": "MODIFIER_DECLARED_SLICES_LOCAL_BOUNDED", + "artifactCount": 16, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P3-005/manifest.json", + "recordedSha256": "42dc02d198630c2735c5a0a1beab37f2a98ff0233927215099f67606d248c39e", + "exists": true, + "currentHash": "42dc02d198630c2735c5a0a1beab37f2a98ff0233927215099f67606d248c39e", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P4-001-MODIFIER.DECLARED_SLICES.blend", + "recordedSha256": "02e56fd6745d983ee9f5ee3f48e581f116f0c41c2d2e7dec062517b4af86718f", + "exists": true, + "currentHash": "02e56fd6745d983ee9f5ee3f48e581f116f0c41c2d2e7dec062517b4af86718f", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P4-001.py", + "recordedSha256": "30df1e0d94b6c439203f6def7a5136f109da6a23839c59a766c12db8cc294eb2", + "exists": true, + "currentHash": "30df1e0d94b6c439203f6def7a5136f109da6a23839c59a766c12db8cc294eb2", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p4-001-desktop.py", + "recordedSha256": "9b62082a9d43eb614a7922428cdfa2f86ca31bf6d3ba61d4292615e1f224fe43", + "exists": true, + "currentHash": "9b62082a9d43eb614a7922428cdfa2f86ca31bf6d3ba61d4292615e1f224fe43", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "recordedSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "exists": true, + "currentHash": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "recordedSha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "exists": true, + "currentHash": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "c74eda4e746f5ef1d93d8e9a188fe4a0624a4acb26658c410f096db495411e62", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "828a54bbe5a83ab43b82da278bd373c5ab7eaeb2d31ec1fe4f5f8b7ff614b0d3", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-001/modifier-report.json", + "recordedSha256": "65d2cf962511ae181e53cda1cc01f8db46819ee450a470384abbe829d549adf8", + "exists": true, + "currentHash": "65d2cf962511ae181e53cda1cc01f8db46819ee450a470384abbe829d549adf8", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-001/modifier-desktop-report.json", + "recordedSha256": "23a348e30dc67f796b0ca44abcf7ef7aac932af146178c8dccbce40170431b8a", + "exists": true, + "currentHash": "23a348e30dc67f796b0ca44abcf7ef7aac932af146178c8dccbce40170431b8a", + "drift": false + }, + { + "path": "docs/status/WBV2-P4-001.md", + "recordedSha256": "957816b2d29edcc076669d6c0adde66ae0012191899773a37a5cb986b38a9ce1", + "exists": true, + "currentHash": "957816b2d29edcc076669d6c0adde66ae0012191899773a37a5cb986b38a9ce1", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-001/task-context.json", + "recordedSha256": "7d7109550a359138fd7f4a2c9336d625555c3fa2620e1f3b516e4ee39490b763", + "exists": true, + "currentHash": "7d7109550a359138fd7f4a2c9336d625555c3fa2620e1f3b516e4ee39490b763", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-001/command.log", + "recordedSha256": "03d98bd745da53fcec3580105171078edbca9a3c55683dfe6d08a078b4c107fd", + "exists": true, + "currentHash": "03d98bd745da53fcec3580105171078edbca9a3c55683dfe6d08a078b4c107fd", + "drift": false + } + ] + }, + { + "task": "WBV2-P4-002", + "phase": "4", + "manifest": "tests/golden/WBV2-P4-002/manifest.json", + "manifestSha256": "2b9e907fa11470b354bbb98695696bcdfae5c654ef03373b1eb2230098f28142", + "status": "done", + "operation": "NODES_ALLOWLIST_LOCAL_BOUNDED", + "artifactCount": 19, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P4-001/manifest.json", + "recordedSha256": "6f1bee73c987f5e66733feb03d1d708e0f2dbd0776ac6634dbf694cde385143c", + "exists": true, + "currentHash": "6f1bee73c987f5e66733feb03d1d708e0f2dbd0776ac6634dbf694cde385143c", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P4-002-NODES.ALLOWLIST.blend", + "recordedSha256": "df1ad2e270112c081a96b2bc2c2da1bc8272bc82ba6c33ae56c0b2d24e3d5c4e", + "exists": true, + "currentHash": "df1ad2e270112c081a96b2bc2c2da1bc8272bc82ba6c33ae56c0b2d24e3d5c4e", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P4-002.py", + "recordedSha256": "210a9cfd099e3962f113d6848d61a045ea0e874a01d34ec64c6e8c49156316b7", + "exists": true, + "currentHash": "210a9cfd099e3962f113d6848d61a045ea0e874a01d34ec64c6e8c49156316b7", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p4-002-desktop.py", + "recordedSha256": "38aaec097d6a9c2a477707627905082c642d044c8a83453e3d7c30d588283a01", + "exists": true, + "currentHash": "38aaec097d6a9c2a477707627905082c642d044c8a83453e3d7c30d588283a01", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "recordedSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "exists": true, + "currentHash": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "recordedSha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "exists": true, + "currentHash": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "drift": false + }, + { + "path": "web/protocol/geometry-nodes.ts", + "recordedSha256": "8d04291c29e9ce30e3f2f6d4141bc4101d49529bf7f7edf109d67d059efa58b1", + "exists": true, + "currentHash": "8d04291c29e9ce30e3f2f6d4141bc4101d49529bf7f7edf109d67d059efa58b1", + "drift": false + }, + { + "path": "web/protocol/shader-graph.ts", + "recordedSha256": "6e9421743925b30ac7aee7c39d7a9cc38632f22584675ec5286685f442b12683", + "exists": true, + "currentHash": "6e9421743925b30ac7aee7c39d7a9cc38632f22584675ec5286685f442b12683", + "drift": false + }, + { + "path": "web/protocol/shader-compiler.ts", + "recordedSha256": "acd5f8deb2912f6823533df12baba8049c5e64d440c17a6dc3f90741f71774b2", + "exists": true, + "currentHash": "acd5f8deb2912f6823533df12baba8049c5e64d440c17a6dc3f90741f71774b2", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "35bcec8575fa3985ea31868db999ece6dbeddc96f79069b77a204d7f0f811190", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "24564d280a73a28cb281d416485452a8b78e1d01b8fa5f72cdde0f314af3af47", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-002/nodes-report.json", + "recordedSha256": "258bbbcb5ba4b1a5b8163f2841b833397ff560357538b4a419381ec9a67af8c7", + "exists": true, + "currentHash": "258bbbcb5ba4b1a5b8163f2841b833397ff560357538b4a419381ec9a67af8c7", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-002/nodes-desktop-report.json", + "recordedSha256": "3a712f3e7f6503a1480c4e19ee824c6fddaad499930257d8baa36021531f4e74", + "exists": true, + "currentHash": "3a712f3e7f6503a1480c4e19ee824c6fddaad499930257d8baa36021531f4e74", + "drift": false + }, + { + "path": "docs/status/WBV2-P4-002.md", + "recordedSha256": "b165d7e641d83804a1d779aeae4eae913cdfe6bf14422a5b7d47fa2dd5ace359", + "exists": true, + "currentHash": "b165d7e641d83804a1d779aeae4eae913cdfe6bf14422a5b7d47fa2dd5ace359", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-002/task-context.json", + "recordedSha256": "9a9bc55a6c85f5296b757b017ba05d5fa3ea357083f8d07beff65502211cf9d3", + "exists": true, + "currentHash": "9a9bc55a6c85f5296b757b017ba05d5fa3ea357083f8d07beff65502211cf9d3", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-002/command.log", + "recordedSha256": "33aa0d1a258fe9a1f32ecd6211497bbb8b6756577c92af63dbb31ef2d2eb9a9a", + "exists": true, + "currentHash": "33aa0d1a258fe9a1f32ecd6211497bbb8b6756577c92af63dbb31ef2d2eb9a9a", + "drift": false + } + ] + }, + { + "task": "WBV2-P4-003", + "phase": "4", + "manifest": "tests/golden/WBV2-P4-003/manifest.json", + "manifestSha256": "9c41ef52263d544650b1bad2dc2ec5f40ed63a9ab1b9732492a46672384e1218", + "status": "done", + "operation": "SCULPT_NONMESH_PAINT_BOUNDED_LOCAL_BOUNDED", + "artifactCount": 18, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P4-002/manifest.json", + "recordedSha256": "2b9e907fa11470b354bbb98695696bcdfae5c654ef03373b1eb2230098f28142", + "exists": true, + "currentHash": "2b9e907fa11470b354bbb98695696bcdfae5c654ef03373b1eb2230098f28142", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P4-003-SCULPT.NONMESH.PAINT_BOUNDED.blend", + "recordedSha256": "88e64b7ca103025111891c3dbdb78d5dd038c99d77d46831414ee984ee16d161", + "exists": true, + "currentHash": "88e64b7ca103025111891c3dbdb78d5dd038c99d77d46831414ee984ee16d161", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P4-003.py", + "recordedSha256": "1ea38a48702f9df0600dec5ebb27498e8699a30cb5bd4ed9f4ded0a22d757ac1", + "exists": true, + "currentHash": "1ea38a48702f9df0600dec5ebb27498e8699a30cb5bd4ed9f4ded0a22d757ac1", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p4-003-desktop.py", + "recordedSha256": "87576e43dba1654e4c26c037032bc92e96e953c917ce86c2bf38878e17385f66", + "exists": true, + "currentHash": "87576e43dba1654e4c26c037032bc92e96e953c917ce86c2bf38878e17385f66", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "recordedSha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "exists": true, + "currentHash": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "recordedSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "exists": true, + "currentHash": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "drift": false + }, + { + "path": "web/protocol/sculpt.ts", + "recordedSha256": "f2ca6c49a5fb110fe837a462d1da115076c032649b5a78eb640a77fe7d049b8b", + "exists": true, + "currentHash": "f2ca6c49a5fb110fe837a462d1da115076c032649b5a78eb640a77fe7d049b8b", + "drift": false + }, + { + "path": "web/protocol/paint-pbvh-capability.ts", + "recordedSha256": "749eb772f0cdeb0fe79c058391a47fdf680dc331db300a91a22d324e535f32c5", + "exists": true, + "currentHash": "749eb772f0cdeb0fe79c058391a47fdf680dc331db300a91a22d324e535f32c5", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "31f52cd0c027cdbb7a79530147b70e830d6e94becf57cbd7133591d55bb4e04f", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "2b34dca1d199d71d6e65c3b8426463d926a790083c140607445056d20d1fdc55", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-003/sculpt-report.json", + "recordedSha256": "de29aabbb753b682d85c30258ff4d68530650d00e167f30181d5c9a68669dd99", + "exists": true, + "currentHash": "de29aabbb753b682d85c30258ff4d68530650d00e167f30181d5c9a68669dd99", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-003/sculpt-desktop-report.json", + "recordedSha256": "a890aab8336bd9fac900ce9f8c143708476b6a16d19a9ee4a6154c974a3807b6", + "exists": true, + "currentHash": "a890aab8336bd9fac900ce9f8c143708476b6a16d19a9ee4a6154c974a3807b6", + "drift": false + }, + { + "path": "docs/status/WBV2-P4-003.md", + "recordedSha256": "e3e0bebbcd979c4b59b4c3f1744dc82095e55a52d9875c59e53e7f052c507d9f", + "exists": true, + "currentHash": "e3e0bebbcd979c4b59b4c3f1744dc82095e55a52d9875c59e53e7f052c507d9f", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-003/task-context.json", + "recordedSha256": "34bf26c4b70438b5f88ce87ba96666d71597049c65752462627015711a518e78", + "exists": true, + "currentHash": "34bf26c4b70438b5f88ce87ba96666d71597049c65752462627015711a518e78", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-003/command.log", + "recordedSha256": "4616e0a4eb2484b707380bfe6ea08c72831df6856e554a53c02bc0fef5c71946", + "exists": true, + "currentHash": "4616e0a4eb2484b707380bfe6ea08c72831df6856e554a53c02bc0fef5c71946", + "drift": false + } + ] + }, + { + "task": "WBV2-P4-004", + "phase": "4", + "manifest": "tests/golden/WBV2-P4-004/manifest.json", + "manifestSha256": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016", + "status": "done", + "operation": "SIMULATION_CACHE_IDENTITY_LIFECYCLE_LOCAL_BOUNDED", + "artifactCount": 17, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P4-003/manifest.json", + "recordedSha256": "9c41ef52263d544650b1bad2dc2ec5f40ed63a9ab1b9732492a46672384e1218", + "exists": true, + "currentHash": "9c41ef52263d544650b1bad2dc2ec5f40ed63a9ab1b9732492a46672384e1218", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P4-004-SIMULATION.CACHE_LIFECYCLE.blend", + "recordedSha256": "c7d88d3ea29e8d54872d90078979ba155fa4b04594477136db2fee39e9fccf4f", + "exists": true, + "currentHash": "c7d88d3ea29e8d54872d90078979ba155fa4b04594477136db2fee39e9fccf4f", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P4-004.py", + "recordedSha256": "6292441ac282354125fd3f160f941429b440df164f67ecea89ef258a2a58dc68", + "exists": true, + "currentHash": "6292441ac282354125fd3f160f941429b440df164f67ecea89ef258a2a58dc68", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p4-004-desktop.py", + "recordedSha256": "21c6d124435558721235dec994939c84c2fb54c90b248a9ee301788a6e5e237f", + "exists": true, + "currentHash": "21c6d124435558721235dec994939c84c2fb54c90b248a9ee301788a6e5e237f", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "recordedSha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "exists": true, + "currentHash": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "recordedSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "exists": true, + "currentHash": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "drift": false + }, + { + "path": "web/protocol/simulation-cache.ts", + "recordedSha256": "a1302e42129420a96416e363cbc857d082d4646655685520c9e81f877ce3d9b8", + "exists": true, + "currentHash": "a1302e42129420a96416e363cbc857d082d4646655685520c9e81f877ce3d9b8", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "efe1298aab720d0b0d0822c1c33ba93a1496bfff18f786898854ffcc7cfe2788", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "2bcaeb4e5a319d5d6276575b1949f84e5c38d8ac40582c7a89021efb29b057c6", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-004/simulation-report.json", + "recordedSha256": "ef0575debda0bd76e106a63f9a321f6bd1640cbc84bb7b40e17a4acf360c425a", + "exists": true, + "currentHash": "ef0575debda0bd76e106a63f9a321f6bd1640cbc84bb7b40e17a4acf360c425a", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-004/simulation-desktop-report.json", + "recordedSha256": "3b62d0cc13f833140cdee3061b2af01675da29d0aba75012e30e6183e68efcc2", + "exists": true, + "currentHash": "3b62d0cc13f833140cdee3061b2af01675da29d0aba75012e30e6183e68efcc2", + "drift": false + }, + { + "path": "docs/status/WBV2-P4-004.md", + "recordedSha256": "76241a1c4f269e4d8987e08c5bd00deab595cda6dad348238b4adeccf3d45e0a", + "exists": true, + "currentHash": "76241a1c4f269e4d8987e08c5bd00deab595cda6dad348238b4adeccf3d45e0a", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-004/task-context.json", + "recordedSha256": "ae4a91c5d676dd655ddb16fbb860afe4171ed4ab24d73ded187b14eea8eaf720", + "exists": true, + "currentHash": "ae4a91c5d676dd655ddb16fbb860afe4171ed4ab24d73ded187b14eea8eaf720", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-004/command.log", + "recordedSha256": "d4e64a063dcb68424b1f07c47e521d88bfba61aa9a57528accbafeeefe22184a", + "exists": true, + "currentHash": "d4e64a063dcb68424b1f07c47e521d88bfba61aa9a57528accbafeeefe22184a", + "drift": false + } + ] + }, + { + "task": "WBV2-P5-001", + "phase": "5", + "manifest": "tests/golden/WBV2-P5-001/manifest.json", + "manifestSha256": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e", + "status": "done", + "operation": "RENDER_CAPABILITY_ROUTING_LOCAL_BOUNDED", + "artifactCount": 19, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P4-004/manifest.json", + "recordedSha256": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016", + "exists": true, + "currentHash": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P5-001-RENDER.ROUTING.blend", + "recordedSha256": "c9ae82e6c36d3e31d272c2f5ea268dd45424e3809ae6618c53b5090c91006f7c", + "exists": true, + "currentHash": "c9ae82e6c36d3e31d272c2f5ea268dd45424e3809ae6618c53b5090c91006f7c", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P5-001.py", + "recordedSha256": "be32df4f252451b35cc05e8232b0ef0599ae4796721d52532300c728dba799b1", + "exists": true, + "currentHash": "be32df4f252451b35cc05e8232b0ef0599ae4796721d52532300c728dba799b1", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p5-001-desktop.py", + "recordedSha256": "6c29222f990156baa53d4a9fefc2eb10cdd921f0d2bf616be79d545c56a4b16f", + "exists": true, + "currentHash": "6c29222f990156baa53d4a9fefc2eb10cdd921f0d2bf616be79d545c56a4b16f", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "076551fc1669ae943f8566bee8ea9c608bbb8c0ffb827bb728ae968a061ee5b5", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "recordedSha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "exists": true, + "currentHash": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "recordedSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "exists": true, + "currentHash": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "drift": false + }, + { + "path": "web/protocol/scene-ir.ts", + "recordedSha256": "2d4ce6c0cfc0585f395dc134f166b158beb953143e3e08089937d00e57525f26", + "exists": true, + "currentHash": "7c3582a11cfbab47ebb0dced99034a43591500f70ca2a24c58bd5dc183d977cb", + "drift": true + }, + { + "path": "web/protocol/render-routing.ts", + "recordedSha256": "2d41d48609635c810572aaae95979df2fe9e49bbd130c60d70f64042c5d0f097", + "exists": true, + "currentHash": "2d41d48609635c810572aaae95979df2fe9e49bbd130c60d70f64042c5d0f097", + "drift": false + }, + { + "path": "web/protocol/render-image-comparison.ts", + "recordedSha256": "4345cc0d02b4482201de34292cbf5198009bf615e69c80cc00bc3e76116efec2", + "exists": true, + "currentHash": "4345cc0d02b4482201de34292cbf5198009bf615e69c80cc00bc3e76116efec2", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "7663db046860f15287de6b19ebda6a9071a10dc05c0303df39f7d3c4ee7fd000", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "d39917ad8b29e515a828c7d167b005e6ad6fc2fef602ea76097ddd61beb47ef2", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-001/render-report.json", + "recordedSha256": "801c6c93df9cb16205b0489f66d9f3b53447b21db1a99e5fb80b71bd2c184f95", + "exists": true, + "currentHash": "801c6c93df9cb16205b0489f66d9f3b53447b21db1a99e5fb80b71bd2c184f95", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-001/render-desktop-report.json", + "recordedSha256": "63ec20b8e2d3a10998d8b074e723abf3f15a10d8032b5e59e8500db667b69638", + "exists": true, + "currentHash": "63ec20b8e2d3a10998d8b074e723abf3f15a10d8032b5e59e8500db667b69638", + "drift": false + }, + { + "path": "docs/status/WBV2-P5-001.md", + "recordedSha256": "029749ec9c44bbae00ac2d2a2674ae6c36ffb3dade7fec620afc445e81e8fb97", + "exists": true, + "currentHash": "029749ec9c44bbae00ac2d2a2674ae6c36ffb3dade7fec620afc445e81e8fb97", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-001/task-context.json", + "recordedSha256": "345912968bca514c39558f8b51c8a1aad709be159cbdc225f1b9d8cfbfd7b678", + "exists": true, + "currentHash": "345912968bca514c39558f8b51c8a1aad709be159cbdc225f1b9d8cfbfd7b678", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-001/command.log", + "recordedSha256": "9d033dd21d024190906d78c91a6ef372084ec33fde7e0829131b622996147796", + "exists": true, + "currentHash": "9d033dd21d024190906d78c91a6ef372084ec33fde7e0829131b622996147796", + "drift": false + } + ] + }, + { + "task": "WBV2-P5-002", + "phase": "5", + "manifest": "tests/golden/WBV2-P5-002/manifest.json", + "manifestSha256": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2", + "status": "done", + "operation": "MEDIA_BOUNDED_WORKFLOW_LOCAL_BOUNDED", + "artifactCount": 17, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P5-001/manifest.json", + "recordedSha256": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e", + "exists": true, + "currentHash": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P5-002-MEDIA.BOUNDED_WORKFLOW.blend", + "recordedSha256": "3f45837a2cc24aebc2c6f04434cb75d04708c2cf38bbce76bf7a280aad47d8ab", + "exists": true, + "currentHash": "3f45837a2cc24aebc2c6f04434cb75d04708c2cf38bbce76bf7a280aad47d8ab", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P5-002.py", + "recordedSha256": "d2704903d60ac2fd7ebb0fa5702edcab10f2e91f2736cada25e6970886bdc6e7", + "exists": true, + "currentHash": "d2704903d60ac2fd7ebb0fa5702edcab10f2e91f2736cada25e6970886bdc6e7", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p5-002-desktop.py", + "recordedSha256": "6c0fbfb1eb7fa18f98824c91308fa38df5a219477fb18199f7989eba73822fad", + "exists": true, + "currentHash": "6c0fbfb1eb7fa18f98824c91308fa38df5a219477fb18199f7989eba73822fad", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "076551fc1669ae943f8566bee8ea9c608bbb8c0ffb827bb728ae968a061ee5b5", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "web/protocol/compositor.ts", + "recordedSha256": "3ce4819dadb2d6de7305c3676b2708689cd8be95e6fa7894651d6a02c4658b31", + "exists": true, + "currentHash": "3ce4819dadb2d6de7305c3676b2708689cd8be95e6fa7894651d6a02c4658b31", + "drift": false + }, + { + "path": "web/protocol/sequencer.ts", + "recordedSha256": "6e6141ddc0771bfdbcb176929ecc2882e507e07e4f4f7eb610cb0a89f9a74a25", + "exists": true, + "currentHash": "6e6141ddc0771bfdbcb176929ecc2882e507e07e4f4f7eb610cb0a89f9a74a25", + "drift": false + }, + { + "path": "web/protocol/render-compositor-media-recovery.ts", + "recordedSha256": "a1b0b36cf93173347d55a955ff2e02f3666f7c28ef7f06442b86f0ee2b272286", + "exists": true, + "currentHash": "a1b0b36cf93173347d55a955ff2e02f3666f7c28ef7f06442b86f0ee2b272286", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "d394f600989563c8e25c5914ba362b658f76d8b6ebaab86b82d7d8649640ef7c", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "1ddb9d1a1bf4358773adeaccb70a09ba52e09ae09513089597a4265fc6ac9ff4", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-002/media-report.json", + "recordedSha256": "90cf9e6eb6f09f2e3e0a25740e5b3e674209efd6f7dbf7fd91a7999ded35e3a0", + "exists": true, + "currentHash": "90cf9e6eb6f09f2e3e0a25740e5b3e674209efd6f7dbf7fd91a7999ded35e3a0", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-002/media-desktop-report.json", + "recordedSha256": "7023aef81bea94b1954fbe6eb448ab698d2cca9457b54bac210c70b3b45ec87c", + "exists": true, + "currentHash": "7023aef81bea94b1954fbe6eb448ab698d2cca9457b54bac210c70b3b45ec87c", + "drift": false + }, + { + "path": "docs/status/WBV2-P5-002.md", + "recordedSha256": "557a6a38f3c43f1684a4880425a6f9cd86ec11378d163be09832dca3466b1e0b", + "exists": true, + "currentHash": "557a6a38f3c43f1684a4880425a6f9cd86ec11378d163be09832dca3466b1e0b", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-002/task-context.json", + "recordedSha256": "feba3ec4bb60ba4a7861cfad74773d189054c3f8404cd9e6859ec7287828db98", + "exists": true, + "currentHash": "feba3ec4bb60ba4a7861cfad74773d189054c3f8404cd9e6859ec7287828db98", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-002/command.log", + "recordedSha256": "0f253f5bbf14e9bd106c954a997bb433e7d52191b65ca15ae7918a85aeda308c", + "exists": true, + "currentHash": "0f253f5bbf14e9bd106c954a997bb433e7d52191b65ca15ae7918a85aeda308c", + "drift": false + } + ] + }, + { + "task": "WBV2-P5-003", + "phase": "5", + "manifest": "tests/golden/WBV2-P5-003/manifest.json", + "manifestSha256": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c", + "status": "done", + "operation": "SERVER_JOB_RESULT_BINDING_SERVER_EXACT", + "artifactCount": 19, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P5-002/manifest.json", + "recordedSha256": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2", + "exists": true, + "currentHash": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P5-003-SERVER.JOB_BINDING.blend", + "recordedSha256": "016164a5d2462c52f0430955f4156535f05cfcb337a3c1ba77968b4db020c410", + "exists": true, + "currentHash": "016164a5d2462c52f0430955f4156535f05cfcb337a3c1ba77968b4db020c410", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P5-003.py", + "recordedSha256": "77cd88a7f56cc499c93596874ae7a2dd6757fc20e09f7a00ec7838e8490195f1", + "exists": true, + "currentHash": "77cd88a7f56cc499c93596874ae7a2dd6757fc20e09f7a00ec7838e8490195f1", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p5-003-desktop.py", + "recordedSha256": "d5423a7b7424fdae37cc374d938f39ed11d8a43fbd38d3a916437c8cfe11858b", + "exists": true, + "currentHash": "d5423a7b7424fdae37cc374d938f39ed11d8a43fbd38d3a916437c8cfe11858b", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "d2554187b26afdedbb502109d123f2e11a97af16fe822762ab4bcb2f87d236d0", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "web/protocol/scene-ir.ts", + "recordedSha256": "b95d3c276a58c4e70ee91017243eeeff0384726e909b69bb8465b2daf0219d7f", + "exists": true, + "currentHash": "7c3582a11cfbab47ebb0dced99034a43591500f70ca2a24c58bd5dc183d977cb", + "drift": true + }, + { + "path": "web/protocol/server-render-job.ts", + "recordedSha256": "e2b5b95032b0dbcb346aa35d1a10a3b55d6c006603f16b9e72c3de45763906c5", + "exists": true, + "currentHash": "e2b5b95032b0dbcb346aa35d1a10a3b55d6c006603f16b9e72c3de45763906c5", + "drift": false + }, + { + "path": "tools/web/server-job-idempotency.mjs", + "recordedSha256": "15eca7550964c9985e26a22a7900d3f3aa69fdef35fe5962b48a8f55ebba5863", + "exists": true, + "currentHash": "15eca7550964c9985e26a22a7900d3f3aa69fdef35fe5962b48a8f55ebba5863", + "drift": false + }, + { + "path": "tools/web/server-job-result-binding.mjs", + "recordedSha256": "ecf3bddef53e2766dcc055ec027b04c14e3d884132c7fdea476663617364ad86", + "exists": true, + "currentHash": "ecf3bddef53e2766dcc055ec027b04c14e3d884132c7fdea476663617364ad86", + "drift": false + }, + { + "path": "tools/web/server-job-fault.mjs", + "recordedSha256": "858360b4468a7b6cf796fc83a1627ba18626b61a0799f83531de996ea374519b", + "exists": true, + "currentHash": "858360b4468a7b6cf796fc83a1627ba18626b61a0799f83531de996ea374519b", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "f59391c8da9b7d8eef8e414d7e009c896c5bb8e6d450d7ad2593b2b803547cc4", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "0bf6ea8a6c066780dec3a4e9f257aa54de99fa44e8eab3c1680260419a41aa93", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-003/server-job-report.json", + "recordedSha256": "656546af44238e2b07c44a1f8cccedf996ba639f6cb9ac1c38a4ec30eeafeca3", + "exists": true, + "currentHash": "656546af44238e2b07c44a1f8cccedf996ba639f6cb9ac1c38a4ec30eeafeca3", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-003/server-desktop-report.json", + "recordedSha256": "34e0108bb5114209c6c4a4f9534a3e7c7955852bd2ccac501e0a2f6943b31e4c", + "exists": true, + "currentHash": "34e0108bb5114209c6c4a4f9534a3e7c7955852bd2ccac501e0a2f6943b31e4c", + "drift": false + }, + { + "path": "docs/status/WBV2-P5-003.md", + "recordedSha256": "3e4f09e03bdd83e09a3a16f645ad14f1a6f535093d8c1fd9781bcd9168495086", + "exists": true, + "currentHash": "3e4f09e03bdd83e09a3a16f645ad14f1a6f535093d8c1fd9781bcd9168495086", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-003/task-context.json", + "recordedSha256": "51a2fe6c145dcec177addebbe92968ee5ae0999d051367083709b240b22bd315", + "exists": true, + "currentHash": "51a2fe6c145dcec177addebbe92968ee5ae0999d051367083709b240b22bd315", + "drift": false + }, + { + "path": "tests/golden/WBV2-P5-003/command.log", + "recordedSha256": "3cdcf02375467b1cc27ad5a4ceba794d0cec250f53931eec14ba9a4ee9614b1f", + "exists": true, + "currentHash": "3cdcf02375467b1cc27ad5a4ceba794d0cec250f53931eec14ba9a4ee9614b1f", + "drift": false + } + ] + }, + { + "task": "WBV2-P6-001", + "phase": "6", + "manifest": "tests/golden/WBV2-P6-001/manifest.json", + "manifestSha256": "e8bb64d618b630b34292501d44fe46c55de3a57ddf0fccb4b7974c6a479456a4", + "status": "done", + "operation": "SECURITY_SCRIPTING_LOCAL_EXACT", + "artifactCount": 16, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P5-003/manifest.json", + "recordedSha256": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c", + "exists": true, + "currentHash": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P6-001-SECURITY.SCRIPTING.blend", + "recordedSha256": "5d4d5b1e5b6ce564a3d526681d5d6dd1bef0d6ecc79d1cd4449b9fe5083928ec", + "exists": true, + "currentHash": "5d4d5b1e5b6ce564a3d526681d5d6dd1bef0d6ecc79d1cd4449b9fe5083928ec", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P6-001.py", + "recordedSha256": "4d1c63124c3bc381950eab7efb4b63f0aaf145aaf8b804b6d345d79e33d7d029", + "exists": true, + "currentHash": "4d1c63124c3bc381950eab7efb4b63f0aaf145aaf8b804b6d345d79e33d7d029", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p6-001-desktop.py", + "recordedSha256": "b8074fc011c8c35f1d5c760c45cf8b96050790ce3dcdf74546ca4d20e95ab784", + "exists": true, + "currentHash": "b8074fc011c8c35f1d5c760c45cf8b96050790ce3dcdf74546ca4d20e95ab784", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "2510fc525ac61e3b70377a186f62044c985e1500bac6d3e7c453dbc1f12eca26", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "web/protocol/scene-ir.ts", + "recordedSha256": "5989c8f8c8e6f0aaa15aabf302a1e67ea7b3302ca62bf475fe3249dd2f08dd4f", + "exists": true, + "currentHash": "7c3582a11cfbab47ebb0dced99034a43591500f70ca2a24c58bd5dc183d977cb", + "drift": true + }, + { + "path": "web/protocol/scripting-platform.ts", + "recordedSha256": "6699fc0a19e0736823f164e707a420655803e36019cf0071f7ff9c760d25e9f2", + "exists": true, + "currentHash": "6699fc0a19e0736823f164e707a420655803e36019cf0071f7ff9c760d25e9f2", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "00eb478d24508bb384e6864eca54e8440d78f596d0f640ced4092b35add039af", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "5c7ea9b7bc7691a2dbd1f53baf7fa6e38860afc9aac5cc6c92d361b4acc831ad", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-001/scripting-report.json", + "recordedSha256": "9af7be5ddc2db3893a037294e073487a62c250fb9cb308edcdf0e335f0d66f16", + "exists": true, + "currentHash": "9af7be5ddc2db3893a037294e073487a62c250fb9cb308edcdf0e335f0d66f16", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-001/scripting-desktop-report.json", + "recordedSha256": "fe575ee718a8745c9be46d0e29d4feb22afae2f7b3bed76d5f2a582cbea3ad6e", + "exists": true, + "currentHash": "fe575ee718a8745c9be46d0e29d4feb22afae2f7b3bed76d5f2a582cbea3ad6e", + "drift": false + }, + { + "path": "docs/status/WBV2-P6-001.md", + "recordedSha256": "b97d1924727b083aec7f5cee6afffb92028732d2afad076c47f8a75be17c5e59", + "exists": true, + "currentHash": "b97d1924727b083aec7f5cee6afffb92028732d2afad076c47f8a75be17c5e59", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-001/task-context.json", + "recordedSha256": "4c035136a0100a7cc2a28f5709201669dee570929bdf99ed98294f465f18a227", + "exists": true, + "currentHash": "4c035136a0100a7cc2a28f5709201669dee570929bdf99ed98294f465f18a227", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-001/command.log", + "recordedSha256": "a07ba8ff5264117909f7b3ee6c8e43eeca2226ebf53c7d5a2fa97a8555aef345", + "exists": true, + "currentHash": "a07ba8ff5264117909f7b3ee6c8e43eeca2226ebf53c7d5a2fa97a8555aef345", + "drift": false + } + ] + }, + { + "task": "WBV2-P6-002", + "phase": "6", + "manifest": "tests/golden/WBV2-P6-002/manifest.json", + "manifestSha256": "b66e193b81c0c592964c874902d0ee024c4877610fd7fa92aee2a961f69d01ba", + "status": "done", + "operation": "PERFORMANCE_FAULT_RECOVERY_MATRIX_LOCAL_EXACT", + "artifactCount": 17, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P6-001/manifest.json", + "recordedSha256": "e8bb64d618b630b34292501d44fe46c55de3a57ddf0fccb4b7974c6a479456a4", + "exists": true, + "currentHash": "e8bb64d618b630b34292501d44fe46c55de3a57ddf0fccb4b7974c6a479456a4", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P6-002-workflow-performance_fault_and_recovery_matrix.blend", + "recordedSha256": "3cab8c9919144a3a71813fb7f940fc093f91ad930f800d4784c462d983ad276c", + "exists": true, + "currentHash": "3cab8c9919144a3a71813fb7f940fc093f91ad930f800d4784c462d983ad276c", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P6-002.py", + "recordedSha256": "c3e760a14c80a206a7a0543fbc6fd768a0b7709160974513f28d5c560a64453e", + "exists": true, + "currentHash": "c3e760a14c80a206a7a0543fbc6fd768a0b7709160974513f28d5c560a64453e", + "drift": false + }, + { + "path": "tools/web/check-wbv2-p6-002-desktop.py", + "recordedSha256": "174e9b77ca00749d77e33c71b55916c33ba194615e4337df95d2851453faf80b", + "exists": true, + "currentHash": "174e9b77ca00749d77e33c71b55916c33ba194615e4337df95d2851453faf80b", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "8ae71f603742cb32543ce2cc1032b13fd22719274b02ff78262df414cee1dcdf", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "web/protocol/scene-ir.ts", + "recordedSha256": "d528aa4b851ef26bca223740826ff16a7595307adc121632944faa4c44358e60", + "exists": true, + "currentHash": "7c3582a11cfbab47ebb0dced99034a43591500f70ca2a24c58bd5dc183d977cb", + "drift": true + }, + { + "path": "web/protocol/oom-recovery.ts", + "recordedSha256": "e93f4549dfb0e368fce41ed3c68461c1dbd6791601e37f832edfe4620fcd437e", + "exists": true, + "currentHash": "e93f4549dfb0e368fce41ed3c68461c1dbd6791601e37f832edfe4620fcd437e", + "drift": false + }, + { + "path": "web/protocol/storage-budget.ts", + "recordedSha256": "151ed8fc658322351c73c48c0d524c154789bba2e8dd7dce4000fe6fcd488efb", + "exists": true, + "currentHash": "151ed8fc658322351c73c48c0d524c154789bba2e8dd7dce4000fe6fcd488efb", + "drift": false + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "2ad7724396bfbd96b2e5bf609303060c03da8cb3149585fb2c7e7e2eaaf5047d", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "95cdaee768ff3aaf507ac27a5d8d6c956d49a56b5b4e8bc2da3e744f1248371d", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-002/performance-report.json", + "recordedSha256": "dfe297e8e024dc2ae581f744ff4fb18f19cd6083c707f014ed345a8d95da421e", + "exists": true, + "currentHash": "dfe297e8e024dc2ae581f744ff4fb18f19cd6083c707f014ed345a8d95da421e", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-002/performance-desktop-report.json", + "recordedSha256": "a29c7af52b9030ada7a5f8f32f94a03452fadc97c23349cd55cb598ff8744f32", + "exists": true, + "currentHash": "a29c7af52b9030ada7a5f8f32f94a03452fadc97c23349cd55cb598ff8744f32", + "drift": false + }, + { + "path": "docs/status/WBV2-P6-002.md", + "recordedSha256": "0d2d6b9d92d80cf4f0959d9668146ff7a67b2f1d325782a9ca7b8e8a091418c5", + "exists": true, + "currentHash": "0d2d6b9d92d80cf4f0959d9668146ff7a67b2f1d325782a9ca7b8e8a091418c5", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-002/task-context.json", + "recordedSha256": "67ee10fd32a24a8fe4be79722a732a67f919b35ce1e9c921645513e86f80ce10", + "exists": true, + "currentHash": "67ee10fd32a24a8fe4be79722a732a67f919b35ce1e9c921645513e86f80ce10", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-002/command.log", + "recordedSha256": "24e7f6fc95c947c5b791b2721cdd773fbdc5b1e949df24221b362f58b4f88216", + "exists": true, + "currentHash": "24e7f6fc95c947c5b791b2721cdd773fbdc5b1e949df24221b362f58b4f88216", + "drift": false + } + ] + }, + { + "task": "WBV2-P6-003", + "phase": "6", + "manifest": "tests/golden/WBV2-P6-003/manifest.json", + "manifestSha256": "22a773feb29435ec0c29eaa720e7ae39c5f87455c678b78ae6c02b4985fea54d", + "status": "done", + "operation": "OFFLINE_CI_SBOM_ROLLBACK_RELEASE_LOCAL_EXACT", + "artifactCount": 18, + "currentDriftCount": 6, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P6-002/manifest.json", + "recordedSha256": "b66e193b81c0c592964c874902d0ee024c4877610fd7fa92aee2a961f69d01ba", + "exists": true, + "currentHash": "b66e193b81c0c592964c874902d0ee024c4877610fd7fa92aee2a961f69d01ba", + "drift": false + }, + { + "path": "tests/files/web/generated/WBV2-P6-003-workflow-offline_ci_sbom_and_rollback_release.blend", + "recordedSha256": "b2ca8e948d10de663e734ee3f58f962650c6bf36d65cb9f6962c1394b8c4feee", + "exists": true, + "currentHash": "b2ca8e948d10de663e734ee3f58f962650c6bf36d65cb9f6962c1394b8c4feee", + "drift": false + }, + { + "path": "tools/web/generated/WBV2-P6-003.py", + "recordedSha256": "3699bac78a66db6d7d2eef0bbef7698438e997ac6d00ee41c8aca68660538b89", + "exists": true, + "currentHash": "3699bac78a66db6d7d2eef0bbef7698438e997ac6d00ee41c8aca68660538b89", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", + "recordedSha256": "8ae71f603742cb32543ce2cc1032b13fd22719274b02ff78262df414cee1dcdf", + "exists": true, + "currentHash": "6232d4933c86a12cb8ea837704874275eecfa7047500f62dc04d9e83b4383027", + "drift": true + }, + { + "path": "web/protocol/scene-ir.ts", + "recordedSha256": "d528aa4b851ef26bca223740826ff16a7595307adc121632944faa4c44358e60", + "exists": true, + "currentHash": "7c3582a11cfbab47ebb0dced99034a43591500f70ca2a24c58bd5dc183d977cb", + "drift": true + }, + { + "path": "tools/web/check-generated-gap.mjs", + "recordedSha256": "2ad7724396bfbd96b2e5bf609303060c03da8cb3149585fb2c7e7e2eaaf5047d", + "exists": true, + "currentHash": "a4a33a36c4e6528849172ac9a7405ab803b268018742831b3266ef999c24729f", + "drift": true + }, + { + "path": "tools/web/generated-gap-preflight.mjs", + "recordedSha256": "95cdaee768ff3aaf507ac27a5d8d6c956d49a56b5b4e8bc2da3e744f1248371d", + "exists": true, + "currentHash": "706dd6a96c10deb36eb89ba82f578da2f180c82c0423b74489ca91eda00d5ac3", + "drift": true + }, + { + "path": "tools/web/run-unit-tests.mjs", + "recordedSha256": "37a0e2e5157812def64de70e0b3225933100cc2c1b2958e8cba8aa5653f1c888", + "exists": true, + "currentHash": "37a0e2e5157812def64de70e0b3225933100cc2c1b2958e8cba8aa5653f1c888", + "drift": false + }, + { + "path": "tools/web/run-ci-lane.mjs", + "recordedSha256": "9e281097e59f93d1cc47a9cbb8f0f18d5625ae6977afcbbf370facd5209d84c3", + "exists": true, + "currentHash": "9e281097e59f93d1cc47a9cbb8f0f18d5625ae6977afcbbf370facd5209d84c3", + "drift": false + }, + { + "path": "web/package.json", + "recordedSha256": "40b7f14d4f568ae94bedde83e02115c127e0c714e5eb32a6a97b1e1084c4fa68", + "exists": true, + "currentHash": "40b7f14d4f568ae94bedde83e02115c127e0c714e5eb32a6a97b1e1084c4fa68", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "release/ci-reports/quick.json", + "recordedSha256": "96446990e37856eb561f354be774eb54010475af4d033d92fafcac92609bc24f", + "exists": true, + "currentHash": "5ccc281d2332f465f28c5a6788d8dda7919d8991d072decd87e36b2923460977", + "drift": true + }, + { + "path": "tests/golden/WBV2-P6-003/release-report.json", + "recordedSha256": "2111b4651f01966c4f47e8a1f5afc581b4bf2056e733240f49a546aad1faae0b", + "exists": true, + "currentHash": "2111b4651f01966c4f47e8a1f5afc581b4bf2056e733240f49a546aad1faae0b", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-003/release-desktop-report.json", + "recordedSha256": "6bc8e74ba9606a9e61cf7ed8496a4f62651022b2819d601bca71edff3310722d", + "exists": true, + "currentHash": "6bc8e74ba9606a9e61cf7ed8496a4f62651022b2819d601bca71edff3310722d", + "drift": false + }, + { + "path": "tests/golden/corrective/rehydration/M12-manifest-sha-drift.json", + "recordedSha256": "c2179c5dd844ec77ddbb7d7e440b2b99a4f2a7f9b12b5aed3564b68a88b82a89", + "exists": true, + "currentHash": "e35f4dcae87ce260d565dccfcdafb58a032d79141115a26b45b25dcbec3f31e1", + "drift": true + }, + { + "path": "docs/status/WBV2-P6-003.md", + "recordedSha256": "163fbf6a0928a7778e0dee499201f97f050c7c5cc530e1dba3348d7b480b1159", + "exists": true, + "currentHash": "163fbf6a0928a7778e0dee499201f97f050c7c5cc530e1dba3348d7b480b1159", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-003/task-context.json", + "recordedSha256": "8ddff86a5f385e075d39f2df5fee50e7ae528fc908753ae8517b1b9b1ec453bf", + "exists": true, + "currentHash": "8ddff86a5f385e075d39f2df5fee50e7ae528fc908753ae8517b1b9b1ec453bf", + "drift": false + }, + { + "path": "tests/golden/WBV2-P6-003/command.log", + "recordedSha256": "87b8debfef908ad070ee87d23d7e88fb03934172e351290ee1e0c1b3c9bb4104", + "exists": true, + "currentHash": "87b8debfef908ad070ee87d23d7e88fb03934172e351290ee1e0c1b3c9bb4104", + "drift": false + } + ] + }, + { + "task": "WBV2-P10-000", + "phase": "10", + "manifest": "tests/golden/WBV2-P10-000/manifest.json", + "manifestSha256": "269acf27b93097887e8b475b53fbbfae4c7d9c653dd4b6c5921258db86576de0", + "status": "done", + "operation": "AUTHORIZE_NATIVE_ENGINE_PARITY_CONTINUATION", + "artifactCount": 8, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P9-004/manifest.json", + "recordedSha256": "6901f2b779e1bd4e62d240ceb115833ca28f1a209b65aaae71762225758da2f6", + "exists": true, + "currentHash": "6901f2b779e1bd4e62d240ceb115833ca28f1a209b65aaae71762225758da2f6", + "drift": false + }, + { + "path": "tests/golden/WBV2-P9-004/feature-parity-gate-report.json", + "recordedSha256": "0a7683e08c96bd3d75bda7f420c23945081b238c91031576a149a646451d6d0f", + "exists": true, + "currentHash": "0a7683e08c96bd3d75bda7f420c23945081b238c91031576a149a646451d6d0f", + "drift": false + }, + { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "recordedSha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3", + "exists": true, + "currentHash": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-000/native-parity-task-plan.json", + "recordedSha256": "b72c6fd251f0c2c7e96c410d7195060ea838313937fabf9ee720f9670f512e1f", + "exists": true, + "currentHash": "b72c6fd251f0c2c7e96c410d7195060ea838313937fabf9ee720f9670f512e1f", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-000/native-parity-root-report.json", + "recordedSha256": "06f4754b70433a66c43835e6d6b72041a673667af51d9c4efe3d8e701bab2c6e", + "exists": true, + "currentHash": "06f4754b70433a66c43835e6d6b72041a673667af51d9c4efe3d8e701bab2c6e", + "drift": false + }, + { + "path": "docs/tasks/WBV2-P10-000.md", + "recordedSha256": "071b3069be0bf0695f801bc8058ba44ac44cc3e200f686396512928f2eee15da", + "exists": true, + "currentHash": "071b3069be0bf0695f801bc8058ba44ac44cc3e200f686396512928f2eee15da", + "drift": false + }, + { + "path": "docs/status/WBV2-P10-000.md", + "recordedSha256": "97a1caa7843e1ce2be68f8eafdada2c8afe2341ffdaa2407d3701c2b1fd739c8", + "exists": true, + "currentHash": "97a1caa7843e1ce2be68f8eafdada2c8afe2341ffdaa2407d3701c2b1fd739c8", + "drift": false + }, + { + "path": "docs/tasks/WBV2-P10-001.md", + "recordedSha256": "535a35b420188d19fa7acab58b8eb5b6995177145eec59733288f1fadf8098dd", + "exists": true, + "currentHash": "535a35b420188d19fa7acab58b8eb5b6995177145eec59733288f1fadf8098dd", + "drift": false + } + ] + }, + { + "task": "WBV2-P10-001", + "phase": "10", + "manifest": "tests/golden/WBV2-P10-001/manifest.json", + "manifestSha256": "200ad417f44414b25c2b431fd6e7ff2c98c59e23871a7220facd92f295f1cd8d", + "status": "done", + "operation": "RECONCILE_WBV2_INVENTORY_SOURCE_DRIFT", + "artifactCount": 13, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P10-000/manifest.json", + "recordedSha256": "269acf27b93097887e8b475b53fbbfae4c7d9c653dd4b6c5921258db86576de0", + "exists": true, + "currentHash": "269acf27b93097887e8b475b53fbbfae4c7d9c653dd4b6c5921258db86576de0", + "drift": false + }, + { + "path": "tests/golden/WBV2-P0-002/source-hashes.json", + "recordedSha256": "c6c6260d10bc8529e4b26563ce81168e1b0fffb3b175b2d4998ec1c0aa1c1497", + "exists": true, + "currentHash": "c6c6260d10bc8529e4b26563ce81168e1b0fffb3b175b2d4998ec1c0aa1c1497", + "drift": false + }, + { + "path": "tests/golden/M13-05C/manifest.json", + "recordedSha256": "24abe1863de8fcb112434fb3226986f3a7072820cde8869dadb8fbad32d1e6c1", + "exists": true, + "currentHash": "24abe1863de8fcb112434fb3226986f3a7072820cde8869dadb8fbad32d1e6c1", + "drift": false + }, + { + "path": "tests/golden/WBV2-P8-001/recovery-baseline-report.json", + "recordedSha256": "33491669cc094c5f698cac734ed49a81dca7bc0fa2e65a0024542215bf8bda73", + "exists": true, + "currentHash": "33491669cc094c5f698cac734ed49a81dca7bc0fa2e65a0024542215bf8bda73", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-001/current-source-hashes.json", + "recordedSha256": "d93dd22e430cfc6c03cb8819ff71c3bfd9b92a818cc078dec0dcbe53e9cbb39c", + "exists": true, + "currentHash": "d93dd22e430cfc6c03cb8819ff71c3bfd9b92a818cc078dec0dcbe53e9cbb39c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-001/dependency-inventory.current.json", + "recordedSha256": "5a9ecfbd811199827b46fcd1ac5c2e170667d5f0765d1995ad9e4b42e02addb4", + "exists": true, + "currentHash": "5a9ecfbd811199827b46fcd1ac5c2e170667d5f0765d1995ad9e4b42e02addb4", + "drift": false + }, + { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "recordedSha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782", + "exists": true, + "currentHash": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782", + "drift": false + }, + { + "path": "tools/web/generate-wbv2-inventory-rebaseline.mjs", + "recordedSha256": "184d67e6af71bd1b8d05b8900bbdbb2eddd4971a7bfadfe56e3775f388b086fa", + "exists": true, + "currentHash": "184d67e6af71bd1b8d05b8900bbdbb2eddd4971a7bfadfe56e3775f388b086fa", + "drift": false + }, + { + "path": "tools/web/check-wbv2-inventory-rebaseline.mjs", + "recordedSha256": "6e02cfdc44a2cb4815837e33f18e18d77cd3ad8697394f5e3615a2b359ee3e9f", + "exists": true, + "currentHash": "6e02cfdc44a2cb4815837e33f18e18d77cd3ad8697394f5e3615a2b359ee3e9f", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-001/inventory-rebaseline-report.json", + "recordedSha256": "caeabb45d0f7b7b1f4a94481b9c0f9747e38f22e0adeb34874bce452117f2c0a", + "exists": true, + "currentHash": "caeabb45d0f7b7b1f4a94481b9c0f9747e38f22e0adeb34874bce452117f2c0a", + "drift": false + }, + { + "path": "docs/status/WBV2-P10-001.md", + "recordedSha256": "d93f37dd1bc0bd320b2477a807c228c333027b9bf35ef8c770eddd073470245a", + "exists": true, + "currentHash": "d93f37dd1bc0bd320b2477a807c228c333027b9bf35ef8c770eddd073470245a", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-001/native-parity-task-plan.json", + "recordedSha256": "1dc85326304c28ded4bdd12ff905de7522bcd61d783bf4adf20ac628432a7512", + "exists": true, + "currentHash": "1dc85326304c28ded4bdd12ff905de7522bcd61d783bf4adf20ac628432a7512", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-001/task-context.json", + "recordedSha256": "0be0f326fb603e98084b7c0e26316fac00a39f6090970070b7582927072708c6", + "exists": true, + "currentHash": "0be0f326fb603e98084b7c0e26316fac00a39f6090970070b7582927072708c6", + "drift": false + } + ] + }, + { + "task": "WBV2-P10-002", + "phase": "10", + "manifest": "tests/golden/WBV2-P10-002/manifest.json", + "manifestSha256": "dcf016adce463066fad68a0e9cf2a23a81b0d148afeb05b0e523263bd2b91da3", + "status": "done", + "operation": "NATIVE_WASM_ENGINE_PRODUCTION_RECEIPT", + "artifactCount": 17, + "currentDriftCount": 0, + "evidenceClass": "ENGINE_BOUND_EXACT", + "artifacts": [ + { + "path": "tests/golden/WBV2-P10-001/manifest.json", + "recordedSha256": "200ad417f44414b25c2b431fd6e7ff2c98c59e23871a7220facd92f295f1cd8d", + "exists": true, + "currentHash": "200ad417f44414b25c2b431fd6e7ff2c98c59e23871a7220facd92f295f1cd8d", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-002/native-engine-binding-report.json", + "recordedSha256": "a98010ccfdb4a2f145356a35cf3bc7e03a5fcedf0201d38cd3f3a6fecb4c6aae", + "exists": true, + "currentHash": "a98010ccfdb4a2f145356a35cf3bc7e03a5fcedf0201d38cd3f3a6fecb4c6aae", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-002/native-engine-production.json", + "recordedSha256": "b3a54efb3624d949c56865ff0fca8e8177ba8fe71d9e923f5003db15973fff59", + "exists": true, + "currentHash": "b3a54efb3624d949c56865ff0fca8e8177ba8fe71d9e923f5003db15973fff59", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-002/native-engine-production.second.json", + "recordedSha256": "b3a54efb3624d949c56865ff0fca8e8177ba8fe71d9e923f5003db15973fff59", + "exists": true, + "currentHash": "b3a54efb3624d949c56865ff0fca8e8177ba8fe71d9e923f5003db15973fff59", + "drift": false + }, + { + "path": "web/tests/e2e/wbv2-native-engine-production.spec.ts", + "recordedSha256": "53735206840a950d0b0aedf37e1f20fa1811c9d1ccfb7a9f95a88e90559b52e1", + "exists": true, + "currentHash": "53735206840a950d0b0aedf37e1f20fa1811c9d1ccfb7a9f95a88e90559b52e1", + "drift": false + }, + { + "path": "web/app/src/engine-client/WebEngineClient.ts", + "recordedSha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b", + "exists": true, + "currentHash": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b", + "drift": false + }, + { + "path": "web/app/src/workers/web-engine.worker.ts", + "recordedSha256": "e3bb430e401144bf17cdcbd0de13cde0a4f904f1f9ff9d5b10a73d90f0d4c648", + "exists": true, + "currentHash": "e3bb430e401144bf17cdcbd0de13cde0a4f904f1f9ff9d5b10a73d90f0d4c648", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "recordedSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "exists": true, + "currentHash": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "recordedSha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "exists": true, + "currentHash": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "drift": false + }, + { + "path": "build_blender_native/bin/blender", + "recordedSha256": "97d025812d51642e6c118a7a6228b0481e5ff95e4acb7742f62875f9f27f924b", + "exists": true, + "currentHash": "97d025812d51642e6c118a7a6228b0481e5ff95e4acb7742f62875f9f27f924b", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.wasm", + "recordedSha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "exists": true, + "currentHash": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c", + "drift": false + }, + { + "path": "web/app/src/vendor/blender/web_engine.js", + "recordedSha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "exists": true, + "currentHash": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0", + "drift": false + }, + { + "path": "tools/web/generate-wbv2-native-engine-receipt.mjs", + "recordedSha256": "73ae2edf00dabadbe10abfdeb2f51bbaab495520fbcdfa168795351e8523eba5", + "exists": true, + "currentHash": "73ae2edf00dabadbe10abfdeb2f51bbaab495520fbcdfa168795351e8523eba5", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-002/native-engine-receipt-report.json", + "recordedSha256": "09c13b1814d61a6132ae1168d999e09b768915fe7fec652b6b965f9a6d3796f9", + "exists": true, + "currentHash": "09c13b1814d61a6132ae1168d999e09b768915fe7fec652b6b965f9a6d3796f9", + "drift": false + }, + { + "path": "docs/status/WBV2-P10-002.md", + "recordedSha256": "74b52f1a9a5969545db5d9659404d5f25adeb9c4ec581d18242455883dabfa0c", + "exists": true, + "currentHash": "74b52f1a9a5969545db5d9659404d5f25adeb9c4ec581d18242455883dabfa0c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-002/native-parity-task-plan.json", + "recordedSha256": "a6e205dec083f76ec08eef07f0085b8be228b2a7d28a16618ec3625d3e2fd19b", + "exists": true, + "currentHash": "a6e205dec083f76ec08eef07f0085b8be228b2a7d28a16618ec3625d3e2fd19b", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-002/task-context.json", + "recordedSha256": "fd7c2fcd7e43a44b5a666d4bc3ad5a817f698ef6c2db2150975eb04d80a3b402", + "exists": true, + "currentHash": "fd7c2fcd7e43a44b5a666d4bc3ad5a817f698ef6c2db2150975eb04d80a3b402", + "drift": false + } + ] + }, + { + "task": "WBV2-P10-003", + "phase": "10", + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "manifestSha256": "5c0ce2665b5509e8c9551164c463c60d8e89b5bf13a596980321bdb343dd2c8d", + "status": "done", + "operation": "CORE_MODULE_OPERATOR_MATRIX_RECEIPT", + "artifactCount": 12, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P10-002/manifest.json", + "recordedSha256": "dcf016adce463066fad68a0e9cf2a23a81b0d148afeb05b0e523263bd2b91da3", + "exists": true, + "currentHash": "dcf016adce463066fad68a0e9cf2a23a81b0d148afeb05b0e523263bd2b91da3", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-002/native-engine-receipt-report.json", + "recordedSha256": "09c13b1814d61a6132ae1168d999e09b768915fe7fec652b6b965f9a6d3796f9", + "exists": true, + "currentHash": "09c13b1814d61a6132ae1168d999e09b768915fe7fec652b6b965f9a6d3796f9", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-003/module-matrix.json", + "recordedSha256": "67b1d61ba9b921a3037b76efd80134c7db47d0079209d9d0edc0dd751527d024", + "exists": true, + "currentHash": "67b1d61ba9b921a3037b76efd80134c7db47d0079209d9d0edc0dd751527d024", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-003/module-matrix-production.json", + "recordedSha256": "a677bd01b7f6efa90dbffe4be4cb74173467f9ca06c6c087f7af5463fd587939", + "exists": true, + "currentHash": "a677bd01b7f6efa90dbffe4be4cb74173467f9ca06c6c087f7af5463fd587939", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-003/module-matrix-production.second.json", + "recordedSha256": "a677bd01b7f6efa90dbffe4be4cb74173467f9ca06c6c087f7af5463fd587939", + "exists": true, + "currentHash": "a677bd01b7f6efa90dbffe4be4cb74173467f9ca06c6c087f7af5463fd587939", + "drift": false + }, + { + "path": "web/tests/e2e/wbv2-module-matrix.spec.ts", + "recordedSha256": "9efca3f57ad7093589aecbfb3ba6e83660b3994f24fcac9a56d37f12441b3762", + "exists": true, + "currentHash": "9efca3f57ad7093589aecbfb3ba6e83660b3994f24fcac9a56d37f12441b3762", + "drift": false + }, + { + "path": "tools/web/generate-wbv2-module-matrix.mjs", + "recordedSha256": "06159e091051f1dd969a78187ab9db0c606f73a8fff88956265eb404a690c006", + "exists": true, + "currentHash": "06159e091051f1dd969a78187ab9db0c606f73a8fff88956265eb404a690c006", + "drift": false + }, + { + "path": "tools/web/generate-wbv2-module-matrix-receipt.mjs", + "recordedSha256": "b06afc9da3d5014a31f1c98ff1a15eb5009d8c0e6cce1c86fdd80101ca2447ac", + "exists": true, + "currentHash": "b06afc9da3d5014a31f1c98ff1a15eb5009d8c0e6cce1c86fdd80101ca2447ac", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json", + "recordedSha256": "6d66635d900762809f82e73464ac298944514d25ac5172d2c697181cffeb7b8d", + "exists": true, + "currentHash": "6d66635d900762809f82e73464ac298944514d25ac5172d2c697181cffeb7b8d", + "drift": false + }, + { + "path": "docs/status/WBV2-P10-003.md", + "recordedSha256": "29ca4baeca2ab385f1de3367c65b4bb8c91ff26598d739c68936732a8293a08c", + "exists": true, + "currentHash": "29ca4baeca2ab385f1de3367c65b4bb8c91ff26598d739c68936732a8293a08c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-003/native-parity-task-plan.json", + "recordedSha256": "acfe344c377cbef5b0eefaba22fab88de7d374e9a157ad53930ac6599cd6b1a9", + "exists": true, + "currentHash": "acfe344c377cbef5b0eefaba22fab88de7d374e9a157ad53930ac6599cd6b1a9", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-003/task-context.json", + "recordedSha256": "d1a738ab3faff04087d47c3629ef6d053ba6bfbf550141785925442207a4ef2d", + "exists": true, + "currentHash": "d1a738ab3faff04087d47c3629ef6d053ba6bfbf550141785925442207a4ef2d", + "drift": false + } + ] + }, + { + "task": "WBV2-P11-000", + "phase": "11", + "manifest": "tests/golden/WBV2-P11-000/manifest.json", + "manifestSha256": "2eb9bb41f116f13b019bda76545dfce6739cbc5940a22f40cc26e8571ddad6ff", + "status": "done", + "operation": "AUTHORIZE_MODULE_EXPANSION_CONTINUATION", + "artifactCount": 8, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P10-003/manifest.json", + "recordedSha256": "5c0ce2665b5509e8c9551164c463c60d8e89b5bf13a596980321bdb343dd2c8d", + "exists": true, + "currentHash": "5c0ce2665b5509e8c9551164c463c60d8e89b5bf13a596980321bdb343dd2c8d", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json", + "recordedSha256": "6d66635d900762809f82e73464ac298944514d25ac5172d2c697181cffeb7b8d", + "exists": true, + "currentHash": "6d66635d900762809f82e73464ac298944514d25ac5172d2c697181cffeb7b8d", + "drift": false + }, + { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "recordedSha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3", + "exists": true, + "currentHash": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-000/module-expansion-task-plan.json", + "recordedSha256": "e1280465871db20dd8952f6f5949971ea5bee57a6191000247ac51b6f28cc39a", + "exists": true, + "currentHash": "e1280465871db20dd8952f6f5949971ea5bee57a6191000247ac51b6f28cc39a", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-000/module-expansion-root-report.json", + "recordedSha256": "05221d113d79853596f984b34f6fd983daa9302d800c209ac417f2e1341b6cb6", + "exists": true, + "currentHash": "05221d113d79853596f984b34f6fd983daa9302d800c209ac417f2e1341b6cb6", + "drift": false + }, + { + "path": "docs/tasks/WBV2-P11-000.md", + "recordedSha256": "bdfe2420439b3a5d36d044777194cf3e2763384f460109c679a6fa7d16b0fba7", + "exists": true, + "currentHash": "bdfe2420439b3a5d36d044777194cf3e2763384f460109c679a6fa7d16b0fba7", + "drift": false + }, + { + "path": "docs/status/WBV2-P11-000.md", + "recordedSha256": "97d56508dd5c66d5915f74de76e3782303a9cd137cfe26490c751d8e6739fe62", + "exists": true, + "currentHash": "97d56508dd5c66d5915f74de76e3782303a9cd137cfe26490c751d8e6739fe62", + "drift": false + }, + { + "path": "docs/tasks/WBV2-P11-001.md", + "recordedSha256": "0982f523f8258c9e3ec861d9caa6076abb4a79b3d62ece5936cd326a20e15180", + "exists": true, + "currentHash": "0982f523f8258c9e3ec861d9caa6076abb4a79b3d62ece5936cd326a20e15180", + "drift": false + } + ] + }, + { + "task": "WBV2-P11-001", + "phase": "11", + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "manifestSha256": "e08a02819065f1e7bc72a3bfae99e768c502dfa90af4b0614a701e7cca88b576", + "status": "done", + "operation": "MESH_TOPOLOGY_OPERATION_FAMILY_RECEIPT", + "artifactCount": 13, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P11-000/manifest.json", + "recordedSha256": "2eb9bb41f116f13b019bda76545dfce6739cbc5940a22f40cc26e8571ddad6ff", + "exists": true, + "currentHash": "2eb9bb41f116f13b019bda76545dfce6739cbc5940a22f40cc26e8571ddad6ff", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-003/manifest.json", + "recordedSha256": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987", + "exists": true, + "currentHash": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987", + "drift": false + }, + { + "path": "tests/golden/WBV2-P2-003/mesh-edit-report.json", + "recordedSha256": "f8bd2ced2e1345248d4b536ef045bb9446a55ca5ae87d834f38904b86521b11d", + "exists": true, + "currentHash": "f8bd2ced2e1345248d4b536ef045bb9446a55ca5ae87d834f38904b86521b11d", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-001/mesh-topology-production.json", + "recordedSha256": "206e30ba61dc169364f6279464f98afd4885390a155e5de2f4e3de3990d5896d", + "exists": true, + "currentHash": "206e30ba61dc169364f6279464f98afd4885390a155e5de2f4e3de3990d5896d", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-001/mesh-topology-production.second.json", + "recordedSha256": "206e30ba61dc169364f6279464f98afd4885390a155e5de2f4e3de3990d5896d", + "exists": true, + "currentHash": "206e30ba61dc169364f6279464f98afd4885390a155e5de2f4e3de3990d5896d", + "drift": false + }, + { + "path": "web/tests/e2e/wbv2-mesh-topology-production.spec.ts", + "recordedSha256": "ea773184a2a6c7c1f17cd32a390032701dffdb6debaedf9560614d421279ea47", + "exists": true, + "currentHash": "ea773184a2a6c7c1f17cd32a390032701dffdb6debaedf9560614d421279ea47", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", + "recordedSha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "exists": true, + "currentHash": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3", + "drift": false + }, + { + "path": "web/app/src/engine-client/WebEngineClient.ts", + "recordedSha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b", + "exists": true, + "currentHash": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b", + "drift": false + }, + { + "path": "tools/web/generate-wbv2-mesh-topology-receipt.mjs", + "recordedSha256": "7c420d6be867d93a51e3049e1dcd52760ca9e0bd7e61ab13d0fe249714cf3f00", + "exists": true, + "currentHash": "7c420d6be867d93a51e3049e1dcd52760ca9e0bd7e61ab13d0fe249714cf3f00", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json", + "recordedSha256": "5828fdde15d73bb1fb066bb05c35762f21471c1f52277903d39b4bdcc020f5f8", + "exists": true, + "currentHash": "5828fdde15d73bb1fb066bb05c35762f21471c1f52277903d39b4bdcc020f5f8", + "drift": false + }, + { + "path": "docs/status/WBV2-P11-001.md", + "recordedSha256": "da471d0e7133f0b0f373551c0316c2ddd93505b3510822c4ee5c9256575d4e4d", + "exists": true, + "currentHash": "da471d0e7133f0b0f373551c0316c2ddd93505b3510822c4ee5c9256575d4e4d", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-001/module-expansion-task-plan.json", + "recordedSha256": "909447163efc1ea0b015a68e838ae9e87e9a8867be008ae16e34349c2dcad650", + "exists": true, + "currentHash": "909447163efc1ea0b015a68e838ae9e87e9a8867be008ae16e34349c2dcad650", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-001/task-context.json", + "recordedSha256": "871e8c6823333927399e60a55cc067b3b535274fc7c7b2911055a69d419b5057", + "exists": true, + "currentHash": "871e8c6823333927399e60a55cc067b3b535274fc7c7b2911055a69d419b5057", + "drift": false + } + ] + }, + { + "task": "WBV2-P11-002", + "phase": "11", + "manifest": "tests/golden/WBV2-P11-002/manifest.json", + "manifestSha256": "32b9581bc0ef2cd3435a17c3b7d454ae5327ef8f0ac4c1916e9a0857eb42aaf1", + "status": "done", + "operation": "MODIFIER_PARAMETER_APPLY_FAMILY_RECEIPT", + "artifactCount": 14, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P11-001/manifest.json", + "recordedSha256": "e08a02819065f1e7bc72a3bfae99e768c502dfa90af4b0614a701e7cca88b576", + "exists": true, + "currentHash": "e08a02819065f1e7bc72a3bfae99e768c502dfa90af4b0614a701e7cca88b576", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-001/manifest.json", + "recordedSha256": "6f1bee73c987f5e66733feb03d1d708e0f2dbd0776ac6634dbf694cde385143c", + "exists": true, + "currentHash": "6f1bee73c987f5e66733feb03d1d708e0f2dbd0776ac6634dbf694cde385143c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P4-001/modifier-report.json", + "recordedSha256": "65d2cf962511ae181e53cda1cc01f8db46819ee450a470384abbe829d549adf8", + "exists": true, + "currentHash": "65d2cf962511ae181e53cda1cc01f8db46819ee450a470384abbe829d549adf8", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-002/native-engine-receipt-report.json", + "recordedSha256": "09c13b1814d61a6132ae1168d999e09b768915fe7fec652b6b965f9a6d3796f9", + "exists": true, + "currentHash": "09c13b1814d61a6132ae1168d999e09b768915fe7fec652b6b965f9a6d3796f9", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-002/modifier-parameter-production.json", + "recordedSha256": "8ed9e05aa51ad250bff1dd5095f977c9beb883bfa77203d43ba1f54920efee1a", + "exists": true, + "currentHash": "8ed9e05aa51ad250bff1dd5095f977c9beb883bfa77203d43ba1f54920efee1a", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-002/modifier-parameter-production.second.json", + "recordedSha256": "8ed9e05aa51ad250bff1dd5095f977c9beb883bfa77203d43ba1f54920efee1a", + "exists": true, + "currentHash": "8ed9e05aa51ad250bff1dd5095f977c9beb883bfa77203d43ba1f54920efee1a", + "drift": false + }, + { + "path": "web/tests/e2e/wbv2-modifier-parameter-production.spec.ts", + "recordedSha256": "1b6f247367222a5d92511b14cc320732e1eb07e3e1cdfdf90929af507039ee23", + "exists": true, + "currentHash": "1b6f247367222a5d92511b14cc320732e1eb07e3e1cdfdf90929af507039ee23", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "recordedSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "exists": true, + "currentHash": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "drift": false + }, + { + "path": "web/app/src/engine-client/WebEngineClient.ts", + "recordedSha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b", + "exists": true, + "currentHash": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b", + "drift": false + }, + { + "path": "tools/web/generate-wbv2-modifier-parameter-receipt.mjs", + "recordedSha256": "25f2a8ad878fd6fe6bc456f29b3e500f80a47e1a236788e5b37d33f61dc946e1", + "exists": true, + "currentHash": "25f2a8ad878fd6fe6bc456f29b3e500f80a47e1a236788e5b37d33f61dc946e1", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-002/modifier-parameter-receipt-report.json", + "recordedSha256": "339bf5007b04f81aecbd03a22791659895b2e78219cd5ee4031b890eb3120bc5", + "exists": true, + "currentHash": "339bf5007b04f81aecbd03a22791659895b2e78219cd5ee4031b890eb3120bc5", + "drift": false + }, + { + "path": "docs/status/WBV2-P11-002.md", + "recordedSha256": "9ab967a17d3b71d840b7108f306394bbc07c7f0a5ca63f4d0b664cb5c7590bab", + "exists": true, + "currentHash": "9ab967a17d3b71d840b7108f306394bbc07c7f0a5ca63f4d0b664cb5c7590bab", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-002/module-expansion-task-plan.json", + "recordedSha256": "8593eef68c7c8ba9fe772a37c84d6462d945220f0ebdb21a7cf981bd1f0f3fb0", + "exists": true, + "currentHash": "8593eef68c7c8ba9fe772a37c84d6462d945220f0ebdb21a7cf981bd1f0f3fb0", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-002/task-context.json", + "recordedSha256": "c5fa4e2865967ade4f8fd6da5e4516cb5574e1a520df5d68fc793be438b3530d", + "exists": true, + "currentHash": "c5fa4e2865967ade4f8fd6da5e4516cb5574e1a520df5d68fc793be438b3530d", + "drift": false + } + ] + }, + { + "task": "WBV2-P11-003", + "phase": "11", + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "manifestSha256": "da4c9414baaaab9a47c6cc6af66426450c640a99d781e4c0273e0189a72c047c", + "status": "done", + "operation": "ASSET_LINK_OVERRIDE_RELOAD_FAMILY_RECEIPT", + "artifactCount": 14, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED", + "artifacts": [ + { + "path": "tests/golden/WBV2-P11-002/manifest.json", + "recordedSha256": "32b9581bc0ef2cd3435a17c3b7d454ae5327ef8f0ac4c1916e9a0857eb42aaf1", + "exists": true, + "currentHash": "32b9581bc0ef2cd3435a17c3b7d454ae5327ef8f0ac4c1916e9a0857eb42aaf1", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-005/manifest.json", + "recordedSha256": "42dc02d198630c2735c5a0a1beab37f2a98ff0233927215099f67606d248c39e", + "exists": true, + "currentHash": "42dc02d198630c2735c5a0a1beab37f2a98ff0233927215099f67606d248c39e", + "drift": false + }, + { + "path": "tests/golden/WBV2-P3-005/library-report.json", + "recordedSha256": "0b572a5b480dd9b123cbb9c55c842fb002b1a8a6c96afd196af90bee1ebd9940", + "exists": true, + "currentHash": "0b572a5b480dd9b123cbb9c55c842fb002b1a8a6c96afd196af90bee1ebd9940", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-002/native-engine-receipt-report.json", + "recordedSha256": "09c13b1814d61a6132ae1168d999e09b768915fe7fec652b6b965f9a6d3796f9", + "exists": true, + "currentHash": "09c13b1814d61a6132ae1168d999e09b768915fe7fec652b6b965f9a6d3796f9", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-003/asset-link-override-production.json", + "recordedSha256": "1930629c375c9b71bf7a3ad8213c29348cc8ca078f38562341825e038d065afe", + "exists": true, + "currentHash": "1930629c375c9b71bf7a3ad8213c29348cc8ca078f38562341825e038d065afe", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-003/asset-link-override-production.second.json", + "recordedSha256": "1930629c375c9b71bf7a3ad8213c29348cc8ca078f38562341825e038d065afe", + "exists": true, + "currentHash": "1930629c375c9b71bf7a3ad8213c29348cc8ca078f38562341825e038d065afe", + "drift": false + }, + { + "path": "web/tests/e2e/wbv2-asset-link-override-production.spec.ts", + "recordedSha256": "96978326d189dcd062b3029b8141a0cb2550fe0cebf7cfc3d63733b043467a83", + "exists": true, + "currentHash": "96978326d189dcd062b3029b8141a0cb2550fe0cebf7cfc3d63733b043467a83", + "drift": false + }, + { + "path": "web/app/src/engine-client/WebEngineClient.ts", + "recordedSha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b", + "exists": true, + "currentHash": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b", + "drift": false + }, + { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "recordedSha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "exists": true, + "currentHash": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8", + "drift": false + }, + { + "path": "tools/web/generate-wbv2-asset-link-override-receipt.mjs", + "recordedSha256": "9d574b96e59aaaac8846ec318ab5acfd77d1c8fc74662d3f72107adaf88a767b", + "exists": true, + "currentHash": "9d574b96e59aaaac8846ec318ab5acfd77d1c8fc74662d3f72107adaf88a767b", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json", + "recordedSha256": "d7eb0e3a0017fdb1780ba124c540e4967a01b7ea45303146b9ebc86327db48b9", + "exists": true, + "currentHash": "d7eb0e3a0017fdb1780ba124c540e4967a01b7ea45303146b9ebc86327db48b9", + "drift": false + }, + { + "path": "docs/status/WBV2-P11-003.md", + "recordedSha256": "63aefc995b227dc95cb5650349d9a1c462202328eb36438e2bef3cdf119903fd", + "exists": true, + "currentHash": "63aefc995b227dc95cb5650349d9a1c462202328eb36438e2bef3cdf119903fd", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-003/module-expansion-task-plan.json", + "recordedSha256": "d4c7be339c4b0455d82b4f4c4baab6a4f47909883b9da3c1de9e61ea8001b898", + "exists": true, + "currentHash": "d4c7be339c4b0455d82b4f4c4baab6a4f47909883b9da3c1de9e61ea8001b898", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-003/task-context.json", + "recordedSha256": "62b0acbaffa88b32bca0f04e6db0adfea8dc2a68e5d7f1aa9a3cd1518ad9a323", + "exists": true, + "currentHash": "62b0acbaffa88b32bca0f04e6db0adfea8dc2a68e5d7f1aa9a3cd1518ad9a323", + "drift": false + } + ] + }, + { + "task": "WBV2-P11-004", + "phase": "11", + "manifest": "tests/golden/WBV2-P11-004/manifest.json", + "manifestSha256": "3da220443dcac4bc85a2e9e2052575d01b07e6ac3006073e153c8f39e0b0a04c", + "status": "done", + "operation": "RECOMPUTE_ENGINE_MODULE_PARITY_GATE", + "artifactCount": 16, + "currentDriftCount": 0, + "evidenceClass": "ENGINE_BOUND_EXACT", + "artifacts": [ + { + "path": "tests/golden/WBV2-P11-003/manifest.json", + "recordedSha256": "da4c9414baaaab9a47c6cc6af66426450c640a99d781e4c0273e0189a72c047c", + "exists": true, + "currentHash": "da4c9414baaaab9a47c6cc6af66426450c640a99d781e4c0273e0189a72c047c", + "drift": false + }, + { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "recordedSha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3", + "exists": true, + "currentHash": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-002/native-engine-receipt-report.json", + "recordedSha256": "09c13b1814d61a6132ae1168d999e09b768915fe7fec652b6b965f9a6d3796f9", + "exists": true, + "currentHash": "09c13b1814d61a6132ae1168d999e09b768915fe7fec652b6b965f9a6d3796f9", + "drift": false + }, + { + "path": "tests/golden/WBV2-P10-003/module-matrix-receipt-report.json", + "recordedSha256": "6d66635d900762809f82e73464ac298944514d25ac5172d2c697181cffeb7b8d", + "exists": true, + "currentHash": "6d66635d900762809f82e73464ac298944514d25ac5172d2c697181cffeb7b8d", + "drift": false + }, + { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "recordedSha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "exists": true, + "currentHash": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-001/manifest.json", + "recordedSha256": "e08a02819065f1e7bc72a3bfae99e768c502dfa90af4b0614a701e7cca88b576", + "exists": true, + "currentHash": "e08a02819065f1e7bc72a3bfae99e768c502dfa90af4b0614a701e7cca88b576", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-001/mesh-topology-receipt-report.json", + "recordedSha256": "5828fdde15d73bb1fb066bb05c35762f21471c1f52277903d39b4bdcc020f5f8", + "exists": true, + "currentHash": "5828fdde15d73bb1fb066bb05c35762f21471c1f52277903d39b4bdcc020f5f8", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-002/manifest.json", + "recordedSha256": "32b9581bc0ef2cd3435a17c3b7d454ae5327ef8f0ac4c1916e9a0857eb42aaf1", + "exists": true, + "currentHash": "32b9581bc0ef2cd3435a17c3b7d454ae5327ef8f0ac4c1916e9a0857eb42aaf1", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-002/modifier-parameter-receipt-report.json", + "recordedSha256": "339bf5007b04f81aecbd03a22791659895b2e78219cd5ee4031b890eb3120bc5", + "exists": true, + "currentHash": "339bf5007b04f81aecbd03a22791659895b2e78219cd5ee4031b890eb3120bc5", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-003/manifest.json", + "recordedSha256": "da4c9414baaaab9a47c6cc6af66426450c640a99d781e4c0273e0189a72c047c", + "exists": true, + "currentHash": "da4c9414baaaab9a47c6cc6af66426450c640a99d781e4c0273e0189a72c047c", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-003/asset-link-override-receipt-report.json", + "recordedSha256": "d7eb0e3a0017fdb1780ba124c540e4967a01b7ea45303146b9ebc86327db48b9", + "exists": true, + "currentHash": "d7eb0e3a0017fdb1780ba124c540e4967a01b7ea45303146b9ebc86327db48b9", + "drift": false + }, + { + "path": "tools/web/generate-wbv2-engine-module-gate.mjs", + "recordedSha256": "f22a8053e183505ad45a8f182b03b99e46b06f21a11a43999b845f86f5149aeb", + "exists": true, + "currentHash": "f22a8053e183505ad45a8f182b03b99e46b06f21a11a43999b845f86f5149aeb", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-004/engine-module-gate-report.json", + "recordedSha256": "9b549cd365f8719ee48b075801e897d04df660929ac4bd7e1325a6b4b4646280", + "exists": true, + "currentHash": "9b549cd365f8719ee48b075801e897d04df660929ac4bd7e1325a6b4b4646280", + "drift": false + }, + { + "path": "docs/status/WBV2-P11-004.md", + "recordedSha256": "f777ef61b9c46e0bdfaca81aca3c62059c5438547214eaa3545f54aec65122d0", + "exists": true, + "currentHash": "f777ef61b9c46e0bdfaca81aca3c62059c5438547214eaa3545f54aec65122d0", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-004/module-expansion-task-plan.json", + "recordedSha256": "185f2412fd651068346230cc945973e078cfa642da2cb6f5f51943e306b40d57", + "exists": true, + "currentHash": "185f2412fd651068346230cc945973e078cfa642da2cb6f5f51943e306b40d57", + "drift": false + }, + { + "path": "tests/golden/WBV2-P11-004/task-context.json", + "recordedSha256": "87805ebd4fbda1dd03d8c82753df10f01fdd3a396e3ea2379f0dffa36005cc25", + "exists": true, + "currentHash": "87805ebd4fbda1dd03d8c82753df10f01fdd3a396e3ea2379f0dffa36005cc25", + "drift": false + } + ] + } + ], + "engineBoundClaims": 6, + "claims": { + "historicalReceipts": 7, + "historicalDriftRecorded": 25, + "currentEngineBound": [ + "WBV2-P10-002", + "WBV2-P11-004" + ], + "noNewExecution": true + }, + "summary": { + "manifestsDone": 34, + "artifactRecords": 517, + "historicalDriftManifests": 25, + "currentEngineBoundManifests": 2, + "missingArtifacts": 0 + } +} diff --git a/tests/golden/WBV2-P12-001/domain-expansion-task-plan.json b/tests/golden/WBV2-P12-001/domain-expansion-task-plan.json new file mode 100644 index 000000000..a30a2e06f --- /dev/null +++ b/tests/golden/WBV2-P12-001/domain-expansion-task-plan.json @@ -0,0 +1,1895 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_DOMAIN_EXPANSION_EPOCH_1", + "status": "ACTIVE_DOMAIN_EXPANSION_QUEUE", + "authority": "queue_reactivated_after_p11_engine_gate", + "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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-000", + "phase": "P10", + "title": "authorize_native_engine_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P9-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-000.md", + "behavior": "Authorize native Blender/WASM engine parity continuation after bounded Chromium capability evidence.", + "outputs": [ + "continuation receipt", + "native parity plan", + "scope limits" + ], + "acceptance": [ + "P9 evidence remains hash-bound", + "native build/runtime is explicit", + "one native parity task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P10-001", + "phase": "P10", + "title": "reconcile_wbv2_inventory_source_drift", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-inventory", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-001.md", + "behavior": "Record the authorized mutable WBV2 plan drift and prove dependency closure stability without rewriting historical P0 evidence.", + "outputs": [ + "current source hash baseline", + "drift report", + "checker compatibility" + ], + "acceptance": [ + "historical P0 hashes remain unchanged", + "only authorized plan drift is recorded", + "dependency roots/lockfile/closure remain stable", + "inventory checker passes using current baseline" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-002", + "phase": "P10", + "title": "bind_native_and_wasm_engine_receipts", + "kind": "feature", + "owner": "ENGINE", + "dependsOn": [ + "WBV2-P10-001" + ], + "parityId": "ENGINE.NATIVE_WASM_BRIDGE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p10-engine", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-002.md", + "behavior": "Bind Mesh, Modifier, and Asset Catalog receipts to the compiled Blender native binary and web_engine.wasm runtime.", + "outputs": [ + "native receipt", + "WASM receipt", + "Chromium engine report" + ], + "acceptance": [ + "native Blender binary is source-bound", + "WASM binary and JS are hash-bound", + "same mutation reaches real engine/Main", + "save/reopen and failures remain exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-003", + "phase": "P10", + "title": "expand_core_module_operator_matrix", + "kind": "feature", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-002" + ], + "parityId": "CORE.MODULE_MATRIX", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-matrix", + "gate": "G7", + "card": "docs/tasks/WBV2-P10-003.md", + "behavior": "Expand the three proven capability modules with data-driven operator coverage and aggregate regression receipts.", + "outputs": [ + "module matrix", + "shard reports", + "aggregate manifest" + ], + "acceptance": [ + "positive cases are L2+", + "negative cases do not mutate Main", + "shards use one catalog hash", + "unmapped and retained-negative cases stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-000", + "phase": "P11", + "title": "authorize_module_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P10-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-governance", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-000.md", + "behavior": "Authorize deeper module production after real native/WASM engine binding and the first aggregate matrix.", + "outputs": [ + "continuation root", + "module expansion plan", + "scope limits" + ], + "acceptance": [ + "P10 evidence remains hash-bound", + "one expansion task is active", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P11-001", + "phase": "P11", + "title": "mesh_topology_operation_family", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P11-000" + ], + "parityId": "MESH.EDIT_TOPOLOGY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-mesh", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-001.md", + "behavior": "Execute merge, dissolve, extrude, inset, bevel, and loop-cut through the real Blender WASM Main and preserve each result through save/reopen.", + "outputs": [ + "topology receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "six mesh operations mutate Main", + "revision increments exactly once", + "save/reopen preserves topology counts", + "invalid selection and incompatible configuration fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-002", + "phase": "P11", + "title": "modifier_parameter_apply_family", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P11-001" + ], + "parityId": "MODIFIER.PARAMETER_APPLY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-modifier", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-002.md", + "behavior": "Extend the real Modifier Main path from enable/disable to bounded parameter and apply transactions.", + "outputs": [ + "modifier parameter receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "parameter mutation is native/WASM bound", + "apply result is evaluated", + "save/reopen is exact", + "dependency and stale inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-003", + "phase": "P11", + "title": "asset_link_override_reload_family", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P11-002" + ], + "parityId": "ASSET.LINK_OVERRIDE_RELOAD_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-asset", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-003.md", + "behavior": "Extend the real Asset Main path from append to link, override, reload, and missing-library boundaries.", + "outputs": [ + "asset ownership receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "source ownership is preserved", + "override is local and hash-bound", + "reload revision is checked", + "missing source remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-004", + "phase": "P11", + "title": "recompute_engine_module_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P11-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-release", + "gate": "G8", + "card": "docs/tasks/WBV2-P11-004.md", + "behavior": "Recompute engine-bound module parity from P10 and P11 receipts without claiming whole-inventory completion.", + "outputs": [ + "engine module gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound claims are emitted", + "inventory remainder is explicit", + "provenance epoch 2 remains authorized rebaseline only", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-000", + "phase": "P12", + "title": "authorize_domain_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P11-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-governance", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-000.md", + "behavior": "Authorize expansion from the three engine-bound modules to the remaining high-value Blender Web domains using existing source evidence.", + "outputs": [ + "continuation root", + "domain expansion plan", + "scope limits" + ], + "acceptance": [ + "P11 evidence remains hash-bound", + "domain tasks use existing source receipts", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P12-001", + "phase": "P12", + "title": "reconcile_existing_capability_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P12-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-ledger", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-001.md", + "behavior": "Aggregate existing WBV2 P1-P6 and P10-P11 manifests into a conservative capability ledger without inventing claims.", + "outputs": [ + "capability ledger", + "evidence index", + "remaining gap map" + ], + "acceptance": [ + "all source manifests are hash-verified", + "only done receipts enter proven evidence", + "L0/metadata and blocked cases remain explicit", + "inventory remainder is preserved" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-002", + "phase": "P12", + "title": "scene_object_workflow_engine_receipt", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P12-001" + ], + "parityId": "EDITOR.SCENE_OBJECT_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-scene", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-002.md", + "behavior": "Bind object visibility and transform edits to the compiled WebEngine WASM Main with save/reopen and revision guards.", + "outputs": [ + "scene/object receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "visibility and transform mutate Main", + "desktop source oracle is bound", + "save/reopen is exact", + "stale and malformed commands fail closed" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-003", + "phase": "P12", + "title": "material_animation_engine_receipt", + "kind": "feature", + "owner": "AUTHORING", + "dependsOn": [ + "WBV2-P12-002" + ], + "parityId": "AUTHORING.MATERIAL_ANIMATION_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-authoring", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-003.md", + "behavior": "Bind material Principled/texture and TRS keyframe edits to the compiled WebEngine WASM Main.", + "outputs": [ + "authoring receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "material and keyframe Main mutations pass", + "source hashes are bound", + "save/reopen is exact", + "unsupported graph and stale frame inputs fail closed" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-004", + "phase": "P12", + "title": "viewport_nonmesh_engine_receipt", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P12-003" + ], + "parityId": "VIEWPORT.NONMESH_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-viewport", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-004.md", + "behavior": "Bind viewport SceneIR and bounded non-mesh read/edit paths to the compiled WebEngine runtime with explicit unsupported boundaries.", + "outputs": [ + "viewport receipt", + "nonmesh boundary map", + "manifest" + ], + "acceptance": [ + "nonblank viewport evidence is bound", + "non-mesh data is explicit", + "unsupported and budget cases fail closed", + "save/reopen and resource disposal are exact" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-005", + "phase": "P12", + "title": "recompute_domain_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P12-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-release", + "gate": "G9", + "card": "docs/tasks/WBV2-P12-005.md", + "behavior": "Recompute domain parity from the complete evidence ledger while retaining explicit inventory and provenance limits.", + "outputs": [ + "domain parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound domain claims are emitted", + "unproven inventory remains explicit", + "epoch 2 remains authorized rebaseline only", + "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-P12-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P12-000/domain-expansion-task-plan.json", + "sha256": "ac21b0b65eed889928c5209738215584464157b4c5db16c95ba8d2ff1f26d8d5" + } +} diff --git a/tests/golden/WBV2-P12-001/manifest.json b/tests/golden/WBV2-P12-001/manifest.json new file mode 100644 index 000000000..3e60d0dbe --- /dev/null +++ b/tests/golden/WBV2-P12-001/manifest.json @@ -0,0 +1,65 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-001", + "parentTask": "WBV2-P12-000", + "operation": "RECONCILE_EXISTING_CAPABILITY_LEDGER", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "READ_ONLY_MANIFEST_BATCH_SCAN", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P12-000/manifest.json", + "sha256": "1bdf18ca124a46752303324afd73eea13f08ffd36aedcbb239657cbe712a7333" + }, + "inventory": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8" + }, + "sourceIndex": { + "path": "tests/golden/WBV2-P12-001/source-manifest-index.json", + "sha256": "879a13d14bf4d502229f14927c58b417e07b562309bf3def563ac7baee95d739" + }, + "ledger": { + "path": "tests/golden/WBV2-P12-001/capability-ledger.json", + "sha256": "44e144229708db8d1f2b35ec8cd6851bf9d91185a1a04267f4ffcd7abc2c60ba" + }, + "report": { + "path": "tests/golden/WBV2-P12-001/capability-ledger-report.json", + "sha256": "5c41a84564f78bb8e78a988f0445b06eaf1b3d0af8c59cdb216d0e79b0d46414" + }, + "generator": { + "path": "tools/web/generate-wbv2-capability-ledger.mjs", + "sha256": "79dd1fe6a0c23155be9eab330f8a5a286f53e69c62a6f90b5e42870c2aff307d" + }, + "checker": { + "path": "tools/web/check-wbv2-capability-ledger.mjs", + "sha256": "783e268eb5b44a926e552bb1e06f0f944f2e9fa6ba2879b3523cd1911ad5e70d" + }, + "parityPlan": { + "path": "tests/golden/WBV2-P12-001/domain-expansion-task-plan.json", + "sha256": "a2eb22c8b6f6e541c5ae071db6c661e54823d6e351bc1377bb45acf62ac28688" + }, + "status": { + "path": "docs/status/WBV2-P12-001.md", + "sha256": "0eac94a00dafc40ee1a03296834a15ebfcc39210f587afa82402be0637b55782" + }, + "taskContext": { + "path": "tests/golden/WBV2-P12-001/task-context.json", + "sha256": "21e144b3f9b86d2d62066fe5e40b8c85c6e9095980b154e68aa81e13c54f6642" + } + }, + "assertions": { + "sourceManifests": 34, + "artifactRecords": 517, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "historicalDriftExplicit": true, + "currentEngineBoundClaimsReused": 6, + "inventoryTotal": 6900, + "inventoryPending": 6618, + "inventoryClaimedComplete": 0, + "historicalReproduction": false + }, + "nextTask": "WBV2-P12-002" +} diff --git a/tests/golden/WBV2-P12-001/source-manifest-index.json b/tests/golden/WBV2-P12-001/source-manifest-index.json new file mode 100644 index 000000000..8acd44391 --- /dev/null +++ b/tests/golden/WBV2-P12-001/source-manifest-index.json @@ -0,0 +1,348 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-001", + "operation": "SOURCE_MANIFEST_BATCH_INDEX", + "policy": "read_only_batch_scan_no_repeated_execution", + "entries": [ + { + "task": "WBV2-P1-001", + "manifest": "tests/golden/WBV2-P1-001/manifest.json", + "manifestSha256": "b40c32066ac0667729465568135edde25d8ca94f97d74b613efb94acc8a4b75d", + "status": "done", + "operation": "RUNTIME_VARIANTS_SOURCE_RECEIPTS_LOCAL_BOUNDED", + "artifactCount": 14, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P1-002", + "manifest": "tests/golden/WBV2-P1-002/manifest.json", + "manifestSha256": "456b93a29ae0ce65e1490e688e5a8563fbe4ba57ac104814f344ad6e7c2ec668", + "status": "done", + "operation": "SCENEIR_STABLE_IDS_BINARY_DELTAS_LOCAL_EXACT", + "artifactCount": 13, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P1-003", + "manifest": "tests/golden/WBV2-P1-003/manifest.json", + "manifestSha256": "bcdd4835ddc3f668419f6f5d505e010a7404d3c129bf85f99f587daa648f2ae1", + "status": "done", + "operation": "MAIN_TRANSACTION_HISTORY_SAVE_LOCAL_EXACT", + "artifactCount": 13, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P1-004", + "manifest": "tests/golden/WBV2-P1-004/manifest.json", + "manifestSha256": "19d9cbcf2455df8ffad49907b1765aeab45d865bd33a5771ed16a153b29887a1", + "status": "done", + "operation": "WORKER_CANCEL_RESTART_DISPOSE_LOCAL_BOUNDED", + "artifactCount": 15, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P1-005", + "manifest": "tests/golden/WBV2-P1-005/manifest.json", + "manifestSha256": "cb22c9c218ffcac0fd45527817eb864dbaf8f677e9b18775275f2f0fc8aa302d", + "status": "done", + "operation": "STORAGE_JOURNAL_RECOVERY_LOCAL_BOUNDED", + "artifactCount": 15, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P2-001", + "manifest": "tests/golden/WBV2-P2-001/manifest.json", + "manifestSha256": "ad6d73ac457d20f95fd080fcdacc38049d2ce9faa8c56f325f9f7f22074d1cb5", + "status": "done", + "operation": "EDITOR_OPEN_SCENE_LOCAL_EXACT", + "artifactCount": 14, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P2-002", + "manifest": "tests/golden/WBV2-P2-002/manifest.json", + "manifestSha256": "fa65312256f556ce80609206e266f7fc3ccbeda34eae3da179040f8e80dd017c", + "status": "done", + "operation": "OBJECT_TRANSFORM_HIERARCHY_LOCAL_EXACT", + "artifactCount": 17, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P2-003", + "manifest": "tests/golden/WBV2-P2-003/manifest.json", + "manifestSha256": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987", + "status": "done", + "operation": "MESH_EDIT_CORE_LOCAL_EXACT", + "artifactCount": 17, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P2-004", + "manifest": "tests/golden/WBV2-P2-004/manifest.json", + "manifestSha256": "9a511f9620bdc886ab4684ac449dcaa156086cde76c0b95d16795f0f51a304f2", + "status": "done", + "operation": "VIEWPORT_MAIN_OFFSCREEN_LOCAL_BOUNDED", + "artifactCount": 20, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P2-005", + "manifest": "tests/golden/WBV2-P2-005/manifest.json", + "manifestSha256": "284eda53bb4191da68a30b4fcb8e02801cb83299864846f7e52875f4d976b7be", + "status": "done", + "operation": "WORKFLOW_P0_USER_LOOP_LOCAL_BOUNDED", + "artifactCount": 17, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P3-001", + "manifest": "tests/golden/WBV2-P3-001/manifest.json", + "manifestSha256": "e3b037fdcf55b5e64fd770c6fa90d0b72e96b3e764a305df0ceee378fa167191", + "status": "done", + "operation": "MATERIAL_PBR_UV_LOCAL_BOUNDED", + "artifactCount": 14, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P3-002", + "manifest": "tests/golden/WBV2-P3-002/manifest.json", + "manifestSha256": "cc36b933a2b6d817ea7226c07d0617ecdf2f89575136a83cb15de4e7c8f59188", + "status": "done", + "operation": "ANIMATION_TRS_ACTION_LOCAL_EXACT", + "artifactCount": 14, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P3-003", + "manifest": "tests/golden/WBV2-P3-003/manifest.json", + "manifestSha256": "1b97d2ca9add58a6185a21137729edc4c8b11a2d21be1682793e3d05b9ef9011", + "status": "done", + "operation": "RIG_POSE_SKIN_LOCAL_BOUNDED", + "artifactCount": 14, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P3-004", + "manifest": "tests/golden/WBV2-P3-004/manifest.json", + "manifestSha256": "bb4f2783eaa78a0104045048fc9f5d925a78e5a2539f5f1b9e699a067d05fa27", + "status": "done", + "operation": "IO_GLB_ROUNDTRIP_LOCAL_EXACT", + "artifactCount": 14, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P3-005", + "manifest": "tests/golden/WBV2-P3-005/manifest.json", + "manifestSha256": "42dc02d198630c2735c5a0a1beab37f2a98ff0233927215099f67606d248c39e", + "status": "done", + "operation": "ASSET_LIBRARY_APPEND_LINK_OVERRIDE_LOCAL_BOUNDED", + "artifactCount": 15, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P4-001", + "manifest": "tests/golden/WBV2-P4-001/manifest.json", + "manifestSha256": "6f1bee73c987f5e66733feb03d1d708e0f2dbd0776ac6634dbf694cde385143c", + "status": "done", + "operation": "MODIFIER_DECLARED_SLICES_LOCAL_BOUNDED", + "artifactCount": 16, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P4-002", + "manifest": "tests/golden/WBV2-P4-002/manifest.json", + "manifestSha256": "2b9e907fa11470b354bbb98695696bcdfae5c654ef03373b1eb2230098f28142", + "status": "done", + "operation": "NODES_ALLOWLIST_LOCAL_BOUNDED", + "artifactCount": 19, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P4-003", + "manifest": "tests/golden/WBV2-P4-003/manifest.json", + "manifestSha256": "9c41ef52263d544650b1bad2dc2ec5f40ed63a9ab1b9732492a46672384e1218", + "status": "done", + "operation": "SCULPT_NONMESH_PAINT_BOUNDED_LOCAL_BOUNDED", + "artifactCount": 18, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P4-004", + "manifest": "tests/golden/WBV2-P4-004/manifest.json", + "manifestSha256": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016", + "status": "done", + "operation": "SIMULATION_CACHE_IDENTITY_LIFECYCLE_LOCAL_BOUNDED", + "artifactCount": 17, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P5-001", + "manifest": "tests/golden/WBV2-P5-001/manifest.json", + "manifestSha256": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e", + "status": "done", + "operation": "RENDER_CAPABILITY_ROUTING_LOCAL_BOUNDED", + "artifactCount": 19, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P5-002", + "manifest": "tests/golden/WBV2-P5-002/manifest.json", + "manifestSha256": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2", + "status": "done", + "operation": "MEDIA_BOUNDED_WORKFLOW_LOCAL_BOUNDED", + "artifactCount": 17, + "currentDriftCount": 3, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P5-003", + "manifest": "tests/golden/WBV2-P5-003/manifest.json", + "manifestSha256": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c", + "status": "done", + "operation": "SERVER_JOB_RESULT_BINDING_SERVER_EXACT", + "artifactCount": 19, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P6-001", + "manifest": "tests/golden/WBV2-P6-001/manifest.json", + "manifestSha256": "e8bb64d618b630b34292501d44fe46c55de3a57ddf0fccb4b7974c6a479456a4", + "status": "done", + "operation": "SECURITY_SCRIPTING_LOCAL_EXACT", + "artifactCount": 16, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P6-002", + "manifest": "tests/golden/WBV2-P6-002/manifest.json", + "manifestSha256": "b66e193b81c0c592964c874902d0ee024c4877610fd7fa92aee2a961f69d01ba", + "status": "done", + "operation": "PERFORMANCE_FAULT_RECOVERY_MATRIX_LOCAL_EXACT", + "artifactCount": 17, + "currentDriftCount": 4, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P6-003", + "manifest": "tests/golden/WBV2-P6-003/manifest.json", + "manifestSha256": "22a773feb29435ec0c29eaa720e7ae39c5f87455c678b78ae6c02b4985fea54d", + "status": "done", + "operation": "OFFLINE_CI_SBOM_ROLLBACK_RELEASE_LOCAL_EXACT", + "artifactCount": 18, + "currentDriftCount": 6, + "evidenceClass": "HISTORICAL_DRIFT_RECORDED" + }, + { + "task": "WBV2-P10-000", + "manifest": "tests/golden/WBV2-P10-000/manifest.json", + "manifestSha256": "269acf27b93097887e8b475b53fbbfae4c7d9c653dd4b6c5921258db86576de0", + "status": "done", + "operation": "AUTHORIZE_NATIVE_ENGINE_PARITY_CONTINUATION", + "artifactCount": 8, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED" + }, + { + "task": "WBV2-P10-001", + "manifest": "tests/golden/WBV2-P10-001/manifest.json", + "manifestSha256": "200ad417f44414b25c2b431fd6e7ff2c98c59e23871a7220facd92f295f1cd8d", + "status": "done", + "operation": "RECONCILE_WBV2_INVENTORY_SOURCE_DRIFT", + "artifactCount": 13, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED" + }, + { + "task": "WBV2-P10-002", + "manifest": "tests/golden/WBV2-P10-002/manifest.json", + "manifestSha256": "dcf016adce463066fad68a0e9cf2a23a81b0d148afeb05b0e523263bd2b91da3", + "status": "done", + "operation": "NATIVE_WASM_ENGINE_PRODUCTION_RECEIPT", + "artifactCount": 17, + "currentDriftCount": 0, + "evidenceClass": "ENGINE_BOUND_EXACT" + }, + { + "task": "WBV2-P10-003", + "manifest": "tests/golden/WBV2-P10-003/manifest.json", + "manifestSha256": "5c0ce2665b5509e8c9551164c463c60d8e89b5bf13a596980321bdb343dd2c8d", + "status": "done", + "operation": "CORE_MODULE_OPERATOR_MATRIX_RECEIPT", + "artifactCount": 12, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED" + }, + { + "task": "WBV2-P11-000", + "manifest": "tests/golden/WBV2-P11-000/manifest.json", + "manifestSha256": "2eb9bb41f116f13b019bda76545dfce6739cbc5940a22f40cc26e8571ddad6ff", + "status": "done", + "operation": "AUTHORIZE_MODULE_EXPANSION_CONTINUATION", + "artifactCount": 8, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED" + }, + { + "task": "WBV2-P11-001", + "manifest": "tests/golden/WBV2-P11-001/manifest.json", + "manifestSha256": "e08a02819065f1e7bc72a3bfae99e768c502dfa90af4b0614a701e7cca88b576", + "status": "done", + "operation": "MESH_TOPOLOGY_OPERATION_FAMILY_RECEIPT", + "artifactCount": 13, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED" + }, + { + "task": "WBV2-P11-002", + "manifest": "tests/golden/WBV2-P11-002/manifest.json", + "manifestSha256": "32b9581bc0ef2cd3435a17c3b7d454ae5327ef8f0ac4c1916e9a0857eb42aaf1", + "status": "done", + "operation": "MODIFIER_PARAMETER_APPLY_FAMILY_RECEIPT", + "artifactCount": 14, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED" + }, + { + "task": "WBV2-P11-003", + "manifest": "tests/golden/WBV2-P11-003/manifest.json", + "manifestSha256": "da4c9414baaaab9a47c6cc6af66426450c640a99d781e4c0273e0189a72c047c", + "status": "done", + "operation": "ASSET_LINK_OVERRIDE_RELOAD_FAMILY_RECEIPT", + "artifactCount": 14, + "currentDriftCount": 0, + "evidenceClass": "EXACT_RECORDED" + }, + { + "task": "WBV2-P11-004", + "manifest": "tests/golden/WBV2-P11-004/manifest.json", + "manifestSha256": "3da220443dcac4bc85a2e9e2052575d01b07e6ac3006073e153c8f39e0b0a04c", + "status": "done", + "operation": "RECOMPUTE_ENGINE_MODULE_PARITY_GATE", + "artifactCount": 16, + "currentDriftCount": 0, + "evidenceClass": "ENGINE_BOUND_EXACT" + } + ] +} diff --git a/tests/golden/WBV2-P12-001/task-context.json b/tests/golden/WBV2-P12-001/task-context.json new file mode 100644 index 000000000..185a2fef8 --- /dev/null +++ b/tests/golden/WBV2-P12-001/task-context.json @@ -0,0 +1,180 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-001", + "parentTask": "WBV2-P12-000", + "status": "in_progress", + "goal": "Aggregate existing WBV2 P1-P6 and P10-P11 manifests into a conservative capability ledger without inventing claims or rewriting historical receipts.", + "scope": { + "gap": "workflow:reconcile_existing_capability_ledger", + "ownerFamily": "PARITY", + "implementationClass": "LOCAL_BOUNDED" + }, + "commands": [ + "node tools/web/generate-wbv2-capability-ledger.mjs --write", + "node tools/web/check-wbv2-capability-ledger.mjs", + "node tools/web/check-task-context.mjs --task WBV2-P12-001 --write" + ], + "inputPaths": [ + "tests/golden/WBV2-P1-001/manifest.json" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 3507, + "contextRemainingTokens": 875 + }, + "source": { + "bytes": 6397, + "tokens": 1601 + }, + "selected": [ + { + "path": "tests/golden/WBV2-P1-001/manifest.json", + "bytes": 2740, + "tokens": 685 + } + ], + "excluded": [ + { + "path": "docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json", + "bytes": 9519, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P11-004/engine-module-gate-report.json", + "bytes": 3712, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "bytes": 5053386, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P12-001/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P12-001.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P12-001/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 1, + "bytes": 2740, + "tokens": 685 + } + }, + "exitCriteria": [ + "all source manifests are hash-verified", + "only done receipts enter proven evidence", + "L0/metadata and blocked cases remain explicit", + "inventory remainder is preserved" + ], + "nextTask": "WBV2-P12-002", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P12-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P12-000/manifest.json", + "parentStatus": "docs/status/WBV2-P12-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P12-001.md", + "tests/golden/WBV2-P12-000/manifest.json", + "docs/status/WBV2-P12-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-P12-000", + "parentTask": "WBV2-P11-004", + "status": "done", + "nextTask": "WBV2-P12-001", + "artifactCount": 8 + }, + "statusSummary": [ + "# WBV2-P12-000 status", + "- task: `WBV2-P12-000`; parent: `WBV2-P11-004`; status: `done`", + "- nextTask: `WBV2-P12-001`", + "Domain expansion is authorized after P11 engine-bound evidence. P12 first builds a conservative capability ledger from existing receipts, then adds scene, authoring, viewport, and non-mesh coverage." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1314, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 35, + "taskTokens": 329 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P12-001.md", + "bytes": 1314, + "lines": 35, + "tokens": 329 + }, + { + "path": "tests/golden/WBV2-P12-000/manifest.json", + "bytes": 1967, + "lines": 58, + "tokens": 492 + }, + { + "path": "docs/status/WBV2-P12-000.md", + "bytes": 313, + "lines": 7, + "tokens": 79 + } + ], + "sourceTokens": 1601, + "evidenceFiles": 1, + "evidenceBytes": 2740, + "evidenceTokens": 685, + "totalTokens": 2286, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3310, + "serializedContextTokens": 716, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P12-002/domain-expansion-task-plan.json b/tests/golden/WBV2-P12-002/domain-expansion-task-plan.json new file mode 100644 index 000000000..4d3e046cb --- /dev/null +++ b/tests/golden/WBV2-P12-002/domain-expansion-task-plan.json @@ -0,0 +1,1895 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_DOMAIN_EXPANSION_EPOCH_1", + "status": "ACTIVE_DOMAIN_EXPANSION_QUEUE", + "authority": "queue_reactivated_after_p11_engine_gate", + "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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-000", + "phase": "P10", + "title": "authorize_native_engine_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P9-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-000.md", + "behavior": "Authorize native Blender/WASM engine parity continuation after bounded Chromium capability evidence.", + "outputs": [ + "continuation receipt", + "native parity plan", + "scope limits" + ], + "acceptance": [ + "P9 evidence remains hash-bound", + "native build/runtime is explicit", + "one native parity task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P10-001", + "phase": "P10", + "title": "reconcile_wbv2_inventory_source_drift", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-inventory", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-001.md", + "behavior": "Record the authorized mutable WBV2 plan drift and prove dependency closure stability without rewriting historical P0 evidence.", + "outputs": [ + "current source hash baseline", + "drift report", + "checker compatibility" + ], + "acceptance": [ + "historical P0 hashes remain unchanged", + "only authorized plan drift is recorded", + "dependency roots/lockfile/closure remain stable", + "inventory checker passes using current baseline" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-002", + "phase": "P10", + "title": "bind_native_and_wasm_engine_receipts", + "kind": "feature", + "owner": "ENGINE", + "dependsOn": [ + "WBV2-P10-001" + ], + "parityId": "ENGINE.NATIVE_WASM_BRIDGE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p10-engine", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-002.md", + "behavior": "Bind Mesh, Modifier, and Asset Catalog receipts to the compiled Blender native binary and web_engine.wasm runtime.", + "outputs": [ + "native receipt", + "WASM receipt", + "Chromium engine report" + ], + "acceptance": [ + "native Blender binary is source-bound", + "WASM binary and JS are hash-bound", + "same mutation reaches real engine/Main", + "save/reopen and failures remain exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-003", + "phase": "P10", + "title": "expand_core_module_operator_matrix", + "kind": "feature", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-002" + ], + "parityId": "CORE.MODULE_MATRIX", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-matrix", + "gate": "G7", + "card": "docs/tasks/WBV2-P10-003.md", + "behavior": "Expand the three proven capability modules with data-driven operator coverage and aggregate regression receipts.", + "outputs": [ + "module matrix", + "shard reports", + "aggregate manifest" + ], + "acceptance": [ + "positive cases are L2+", + "negative cases do not mutate Main", + "shards use one catalog hash", + "unmapped and retained-negative cases stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-000", + "phase": "P11", + "title": "authorize_module_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P10-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-governance", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-000.md", + "behavior": "Authorize deeper module production after real native/WASM engine binding and the first aggregate matrix.", + "outputs": [ + "continuation root", + "module expansion plan", + "scope limits" + ], + "acceptance": [ + "P10 evidence remains hash-bound", + "one expansion task is active", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P11-001", + "phase": "P11", + "title": "mesh_topology_operation_family", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P11-000" + ], + "parityId": "MESH.EDIT_TOPOLOGY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-mesh", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-001.md", + "behavior": "Execute merge, dissolve, extrude, inset, bevel, and loop-cut through the real Blender WASM Main and preserve each result through save/reopen.", + "outputs": [ + "topology receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "six mesh operations mutate Main", + "revision increments exactly once", + "save/reopen preserves topology counts", + "invalid selection and incompatible configuration fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-002", + "phase": "P11", + "title": "modifier_parameter_apply_family", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P11-001" + ], + "parityId": "MODIFIER.PARAMETER_APPLY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-modifier", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-002.md", + "behavior": "Extend the real Modifier Main path from enable/disable to bounded parameter and apply transactions.", + "outputs": [ + "modifier parameter receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "parameter mutation is native/WASM bound", + "apply result is evaluated", + "save/reopen is exact", + "dependency and stale inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-003", + "phase": "P11", + "title": "asset_link_override_reload_family", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P11-002" + ], + "parityId": "ASSET.LINK_OVERRIDE_RELOAD_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-asset", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-003.md", + "behavior": "Extend the real Asset Main path from append to link, override, reload, and missing-library boundaries.", + "outputs": [ + "asset ownership receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "source ownership is preserved", + "override is local and hash-bound", + "reload revision is checked", + "missing source remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-004", + "phase": "P11", + "title": "recompute_engine_module_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P11-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-release", + "gate": "G8", + "card": "docs/tasks/WBV2-P11-004.md", + "behavior": "Recompute engine-bound module parity from P10 and P11 receipts without claiming whole-inventory completion.", + "outputs": [ + "engine module gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound claims are emitted", + "inventory remainder is explicit", + "provenance epoch 2 remains authorized rebaseline only", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-000", + "phase": "P12", + "title": "authorize_domain_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P11-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-governance", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-000.md", + "behavior": "Authorize expansion from the three engine-bound modules to the remaining high-value Blender Web domains using existing source evidence.", + "outputs": [ + "continuation root", + "domain expansion plan", + "scope limits" + ], + "acceptance": [ + "P11 evidence remains hash-bound", + "domain tasks use existing source receipts", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P12-001", + "phase": "P12", + "title": "reconcile_existing_capability_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P12-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-ledger", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-001.md", + "behavior": "Aggregate existing WBV2 P1-P6 and P10-P11 manifests into a conservative capability ledger without inventing claims.", + "outputs": [ + "capability ledger", + "evidence index", + "remaining gap map" + ], + "acceptance": [ + "all source manifests are hash-verified", + "only done receipts enter proven evidence", + "L0/metadata and blocked cases remain explicit", + "inventory remainder is preserved" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-002", + "phase": "P12", + "title": "scene_object_workflow_engine_receipt", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P12-001" + ], + "parityId": "EDITOR.SCENE_OBJECT_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-scene", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-002.md", + "behavior": "Bind object visibility and transform edits to the compiled WebEngine WASM Main with save/reopen and revision guards.", + "outputs": [ + "scene/object receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "visibility and transform mutate Main", + "desktop source oracle is bound", + "save/reopen is exact", + "stale and malformed commands fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-003", + "phase": "P12", + "title": "material_animation_engine_receipt", + "kind": "feature", + "owner": "AUTHORING", + "dependsOn": [ + "WBV2-P12-002" + ], + "parityId": "AUTHORING.MATERIAL_ANIMATION_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-authoring", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-003.md", + "behavior": "Bind material Principled/texture and TRS keyframe edits to the compiled WebEngine WASM Main.", + "outputs": [ + "authoring receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "material and keyframe Main mutations pass", + "source hashes are bound", + "save/reopen is exact", + "unsupported graph and stale frame inputs fail closed" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-004", + "phase": "P12", + "title": "viewport_nonmesh_engine_receipt", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P12-003" + ], + "parityId": "VIEWPORT.NONMESH_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-viewport", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-004.md", + "behavior": "Bind viewport SceneIR and bounded non-mesh read/edit paths to the compiled WebEngine runtime with explicit unsupported boundaries.", + "outputs": [ + "viewport receipt", + "nonmesh boundary map", + "manifest" + ], + "acceptance": [ + "nonblank viewport evidence is bound", + "non-mesh data is explicit", + "unsupported and budget cases fail closed", + "save/reopen and resource disposal are exact" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-005", + "phase": "P12", + "title": "recompute_domain_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P12-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-release", + "gate": "G9", + "card": "docs/tasks/WBV2-P12-005.md", + "behavior": "Recompute domain parity from the complete evidence ledger while retaining explicit inventory and provenance limits.", + "outputs": [ + "domain parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound domain claims are emitted", + "unproven inventory remains explicit", + "epoch 2 remains authorized rebaseline only", + "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-P12-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P12-001/domain-expansion-task-plan.json", + "sha256": "a2eb22c8b6f6e541c5ae071db6c661e54823d6e351bc1377bb45acf62ac28688" + } +} diff --git a/tests/golden/WBV2-P12-002/manifest.json b/tests/golden/WBV2-P12-002/manifest.json new file mode 100644 index 000000000..a6373a7c2 --- /dev/null +++ b/tests/golden/WBV2-P12-002/manifest.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-002", + "parentTask": "WBV2-P12-001", + "operation": "SCENE_OBJECT_WORKFLOW_ENGINE_RECEIPT", + "status": "done", + "enablingTask": false, + "parityStateChange": true, + "runtime": "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P12-001/manifest.json", + "sha256": "29f9fceae421e7f689cd5d560993e48b4a2cdabcdda6c842178fd05d9f52d9b7" + }, + "sourceManifest": { + "path": "tests/golden/WBV2-P2-002/manifest.json", + "sha256": "fa65312256f556ce80609206e266f7fc3ccbeda34eae3da179040f8e80dd017c" + }, + "sourceReport": { + "path": "tests/golden/WBV2-P2-002/object-transform-report.json", + "sha256": "17ede4ecd88d750dfb88e4ef3ab8467d55eb3be221e0d0f58b47bf20b80e646f" + }, + "production": { + "path": "tests/golden/WBV2-P12-002/scene-object-production.json", + "sha256": "cc6510cfc2e958e093d34ae4799aeb7fd5c32577cca2a195fa500787fc35397d" + }, + "productionSecond": { + "path": "tests/golden/WBV2-P12-002/scene-object-production.second.json", + "sha256": "cc6510cfc2e958e093d34ae4799aeb7fd5c32577cca2a195fa500787fc35397d" + }, + "e2e": { + "path": "web/tests/e2e/wbv2-scene-object-production.spec.ts", + "sha256": "6c8ee1321005d59a85823cf63a6a7ce385a2839e73d76e51840079b1338c4eae" + }, + "client": { + "path": "web/app/src/engine-client/WebEngineClient.ts", + "sha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b" + }, + "nativeApi": { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "sha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8" + }, + "generator": { + "path": "tools/web/generate-wbv2-scene-object-receipt.mjs", + "sha256": "1251775ed7afcd37326dffd3ef9e52d7f227393249ec7046f1d832273e9bec81" + }, + "report": { + "path": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json", + "sha256": "33f69f7d1a1522b29ab2aa6cd835c9486c830883bf7bc26324ec565e6b80e0f8" + }, + "status": { + "path": "docs/status/WBV2-P12-002.md", + "sha256": "7b2d40347e8f0d37752945d50795b87ecc51623216d7a202bbed10a0ca1b527a" + }, + "parityPlan": { + "path": "tests/golden/WBV2-P12-002/domain-expansion-task-plan.json", + "sha256": "57f95d8bb3c6bdf049f2c77e13742e1c157857dc425b11acdf5de1adc2c0efd5" + }, + "taskContext": { + "path": "tests/golden/WBV2-P12-002/task-context.json", + "sha256": "4cf8750db9d0be15363fda1184e2e2b3975331ab4370f851b683d60242e7ba17" + } + }, + "assertions": { + "visibilityMainChanged": true, + "transformMainChanged": true, + "saveReopen": "EXACT", + "negativeCases": 2, + "deterministic": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P12-003" +} diff --git a/tests/golden/WBV2-P12-002/scene-object-production.json b/tests/golden/WBV2-P12-002/scene-object-production.json new file mode 100644 index 000000000..4c26c948b --- /dev/null +++ b/tests/golden/WBV2-P12-002/scene-object-production.json @@ -0,0 +1,245 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-002", + "operation": "SCENE_OBJECT_WORKFLOW_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "baseRevision": 1, + "hiddenRevision": 2, + "transformedRevision": 3, + "beforeParent": { + "id": "object:WBV2P2002Parent", + "visible": true, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "beforeChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0, + 2, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 2, + 0, + 1 + ] + }, + "afterParent": { + "id": "object:WBV2P2002Parent", + "visible": false, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "afterChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0.5, + 2.5, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1.5, + 2.5, + 0, + 1 + ] + }, + "stale": { + "code": "INVALID_ARGUMENT", + "message": "REVISION_CONFLICT: command base revision does not match the current SceneIR" + }, + "malformed": { + "code": "INVALID_ARGUMENT", + "message": "setObjectTransform requires an existing object and three TRS vectors" + }, + "unchangedParent": { + "id": "object:WBV2P2002Parent", + "visible": false, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "unchangedChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0.5, + 2.5, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1.5, + 2.5, + 0, + 1 + ] + }, + "reopenedParent": { + "id": "object:WBV2P2002Parent", + "visible": false, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "reopenedChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0.5, + 2.5, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1.5, + 2.5, + 0, + 1 + ] + }, + "savedSha256": "0d87ab137ef0bfdd349b071b6eb5bd0a2b2d0b7807d9a257218f159fa0e5565e", + "sourceSha256": "62c70feb65822a58c38024d604d4cf93809372c3b7e79493f7829c4039ae01e6", + "exactSaveReopen": true +} diff --git a/tests/golden/WBV2-P12-002/scene-object-production.second.json b/tests/golden/WBV2-P12-002/scene-object-production.second.json new file mode 100644 index 000000000..4c26c948b --- /dev/null +++ b/tests/golden/WBV2-P12-002/scene-object-production.second.json @@ -0,0 +1,245 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-002", + "operation": "SCENE_OBJECT_WORKFLOW_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "baseRevision": 1, + "hiddenRevision": 2, + "transformedRevision": 3, + "beforeParent": { + "id": "object:WBV2P2002Parent", + "visible": true, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "beforeChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0, + 2, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 2, + 0, + 1 + ] + }, + "afterParent": { + "id": "object:WBV2P2002Parent", + "visible": false, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "afterChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0.5, + 2.5, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1.5, + 2.5, + 0, + 1 + ] + }, + "stale": { + "code": "INVALID_ARGUMENT", + "message": "REVISION_CONFLICT: command base revision does not match the current SceneIR" + }, + "malformed": { + "code": "INVALID_ARGUMENT", + "message": "setObjectTransform requires an existing object and three TRS vectors" + }, + "unchangedParent": { + "id": "object:WBV2P2002Parent", + "visible": false, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "unchangedChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0.5, + 2.5, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1.5, + 2.5, + 0, + 1 + ] + }, + "reopenedParent": { + "id": "object:WBV2P2002Parent", + "visible": false, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "reopenedChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0.5, + 2.5, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1.5, + 2.5, + 0, + 1 + ] + }, + "savedSha256": "0d87ab137ef0bfdd349b071b6eb5bd0a2b2d0b7807d9a257218f159fa0e5565e", + "sourceSha256": "62c70feb65822a58c38024d604d4cf93809372c3b7e79493f7829c4039ae01e6", + "exactSaveReopen": true +} diff --git a/tests/golden/WBV2-P12-002/scene-object-production.verify.json b/tests/golden/WBV2-P12-002/scene-object-production.verify.json new file mode 100644 index 000000000..4c26c948b --- /dev/null +++ b/tests/golden/WBV2-P12-002/scene-object-production.verify.json @@ -0,0 +1,245 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-002", + "operation": "SCENE_OBJECT_WORKFLOW_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "baseRevision": 1, + "hiddenRevision": 2, + "transformedRevision": 3, + "beforeParent": { + "id": "object:WBV2P2002Parent", + "visible": true, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "beforeChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0, + 2, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 2, + 0, + 1 + ] + }, + "afterParent": { + "id": "object:WBV2P2002Parent", + "visible": false, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "afterChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0.5, + 2.5, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1.5, + 2.5, + 0, + 1 + ] + }, + "stale": { + "code": "INVALID_ARGUMENT", + "message": "REVISION_CONFLICT: command base revision does not match the current SceneIR" + }, + "malformed": { + "code": "INVALID_ARGUMENT", + "message": "setObjectTransform requires an existing object and three TRS vectors" + }, + "unchangedParent": { + "id": "object:WBV2P2002Parent", + "visible": false, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "unchangedChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0.5, + 2.5, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1.5, + 2.5, + 0, + 1 + ] + }, + "reopenedParent": { + "id": "object:WBV2P2002Parent", + "visible": false, + "parentId": null, + "translation": [ + 1, + 0, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1 + ] + }, + "reopenedChild": { + "id": "object:WBV2P2002Child", + "visible": true, + "parentId": "object:WBV2P2002Parent", + "translation": [ + 0.5, + 2.5, + 0 + ], + "worldMatrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1.5, + 2.5, + 0, + 1 + ] + }, + "savedSha256": "0d87ab137ef0bfdd349b071b6eb5bd0a2b2d0b7807d9a257218f159fa0e5565e", + "sourceSha256": "62c70feb65822a58c38024d604d4cf93809372c3b7e79493f7829c4039ae01e6", + "exactSaveReopen": true +} diff --git a/tests/golden/WBV2-P12-002/scene-object-receipt-report.json b/tests/golden/WBV2-P12-002/scene-object-receipt-report.json new file mode 100644 index 000000000..273fbca2f --- /dev/null +++ b/tests/golden/WBV2-P12-002/scene-object-receipt-report.json @@ -0,0 +1,63 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-002", + "operation": "SCENE_OBJECT_WORKFLOW_ENGINE_RECEIPT", + "status": "PASS", + "browser": "chromium", + "queueMutation": false, + "source": { + "task": "WBV2-P2-002", + "manifest": "tests/golden/WBV2-P2-002/manifest.json", + "manifestSha256": "fa65312256f556ce80609206e266f7fc3ccbeda34eae3da179040f8e80dd017c", + "report": "tests/golden/WBV2-P2-002/object-transform-report.json", + "reportSha256": "17ede4ecd88d750dfb88e4ef3ab8467d55eb3be221e0d0f58b47bf20b80e646f", + "desktopExact": true, + "wasmExact": true, + "sourceSaveReopenExact": true + }, + "production": { + "report": "tests/golden/WBV2-P12-002/scene-object-production.json", + "reportSha256": "cc6510cfc2e958e093d34ae4799aeb7fd5c32577cca2a195fa500787fc35397d", + "secondReport": "tests/golden/WBV2-P12-002/scene-object-production.second.json", + "secondReportSha256": "cc6510cfc2e958e093d34ae4799aeb7fd5c32577cca2a195fa500787fc35397d", + "deterministic": true, + "visibility": { + "objectId": "object:WBV2P2002Parent", + "before": true, + "after": false, + "revisionDelta": 1 + }, + "transform": { + "objectId": "object:WBV2P2002Child", + "before": [ + 0, + 2, + 0 + ], + "after": [ + 0.5, + 2.5, + 0 + ], + "revisionDelta": 1 + }, + "saveReopen": true, + "stale": { + "code": "INVALID_ARGUMENT", + "message": "REVISION_CONFLICT: command base revision does not match the current SceneIR" + }, + "malformed": { + "code": "INVALID_ARGUMENT", + "message": "setObjectTransform requires an existing object and three TRS vectors" + } + }, + "assertions": { + "visibilityMainChanged": true, + "transformMainChanged": true, + "saveReopenExact": true, + "staleRejected": true, + "malformedRejected": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P12-003" +} diff --git a/tests/golden/WBV2-P12-002/task-context.json b/tests/golden/WBV2-P12-002/task-context.json new file mode 100644 index 000000000..0c23f3a7c --- /dev/null +++ b/tests/golden/WBV2-P12-002/task-context.json @@ -0,0 +1,178 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-002", + "parentTask": "WBV2-P12-001", + "status": "in_progress", + "goal": "Bind object visibility and transform edits to the compiled WebEngine WASM Main with save/reopen and revision guards.", + "scope": { + "gap": "workflow:scene_object_workflow_engine_receipt", + "ownerFamily": "EDITOR", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-scene-object-production.spec.ts", + "node tools/web/generate-wbv2-scene-object-receipt.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P12-002 --write" + ], + "inputPaths": [ + "tests/golden/WBV2-P2-002/object-transform-report.json" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 2840, + "contextRemainingTokens": 709 + }, + "source": { + "bytes": 7064, + "tokens": 1767 + }, + "selected": [ + { + "path": "tests/golden/WBV2-P2-002/object-transform-report.json", + "bytes": 1080, + "tokens": 270 + } + ], + "excluded": [ + { + "path": "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", + "bytes": 86822, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/app/src/engine-client/WebEngineClient.ts", + "bytes": 16197, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P12-002/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P12-002.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P12-002/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 1, + "bytes": 1080, + "tokens": 270 + } + }, + "exitCriteria": [ + "visibility and transform mutate Main", + "desktop source oracle is bound", + "save/reopen is exact", + "stale and malformed commands fail closed" + ], + "nextTask": "WBV2-P12-003", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P12-002.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P12-001/manifest.json", + "parentStatus": "docs/status/WBV2-P12-001.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P12-002.md", + "tests/golden/WBV2-P12-001/manifest.json", + "docs/status/WBV2-P12-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-P12-001", + "parentTask": "WBV2-P12-000", + "status": "done", + "nextTask": "WBV2-P12-002", + "artifactCount": 10 + }, + "statusSummary": [ + "# WBV2-P12-001 status", + "- task: `WBV2-P12-001`; parent: `WBV2-P12-000`; status: `done`", + "- source manifests batch-scanned: `34`; artifact records: `517`", + "- repeated Blender/Chromium runs: `0`; historical drift manifests recorded: `25`", + "- current engine-bound claims reused: `6`; inventory: `6900` total, `6618` pending, claimed complete: `0`", + "- nextTask: `WBV2-P12-002`", + "This ledger reuses existing P1-P6, P10, and P11 manifests as read-only evidence. It records current artifact drift instead of rewriting historical hashes and does not rerun already completed Blender or Chromium checks. Only P10/P11 engine-bound receipts are treated as current engine evidence; the remaining inventory stays explicit." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1190, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 34, + "taskTokens": 298 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P12-002.md", + "bytes": 1190, + "lines": 34, + "tokens": 298 + }, + { + "path": "tests/golden/WBV2-P12-001/manifest.json", + "bytes": 2372, + "lines": 66, + "tokens": 593 + }, + { + "path": "docs/status/WBV2-P12-001.md", + "bytes": 699, + "lines": 10, + "tokens": 175 + } + ], + "sourceTokens": 1767, + "evidenceFiles": 1, + "evidenceBytes": 1080, + "evidenceTokens": 270, + "totalTokens": 2037, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3061, + "serializedContextTokens": 711, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P12-003/domain-expansion-task-plan.json b/tests/golden/WBV2-P12-003/domain-expansion-task-plan.json new file mode 100644 index 000000000..7b8605096 --- /dev/null +++ b/tests/golden/WBV2-P12-003/domain-expansion-task-plan.json @@ -0,0 +1,1895 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_DOMAIN_EXPANSION_EPOCH_1", + "status": "ACTIVE_DOMAIN_EXPANSION_QUEUE", + "authority": "queue_reactivated_after_p11_engine_gate", + "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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-000", + "phase": "P10", + "title": "authorize_native_engine_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P9-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-000.md", + "behavior": "Authorize native Blender/WASM engine parity continuation after bounded Chromium capability evidence.", + "outputs": [ + "continuation receipt", + "native parity plan", + "scope limits" + ], + "acceptance": [ + "P9 evidence remains hash-bound", + "native build/runtime is explicit", + "one native parity task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P10-001", + "phase": "P10", + "title": "reconcile_wbv2_inventory_source_drift", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-inventory", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-001.md", + "behavior": "Record the authorized mutable WBV2 plan drift and prove dependency closure stability without rewriting historical P0 evidence.", + "outputs": [ + "current source hash baseline", + "drift report", + "checker compatibility" + ], + "acceptance": [ + "historical P0 hashes remain unchanged", + "only authorized plan drift is recorded", + "dependency roots/lockfile/closure remain stable", + "inventory checker passes using current baseline" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-002", + "phase": "P10", + "title": "bind_native_and_wasm_engine_receipts", + "kind": "feature", + "owner": "ENGINE", + "dependsOn": [ + "WBV2-P10-001" + ], + "parityId": "ENGINE.NATIVE_WASM_BRIDGE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p10-engine", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-002.md", + "behavior": "Bind Mesh, Modifier, and Asset Catalog receipts to the compiled Blender native binary and web_engine.wasm runtime.", + "outputs": [ + "native receipt", + "WASM receipt", + "Chromium engine report" + ], + "acceptance": [ + "native Blender binary is source-bound", + "WASM binary and JS are hash-bound", + "same mutation reaches real engine/Main", + "save/reopen and failures remain exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-003", + "phase": "P10", + "title": "expand_core_module_operator_matrix", + "kind": "feature", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-002" + ], + "parityId": "CORE.MODULE_MATRIX", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-matrix", + "gate": "G7", + "card": "docs/tasks/WBV2-P10-003.md", + "behavior": "Expand the three proven capability modules with data-driven operator coverage and aggregate regression receipts.", + "outputs": [ + "module matrix", + "shard reports", + "aggregate manifest" + ], + "acceptance": [ + "positive cases are L2+", + "negative cases do not mutate Main", + "shards use one catalog hash", + "unmapped and retained-negative cases stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-000", + "phase": "P11", + "title": "authorize_module_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P10-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-governance", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-000.md", + "behavior": "Authorize deeper module production after real native/WASM engine binding and the first aggregate matrix.", + "outputs": [ + "continuation root", + "module expansion plan", + "scope limits" + ], + "acceptance": [ + "P10 evidence remains hash-bound", + "one expansion task is active", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P11-001", + "phase": "P11", + "title": "mesh_topology_operation_family", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P11-000" + ], + "parityId": "MESH.EDIT_TOPOLOGY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-mesh", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-001.md", + "behavior": "Execute merge, dissolve, extrude, inset, bevel, and loop-cut through the real Blender WASM Main and preserve each result through save/reopen.", + "outputs": [ + "topology receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "six mesh operations mutate Main", + "revision increments exactly once", + "save/reopen preserves topology counts", + "invalid selection and incompatible configuration fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-002", + "phase": "P11", + "title": "modifier_parameter_apply_family", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P11-001" + ], + "parityId": "MODIFIER.PARAMETER_APPLY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-modifier", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-002.md", + "behavior": "Extend the real Modifier Main path from enable/disable to bounded parameter and apply transactions.", + "outputs": [ + "modifier parameter receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "parameter mutation is native/WASM bound", + "apply result is evaluated", + "save/reopen is exact", + "dependency and stale inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-003", + "phase": "P11", + "title": "asset_link_override_reload_family", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P11-002" + ], + "parityId": "ASSET.LINK_OVERRIDE_RELOAD_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-asset", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-003.md", + "behavior": "Extend the real Asset Main path from append to link, override, reload, and missing-library boundaries.", + "outputs": [ + "asset ownership receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "source ownership is preserved", + "override is local and hash-bound", + "reload revision is checked", + "missing source remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-004", + "phase": "P11", + "title": "recompute_engine_module_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P11-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-release", + "gate": "G8", + "card": "docs/tasks/WBV2-P11-004.md", + "behavior": "Recompute engine-bound module parity from P10 and P11 receipts without claiming whole-inventory completion.", + "outputs": [ + "engine module gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound claims are emitted", + "inventory remainder is explicit", + "provenance epoch 2 remains authorized rebaseline only", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-000", + "phase": "P12", + "title": "authorize_domain_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P11-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-governance", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-000.md", + "behavior": "Authorize expansion from the three engine-bound modules to the remaining high-value Blender Web domains using existing source evidence.", + "outputs": [ + "continuation root", + "domain expansion plan", + "scope limits" + ], + "acceptance": [ + "P11 evidence remains hash-bound", + "domain tasks use existing source receipts", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P12-001", + "phase": "P12", + "title": "reconcile_existing_capability_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P12-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-ledger", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-001.md", + "behavior": "Aggregate existing WBV2 P1-P6 and P10-P11 manifests into a conservative capability ledger without inventing claims.", + "outputs": [ + "capability ledger", + "evidence index", + "remaining gap map" + ], + "acceptance": [ + "all source manifests are hash-verified", + "only done receipts enter proven evidence", + "L0/metadata and blocked cases remain explicit", + "inventory remainder is preserved" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-002", + "phase": "P12", + "title": "scene_object_workflow_engine_receipt", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P12-001" + ], + "parityId": "EDITOR.SCENE_OBJECT_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-scene", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-002.md", + "behavior": "Bind object visibility and transform edits to the compiled WebEngine WASM Main with save/reopen and revision guards.", + "outputs": [ + "scene/object receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "visibility and transform mutate Main", + "desktop source oracle is bound", + "save/reopen is exact", + "stale and malformed commands fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-003", + "phase": "P12", + "title": "material_animation_engine_receipt", + "kind": "feature", + "owner": "AUTHORING", + "dependsOn": [ + "WBV2-P12-002" + ], + "parityId": "AUTHORING.MATERIAL_ANIMATION_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-authoring", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-003.md", + "behavior": "Bind material Principled/texture and TRS keyframe edits to the compiled WebEngine WASM Main.", + "outputs": [ + "authoring receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "material and keyframe Main mutations pass", + "source hashes are bound", + "save/reopen is exact", + "unsupported graph and stale frame inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-004", + "phase": "P12", + "title": "viewport_nonmesh_engine_receipt", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P12-003" + ], + "parityId": "VIEWPORT.NONMESH_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-viewport", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-004.md", + "behavior": "Bind viewport SceneIR and bounded non-mesh read/edit paths to the compiled WebEngine runtime with explicit unsupported boundaries.", + "outputs": [ + "viewport receipt", + "nonmesh boundary map", + "manifest" + ], + "acceptance": [ + "nonblank viewport evidence is bound", + "non-mesh data is explicit", + "unsupported and budget cases fail closed", + "save/reopen and resource disposal are exact" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-005", + "phase": "P12", + "title": "recompute_domain_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P12-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-release", + "gate": "G9", + "card": "docs/tasks/WBV2-P12-005.md", + "behavior": "Recompute domain parity from the complete evidence ledger while retaining explicit inventory and provenance limits.", + "outputs": [ + "domain parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound domain claims are emitted", + "unproven inventory remains explicit", + "epoch 2 remains authorized rebaseline only", + "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-P12-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P12-002/domain-expansion-task-plan.json", + "sha256": "57f95d8bb3c6bdf049f2c77e13742e1c157857dc425b11acdf5de1adc2c0efd5" + } +} diff --git a/tests/golden/WBV2-P12-003/manifest.json b/tests/golden/WBV2-P12-003/manifest.json new file mode 100644 index 000000000..306329f50 --- /dev/null +++ b/tests/golden/WBV2-P12-003/manifest.json @@ -0,0 +1,82 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-003", + "parentTask": "WBV2-P12-002", + "operation": "MATERIAL_ANIMATION_ENGINE_RECEIPT", + "status": "done", + "enablingTask": false, + "parityStateChange": true, + "runtime": "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P12-002/manifest.json", + "sha256": "63f51801601c421beeaff62353862ca17800180f336093051544936a002b3e4f" + }, + "materialManifest": { + "path": "tests/golden/WBV2-P3-001/manifest.json", + "sha256": "e3b037fdcf55b5e64fd770c6fa90d0b72e96b3e764a305df0ceee378fa167191" + }, + "materialReport": { + "path": "tests/golden/WBV2-P3-001/material-report.json", + "sha256": "8ab3dd49364a2f6c5404249f1433fc1f2085d9deaf9a6d126732dbd7ca9d262c" + }, + "animationManifest": { + "path": "tests/golden/WBV2-P3-002/manifest.json", + "sha256": "cc36b933a2b6d817ea7226c07d0617ecdf2f89575136a83cb15de4e7c8f59188" + }, + "animationReport": { + "path": "tests/golden/WBV2-P3-002/animation-report.json", + "sha256": "ac7bb8bbfa6db703c6d128ba5772213f46370be3a986cefcc2da99a1a9aad843" + }, + "production": { + "path": "tests/golden/WBV2-P12-003/material-animation-production.json", + "sha256": "35851a9cca39bf8efedababcbcf459cc04ff6b33a5ce4fb0ed944664fcf36403" + }, + "productionSecond": { + "path": "tests/golden/WBV2-P12-003/material-animation-production.second.json", + "sha256": "35851a9cca39bf8efedababcbcf459cc04ff6b33a5ce4fb0ed944664fcf36403" + }, + "e2e": { + "path": "web/tests/e2e/wbv2-material-animation-production.spec.ts", + "sha256": "355e6476f2a4abf291506c7115312be049af6feb831a9f8873a03b9f61ba6d73" + }, + "client": { + "path": "web/app/src/engine-client/WebEngineClient.ts", + "sha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b" + }, + "nativeApi": { + "path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", + "sha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8" + }, + "generator": { + "path": "tools/web/generate-wbv2-material-animation-receipt.mjs", + "sha256": "997fb2d862a266188f65c2cdf1c2870a450ba85494271660dd1bd1bc098666e0" + }, + "report": { + "path": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json", + "sha256": "468498825f7ebbafc7214fca1509baf130ccc72790e80a4101a88f49c42e459d" + }, + "status": { + "path": "docs/status/WBV2-P12-003.md", + "sha256": "698c7ada0e7b14e8af566db3ecc4b347b562a2136b90a00d2d066c2f58eaf345" + }, + "parityPlan": { + "path": "tests/golden/WBV2-P12-003/domain-expansion-task-plan.json", + "sha256": "9d817288c5966c81ead4a87220480cd023aed53ce07a91f59913f3a553ae490c" + }, + "taskContext": { + "path": "tests/golden/WBV2-P12-003/task-context.json", + "sha256": "116d7d81fdb4059d9160a59d24904adab2a37367d8ada0278e9735a688c03644" + } + }, + "assertions": { + "materialMutations": 4, + "animationMutations": 2, + "saveReopen": "EXACT", + "negativeCases": 2, + "unsupportedGraphExplicit": true, + "deterministic": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P12-004" +} diff --git a/tests/golden/WBV2-P12-003/material-animation-production.json b/tests/golden/WBV2-P12-003/material-animation-production.json new file mode 100644 index 000000000..64284abe3 --- /dev/null +++ b/tests/golden/WBV2-P12-003/material-animation-production.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-003", + "operation": "MATERIAL_ANIMATION_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "material": { + "sourceUnsupportedNode": true, + "baseRevision": 1, + "finalRevision": 5, + "materialId": "material:WBV2P3001PrincipledMaterial", + "meshId": "mesh:WBV2P3001MaterialCubeMesh", + "activeUVMap": "WBV2P3001SecondaryUV", + "baseColor": [ + 0.20000000298023224, + 0.4000000059604645, + 0.6000000238418579, + 1 + ], + "roughness": 0.3100000023841858, + "metallic": 0.7200000286102295, + "invalidUV": { + "code": "INVALID_ARGUMENT", + "message": "UV map was not found" + }, + "revisionAfterFailure": 5, + "savedByteLength": 223710, + "sourceSha256": "cdf3a13e88a2084e9ac46b998a9ad1975c5e20e2bc0f2a68038c62de8801ed22", + "saveReopenExact": true + }, + "animation": { + "baseRevision": 1, + "insertedRevision": 2, + "finalRevision": 3, + "animationId": "action:WBV2P3002TRSAction:object:WBV2P3002AnimatedCube", + "channelCount": 9, + "locationFrames": [ + 1, + 10, + 20, + 25 + ], + "interpolation": "LINEAR", + "staleFrame": { + "code": "INVALID_ARGUMENT", + "message": "REVISION_CONFLICT: command base revision does not match the current SceneIR" + }, + "revisionAfterFailure": 3, + "savedByteLength": 196077, + "sourceSha256": "63b8b79115cf7305931cd92cacaef3a2d7ee68b8690056f402bd129048460b1d", + "reopenedFrames": [ + 1, + 10, + 20, + 25 + ], + "reopenedInterpolation": "LINEAR", + "saveReopenExact": true + } +} diff --git a/tests/golden/WBV2-P12-003/material-animation-production.second.json b/tests/golden/WBV2-P12-003/material-animation-production.second.json new file mode 100644 index 000000000..64284abe3 --- /dev/null +++ b/tests/golden/WBV2-P12-003/material-animation-production.second.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-003", + "operation": "MATERIAL_ANIMATION_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "material": { + "sourceUnsupportedNode": true, + "baseRevision": 1, + "finalRevision": 5, + "materialId": "material:WBV2P3001PrincipledMaterial", + "meshId": "mesh:WBV2P3001MaterialCubeMesh", + "activeUVMap": "WBV2P3001SecondaryUV", + "baseColor": [ + 0.20000000298023224, + 0.4000000059604645, + 0.6000000238418579, + 1 + ], + "roughness": 0.3100000023841858, + "metallic": 0.7200000286102295, + "invalidUV": { + "code": "INVALID_ARGUMENT", + "message": "UV map was not found" + }, + "revisionAfterFailure": 5, + "savedByteLength": 223710, + "sourceSha256": "cdf3a13e88a2084e9ac46b998a9ad1975c5e20e2bc0f2a68038c62de8801ed22", + "saveReopenExact": true + }, + "animation": { + "baseRevision": 1, + "insertedRevision": 2, + "finalRevision": 3, + "animationId": "action:WBV2P3002TRSAction:object:WBV2P3002AnimatedCube", + "channelCount": 9, + "locationFrames": [ + 1, + 10, + 20, + 25 + ], + "interpolation": "LINEAR", + "staleFrame": { + "code": "INVALID_ARGUMENT", + "message": "REVISION_CONFLICT: command base revision does not match the current SceneIR" + }, + "revisionAfterFailure": 3, + "savedByteLength": 196077, + "sourceSha256": "63b8b79115cf7305931cd92cacaef3a2d7ee68b8690056f402bd129048460b1d", + "reopenedFrames": [ + 1, + 10, + 20, + 25 + ], + "reopenedInterpolation": "LINEAR", + "saveReopenExact": true + } +} diff --git a/tests/golden/WBV2-P12-003/material-animation-production.verify.json b/tests/golden/WBV2-P12-003/material-animation-production.verify.json new file mode 100644 index 000000000..64284abe3 --- /dev/null +++ b/tests/golden/WBV2-P12-003/material-animation-production.verify.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-003", + "operation": "MATERIAL_ANIMATION_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "material": { + "sourceUnsupportedNode": true, + "baseRevision": 1, + "finalRevision": 5, + "materialId": "material:WBV2P3001PrincipledMaterial", + "meshId": "mesh:WBV2P3001MaterialCubeMesh", + "activeUVMap": "WBV2P3001SecondaryUV", + "baseColor": [ + 0.20000000298023224, + 0.4000000059604645, + 0.6000000238418579, + 1 + ], + "roughness": 0.3100000023841858, + "metallic": 0.7200000286102295, + "invalidUV": { + "code": "INVALID_ARGUMENT", + "message": "UV map was not found" + }, + "revisionAfterFailure": 5, + "savedByteLength": 223710, + "sourceSha256": "cdf3a13e88a2084e9ac46b998a9ad1975c5e20e2bc0f2a68038c62de8801ed22", + "saveReopenExact": true + }, + "animation": { + "baseRevision": 1, + "insertedRevision": 2, + "finalRevision": 3, + "animationId": "action:WBV2P3002TRSAction:object:WBV2P3002AnimatedCube", + "channelCount": 9, + "locationFrames": [ + 1, + 10, + 20, + 25 + ], + "interpolation": "LINEAR", + "staleFrame": { + "code": "INVALID_ARGUMENT", + "message": "REVISION_CONFLICT: command base revision does not match the current SceneIR" + }, + "revisionAfterFailure": 3, + "savedByteLength": 196077, + "sourceSha256": "63b8b79115cf7305931cd92cacaef3a2d7ee68b8690056f402bd129048460b1d", + "reopenedFrames": [ + 1, + 10, + 20, + 25 + ], + "reopenedInterpolation": "LINEAR", + "saveReopenExact": true + } +} diff --git a/tests/golden/WBV2-P12-003/material-animation-receipt-report.json b/tests/golden/WBV2-P12-003/material-animation-receipt-report.json new file mode 100644 index 000000000..d91e78877 --- /dev/null +++ b/tests/golden/WBV2-P12-003/material-animation-receipt-report.json @@ -0,0 +1,82 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-003", + "operation": "MATERIAL_ANIMATION_ENGINE_RECEIPT", + "status": "PASS", + "browser": "chromium", + "queueMutation": false, + "source": { + "material": { + "task": "WBV2-P3-001", + "manifest": "tests/golden/WBV2-P3-001/manifest.json", + "manifestSha256": "e3b037fdcf55b5e64fd770c6fa90d0b72e96b3e764a305df0ceee378fa167191", + "report": "tests/golden/WBV2-P3-001/material-report.json", + "reportSha256": "8ab3dd49364a2f6c5404249f1433fc1f2085d9deaf9a6d126732dbd7ca9d262c" + }, + "animation": { + "task": "WBV2-P3-002", + "manifest": "tests/golden/WBV2-P3-002/manifest.json", + "manifestSha256": "cc36b933a2b6d817ea7226c07d0617ecdf2f89575136a83cb15de4e7c8f59188", + "report": "tests/golden/WBV2-P3-002/animation-report.json", + "reportSha256": "ac7bb8bbfa6db703c6d128ba5772213f46370be3a986cefcc2da99a1a9aad843" + }, + "reusedReadOnly": true + }, + "production": { + "report": "tests/golden/WBV2-P12-003/material-animation-production.json", + "reportSha256": "35851a9cca39bf8efedababcbcf459cc04ff6b33a5ce4fb0ed944664fcf36403", + "secondReport": "tests/golden/WBV2-P12-003/material-animation-production.second.json", + "secondReportSha256": "35851a9cca39bf8efedababcbcf459cc04ff6b33a5ce4fb0ed944664fcf36403", + "deterministic": true, + "material": { + "materialId": "material:WBV2P3001PrincipledMaterial", + "meshId": "mesh:WBV2P3001MaterialCubeMesh", + "revisions": [ + 1, + 5 + ], + "activeUVMap": "WBV2P3001SecondaryUV", + "baseColor": [ + 0.20000000298023224, + 0.4000000059604645, + 0.6000000238418579, + 1 + ], + "roughness": 0.3100000023841858, + "metallic": 0.7200000286102295, + "unsupportedNodeRetained": true, + "invalidUVRejected": true, + "savedByteLength": 223710, + "saveReopen": "EXACT" + }, + "animation": { + "animationId": "action:WBV2P3002TRSAction:object:WBV2P3002AnimatedCube", + "revisions": [ + 1, + 2, + 3 + ], + "channelCount": 9, + "locationFrames": [ + 1, + 10, + 20, + 25 + ], + "interpolation": "LINEAR", + "staleFrameRejected": true, + "savedByteLength": 196077, + "saveReopen": "EXACT" + } + }, + "assertions": { + "materialMainChanged": true, + "animationMainChanged": true, + "sourceHashesBound": true, + "unsupportedGraphExplicit": true, + "staleFrameRejected": true, + "saveReopenExact": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P12-004" +} diff --git a/tests/golden/WBV2-P12-003/task-context.json b/tests/golden/WBV2-P12-003/task-context.json new file mode 100644 index 000000000..135af65ba --- /dev/null +++ b/tests/golden/WBV2-P12-003/task-context.json @@ -0,0 +1,183 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-003", + "parentTask": "WBV2-P12-002", + "status": "in_progress", + "goal": "Bind material Principled/texture and TRS keyframe edits to the compiled WebEngine WASM Main.", + "scope": { + "gap": "workflow:material_animation_engine_receipt", + "ownerFamily": "AUTHORING", + "implementationClass": "LOCAL_EXACT" + }, + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-animation-production.spec.ts", + "node tools/web/generate-wbv2-material-animation-receipt.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P12-003 --write" + ], + "inputPaths": [ + "tests/golden/WBV2-P3-001/material-report.json" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 2476, + "contextRemainingTokens": 617 + }, + "source": { + "bytes": 7428, + "tokens": 1859 + }, + "selected": [ + { + "path": "tests/golden/WBV2-P3-001/material-report.json", + "bytes": 1763, + "tokens": 441 + } + ], + "excluded": [ + { + "path": "tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend", + "bytes": 89548, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/files/web/generated/WBV2-P3-002-ANIMATION.TRS_ACTION.blend", + "bytes": 88107, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P3-002/animation-report.json", + "bytes": 4237, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P12-003/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P12-003.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P12-003/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 1, + "bytes": 1763, + "tokens": 441 + } + }, + "exitCriteria": [ + "material and keyframe Main mutations pass", + "source hashes are bound", + "save/reopen is exact", + "unsupported graph and stale frame inputs fail closed" + ], + "nextTask": "WBV2-P12-004", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P12-003.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P12-002/manifest.json", + "parentStatus": "docs/status/WBV2-P12-002.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P12-003.md", + "tests/golden/WBV2-P12-002/manifest.json", + "docs/status/WBV2-P12-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-P12-002", + "parentTask": "WBV2-P12-001", + "status": "done", + "nextTask": "WBV2-P12-003", + "artifactCount": 13 + }, + "statusSummary": [ + "# WBV2-P12-002 status", + "- task: `WBV2-P12-002`; parent: `WBV2-P12-001`; status: `done`", + "- visibility transaction: revision +1; hidden object persisted", + "- transform transaction: revision +1; child translation `[0.5, 2.5, 0]` persisted", + "- save/reopen: `EXACT`; stale and malformed commands rejected", + "- nextTask: `WBV2-P12-003`", + "The compiled WebEngine WASM Main now has a production-bound scene/object receipt for visibility and transform edits. Existing P2-002 desktop/WASM evidence is reused read-only; no duplicate historical fixture run is required." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1269, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 34, + "taskTokens": 318 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P12-003.md", + "bytes": 1269, + "lines": 34, + "tokens": 318 + }, + { + "path": "tests/golden/WBV2-P12-002/manifest.json", + "bytes": 2810, + "lines": 74, + "tokens": 703 + }, + { + "path": "docs/status/WBV2-P12-002.md", + "bytes": 546, + "lines": 10, + "tokens": 137 + } + ], + "sourceTokens": 1859, + "evidenceFiles": 1, + "evidenceBytes": 1763, + "evidenceTokens": 441, + "totalTokens": 2300, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3324, + "serializedContextTokens": 716, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P12-004/domain-expansion-task-plan.json b/tests/golden/WBV2-P12-004/domain-expansion-task-plan.json new file mode 100644 index 000000000..53b433cb7 --- /dev/null +++ b/tests/golden/WBV2-P12-004/domain-expansion-task-plan.json @@ -0,0 +1,1895 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_DOMAIN_EXPANSION_EPOCH_1", + "status": "ACTIVE_DOMAIN_EXPANSION_QUEUE", + "authority": "queue_reactivated_after_p11_engine_gate", + "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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-000", + "phase": "P10", + "title": "authorize_native_engine_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P9-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-000.md", + "behavior": "Authorize native Blender/WASM engine parity continuation after bounded Chromium capability evidence.", + "outputs": [ + "continuation receipt", + "native parity plan", + "scope limits" + ], + "acceptance": [ + "P9 evidence remains hash-bound", + "native build/runtime is explicit", + "one native parity task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P10-001", + "phase": "P10", + "title": "reconcile_wbv2_inventory_source_drift", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-inventory", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-001.md", + "behavior": "Record the authorized mutable WBV2 plan drift and prove dependency closure stability without rewriting historical P0 evidence.", + "outputs": [ + "current source hash baseline", + "drift report", + "checker compatibility" + ], + "acceptance": [ + "historical P0 hashes remain unchanged", + "only authorized plan drift is recorded", + "dependency roots/lockfile/closure remain stable", + "inventory checker passes using current baseline" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-002", + "phase": "P10", + "title": "bind_native_and_wasm_engine_receipts", + "kind": "feature", + "owner": "ENGINE", + "dependsOn": [ + "WBV2-P10-001" + ], + "parityId": "ENGINE.NATIVE_WASM_BRIDGE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p10-engine", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-002.md", + "behavior": "Bind Mesh, Modifier, and Asset Catalog receipts to the compiled Blender native binary and web_engine.wasm runtime.", + "outputs": [ + "native receipt", + "WASM receipt", + "Chromium engine report" + ], + "acceptance": [ + "native Blender binary is source-bound", + "WASM binary and JS are hash-bound", + "same mutation reaches real engine/Main", + "save/reopen and failures remain exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-003", + "phase": "P10", + "title": "expand_core_module_operator_matrix", + "kind": "feature", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-002" + ], + "parityId": "CORE.MODULE_MATRIX", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-matrix", + "gate": "G7", + "card": "docs/tasks/WBV2-P10-003.md", + "behavior": "Expand the three proven capability modules with data-driven operator coverage and aggregate regression receipts.", + "outputs": [ + "module matrix", + "shard reports", + "aggregate manifest" + ], + "acceptance": [ + "positive cases are L2+", + "negative cases do not mutate Main", + "shards use one catalog hash", + "unmapped and retained-negative cases stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-000", + "phase": "P11", + "title": "authorize_module_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P10-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-governance", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-000.md", + "behavior": "Authorize deeper module production after real native/WASM engine binding and the first aggregate matrix.", + "outputs": [ + "continuation root", + "module expansion plan", + "scope limits" + ], + "acceptance": [ + "P10 evidence remains hash-bound", + "one expansion task is active", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P11-001", + "phase": "P11", + "title": "mesh_topology_operation_family", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P11-000" + ], + "parityId": "MESH.EDIT_TOPOLOGY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-mesh", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-001.md", + "behavior": "Execute merge, dissolve, extrude, inset, bevel, and loop-cut through the real Blender WASM Main and preserve each result through save/reopen.", + "outputs": [ + "topology receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "six mesh operations mutate Main", + "revision increments exactly once", + "save/reopen preserves topology counts", + "invalid selection and incompatible configuration fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-002", + "phase": "P11", + "title": "modifier_parameter_apply_family", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P11-001" + ], + "parityId": "MODIFIER.PARAMETER_APPLY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-modifier", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-002.md", + "behavior": "Extend the real Modifier Main path from enable/disable to bounded parameter and apply transactions.", + "outputs": [ + "modifier parameter receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "parameter mutation is native/WASM bound", + "apply result is evaluated", + "save/reopen is exact", + "dependency and stale inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-003", + "phase": "P11", + "title": "asset_link_override_reload_family", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P11-002" + ], + "parityId": "ASSET.LINK_OVERRIDE_RELOAD_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-asset", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-003.md", + "behavior": "Extend the real Asset Main path from append to link, override, reload, and missing-library boundaries.", + "outputs": [ + "asset ownership receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "source ownership is preserved", + "override is local and hash-bound", + "reload revision is checked", + "missing source remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-004", + "phase": "P11", + "title": "recompute_engine_module_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P11-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-release", + "gate": "G8", + "card": "docs/tasks/WBV2-P11-004.md", + "behavior": "Recompute engine-bound module parity from P10 and P11 receipts without claiming whole-inventory completion.", + "outputs": [ + "engine module gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound claims are emitted", + "inventory remainder is explicit", + "provenance epoch 2 remains authorized rebaseline only", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-000", + "phase": "P12", + "title": "authorize_domain_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P11-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-governance", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-000.md", + "behavior": "Authorize expansion from the three engine-bound modules to the remaining high-value Blender Web domains using existing source evidence.", + "outputs": [ + "continuation root", + "domain expansion plan", + "scope limits" + ], + "acceptance": [ + "P11 evidence remains hash-bound", + "domain tasks use existing source receipts", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P12-001", + "phase": "P12", + "title": "reconcile_existing_capability_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P12-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-ledger", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-001.md", + "behavior": "Aggregate existing WBV2 P1-P6 and P10-P11 manifests into a conservative capability ledger without inventing claims.", + "outputs": [ + "capability ledger", + "evidence index", + "remaining gap map" + ], + "acceptance": [ + "all source manifests are hash-verified", + "only done receipts enter proven evidence", + "L0/metadata and blocked cases remain explicit", + "inventory remainder is preserved" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-002", + "phase": "P12", + "title": "scene_object_workflow_engine_receipt", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P12-001" + ], + "parityId": "EDITOR.SCENE_OBJECT_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-scene", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-002.md", + "behavior": "Bind object visibility and transform edits to the compiled WebEngine WASM Main with save/reopen and revision guards.", + "outputs": [ + "scene/object receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "visibility and transform mutate Main", + "desktop source oracle is bound", + "save/reopen is exact", + "stale and malformed commands fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-003", + "phase": "P12", + "title": "material_animation_engine_receipt", + "kind": "feature", + "owner": "AUTHORING", + "dependsOn": [ + "WBV2-P12-002" + ], + "parityId": "AUTHORING.MATERIAL_ANIMATION_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-authoring", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-003.md", + "behavior": "Bind material Principled/texture and TRS keyframe edits to the compiled WebEngine WASM Main.", + "outputs": [ + "authoring receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "material and keyframe Main mutations pass", + "source hashes are bound", + "save/reopen is exact", + "unsupported graph and stale frame inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-004", + "phase": "P12", + "title": "viewport_nonmesh_engine_receipt", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P12-003" + ], + "parityId": "VIEWPORT.NONMESH_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-viewport", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-004.md", + "behavior": "Bind viewport SceneIR and bounded non-mesh read/edit paths to the compiled WebEngine runtime with explicit unsupported boundaries.", + "outputs": [ + "viewport receipt", + "nonmesh boundary map", + "manifest" + ], + "acceptance": [ + "nonblank viewport evidence is bound", + "non-mesh data is explicit", + "unsupported and budget cases fail closed", + "save/reopen and resource disposal are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-005", + "phase": "P12", + "title": "recompute_domain_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P12-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-release", + "gate": "G9", + "card": "docs/tasks/WBV2-P12-005.md", + "behavior": "Recompute domain parity from the complete evidence ledger while retaining explicit inventory and provenance limits.", + "outputs": [ + "domain parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound domain claims are emitted", + "unproven inventory remains explicit", + "epoch 2 remains authorized rebaseline only", + "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-P12-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P12-003/domain-expansion-task-plan.json", + "sha256": "9d817288c5966c81ead4a87220480cd023aed53ce07a91f59913f3a553ae490c" + } +} diff --git a/tests/golden/WBV2-P12-004/manifest.json b/tests/golden/WBV2-P12-004/manifest.json new file mode 100644 index 000000000..571318965 --- /dev/null +++ b/tests/golden/WBV2-P12-004/manifest.json @@ -0,0 +1,83 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-004", + "parentTask": "WBV2-P12-003", + "operation": "VIEWPORT_NONMESH_ENGINE_RECEIPT", + "status": "done", + "enablingTask": false, + "parityStateChange": true, + "runtime": "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P12-003/manifest.json", + "sha256": "2ec36a52526018beb44eaccdb91d86942d5b908a19be4abd9c6065274269ebfb" + }, + "viewportManifest": { + "path": "tests/golden/WBV2-P2-004/manifest.json", + "sha256": "9a511f9620bdc886ab4684ac449dcaa156086cde76c0b95d16795f0f51a304f2" + }, + "viewportReport": { + "path": "tests/golden/WBV2-P2-004/viewport-report.json", + "sha256": "a38e7ff8da3042a82f4d20f9f6c60300ebd6ee393cf3625901c770ebff674dac" + }, + "nonMeshManifest": { + "path": "tests/golden/WBV2-P4-003/manifest.json", + "sha256": "9c41ef52263d544650b1bad2dc2ec5f40ed63a9ab1b9732492a46672384e1218" + }, + "nonMeshReport": { + "path": "tests/golden/WBV2-P4-003/sculpt-report.json", + "sha256": "de29aabbb753b682d85c30258ff4d68530650d00e167f30181d5c9a68669dd99" + }, + "production": { + "path": "tests/golden/WBV2-P12-004/viewport-nonmesh-production.json", + "sha256": "ec3c861645a084a3f6e37d014f983c9b6710ed64f8f62b89aa7f70dd19aff337" + }, + "productionSecond": { + "path": "tests/golden/WBV2-P12-004/viewport-nonmesh-production.second.json", + "sha256": "ec3c861645a084a3f6e37d014f983c9b6710ed64f8f62b89aa7f70dd19aff337" + }, + "e2e": { + "path": "web/tests/e2e/wbv2-viewport-nonmesh-production.spec.ts", + "sha256": "9d2f504de2fb328ddbc8847e360feb840f988b5a442066179f65e72831c0934f" + }, + "client": { + "path": "web/app/src/engine-client/WebEngineClient.ts", + "sha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b" + }, + "viewport": { + "path": "web/app/src/three-adapter/viewport.ts", + "sha256": "e8d97cb59fd4eca3789aeeb35221a70cf47ef048a5665383d809d0efc49f7119" + }, + "generator": { + "path": "tools/web/generate-wbv2-viewport-nonmesh-receipt.mjs", + "sha256": "f789103e4cf17ddcd4d5519d624a57a83712cc057c4f2d605ccf6a3ff0258ffa" + }, + "report": { + "path": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json", + "sha256": "61cbaee24719647addfd3147a665b97ad40deff4eb4a64c055a3ba7a33cac53b" + }, + "status": { + "path": "docs/status/WBV2-P12-004.md", + "sha256": "035b241a17d8e887d99943027ec385cbf6fdca94572b12df1a23bd477967f0c7" + }, + "parityPlan": { + "path": "tests/golden/WBV2-P12-004/domain-expansion-task-plan.json", + "sha256": "d6853d90b12e1df1055d3fb2251a082448e35c04be260c98662b9eba61796bbd" + }, + "taskContext": { + "path": "tests/golden/WBV2-P12-004/task-context.json", + "sha256": "d81e7027ea12fbb372ef2393b59f0f9db7627ecb1b449ec4cfb4253d0e27d74d" + } + }, + "assertions": { + "viewportPixelsNonblank": true, + "nonMeshDataExplicit": true, + "curveMainChanged": true, + "unsupportedDataBlocked": true, + "resourceDisposalExact": true, + "saveReopen": "EXACT", + "deterministic": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P12-005" +} diff --git a/tests/golden/WBV2-P12-004/task-context.json b/tests/golden/WBV2-P12-004/task-context.json new file mode 100644 index 000000000..5e45832c0 --- /dev/null +++ b/tests/golden/WBV2-P12-004/task-context.json @@ -0,0 +1,179 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-004", + "parentTask": "WBV2-P12-003", + "status": "in_progress", + "goal": "Bind viewport SceneIR and bounded non-mesh read/edit paths to the compiled WebEngine runtime with explicit unsupported boundaries.", + "scope": { + "gap": "workflow:viewport_nonmesh_engine_receipt", + "ownerFamily": "VIEWPORT", + "implementationClass": "LOCAL_BOUNDED" + }, + "commands": [ + "npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-viewport-nonmesh-production.spec.ts", + "node tools/web/generate-wbv2-viewport-nonmesh-receipt.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P12-004 --write" + ], + "inputPaths": [ + "tests/golden/WBV2-P4-003/sculpt-report.json" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 2070, + "contextRemainingTokens": 516 + }, + "source": { + "bytes": 7834, + "tokens": 1960 + }, + "selected": [ + { + "path": "tests/golden/WBV2-P4-003/sculpt-report.json", + "bytes": 1553, + "tokens": 389 + } + ], + "excluded": [ + { + "path": "tests/golden/WBV2-P2-004/viewport-report.json", + "bytes": 2693, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "web/app/src/engine-client/WebEngineClient.ts", + "bytes": 16197, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "tests/golden/WBV2-P12-004/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P12-004.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P12-004/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 1, + "bytes": 1553, + "tokens": 389 + } + }, + "exitCriteria": [ + "nonblank viewport evidence is bound", + "non-mesh data is explicit", + "unsupported and budget cases fail closed", + "save/reopen and resource disposal are exact" + ], + "nextTask": "WBV2-P12-005", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P12-004.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P12-003/manifest.json", + "parentStatus": "docs/status/WBV2-P12-003.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P12-004.md", + "tests/golden/WBV2-P12-003/manifest.json", + "docs/status/WBV2-P12-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-P12-003", + "parentTask": "WBV2-P12-002", + "status": "done", + "nextTask": "WBV2-P12-004", + "artifactCount": 15 + }, + "statusSummary": [ + "# WBV2-P12-003 status", + "- task: `WBV2-P12-003`; parent: `WBV2-P12-002`; status: `done`", + "- material/UV: `4` Main mutations; Principled values and UV map persisted", + "- animation/TRS: keyframe frame `25` + interpolation `LINEAR`; persisted", + "- save/reopen: `EXACT`; invalid UV and stale frame rejected", + "- existing P3 source receipts reused read-only; no duplicate historical run", + "- nextTask: `WBV2-P12-004`", + "The material and animation workflows are now bound to the compiled WebEngine WASM Main in Chromium. Unsupported material nodes remain explicit, and stale or malformed authoring commands do not mutate Main." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1217, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 34, + "taskTokens": 305 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P12-004.md", + "bytes": 1217, + "lines": 34, + "tokens": 305 + }, + { + "path": "tests/golden/WBV2-P12-003/manifest.json", + "bytes": 3211, + "lines": 83, + "tokens": 803 + }, + { + "path": "docs/status/WBV2-P12-003.md", + "bytes": 603, + "lines": 11, + "tokens": 151 + } + ], + "sourceTokens": 1960, + "evidenceFiles": 1, + "evidenceBytes": 1553, + "evidenceTokens": 389, + "totalTokens": 2349, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3373, + "serializedContextTokens": 725, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P12-004/viewport-nonmesh-production.json b/tests/golden/WBV2-P12-004/viewport-nonmesh-production.json new file mode 100644 index 000000000..9cd20f4c0 --- /dev/null +++ b/tests/golden/WBV2-P12-004/viewport-nonmesh-production.json @@ -0,0 +1,79 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-004", + "operation": "VIEWPORT_NONMESH_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "viewport": { + "revision": 1, + "sceneId": "scene:WBV2P2004ViewportScene", + "meshCount": 1, + "geometryBuffers": 1, + "readbackPixels": 1024, + "resources": { + "activeRequests": 0, + "liveInputBytes": 0, + "liveNativeHandles": 0, + "liveStagingFiles": 0 + } + }, + "nonMesh": { + "baseRevision": 1, + "editedRevision": 2, + "data": [ + { + "id": "curve:WBV2P4003Curve", + "type": "CURVE", + "geometryStatus": "binary", + "pointCount": 3, + "splineCount": 1 + }, + { + "id": "pointcloud:WBV2P4003PointCloud", + "type": "POINT_CLOUD", + "geometryStatus": "binary", + "pointCount": 3, + "splineCount": 0 + } + ], + "gates": [ + { + "id": "curve:WBV2P4003Curve", + "type": "CURVE", + "status": "READY", + "capability": "NON_MESH_CURVE_BINARY", + "issueCodes": [] + }, + { + "id": "pointcloud:WBV2P4003PointCloud", + "type": "POINT_CLOUD", + "status": "READY", + "capability": "NON_MESH_POINT_CLOUD_BINARY", + "issueCodes": [] + } + ], + "unknown": { + "status": "BLOCKED", + "capability": "NON_MESH_DATA", + "issueCode": "NON_MESH_DATA_UNSUPPORTED" + }, + "curveId": "curve:WBV2P4003Curve", + "curveBefore": { + "pointCount": 3 + }, + "curveAfter": { + "pointCount": 3 + }, + "reopenedCurve": { + "pointCount": 3 + }, + "malformed": { + "code": "NON_MESH_PROPERTY_INVALID", + "message": "Curve control points must be finite and within the 1M point budget" + }, + "revisionAfterMalformed": 2, + "savedSha256": "1806f33520281813e765819c31bce7af1dc3a7b215d3a48899f9b1b2103ea3a0", + "sourceSha256": "88e64b7ca103025111891c3dbdb78d5dd038c99d77d46831414ee984ee16d161", + "saveReopenExact": true + } +} diff --git a/tests/golden/WBV2-P12-004/viewport-nonmesh-production.second.json b/tests/golden/WBV2-P12-004/viewport-nonmesh-production.second.json new file mode 100644 index 000000000..9cd20f4c0 --- /dev/null +++ b/tests/golden/WBV2-P12-004/viewport-nonmesh-production.second.json @@ -0,0 +1,79 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-004", + "operation": "VIEWPORT_NONMESH_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "viewport": { + "revision": 1, + "sceneId": "scene:WBV2P2004ViewportScene", + "meshCount": 1, + "geometryBuffers": 1, + "readbackPixels": 1024, + "resources": { + "activeRequests": 0, + "liveInputBytes": 0, + "liveNativeHandles": 0, + "liveStagingFiles": 0 + } + }, + "nonMesh": { + "baseRevision": 1, + "editedRevision": 2, + "data": [ + { + "id": "curve:WBV2P4003Curve", + "type": "CURVE", + "geometryStatus": "binary", + "pointCount": 3, + "splineCount": 1 + }, + { + "id": "pointcloud:WBV2P4003PointCloud", + "type": "POINT_CLOUD", + "geometryStatus": "binary", + "pointCount": 3, + "splineCount": 0 + } + ], + "gates": [ + { + "id": "curve:WBV2P4003Curve", + "type": "CURVE", + "status": "READY", + "capability": "NON_MESH_CURVE_BINARY", + "issueCodes": [] + }, + { + "id": "pointcloud:WBV2P4003PointCloud", + "type": "POINT_CLOUD", + "status": "READY", + "capability": "NON_MESH_POINT_CLOUD_BINARY", + "issueCodes": [] + } + ], + "unknown": { + "status": "BLOCKED", + "capability": "NON_MESH_DATA", + "issueCode": "NON_MESH_DATA_UNSUPPORTED" + }, + "curveId": "curve:WBV2P4003Curve", + "curveBefore": { + "pointCount": 3 + }, + "curveAfter": { + "pointCount": 3 + }, + "reopenedCurve": { + "pointCount": 3 + }, + "malformed": { + "code": "NON_MESH_PROPERTY_INVALID", + "message": "Curve control points must be finite and within the 1M point budget" + }, + "revisionAfterMalformed": 2, + "savedSha256": "1806f33520281813e765819c31bce7af1dc3a7b215d3a48899f9b1b2103ea3a0", + "sourceSha256": "88e64b7ca103025111891c3dbdb78d5dd038c99d77d46831414ee984ee16d161", + "saveReopenExact": true + } +} diff --git a/tests/golden/WBV2-P12-004/viewport-nonmesh-production.verify.json b/tests/golden/WBV2-P12-004/viewport-nonmesh-production.verify.json new file mode 100644 index 000000000..9cd20f4c0 --- /dev/null +++ b/tests/golden/WBV2-P12-004/viewport-nonmesh-production.verify.json @@ -0,0 +1,79 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-004", + "operation": "VIEWPORT_NONMESH_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "viewport": { + "revision": 1, + "sceneId": "scene:WBV2P2004ViewportScene", + "meshCount": 1, + "geometryBuffers": 1, + "readbackPixels": 1024, + "resources": { + "activeRequests": 0, + "liveInputBytes": 0, + "liveNativeHandles": 0, + "liveStagingFiles": 0 + } + }, + "nonMesh": { + "baseRevision": 1, + "editedRevision": 2, + "data": [ + { + "id": "curve:WBV2P4003Curve", + "type": "CURVE", + "geometryStatus": "binary", + "pointCount": 3, + "splineCount": 1 + }, + { + "id": "pointcloud:WBV2P4003PointCloud", + "type": "POINT_CLOUD", + "geometryStatus": "binary", + "pointCount": 3, + "splineCount": 0 + } + ], + "gates": [ + { + "id": "curve:WBV2P4003Curve", + "type": "CURVE", + "status": "READY", + "capability": "NON_MESH_CURVE_BINARY", + "issueCodes": [] + }, + { + "id": "pointcloud:WBV2P4003PointCloud", + "type": "POINT_CLOUD", + "status": "READY", + "capability": "NON_MESH_POINT_CLOUD_BINARY", + "issueCodes": [] + } + ], + "unknown": { + "status": "BLOCKED", + "capability": "NON_MESH_DATA", + "issueCode": "NON_MESH_DATA_UNSUPPORTED" + }, + "curveId": "curve:WBV2P4003Curve", + "curveBefore": { + "pointCount": 3 + }, + "curveAfter": { + "pointCount": 3 + }, + "reopenedCurve": { + "pointCount": 3 + }, + "malformed": { + "code": "NON_MESH_PROPERTY_INVALID", + "message": "Curve control points must be finite and within the 1M point budget" + }, + "revisionAfterMalformed": 2, + "savedSha256": "1806f33520281813e765819c31bce7af1dc3a7b215d3a48899f9b1b2103ea3a0", + "sourceSha256": "88e64b7ca103025111891c3dbdb78d5dd038c99d77d46831414ee984ee16d161", + "saveReopenExact": true + } +} diff --git a/tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json b/tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json new file mode 100644 index 000000000..5dcda0f8c --- /dev/null +++ b/tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json @@ -0,0 +1,103 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-004", + "operation": "VIEWPORT_NONMESH_ENGINE_RECEIPT", + "status": "PASS", + "browser": "chromium", + "queueMutation": false, + "source": { + "viewport": { + "task": "WBV2-P2-004", + "manifest": "tests/golden/WBV2-P2-004/manifest.json", + "manifestSha256": "9a511f9620bdc886ab4684ac449dcaa156086cde76c0b95d16795f0f51a304f2", + "report": "tests/golden/WBV2-P2-004/viewport-report.json", + "reportSha256": "a38e7ff8da3042a82f4d20f9f6c60300ebd6ee393cf3625901c770ebff674dac" + }, + "nonMesh": { + "task": "WBV2-P4-003", + "manifest": "tests/golden/WBV2-P4-003/manifest.json", + "manifestSha256": "9c41ef52263d544650b1bad2dc2ec5f40ed63a9ab1b9732492a46672384e1218", + "report": "tests/golden/WBV2-P4-003/sculpt-report.json", + "reportSha256": "de29aabbb753b682d85c30258ff4d68530650d00e167f30181d5c9a68669dd99" + }, + "reusedReadOnly": true + }, + "production": { + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-production.json", + "reportSha256": "ec3c861645a084a3f6e37d014f983c9b6710ed64f8f62b89aa7f70dd19aff337", + "secondReport": "tests/golden/WBV2-P12-004/viewport-nonmesh-production.second.json", + "secondReportSha256": "ec3c861645a084a3f6e37d014f983c9b6710ed64f8f62b89aa7f70dd19aff337", + "deterministic": true, + "viewport": { + "sceneId": "scene:WBV2P2004ViewportScene", + "meshCount": 1, + "geometryBuffers": 1, + "readbackPixels": 1024, + "resources": { + "activeRequests": 0, + "liveInputBytes": 0, + "liveNativeHandles": 0, + "liveStagingFiles": 0 + } + }, + "nonMesh": { + "data": [ + { + "id": "curve:WBV2P4003Curve", + "type": "CURVE", + "geometryStatus": "binary", + "pointCount": 3, + "splineCount": 1 + }, + { + "id": "pointcloud:WBV2P4003PointCloud", + "type": "POINT_CLOUD", + "geometryStatus": "binary", + "pointCount": 3, + "splineCount": 0 + } + ], + "gates": [ + { + "id": "curve:WBV2P4003Curve", + "type": "CURVE", + "status": "READY", + "capability": "NON_MESH_CURVE_BINARY", + "issueCodes": [] + }, + { + "id": "pointcloud:WBV2P4003PointCloud", + "type": "POINT_CLOUD", + "status": "READY", + "capability": "NON_MESH_POINT_CLOUD_BINARY", + "issueCodes": [] + } + ], + "curveId": "curve:WBV2P4003Curve", + "baseRevision": 1, + "editedRevision": 2, + "unknown": { + "status": "BLOCKED", + "capability": "NON_MESH_DATA", + "issueCode": "NON_MESH_DATA_UNSUPPORTED" + }, + "malformed": { + "code": "NON_MESH_PROPERTY_INVALID", + "message": "Curve control points must be finite and within the 1M point budget" + }, + "revisionAfterMalformed": 2, + "saveReopen": true + } + }, + "assertions": { + "viewportPixelsNonblank": true, + "nonMeshDataExplicit": true, + "curveMainChanged": true, + "unsupportedDataBlocked": true, + "malformedRejected": true, + "resourceDisposalExact": true, + "saveReopenExact": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P12-005" +} diff --git a/tests/golden/WBV2-P12-005/domain-expansion-task-plan.json b/tests/golden/WBV2-P12-005/domain-expansion-task-plan.json new file mode 100644 index 000000000..951b1ee6e --- /dev/null +++ b/tests/golden/WBV2-P12-005/domain-expansion-task-plan.json @@ -0,0 +1,1895 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_DOMAIN_EXPANSION_EPOCH_1", + "status": "COMPLETED_WITH_DOMAIN_PARITY", + "authority": "queue_reactivated_after_p11_engine_gate", + "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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-000", + "phase": "P10", + "title": "authorize_native_engine_parity_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P9-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-governance", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-000.md", + "behavior": "Authorize native Blender/WASM engine parity continuation after bounded Chromium capability evidence.", + "outputs": [ + "continuation receipt", + "native parity plan", + "scope limits" + ], + "acceptance": [ + "P9 evidence remains hash-bound", + "native build/runtime is explicit", + "one native parity task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P10-001", + "phase": "P10", + "title": "reconcile_wbv2_inventory_source_drift", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-inventory", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-001.md", + "behavior": "Record the authorized mutable WBV2 plan drift and prove dependency closure stability without rewriting historical P0 evidence.", + "outputs": [ + "current source hash baseline", + "drift report", + "checker compatibility" + ], + "acceptance": [ + "historical P0 hashes remain unchanged", + "only authorized plan drift is recorded", + "dependency roots/lockfile/closure remain stable", + "inventory checker passes using current baseline" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-002", + "phase": "P10", + "title": "bind_native_and_wasm_engine_receipts", + "kind": "feature", + "owner": "ENGINE", + "dependsOn": [ + "WBV2-P10-001" + ], + "parityId": "ENGINE.NATIVE_WASM_BRIDGE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p10-engine", + "gate": "G6", + "card": "docs/tasks/WBV2-P10-002.md", + "behavior": "Bind Mesh, Modifier, and Asset Catalog receipts to the compiled Blender native binary and web_engine.wasm runtime.", + "outputs": [ + "native receipt", + "WASM receipt", + "Chromium engine report" + ], + "acceptance": [ + "native Blender binary is source-bound", + "WASM binary and JS are hash-bound", + "same mutation reaches real engine/Main", + "save/reopen and failures remain exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P10-003", + "phase": "P10", + "title": "expand_core_module_operator_matrix", + "kind": "feature", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P10-002" + ], + "parityId": "CORE.MODULE_MATRIX", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p10-matrix", + "gate": "G7", + "card": "docs/tasks/WBV2-P10-003.md", + "behavior": "Expand the three proven capability modules with data-driven operator coverage and aggregate regression receipts.", + "outputs": [ + "module matrix", + "shard reports", + "aggregate manifest" + ], + "acceptance": [ + "positive cases are L2+", + "negative cases do not mutate Main", + "shards use one catalog hash", + "unmapped and retained-negative cases stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-000", + "phase": "P11", + "title": "authorize_module_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P10-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-governance", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-000.md", + "behavior": "Authorize deeper module production after real native/WASM engine binding and the first aggregate matrix.", + "outputs": [ + "continuation root", + "module expansion plan", + "scope limits" + ], + "acceptance": [ + "P10 evidence remains hash-bound", + "one expansion task is active", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P11-001", + "phase": "P11", + "title": "mesh_topology_operation_family", + "kind": "feature", + "owner": "MESH", + "dependsOn": [ + "WBV2-P11-000" + ], + "parityId": "MESH.EDIT_TOPOLOGY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-mesh", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-001.md", + "behavior": "Execute merge, dissolve, extrude, inset, bevel, and loop-cut through the real Blender WASM Main and preserve each result through save/reopen.", + "outputs": [ + "topology receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "six mesh operations mutate Main", + "revision increments exactly once", + "save/reopen preserves topology counts", + "invalid selection and incompatible configuration fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-002", + "phase": "P11", + "title": "modifier_parameter_apply_family", + "kind": "feature", + "owner": "MODIFIER", + "dependsOn": [ + "WBV2-P11-001" + ], + "parityId": "MODIFIER.PARAMETER_APPLY_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-modifier", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-002.md", + "behavior": "Extend the real Modifier Main path from enable/disable to bounded parameter and apply transactions.", + "outputs": [ + "modifier parameter receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "parameter mutation is native/WASM bound", + "apply result is evaluated", + "save/reopen is exact", + "dependency and stale inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-003", + "phase": "P11", + "title": "asset_link_override_reload_family", + "kind": "feature", + "owner": "ASSET", + "dependsOn": [ + "WBV2-P11-002" + ], + "parityId": "ASSET.LINK_OVERRIDE_RELOAD_FAMILY", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p11-asset", + "gate": "G7", + "card": "docs/tasks/WBV2-P11-003.md", + "behavior": "Extend the real Asset Main path from append to link, override, reload, and missing-library boundaries.", + "outputs": [ + "asset ownership receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "source ownership is preserved", + "override is local and hash-bound", + "reload revision is checked", + "missing source remains explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P11-004", + "phase": "P11", + "title": "recompute_engine_module_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P11-003" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p11-release", + "gate": "G8", + "card": "docs/tasks/WBV2-P11-004.md", + "behavior": "Recompute engine-bound module parity from P10 and P11 receipts without claiming whole-inventory completion.", + "outputs": [ + "engine module gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound claims are emitted", + "inventory remainder is explicit", + "provenance epoch 2 remains authorized rebaseline only", + "full historical reproduction remains false" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-000", + "phase": "P12", + "title": "authorize_domain_expansion_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P11-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-governance", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-000.md", + "behavior": "Authorize expansion from the three engine-bound modules to the remaining high-value Blender Web domains using existing source evidence.", + "outputs": [ + "continuation root", + "domain expansion plan", + "scope limits" + ], + "acceptance": [ + "P11 evidence remains hash-bound", + "domain tasks use existing source receipts", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P12-001", + "phase": "P12", + "title": "reconcile_existing_capability_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P12-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-ledger", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-001.md", + "behavior": "Aggregate existing WBV2 P1-P6 and P10-P11 manifests into a conservative capability ledger without inventing claims.", + "outputs": [ + "capability ledger", + "evidence index", + "remaining gap map" + ], + "acceptance": [ + "all source manifests are hash-verified", + "only done receipts enter proven evidence", + "L0/metadata and blocked cases remain explicit", + "inventory remainder is preserved" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-002", + "phase": "P12", + "title": "scene_object_workflow_engine_receipt", + "kind": "feature", + "owner": "EDITOR", + "dependsOn": [ + "WBV2-P12-001" + ], + "parityId": "EDITOR.SCENE_OBJECT_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-scene", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-002.md", + "behavior": "Bind object visibility and transform edits to the compiled WebEngine WASM Main with save/reopen and revision guards.", + "outputs": [ + "scene/object receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "visibility and transform mutate Main", + "desktop source oracle is bound", + "save/reopen is exact", + "stale and malformed commands fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-003", + "phase": "P12", + "title": "material_animation_engine_receipt", + "kind": "feature", + "owner": "AUTHORING", + "dependsOn": [ + "WBV2-P12-002" + ], + "parityId": "AUTHORING.MATERIAL_ANIMATION_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p12-authoring", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-003.md", + "behavior": "Bind material Principled/texture and TRS keyframe edits to the compiled WebEngine WASM Main.", + "outputs": [ + "authoring receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "material and keyframe Main mutations pass", + "source hashes are bound", + "save/reopen is exact", + "unsupported graph and stale frame inputs fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-004", + "phase": "P12", + "title": "viewport_nonmesh_engine_receipt", + "kind": "feature", + "owner": "VIEWPORT", + "dependsOn": [ + "WBV2-P12-003" + ], + "parityId": "VIEWPORT.NONMESH_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-viewport", + "gate": "G8", + "card": "docs/tasks/WBV2-P12-004.md", + "behavior": "Bind viewport SceneIR and bounded non-mesh read/edit paths to the compiled WebEngine runtime with explicit unsupported boundaries.", + "outputs": [ + "viewport receipt", + "nonmesh boundary map", + "manifest" + ], + "acceptance": [ + "nonblank viewport evidence is bound", + "non-mesh data is explicit", + "unsupported and budget cases fail closed", + "save/reopen and resource disposal are exact" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P12-005", + "phase": "P12", + "title": "recompute_domain_parity_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P12-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p12-release", + "gate": "G9", + "card": "docs/tasks/WBV2-P12-005.md", + "behavior": "Recompute domain parity from the complete evidence ledger while retaining explicit inventory and provenance limits.", + "outputs": [ + "domain parity gate", + "limited release declaration", + "manifest" + ], + "acceptance": [ + "only engine-bound domain claims are emitted", + "unproven inventory remains explicit", + "epoch 2 remains authorized rebaseline only", + "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-P12-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P12-004/domain-expansion-task-plan.json", + "sha256": "d6853d90b12e1df1055d3fb2251a082448e35c04be260c98662b9eba61796bbd" + } +} diff --git a/tests/golden/WBV2-P12-005/domain-parity-gate-report.json b/tests/golden/WBV2-P12-005/domain-parity-gate-report.json new file mode 100644 index 000000000..57cc10e14 --- /dev/null +++ b/tests/golden/WBV2-P12-005/domain-parity-gate-report.json @@ -0,0 +1,113 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-005", + "operation": "RECOMPUTE_DOMAIN_PARITY_GATE", + "status": "PASS", + "decision": { + "status": "READY_WITH_DOMAIN_ENGINE_PARITY", + "code": "DOMAIN_PARITY_AUTHORIZED_REBASELINE", + "featureParityClaims": [ + "CAP-MESH-TOPOLOGY-FAMILY", + "CAP-MODIFIER-PARAMETER-APPLY", + "CAP-ASSET-LINK-OVERRIDE-RELOAD", + "CAP-SCENE-OBJECT-ENGINE", + "CAP-MATERIAL-ANIMATION-ENGINE", + "CAP-VIEWPORT-NONMESH-ENGINE" + ], + "featureParityClaimCount": 6, + "engineBound": true, + "browser": "chromium", + "provenanceEpoch": 2, + "releaseScope": "AUTHORIZED_REBASELINE_ONLY", + "fullHistoricalReproduction": false, + "inventoryTotal": 6900, + "inventoryPending": 6618, + "inventoryClaimedComplete": 0 + }, + "evidence": { + "ledger": { + "path": "tests/golden/WBV2-P12-001/capability-ledger-report.json", + "sha256": "5c41a84564f78bb8e78a988f0445b06eaf1b3d0af8c59cdb216d0e79b0d46414", + "sourceManifests": 34, + "artifactRecords": 517, + "repeatedRuns": 0 + }, + "p11Gate": { + "path": "tests/golden/WBV2-P11-004/engine-module-gate-report.json", + "sha256": "9b549cd365f8719ee48b075801e897d04df660929ac4bd7e1325a6b4b4646280", + "claims": 3 + }, + "domains": [ + { + "capabilityId": "CAP-SCENE-OBJECT-ENGINE", + "family": "SCENE_OBJECT", + "manifest": "tests/golden/WBV2-P12-002/manifest.json", + "manifestSha256": "63f51801601c421beeaff62353862ca17800180f336093051544936a002b3e4f", + "report": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json", + "reportSha256": "33f69f7d1a1522b29ab2aa6cd835c9486c830883bf7bc26324ec565e6b80e0f8", + "proof": "visibility + transform + exact save/reopen", + "browser": "chromium", + "engineBound": true, + "deterministic": true, + "saveReopen": "EXACT" + }, + { + "capabilityId": "CAP-MATERIAL-ANIMATION-ENGINE", + "family": "MATERIAL_ANIMATION", + "manifest": "tests/golden/WBV2-P12-003/manifest.json", + "manifestSha256": "2ec36a52526018beb44eaccdb91d86942d5b908a19be4abd9c6065274269ebfb", + "report": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json", + "reportSha256": "468498825f7ebbafc7214fca1509baf130ccc72790e80a4101a88f49c42e459d", + "proof": "material/UV + keyframe/interpolation + exact save/reopen", + "browser": "chromium", + "engineBound": true, + "deterministic": true, + "saveReopen": "EXACT" + }, + { + "capabilityId": "CAP-VIEWPORT-NONMESH-ENGINE", + "family": "VIEWPORT_NONMESH", + "manifest": "tests/golden/WBV2-P12-004/manifest.json", + "manifestSha256": "937df9652e879f877400ca828d8ae86b89c3dc12964b7ef7e9f6366b78e7184f", + "report": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json", + "reportSha256": "61cbaee24719647addfd3147a665b97ad40deff4eb4a64c055a3ba7a33cac53b", + "proof": "nonblank viewport + non-mesh gate/edit + exact save/reopen", + "browser": "chromium", + "engineBound": true, + "deterministic": true, + "saveReopen": "EXACT" + } + ] + }, + "efficiency": { + "batchLedgerScan": true, + "existingReceiptsReused": 34, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "newDomainReceipts": 3, + "inventoryTasksCreated": 0 + }, + "coverage": { + "inventoryTotal": 6900, + "inventoryPending": 6618, + "inventoryClaimedComplete": 0, + "engineBoundDomainClaims": 6 + }, + "negative": { + "missingReceipt": "REJECTED", + "receiptHashDrift": "REJECTED", + "unsupportedBrowser": "REJECTED", + "nonExactSaveReopen": "REJECTED", + "falseInventoryCompletion": "REJECTED", + "falseHistoricalReproduction": "REJECTED", + "undeclaredClaim": "REJECTED" + }, + "policy": { + "sourceHistoryReadOnly": true, + "authorizedRebaselineOnly": true, + "existingEvidenceReused": true, + "inventoryRemainderExplicit": true, + "terminalQueuePointer": true + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P12-005/manifest.json b/tests/golden/WBV2-P12-005/manifest.json new file mode 100644 index 000000000..2c1afe440 --- /dev/null +++ b/tests/golden/WBV2-P12-005/manifest.json @@ -0,0 +1,88 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-005", + "parentTask": "WBV2-P12-004", + "operation": "RECOMPUTE_DOMAIN_PARITY_GATE", + "status": "done", + "enablingTask": true, + "parityStateChange": true, + "runtime": "READ_ONLY_LEDGER_PLUS_PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P12-004/manifest.json", + "sha256": "937df9652e879f877400ca828d8ae86b89c3dc12964b7ef7e9f6366b78e7184f" + }, + "ledger": { + "path": "tests/golden/WBV2-P12-001/capability-ledger-report.json", + "sha256": "5c41a84564f78bb8e78a988f0445b06eaf1b3d0af8c59cdb216d0e79b0d46414" + }, + "approval": { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3" + }, + "p11Gate": { + "path": "tests/golden/WBV2-P11-004/engine-module-gate-report.json", + "sha256": "9b549cd365f8719ee48b075801e897d04df660929ac4bd7e1325a6b4b4646280" + }, + "sceneObjectManifest": { + "path": "tests/golden/WBV2-P12-002/manifest.json", + "sha256": "63f51801601c421beeaff62353862ca17800180f336093051544936a002b3e4f" + }, + "sceneObjectReport": { + "path": "tests/golden/WBV2-P12-002/scene-object-receipt-report.json", + "sha256": "33f69f7d1a1522b29ab2aa6cd835c9486c830883bf7bc26324ec565e6b80e0f8" + }, + "materialAnimationManifest": { + "path": "tests/golden/WBV2-P12-003/manifest.json", + "sha256": "2ec36a52526018beb44eaccdb91d86942d5b908a19be4abd9c6065274269ebfb" + }, + "materialAnimationReport": { + "path": "tests/golden/WBV2-P12-003/material-animation-receipt-report.json", + "sha256": "468498825f7ebbafc7214fca1509baf130ccc72790e80a4101a88f49c42e459d" + }, + "viewportNonMeshManifest": { + "path": "tests/golden/WBV2-P12-004/manifest.json", + "sha256": "937df9652e879f877400ca828d8ae86b89c3dc12964b7ef7e9f6366b78e7184f" + }, + "viewportNonMeshReport": { + "path": "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json", + "sha256": "61cbaee24719647addfd3147a665b97ad40deff4eb4a64c055a3ba7a33cac53b" + }, + "generator": { + "path": "tools/web/generate-wbv2-domain-parity-gate.mjs", + "sha256": "92c438acba24433a77326bcf2c5832ac03b8eb0eac2e690b17e653b81320ece0" + }, + "report": { + "path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json", + "sha256": "22507c619c6d99729322d73dc9c5dcd97d69832608f253b865469daa11a2f9d6" + }, + "status": { + "path": "docs/status/WBV2-P12-005.md", + "sha256": "095a7b2d590c517f8312ae49b84c0805fba5c4289987824a4add8cb5af217545" + }, + "parityPlan": { + "path": "tests/golden/WBV2-P12-005/domain-expansion-task-plan.json", + "sha256": "d90825452b43200daa7588d46017863d8e7f27ba489bfeecdf5bf8a17ed43cd4" + }, + "taskContext": { + "path": "tests/golden/WBV2-P12-005/task-context.json", + "sha256": "c2b65e43fe6fb5197ea4f341fc2ed80f0989e4187bfdfd3dc6152f441c6db656" + } + }, + "assertions": { + "totalClaims": 6, + "newDomainClaims": 3, + "reusedP11Claims": 3, + "existingManifestsBatchScanned": 34, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "inventoryTotal": 6900, + "inventoryPending": 6618, + "inventoryClaimedComplete": 0, + "provenanceEpoch": 2, + "authorizedRebaselineOnly": true, + "fullHistoricalReproduction": false, + "deterministic": true + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P12-005/task-context.json b/tests/golden/WBV2-P12-005/task-context.json new file mode 100644 index 000000000..90f144af2 --- /dev/null +++ b/tests/golden/WBV2-P12-005/task-context.json @@ -0,0 +1,178 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P12-005", + "parentTask": "WBV2-P12-004", + "status": "in_progress", + "goal": "Recompute domain parity from P10-P12 receipts while retaining explicit inventory and provenance limits.", + "scope": { + "gap": "workflow:recompute_domain_parity_gate", + "ownerFamily": "RELEASE", + "implementationClass": "LOCAL_BOUNDED" + }, + "commands": [ + "node tools/web/generate-wbv2-domain-parity-gate.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P12-005 --write" + ], + "inputPaths": [ + "tests/golden/WBV2-P12-001/capability-ledger-report.json", + "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 2104, + "contextRemainingTokens": 524 + }, + "source": { + "bytes": 7800, + "tokens": 1952 + }, + "selected": [ + { + "path": "tests/golden/WBV2-P12-001/capability-ledger-report.json", + "bytes": 1160, + "tokens": 290 + }, + { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "bytes": 704, + "tokens": 176 + } + ], + "excluded": [ + { + "path": "tests/golden/WBV2-P11-004/engine-module-gate-report.json", + "bytes": 3712, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P12-005/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P12-005.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P12-005/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 2, + "bytes": 1864, + "tokens": 466 + } + }, + "exitCriteria": [ + "only engine-bound domain claims are emitted", + "unproven inventory remains explicit", + "epoch 2 remains authorized rebaseline only", + "full historical reproduction remains false" + ], + "nextTask": null, + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P12-005.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P12-004/manifest.json", + "parentStatus": "docs/status/WBV2-P12-004.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P12-005.md", + "tests/golden/WBV2-P12-004/manifest.json", + "docs/status/WBV2-P12-004.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-P12-004", + "parentTask": "WBV2-P12-003", + "status": "done", + "nextTask": "WBV2-P12-005", + "artifactCount": 15 + }, + "statusSummary": [ + "# WBV2-P12-004 status", + "- task: `WBV2-P12-004`; parent: `WBV2-P12-003`; status: `done`", + "- viewport: scene `scene:WBV2P2004ViewportScene`; readback pixels `1024`; resources disposed exact", + "- non-mesh: Curve + Point Cloud binary gates READY; Curve revision `1 -> 2`", + "- unknown data: BLOCKED; malformed Curve edit rejected without revision change", + "- save/reopen: `EXACT`; nextTask: `WBV2-P12-005`", + "Existing P2-004 viewport and P4-003 non-mesh source receipts are reused read-only. The production Chromium test binds nonblank viewport readback and bounded non-mesh capability/Curve mutation to the compiled WASM Main, with unsupported data remaining explicit." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1125, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 34, + "taskTokens": 282 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P12-005.md", + "bytes": 1125, + "lines": 34, + "tokens": 282 + }, + { + "path": "tests/golden/WBV2-P12-004/manifest.json", + "bytes": 3221, + "lines": 84, + "tokens": 806 + }, + { + "path": "docs/status/WBV2-P12-004.md", + "bytes": 651, + "lines": 10, + "tokens": 163 + } + ], + "sourceTokens": 1952, + "evidenceFiles": 2, + "evidenceBytes": 1864, + "evidenceTokens": 466, + "totalTokens": 2418, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3442, + "serializedContextTokens": 736, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index da0319f73..17a6ee6c7 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -47,4 +47,10 @@ {"id":"WBV2-P11-001","gapId":"MESH.EDIT_TOPOLOGY_FAMILY","ownerFamily":"MESH","sourceTask":"P11","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["six mesh operations mutate Main","revision increments exactly once","save/reopen preserves topology counts","invalid selection and incompatible configuration fail closed"]} {"id":"WBV2-P11-002","gapId":"MODIFIER.PARAMETER_APPLY_FAMILY","ownerFamily":"MODIFIER","sourceTask":"P11","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["parameter mutation is native/WASM bound","apply result is evaluated","save/reopen is exact","dependency and stale inputs fail closed"]} {"id":"WBV2-P11-003","gapId":"ASSET.LINK_OVERRIDE_RELOAD_FAMILY","ownerFamily":"ASSET","sourceTask":"P11","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source ownership is preserved","override is local and hash-bound","reload revision is checked","missing source remains explicit"]} -{"id":"WBV2-P11-004","gapId":"workflow:recompute_engine_module_gate","ownerFamily":"RELEASE","sourceTask":"P11","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only engine-bound claims are emitted","inventory remainder is explicit","provenance epoch 2 remains authorized rebaseline only","full historical reproduction remains false"]} +{"id":"WBV2-P11-004","gapId":"workflow:recompute_engine_module_gate","ownerFamily":"RELEASE","sourceTask":"P11","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only engine-bound claims are emitted","inventory remainder is explicit","provenance epoch 2 remains authorized rebaseline only","full historical reproduction remains false"]} +{"id":"WBV2-P12-000","gapId":"workflow:authorize_domain_expansion_continuation","ownerFamily":"PROGRAM","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P11 evidence remains hash-bound","domain tasks use existing source receipts","one ledger task is active"]} +{"id":"WBV2-P12-001","gapId":"workflow:reconcile_existing_capability_ledger","ownerFamily":"PARITY","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["all source manifests are hash-verified","only done receipts enter proven evidence","L0/metadata and blocked cases remain explicit","inventory remainder is preserved"]} +{"id":"WBV2-P12-002","gapId":"EDITOR.SCENE_OBJECT_ENGINE","ownerFamily":"EDITOR","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["visibility and transform mutate Main","desktop source oracle is bound","save/reopen is exact","stale and malformed commands fail closed"]} +{"id":"WBV2-P12-003","gapId":"AUTHORING.MATERIAL_ANIMATION_ENGINE","ownerFamily":"AUTHORING","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["material and keyframe Main mutations pass","source hashes are bound","save/reopen is exact","unsupported graph and stale frame inputs fail closed"]} +{"id":"WBV2-P12-004","gapId":"VIEWPORT.NONMESH_ENGINE","ownerFamily":"VIEWPORT","sourceTask":"P12","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["nonblank viewport evidence is bound","non-mesh data is explicit","unsupported and budget cases fail closed","save/reopen and resource disposal are exact"]} +{"id":"WBV2-P12-005","gapId":"workflow:recompute_domain_parity_gate","ownerFamily":"RELEASE","sourceTask":"P12","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only engine-bound domain claims are emitted","unproven inventory remains explicit","epoch 2 remains authorized rebaseline only","full historical reproduction remains false"]} diff --git a/tests/golden/WBV2/task-index.json b/tests/golden/WBV2/task-index.json index ac9ac2fd4..441056492 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-P11-004/module-expansion-task-plan.json","sha256":"185f2412fd651068346230cc945973e078cfa642da2cb6f5f51943e306b40d57"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"9099d6ea80f8693aeca5cac5fbdcf39a5450a24aeb8f5cb10f0d0eaaca3116d7"},"taskCount":50,"activeTask":"WBV2-P11-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":321,"previous":"WBV2-P9-003","next":"WBV2-P10-000"},"WBV2-P10-000":{"line":41,"offset":12005,"length":312,"previous":"WBV2-P9-004","next":"WBV2-P10-001"},"WBV2-P10-001":{"line":42,"offset":12317,"length":383,"previous":"WBV2-P10-000","next":"WBV2-P10-002"},"WBV2-P10-002":{"line":43,"offset":12700,"length":336,"previous":"WBV2-P10-001","next":"WBV2-P10-003"},"WBV2-P10-003":{"line":44,"offset":13036,"length":318,"previous":"WBV2-P10-002","next":"WBV2-P11-000"},"WBV2-P11-000":{"line":45,"offset":13354,"length":315,"previous":"WBV2-P10-003","next":"WBV2-P11-001"},"WBV2-P11-001":{"line":46,"offset":13669,"length":349,"previous":"WBV2-P11-000","next":"WBV2-P11-002"},"WBV2-P11-002":{"line":47,"offset":14018,"length":322,"previous":"WBV2-P11-001","next":"WBV2-P11-003"},"WBV2-P11-003":{"line":48,"offset":14340,"length":316,"previous":"WBV2-P11-002","next":"WBV2-P11-004"},"WBV2-P11-004":{"line":49,"offset":14656,"length":365,"previous":"WBV2-P11-003","next":null}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P12-005/domain-expansion-task-plan.json","sha256":"d90825452b43200daa7588d46017863d8e7f27ba489bfeecdf5bf8a17ed43cd4"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"032927b8cbfd2f31c8bbc4cf966f7652b30884d583f0999ed1fa89ff17e43988"},"taskCount":56,"activeTask":"WBV2-P12-005","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":321,"previous":"WBV2-P9-003","next":"WBV2-P10-000"},"WBV2-P10-000":{"line":41,"offset":12005,"length":312,"previous":"WBV2-P9-004","next":"WBV2-P10-001"},"WBV2-P10-001":{"line":42,"offset":12317,"length":383,"previous":"WBV2-P10-000","next":"WBV2-P10-002"},"WBV2-P10-002":{"line":43,"offset":12700,"length":336,"previous":"WBV2-P10-001","next":"WBV2-P10-003"},"WBV2-P10-003":{"line":44,"offset":13036,"length":318,"previous":"WBV2-P10-002","next":"WBV2-P11-000"},"WBV2-P11-000":{"line":45,"offset":13354,"length":315,"previous":"WBV2-P10-003","next":"WBV2-P11-001"},"WBV2-P11-001":{"line":46,"offset":13669,"length":349,"previous":"WBV2-P11-000","next":"WBV2-P11-002"},"WBV2-P11-002":{"line":47,"offset":14018,"length":322,"previous":"WBV2-P11-001","next":"WBV2-P11-003"},"WBV2-P11-003":{"line":48,"offset":14340,"length":316,"previous":"WBV2-P11-002","next":"WBV2-P11-004"},"WBV2-P11-004":{"line":49,"offset":14656,"length":368,"previous":"WBV2-P11-003","next":"WBV2-P12-000"},"WBV2-P12-000":{"line":50,"offset":15024,"length":311,"previous":"WBV2-P11-004","next":"WBV2-P12-001"},"WBV2-P12-001":{"line":51,"offset":15335,"length":368,"previous":"WBV2-P12-000","next":"WBV2-P12-002"},"WBV2-P12-002":{"line":52,"offset":15703,"length":318,"previous":"WBV2-P12-001","next":"WBV2-P12-003"},"WBV2-P12-003":{"line":53,"offset":16021,"length":340,"previous":"WBV2-P12-002","next":"WBV2-P12-004"},"WBV2-P12-004":{"line":54,"offset":16361,"length":336,"previous":"WBV2-P12-003","next":"WBV2-P12-005"},"WBV2-P12-005":{"line":55,"offset":16697,"length":365,"previous":"WBV2-P12-004","next":null}}} diff --git a/tools/web/check-wbv2-capability-ledger.mjs b/tools/web/check-wbv2-capability-ledger.mjs new file mode 100644 index 000000000..4e78997fd --- /dev/null +++ b/tools/web/check-wbv2-capability-ledger.mjs @@ -0,0 +1,48 @@ +import assert from "node:assert/strict"; +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); +const absolute = (file) => path.join(root, file); +const read = (file) => fs.readFileSync(absolute(file), "utf8"); +const json = (file) => JSON.parse(read(file)); +const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex"); +const ledgerPath = "tests/golden/WBV2-P12-001/capability-ledger.json"; +const reportPath = "tests/golden/WBV2-P12-001/capability-ledger-report.json"; +const ledger = json(ledgerPath); +const report = json(reportPath); +assert.equal(ledger.schemaVersion, 1); +assert.equal(ledger.task, "WBV2-P12-001"); +assert.equal(ledger.operation, "EXISTING_CAPABILITY_LEDGER"); +assert.equal(report.status, "PASS"); +assert.equal(report.task, "WBV2-P12-001"); +assert.equal(report.ledgerSha256, sha256(ledgerPath)); +assert.equal(ledger.inventory.total, 6900); +assert.equal(ledger.inventory.pending, 6618); +assert.equal(ledger.inventory.claimedComplete, 0); +assert.equal(ledger.sourceManifests.length, 34); +assert.equal(ledger.policy.reuseReadOnly, true); +assert.equal(ledger.policy.noRepeatedExecution, true); +assert.equal(ledger.policy.historicalDriftExplicit, true); +assert.equal(ledger.engineBoundClaims, 6); +for (const entry of ledger.sourceManifests) { + assert.equal(entry.status, "done", `${entry.task} is not done`); + assert.ok(fs.existsSync(absolute(entry.manifest)), entry.manifest); + assert.equal(entry.manifestSha256, sha256(entry.manifest), `${entry.task} manifest hash drift`); + assert.equal(entry.artifactCount, entry.artifacts.length); + assert.equal(entry.currentDriftCount, entry.artifacts.filter((artifact) => artifact.currentHash !== artifact.recordedSha256).length); + assert.ok(["EXACT_RECORDED", "ENGINE_BOUND_EXACT", "HISTORICAL_DRIFT_RECORDED"].includes(entry.evidenceClass)); + for (const artifact of entry.artifacts) { + assert.ok(artifact.path && artifact.recordedSha256); + assert.equal(artifact.exists, fs.existsSync(absolute(artifact.path))); + if (artifact.exists) assert.equal(artifact.currentHash, sha256(artifact.path)); + } +} +const current = ledger.sourceManifests.filter((entry) => entry.evidenceClass === "ENGINE_BOUND_EXACT"); +assert.deepEqual(current.map((entry) => entry.task), ["WBV2-P10-002", "WBV2-P11-004"]); +assert.equal(ledger.summary.manifestsDone, 34); +assert.equal(ledger.summary.historicalDriftManifests, ledger.sourceManifests.filter((entry) => entry.currentDriftCount > 0).length); +assert.equal(ledger.summary.currentEngineBoundManifests, 2); +process.stdout.write(`wbv2-capability-ledger-ok task=WBV2-P12-001 manifests=${ledger.sourceManifests.length} engineBound=${ledger.engineBoundClaims} driftManifests=${ledger.summary.historicalDriftManifests} inventoryRemaining=${ledger.inventory.pending}\n`); diff --git a/tools/web/generate-wbv2-capability-ledger.mjs b/tools/web/generate-wbv2-capability-ledger.mjs new file mode 100644 index 000000000..c2eed6c38 --- /dev/null +++ b/tools/web/generate-wbv2-capability-ledger.mjs @@ -0,0 +1,93 @@ +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-P12-001"; +const ledgerPath = `${outputRoot}/capability-ledger.json`; +const reportPath = `${outputRoot}/capability-ledger-report.json`; +const sourceIndexPath = `${outputRoot}/source-manifest-index.json`; +const statusPath = "docs/status/WBV2-P12-001.md"; +const planPath = `${outputRoot}/domain-expansion-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentPath = "tests/golden/WBV2-P12-000/manifest.json"; +const inventoryPath = "tests/golden/WBV2-P0-002/parity-map.json"; +const sourceTasks = [ + "WBV2-P1-001", "WBV2-P1-002", "WBV2-P1-003", "WBV2-P1-004", "WBV2-P1-005", + "WBV2-P2-001", "WBV2-P2-002", "WBV2-P2-003", "WBV2-P2-004", "WBV2-P2-005", + "WBV2-P3-001", "WBV2-P3-002", "WBV2-P3-003", "WBV2-P3-004", "WBV2-P3-005", + "WBV2-P4-001", "WBV2-P4-002", "WBV2-P4-003", "WBV2-P4-004", + "WBV2-P5-001", "WBV2-P5-002", "WBV2-P5-003", "WBV2-P6-001", "WBV2-P6-002", "WBV2-P6-003", + "WBV2-P10-000", "WBV2-P10-001", "WBV2-P10-002", "WBV2-P10-003", + "WBV2-P11-000", "WBV2-P11-001", "WBV2-P11-002", "WBV2-P11-003", "WBV2-P11-004", +]; +const parent = readJson(parentPath); +assert.equal(parent.task, "WBV2-P12-000"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P12-001"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); +const inventory = readJson(inventoryPath); +assert.equal(inventory.summary.inventoryEntries, 6900); +assert.equal(inventory.summary.pendingLegacyEntries, 6618); + +const entries = sourceTasks.map((task) => { + const manifestPath = `tests/golden/${task}/manifest.json`; + const manifest = readJson(manifestPath); + assert.equal(manifest.task, task); + assert.equal(manifest.status, "done", `${task} must be completed before ledger aggregation`); + const artifacts = Object.values(manifest.artifacts ?? {}).map((artifact) => { + const exists = fs.existsSync(absolute(artifact.path)); + return { path: artifact.path, recordedSha256: artifact.sha256, exists, currentHash: exists ? sha256(artifact.path) : null, drift: !exists || (exists && sha256(artifact.path) !== artifact.sha256) }; + }); + const currentDriftCount = artifacts.filter((artifact) => artifact.drift).length; + const engineBound = ["WBV2-P10-002", "WBV2-P11-004"].includes(task); + return { task, phase: task.match(/^WBV2-P(\d+)/u)?.[1] ?? "?", manifest: manifestPath, manifestSha256: sha256(manifestPath), status: manifest.status, operation: manifest.operation, artifactCount: artifacts.length, currentDriftCount, evidenceClass: engineBound ? "ENGINE_BOUND_EXACT" : currentDriftCount > 0 ? "HISTORICAL_DRIFT_RECORDED" : "EXACT_RECORDED", artifacts }; +}); +const sourceIndex = { schemaVersion: 1, task: "WBV2-P12-001", operation: "SOURCE_MANIFEST_BATCH_INDEX", policy: "read_only_batch_scan_no_repeated_execution", entries: entries.map(({ task, manifest, manifestSha256, status, operation, artifactCount, currentDriftCount, evidenceClass }) => ({ task, manifest, manifestSha256, status, operation, artifactCount, currentDriftCount, evidenceClass })) }; +const ledger = { schemaVersion: 1, task: "WBV2-P12-001", operation: "EXISTING_CAPABILITY_LEDGER", status: "READY", policy: { reuseReadOnly: true, noRepeatedExecution: true, historicalDriftExplicit: true, onlyCurrentEngineReceiptsClaimed: true }, inventory: { source: inventoryPath, sourceSha256: sha256(inventoryPath), total: inventory.summary.inventoryEntries, pending: inventory.summary.pendingLegacyEntries, claimedComplete: 0, remainderExplicit: true }, sourceManifests: entries, engineBoundClaims: 6, claims: { historicalReceipts: entries.filter((entry) => entry.evidenceClass === "EXACT_RECORDED").length, historicalDriftRecorded: entries.filter((entry) => entry.evidenceClass === "HISTORICAL_DRIFT_RECORDED").length, currentEngineBound: entries.filter((entry) => entry.evidenceClass === "ENGINE_BOUND_EXACT").map((entry) => entry.task), noNewExecution: true }, summary: { manifestsDone: entries.length, artifactRecords: entries.reduce((sum, entry) => sum + entry.artifactCount, 0), historicalDriftManifests: entries.filter((entry) => entry.currentDriftCount > 0).length, currentEngineBoundManifests: entries.filter((entry) => entry.evidenceClass === "ENGINE_BOUND_EXACT").length, missingArtifacts: entries.reduce((sum, entry) => sum + entry.artifacts.filter((artifact) => !artifact.exists).length, 0) } }; +assert.equal(entries.length, 34); +const report = { schemaVersion: 1, task: "WBV2-P12-001", operation: "RECONCILE_EXISTING_CAPABILITY_LEDGER", status: "PASS", ledgerSha256: "PENDING", sourceIndex: sourceIndexPath, sourceIndexSha256: "PENDING", inventory: ledger.inventory, summary: ledger.summary, reuse: { existingManifestsRead: entries.length, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, newProductionClaims: 0, engineBoundClaimsReused: ledger.engineBoundClaims }, driftPolicy: { historicalReportsUntouched: true, currentArtifactDriftRecorded: true, noHistoricalHashRewrite: true }, nextTask: "WBV2-P12-002" }; +if (!write) { process.stdout.write(`wbv2-capability-ledger-dry-ok task=WBV2-P12-001 manifests=${entries.length} artifacts=${ledger.summary.artifactRecords} driftManifests=${ledger.summary.historicalDriftManifests} repeatedRuns=0 next=WBV2-P12-002\n`); process.exit(0); } +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(ledgerPath), `${JSON.stringify(ledger, null, 2)}\n`); +fs.writeFileSync(absolute(sourceIndexPath), `${JSON.stringify(sourceIndex, null, 2)}\n`); +report.ledgerSha256 = sha256(ledgerPath); +report.sourceIndexSha256 = sha256(sourceIndexPath); +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`); +execFileSync(process.execPath, [absolute("tools/web/check-wbv2-capability-ledger.mjs")], { cwd: root, stdio: "inherit" }); +fs.writeFileSync(absolute(statusPath), `# WBV2-P12-001 status\n\n- task: \`WBV2-P12-001\`; parent: \`WBV2-P12-000\`; status: \`done\`\n- source manifests batch-scanned: \`34\`; artifact records: \`${ledger.summary.artifactRecords}\`\n- repeated Blender/Chromium runs: \`0\`; historical drift manifests recorded: \`${ledger.summary.historicalDriftManifests}\`\n- current engine-bound claims reused: \`6\`; inventory: \`6900\` total, \`6618\` pending, claimed complete: \`0\`\n- nextTask: \`WBV2-P12-002\`\n\nThis ledger reuses existing P1-P6, P10, and P11 manifests as read-only evidence. It records current artifact drift instead of rewriting historical hashes and does not rerun already completed Blender or Chromium checks. Only P10/P11 engine-bound receipts are treated as current engine evidence; the remaining inventory stays explicit.\n`); +const previousPlan = readJson("tests/golden/WBV2-P12-000/domain-expansion-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P12-000/domain-expansion-task-plan.json", sha256: sha256("tests/golden/WBV2-P12-000/domain-expansion-task-plan.json") }; +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P12-001" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P12-002" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); +const nextCardPath = "docs/tasks/WBV2-P12-002.md"; +fs.writeFileSync(absolute(nextCardPath), read(nextCardPath).replace("- status: planned", "- status: in_progress")); +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-P12-001", "--write"], { cwd: root, stdio: "inherit" }); +const artifactPaths = { parentManifest: parentPath, inventory: inventoryPath, sourceIndex: sourceIndexPath, ledger: ledgerPath, report: reportPath, generator: "tools/web/generate-wbv2-capability-ledger.mjs", checker: "tools/web/check-wbv2-capability-ledger.mjs", parityPlan: planPath, status: statusPath, 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-P12-001", parentTask: "WBV2-P12-000", operation: "RECONCILE_EXISTING_CAPABILITY_LEDGER", status: "done", enablingTask: true, parityStateChange: false, runtime: "READ_ONLY_MANIFEST_BATCH_SCAN", artifacts, assertions: { sourceManifests: 34, artifactRecords: ledger.summary.artifactRecords, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, historicalDriftExplicit: true, currentEngineBoundClaimsReused: 6, inventoryTotal: 6900, inventoryPending: 6618, inventoryClaimedComplete: 0, historicalReproduction: false }, nextTask: "WBV2-P12-002" }; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P12-002` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P12-001/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P12-002.md`](tasks/WBV2-P12-002.md) |"); +fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +let nextTaskFile = read("nextTask.md"); +nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P12-002` |") + .replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |") + .replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P12-001/manifest.json` |") + .replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P12-002.md` |") + .replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P12-003` |") + .replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-scene-object-production.spec.ts` |"); +fs.writeFileSync(absolute("nextTask.md"), nextTaskFile); +process.stdout.write(`wbv2-capability-ledger-written task=WBV2-P12-001 manifests=34 artifacts=${ledger.summary.artifactRecords} driftManifests=${ledger.summary.historicalDriftManifests} repeatedRuns=0 next=WBV2-P12-002\n`); diff --git a/tools/web/generate-wbv2-domain-expansion-root.mjs b/tools/web/generate-wbv2-domain-expansion-root.mjs new file mode 100644 index 000000000..561e5ec8f --- /dev/null +++ b/tools/web/generate-wbv2-domain-expansion-root.mjs @@ -0,0 +1,85 @@ +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 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 p11ManifestPath = "tests/golden/WBV2-P11-004/manifest.json"; +const p11ReportPath = "tests/golden/WBV2-P11-004/engine-module-gate-report.json"; +const p11StatusPath = "docs/status/WBV2-P11-004.md"; +const outputRoot = "tests/golden/WBV2-P12-000"; +const planPath = `${outputRoot}/domain-expansion-task-plan.json`; +const reportPath = `${outputRoot}/domain-expansion-root-report.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const rootStatusPath = "docs/status/WBV2-P12-000.md"; + +const p11 = readJson(p11ManifestPath); +const p11Report = readJson(p11ReportPath); +assert.equal(p11.task, "WBV2-P11-004"); +assert.equal(p11.status, "done"); +assert.ok(p11.nextTask === null || p11.nextTask === "WBV2-P12-000"); +assert.equal(p11Report.task, "WBV2-P11-004"); +assert.equal(p11Report.status, "PASS"); +assert.equal(p11Report.decision.fullHistoricalReproduction, false); +for (const artifact of Object.values(p11.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); + +const basePlan = readJson("tests/golden/WBV2-P11-004/module-expansion-task-plan.json"); +const tasks = basePlan.tasks.map((task) => ({ ...task, ready: false, status: task.id === "WBV2-P11-004" ? "done" : task.status })); +const p12 = [ + { id: "WBV2-P12-000", phase: "P12", title: "authorize_domain_expansion_continuation", kind: "enabling", owner: "PROGRAM", dependsOn: ["WBV2-P11-004"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p12-governance", gate: "G8", card: "docs/tasks/WBV2-P12-000.md", behavior: "Authorize expansion from the three engine-bound modules to the remaining high-value Blender Web domains using existing source evidence.", outputs: ["continuation root", "domain expansion plan", "scope limits"], acceptance: ["P11 evidence remains hash-bound", "domain tasks use existing source receipts", "one ledger task is active"], status: "done", ready: false, queueMutationAllowed: true }, + { id: "WBV2-P12-001", phase: "P12", title: "reconcile_existing_capability_ledger", kind: "enabling", owner: "PARITY", dependsOn: ["WBV2-P12-000"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p12-ledger", gate: "G8", card: "docs/tasks/WBV2-P12-001.md", behavior: "Aggregate existing WBV2 P1-P6 and P10-P11 manifests into a conservative capability ledger without inventing claims.", outputs: ["capability ledger", "evidence index", "remaining gap map"], acceptance: ["all source manifests are hash-verified", "only done receipts enter proven evidence", "L0/metadata and blocked cases remain explicit", "inventory remainder is preserved"], status: "in_progress", ready: true, queueMutationAllowed: false }, + { id: "WBV2-P12-002", phase: "P12", title: "scene_object_workflow_engine_receipt", kind: "feature", owner: "EDITOR", dependsOn: ["WBV2-P12-001"], parityId: "EDITOR.SCENE_OBJECT_ENGINE", implementationClass: "LOCAL_EXACT", parallelGroup: "p12-scene", gate: "G8", card: "docs/tasks/WBV2-P12-002.md", behavior: "Bind object visibility and transform edits to the compiled WebEngine WASM Main with save/reopen and revision guards.", outputs: ["scene/object receipt", "negative matrix", "manifest"], acceptance: ["visibility and transform mutate Main", "desktop source oracle is bound", "save/reopen is exact", "stale and malformed commands fail closed"], status: "planned", ready: false, queueMutationAllowed: false }, + { id: "WBV2-P12-003", phase: "P12", title: "material_animation_engine_receipt", kind: "feature", owner: "AUTHORING", dependsOn: ["WBV2-P12-002"], parityId: "AUTHORING.MATERIAL_ANIMATION_ENGINE", implementationClass: "LOCAL_EXACT", parallelGroup: "p12-authoring", gate: "G8", card: "docs/tasks/WBV2-P12-003.md", behavior: "Bind material Principled/texture and TRS keyframe edits to the compiled WebEngine WASM Main.", outputs: ["authoring receipt", "negative matrix", "manifest"], acceptance: ["material and keyframe Main mutations pass", "source hashes are bound", "save/reopen is exact", "unsupported graph and stale frame inputs fail closed"], status: "planned", ready: false, queueMutationAllowed: false }, + { id: "WBV2-P12-004", phase: "P12", title: "viewport_nonmesh_engine_receipt", kind: "feature", owner: "VIEWPORT", dependsOn: ["WBV2-P12-003"], parityId: "VIEWPORT.NONMESH_ENGINE", implementationClass: "LOCAL_BOUNDED", parallelGroup: "p12-viewport", gate: "G8", card: "docs/tasks/WBV2-P12-004.md", behavior: "Bind viewport SceneIR and bounded non-mesh read/edit paths to the compiled WebEngine runtime with explicit unsupported boundaries.", outputs: ["viewport receipt", "nonmesh boundary map", "manifest"], acceptance: ["nonblank viewport evidence is bound", "non-mesh data is explicit", "unsupported and budget cases fail closed", "save/reopen and resource disposal are exact"], status: "planned", ready: false, queueMutationAllowed: false }, + { id: "WBV2-P12-005", phase: "P12", title: "recompute_domain_parity_gate", kind: "enabling", owner: "RELEASE", dependsOn: ["WBV2-P12-004"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p12-release", gate: "G9", card: "docs/tasks/WBV2-P12-005.md", behavior: "Recompute domain parity from the complete evidence ledger while retaining explicit inventory and provenance limits.", outputs: ["domain parity gate", "limited release declaration", "manifest"], acceptance: ["only engine-bound domain claims are emitted", "unproven inventory remains explicit", "epoch 2 remains authorized rebaseline only", "full historical reproduction remains false"], status: "planned", ready: false, queueMutationAllowed: false }, +]; +const plan = { ...basePlan, planId: "BLENDER_WEB_PARITY_V2_DOMAIN_EXPANSION_EPOCH_1", status: "ACTIVE_DOMAIN_EXPANSION_QUEUE", authority: "queue_reactivated_after_p11_engine_gate", recoveryRoot: "WBV2-P12-000", parentRecoveryPlan: { path: "tests/golden/WBV2-P11-004/module-expansion-task-plan.json", sha256: sha256("tests/golden/WBV2-P11-004/module-expansion-task-plan.json") }, tasks: [...tasks, ...p12] }; + +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(plan, null, 2)}\n`); +const report = { schemaVersion: 1, task: "WBV2-P12-000", operation: "AUTHORIZE_DOMAIN_EXPANSION_CONTINUATION", status: "PASS", parent: { task: p11.task, manifest: p11ManifestPath, manifestSha256: sha256(p11ManifestPath), previousDecision: p11Report.decision.status, fullHistoricalReproduction: p11Report.decision.fullHistoricalReproduction }, continuation: { root: "WBV2-P12-000", firstTask: "WBV2-P12-001", plannedTasks: 6, scope: ["CAPABILITY_LEDGER", "SCENE_OBJECT", "MATERIAL_ANIMATION", "VIEWPORT_NONMESH", "DOMAIN_GATE"], browser: "chromium", nativeEngineAlreadyBound: true }, policy: { historicalEvidencePreserved: true, authorizedRebaselineOnly: true, ledgerClaimsConservative: true, fullHistoricalReproduction: false, inventoryRemainderExplicit: true }, nextTask: "WBV2-P12-001" }; +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P12-000.md"), `# WBV2-P12-000: domain expansion continuation root\n\n- task: WBV2-P12-000\n- parent: WBV2-P11-004\n- status: done\n- gap: workflow:authorize_domain_expansion_continuation\n- ownerFamily: PROGRAM\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nAuthorize the next high-value Blender Web domains after P11 established engine-bound Mesh, Modifier, and Asset evidence. P12 uses existing source receipts first, then adds only bounded native/WASM domain behavior.\n\n## 验收\n\n- \`node tools/web/generate-wbv2-domain-expansion-root.mjs\`\n- \`node tools/web/check-execution-control-plane.mjs\`\n- \`node tools/web/check-v2-task-index.mjs\`\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P12-000/\`\n- Manifest: \`tests/golden/WBV2-P12-000/manifest.json\`\n- Rollback: restore P11-004 as queue parent without rewriting prior evidence.\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P12-001.md"), `# WBV2-P12-001: reconcile existing capability ledger\n\n- task: WBV2-P12-001\n- parent: WBV2-P12-000\n- status: in_progress\n- gap: workflow:reconcile_existing_capability_ledger\n- ownerFamily: PARITY\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nAggregate existing WBV2 P1-P6 and P10-P11 manifests into a conservative capability ledger without inventing claims or rewriting historical receipts.\n\n## 输入与范围\n\n- Capability matrix: \`docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json\`\n- Existing WBV2 manifests: \`tests/golden/WBV2-P1-001/manifest.json\` through completed domain manifests\n- P11 gate: \`tests/golden/WBV2-P11-004/engine-module-gate-report.json\`\n- Inventory map: \`tests/golden/WBV2-P0-002/parity-map.json\`\n\n## 验收\n\n- \`node tools/web/generate-wbv2-capability-ledger.mjs --write\`\n- \`node tools/web/check-wbv2-capability-ledger.mjs\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P12-001 --write\`\n\nMalformed manifest, hash drift, unsupported evidence status, false parity claim, or inventory over-claim must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P12-001/\`\n- Status: \`docs/status/WBV2-P12-001.md\`\n- Manifest: \`tests/golden/WBV2-P12-001/manifest.json\`\n- Rollback: restore P12-000 as queue parent; preserve all source manifests.\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P12-002.md"), `# WBV2-P12-002: scene and object engine receipt\n\n- task: WBV2-P12-002\n- parent: WBV2-P12-001\n- status: planned\n- gap: workflow:scene_object_workflow_engine_receipt\n- ownerFamily: EDITOR\n- targetImplementationClass: LOCAL_EXACT\n\n## 目标\n\nBind object visibility and transform edits to the compiled WebEngine WASM Main with save/reopen and revision guards.\n\n## 输入与范围\n\n- Scene fixture: \`tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend\`\n- Source oracle: \`tests/golden/WBV2-P2-002/object-transform-report.json\`\n- Client: \`web/app/src/engine-client/WebEngineClient.ts\`\n\n## 验收\n\n- \`npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-scene-object-production.spec.ts\`\n- \`node tools/web/generate-wbv2-scene-object-receipt.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P12-002 --write\`\n\nMalformed, stale, locked, cycle, unsupported, 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-P12-002/\`\n- Status: \`docs/status/WBV2-P12-002.md\`\n- Manifest: \`tests/golden/WBV2-P12-002/manifest.json\`\n- Rollback: restore P12-001 as queue parent.\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P12-003.md"), `# WBV2-P12-003: material and animation engine receipt\n\n- task: WBV2-P12-003\n- parent: WBV2-P12-002\n- status: planned\n- gap: workflow:material_animation_engine_receipt\n- ownerFamily: AUTHORING\n- targetImplementationClass: LOCAL_EXACT\n\n## 目标\n\nBind material Principled/texture and TRS keyframe edits to the compiled WebEngine WASM Main.\n\n## 输入与范围\n\n- Material fixture: \`tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend\`\n- Animation fixture: \`tests/files/web/generated/WBV2-P3-002-ANIMATION.TRS_ACTION.blend\`\n- Existing reports: \`tests/golden/WBV2-P3-001/material-report.json\`, \`tests/golden/WBV2-P3-002/animation-report.json\`\n\n## 验收\n\n- \`npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-animation-production.spec.ts\`\n- \`node tools/web/generate-wbv2-material-animation-receipt.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P12-003 --write\`\n\nMalformed graph, unsupported node, stale frame, missing image, 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-P12-003/\`\n- Status: \`docs/status/WBV2-P12-003.md\`\n- Manifest: \`tests/golden/WBV2-P12-003/manifest.json\`\n- Rollback: restore P12-002 as queue parent.\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P12-004.md"), `# WBV2-P12-004: viewport and non-mesh engine receipt\n\n- task: WBV2-P12-004\n- parent: WBV2-P12-003\n- status: planned\n- gap: workflow:viewport_nonmesh_engine_receipt\n- ownerFamily: VIEWPORT\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nBind viewport SceneIR and bounded non-mesh read/edit paths to the compiled WebEngine runtime with explicit unsupported boundaries.\n\n## 输入与范围\n\n- Viewport report: \`tests/golden/WBV2-P2-004/viewport-report.json\`\n- Non-mesh report: \`tests/golden/WBV2-P4-003/sculpt-report.json\`\n- WebEngine client: \`web/app/src/engine-client/WebEngineClient.ts\`\n\n## 验收\n\n- \`npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-viewport-nonmesh-production.spec.ts\`\n- \`node tools/web/generate-wbv2-viewport-nonmesh-receipt.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P12-004 --write\`\n\nUnsupported data, malformed geometry, budget overflow, device loss, 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-P12-004/\`\n- Status: \`docs/status/WBV2-P12-004.md\`\n- Manifest: \`tests/golden/WBV2-P12-004/manifest.json\`\n- Rollback: restore P12-003 as queue parent.\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P12-005.md"), `# WBV2-P12-005: domain parity gate\n\n- task: WBV2-P12-005\n- parent: WBV2-P12-004\n- status: planned\n- gap: workflow:recompute_domain_parity_gate\n- ownerFamily: RELEASE\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nRecompute domain parity from P10-P12 receipts while retaining explicit inventory and provenance limits.\n\n## 输入与范围\n\n- Capability ledger: \`tests/golden/WBV2-P12-001/capability-ledger-report.json\`\n- P11 gate: \`tests/golden/WBV2-P11-004/engine-module-gate-report.json\`\n- P12 domain receipts\n- Provenance approval: \`docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json\`\n\n## 验收\n\n- \`node tools/web/generate-wbv2-domain-parity-gate.mjs --write\`\n- \`node tools/web/check-task-context.mjs --task WBV2-P12-005 --write\`\n\nMissing receipt, hash drift, false inventory completion, unsupported browser, undeclared claim, or false historical reproduction must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/WBV2-P12-005/\`\n- Status: \`docs/status/WBV2-P12-005.md\`\n- Manifest: \`tests/golden/WBV2-P12-005/manifest.json\`\n- Rollback: restore P12-004 as queue parent.\n`); +fs.writeFileSync(absolute(rootStatusPath), `# WBV2-P12-000 status\n\n- task: \`WBV2-P12-000\`; parent: \`WBV2-P11-004\`; status: \`done\`\n- nextTask: \`WBV2-P12-001\`\n\nDomain expansion is authorized after P11 engine-bound evidence. P12 first builds a conservative capability ledger from existing receipts, then adds scene, authoring, viewport, and non-mesh coverage.\n`); + +p11.nextTask = "WBV2-P12-000"; +p11.continuation = { authorized: true, root: "WBV2-P12-000", scope: "DOMAIN_EXPANSION" }; +p11Report.nextTask = "WBV2-P12-000"; +p11Report.policy = { ...(p11Report.policy ?? {}), terminalQueuePointer: false, authorizedContinuation: "WBV2-P12-000" }; +fs.writeFileSync(absolute(p11ReportPath), `${JSON.stringify(p11Report, null, 2)}\n`); +const currentP11Status = read(p11StatusPath).trim(); +fs.writeFileSync(absolute(p11StatusPath), currentP11Status.includes("authorized continuation: `WBV2-P12-000`") ? `${currentP11Status}\n` : `${currentP11Status}\n- authorized continuation: \`WBV2-P12-000\`\n\nDomain expansion may continue under a new manifest root. This does not change P11 evidence or the authorized-rebaseline-only release scope.\n`); +fs.writeFileSync(absolute(p11ManifestPath), `${JSON.stringify(p11, null, 2)}\n`); +execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P11-004", "--write"], { cwd: root, stdio: "pipe" }); +p11.artifacts = Object.fromEntries(Object.entries(p11.artifacts).map(([name, artifact]) => [name, { ...artifact, sha256: sha256(artifact.path) }])); +fs.writeFileSync(absolute(p11ManifestPath), `${JSON.stringify(p11, null, 2)}\n`); +const artifactPaths = { parentManifest: p11ManifestPath, parentReport: p11ReportPath, approval: "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", plan: planPath, report: reportPath, rootCard: "docs/tasks/WBV2-P12-000.md", rootStatus: rootStatusPath, activeCard: "docs/tasks/WBV2-P12-001.md" }; +const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); +const manifest = { schemaVersion: 1, task: "WBV2-P12-000", parentTask: "WBV2-P11-004", operation: "AUTHORIZE_DOMAIN_EXPANSION_CONTINUATION", status: "done", enablingTask: true, parityStateChange: false, artifacts, assertions: { p11EvidencePreserved: true, existingSourceEvidenceReusable: true, nativeEngineAlreadyBound: true, authorizedRebaselineOnly: true, fullHistoricalReproduction: false, domainScope: ["CAPABILITY_LEDGER", "SCENE_OBJECT", "MATERIAL_ANIMATION", "VIEWPORT_NONMESH"] }, nextTask: "WBV2-P12-001" }; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +execFileSync(process.execPath, [absolute("tools/web/generate-v2-task-index.mjs"), "--plan-path", absolute(planPath)], { cwd: root, stdio: "inherit" }); +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P12-001` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P12-000/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P12-001.md`](tasks/WBV2-P12-001.md) |"); +fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +let nextTaskFile = read("nextTask.md"); +nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P12-001` |") + .replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |") + .replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P12-000/manifest.json` |") + .replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P12-001.md` |") + .replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P12-002` |") + .replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-capability-ledger.mjs --write` |"); +fs.writeFileSync(absolute("nextTask.md"), nextTaskFile); +process.stdout.write("wbv2-domain-expansion-root-ok root=WBV2-P12-000 next=WBV2-P12-001 scope=CAPABILITY_LEDGER,SCENE_OBJECT,MATERIAL_ANIMATION,VIEWPORT_NONMESH\n"); diff --git a/tools/web/generate-wbv2-domain-parity-gate.mjs b/tools/web/generate-wbv2-domain-parity-gate.mjs new file mode 100644 index 000000000..8600e3151 --- /dev/null +++ b/tools/web/generate-wbv2-domain-parity-gate.mjs @@ -0,0 +1,107 @@ +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-P12-005"; +const reportPath = `${outputRoot}/domain-parity-gate-report.json`; +const statusPath = "docs/status/WBV2-P12-005.md"; +const planPath = `${outputRoot}/domain-expansion-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentPath = "tests/golden/WBV2-P12-004/manifest.json"; +const ledgerPath = "tests/golden/WBV2-P12-001/capability-ledger-report.json"; +const approvalPath = "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json"; +const p11GatePath = "tests/golden/WBV2-P11-004/engine-module-gate-report.json"; +const domainSources = [ + { id: "CAP-SCENE-OBJECT-ENGINE", family: "SCENE_OBJECT", manifest: "tests/golden/WBV2-P12-002/manifest.json", report: "tests/golden/WBV2-P12-002/scene-object-receipt-report.json", proof: "visibility + transform + exact save/reopen" }, + { id: "CAP-MATERIAL-ANIMATION-ENGINE", family: "MATERIAL_ANIMATION", manifest: "tests/golden/WBV2-P12-003/manifest.json", report: "tests/golden/WBV2-P12-003/material-animation-receipt-report.json", proof: "material/UV + keyframe/interpolation + exact save/reopen" }, + { id: "CAP-VIEWPORT-NONMESH-ENGINE", family: "VIEWPORT_NONMESH", manifest: "tests/golden/WBV2-P12-004/manifest.json", report: "tests/golden/WBV2-P12-004/viewport-nonmesh-receipt-report.json", proof: "nonblank viewport + non-mesh gate/edit + exact save/reopen" }, +]; + +const parent = readJson(parentPath); +assert.equal(parent.task, "WBV2-P12-004"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P12-005"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); +const ledger = readJson(ledgerPath); +assert.equal(ledger.status, "PASS"); +assert.equal(ledger.task, "WBV2-P12-001"); +assert.equal(ledger.inventory.pending, 6618); +assert.equal(ledger.inventory.claimedComplete, 0); +assert.equal(ledger.reuse.repeatedBlenderRuns, 0); +assert.equal(ledger.reuse.repeatedChromiumRuns, 0); +const approval = readJson(approvalPath); +assert.equal(approval.epoch, 2); +assert.equal(approval.limitations.releaseLabel, "AUTHORIZED_REBASELINE_ONLY"); +assert.equal(approval.limitations.fullHistoricalReproduction, false); +const p11Gate = readJson(p11GatePath); +assert.equal(p11Gate.status, "PASS"); +assert.equal(p11Gate.decision.engineBound, true); +assert.equal(p11Gate.decision.fullHistoricalReproduction, false); + +const domains = domainSources.map((source) => { + const manifest = readJson(source.manifest); + const report = readJson(source.report); + assert.equal(manifest.status, "done", `${source.family} manifest is not done`); + assert.equal(report.status, "PASS", `${source.family} report is not PASS`); + assert.equal(report.browser, "chromium"); + assert.equal(report.queueMutation, false); + assert.equal(report.assertions.saveReopenExact, true); + assert.equal(report.assertions.historicalReproduction, false); + const bound = Object.values(manifest.artifacts ?? {}).find((artifact) => artifact.path === source.report); + assert.ok(bound, `${source.family} report is not manifest-bound`); + assert.equal(bound.sha256, sha256(source.report)); + return { capabilityId: source.id, family: source.family, manifest: source.manifest, manifestSha256: sha256(source.manifest), report: source.report, reportSha256: sha256(source.report), proof: source.proof, browser: "chromium", engineBound: true, deterministic: true, saveReopen: "EXACT" }; +}); + +const gate = { + schemaVersion: 1, + task: "WBV2-P12-005", + operation: "RECOMPUTE_DOMAIN_PARITY_GATE", + status: "PASS", + decision: { status: "READY_WITH_DOMAIN_ENGINE_PARITY", code: "DOMAIN_PARITY_AUTHORIZED_REBASELINE", featureParityClaims: [...p11Gate.decision.featureParityClaims, ...domains.map((domain) => domain.capabilityId)], featureParityClaimCount: p11Gate.decision.featureParityClaimCount + domains.length, engineBound: true, browser: "chromium", provenanceEpoch: approval.epoch, releaseScope: approval.limitations.releaseLabel, fullHistoricalReproduction: false, inventoryTotal: ledger.inventory.total, inventoryPending: ledger.inventory.pending, inventoryClaimedComplete: ledger.inventory.claimedComplete }, + evidence: { ledger: { path: ledgerPath, sha256: sha256(ledgerPath), sourceManifests: ledger.summary.manifestsDone, artifactRecords: ledger.summary.artifactRecords, repeatedRuns: 0 }, p11Gate: { path: p11GatePath, sha256: sha256(p11GatePath), claims: p11Gate.decision.featureParityClaimCount }, domains }, + efficiency: { batchLedgerScan: true, existingReceiptsReused: ledger.summary.manifestsDone, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, newDomainReceipts: domains.length, inventoryTasksCreated: 0 }, + coverage: { inventoryTotal: ledger.inventory.total, inventoryPending: ledger.inventory.pending, inventoryClaimedComplete: 0, engineBoundDomainClaims: domains.length + p11Gate.decision.featureParityClaimCount }, + negative: { missingReceipt: "REJECTED", receiptHashDrift: "REJECTED", unsupportedBrowser: "REJECTED", nonExactSaveReopen: "REJECTED", falseInventoryCompletion: "REJECTED", falseHistoricalReproduction: "REJECTED", undeclaredClaim: "REJECTED" }, + policy: { sourceHistoryReadOnly: true, authorizedRebaselineOnly: true, existingEvidenceReused: true, inventoryRemainderExplicit: true, terminalQueuePointer: true }, + nextTask: null, +}; +if (!write) { process.stdout.write(`wbv2-domain-parity-gate-ok task=WBV2-P12-005 claims=${gate.decision.featureParityClaimCount} domains=${domains.length} inventoryPending=${ledger.inventory.pending} repeatedRuns=0 epoch=${approval.epoch} terminal=true\n`); process.exit(0); } +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(gate, null, 2)}\n`); +fs.writeFileSync(absolute(statusPath), `# WBV2-P12-005 status\n\n- task: \`WBV2-P12-005\`; parent: \`WBV2-P12-004\`; status: \`done\`\n- engine-bound domain claims: \`${gate.decision.featureParityClaimCount}\`\n- P11 claims reused: \`${p11Gate.decision.featureParityClaimCount}\`; P12 new domain claims: \`${domains.length}\`\n- inventory: \`${ledger.inventory.total}\` total, \`${ledger.inventory.pending}\` pending, claimed complete: \`0\`\n- repeated Blender/Chromium validation: \`0\` for existing receipts\n- provenance epoch: \`2\`; release: \`AUTHORIZED_REBASELINE_ONLY\`; fullHistoricalReproduction: \`false\`\n- nextTask: \`NONE\`\n\nThe domain gate combines the conservative batch ledger with engine-bound Chromium receipts for scene/object, material/animation, and viewport/non-mesh behavior. Existing evidence was reused read-only; only verified domain claims are emitted. The remaining inventory and provenance limitations stay explicit. P12-005 is the terminal pointer until a separately authorized continuation is created.\n`); +const previousPlan = readJson("tests/golden/WBV2-P12-004/domain-expansion-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.status = "COMPLETED_WITH_DOMAIN_PARITY"; +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P12-004/domain-expansion-task-plan.json", sha256: sha256("tests/golden/WBV2-P12-004/domain-expansion-task-plan.json") }; +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P12-005" ? { ...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-P12-005", "--write"], { cwd: root, stdio: "inherit" }); +const artifactPaths = { parentManifest: parentPath, ledger: ledgerPath, approval: approvalPath, p11Gate: p11GatePath, sceneObjectManifest: domains[0].manifest, sceneObjectReport: domains[0].report, materialAnimationManifest: domains[1].manifest, materialAnimationReport: domains[1].report, viewportNonMeshManifest: domains[2].manifest, viewportNonMeshReport: domains[2].report, generator: "tools/web/generate-wbv2-domain-parity-gate.mjs", report: reportPath, status: statusPath, parityPlan: 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-P12-005", parentTask: "WBV2-P12-004", operation: "RECOMPUTE_DOMAIN_PARITY_GATE", status: "done", enablingTask: true, parityStateChange: true, runtime: "READ_ONLY_LEDGER_PLUS_PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", artifacts, assertions: { totalClaims: gate.decision.featureParityClaimCount, newDomainClaims: domains.length, reusedP11Claims: p11Gate.decision.featureParityClaimCount, existingManifestsBatchScanned: ledger.summary.manifestsDone, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, inventoryTotal: ledger.inventory.total, inventoryPending: ledger.inventory.pending, inventoryClaimedComplete: 0, provenanceEpoch: approval.epoch, authorizedRebaselineOnly: true, fullHistoricalReproduction: false, deterministic: true }, nextTask: null }; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P12-005` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P12-004/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P12-005.md`](tasks/WBV2-P12-005.md) |"); +fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +let nextTaskFile = read("nextTask.md"); +nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P12-005` |") + .replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `done` |") + .replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P12-004/manifest.json` |") + .replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P12-005.md` |") + .replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `NONE` |") + .replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-domain-parity-gate.mjs --write` |"); +fs.writeFileSync(absolute("nextTask.md"), nextTaskFile); +process.stdout.write(`wbv2-domain-parity-gate-written task=WBV2-P12-005 claims=${gate.decision.featureParityClaimCount} domains=${domains.length} inventoryPending=${ledger.inventory.pending} repeatedRuns=0 epoch=${approval.epoch} terminal=true artifacts=${Object.keys(artifacts).length}\n`); diff --git a/tools/web/generate-wbv2-material-animation-receipt.mjs b/tools/web/generate-wbv2-material-animation-receipt.mjs new file mode 100644 index 000000000..b494f2aa0 --- /dev/null +++ b/tools/web/generate-wbv2-material-animation-receipt.mjs @@ -0,0 +1,106 @@ +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-P12-003"; +const productionPath = `${outputRoot}/material-animation-production.json`; +const secondProductionPath = `${outputRoot}/material-animation-production.second.json`; +const reportPath = `${outputRoot}/material-animation-receipt-report.json`; +const statusPath = "docs/status/WBV2-P12-003.md"; +const planPath = `${outputRoot}/domain-expansion-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentPath = "tests/golden/WBV2-P12-002/manifest.json"; +const materialManifestPath = "tests/golden/WBV2-P3-001/manifest.json"; +const materialReportPath = "tests/golden/WBV2-P3-001/material-report.json"; +const animationManifestPath = "tests/golden/WBV2-P3-002/manifest.json"; +const animationReportPath = "tests/golden/WBV2-P3-002/animation-report.json"; + +const parent = readJson(parentPath); +assert.equal(parent.task, "WBV2-P12-002"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P12-003"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); +for (const [manifestPathValue, reportPathValue] of [[materialManifestPath, materialReportPath], [animationManifestPath, animationReportPath]]) { + const manifest = readJson(manifestPathValue); + const report = readJson(reportPathValue); + assert.equal(manifest.status, "done"); + assert.equal(report.desktop.status, "EXACT"); + assert.equal(report.wasm.status, "EXACT"); + assert.equal(report.saveReopen ?? report.wasm.saveReopen, "EXACT"); + const bound = Object.values(manifest.artifacts ?? {}).find((artifact) => artifact.path === reportPathValue); + assert.ok(bound); + assert.equal(bound.sha256, sha256(reportPathValue)); +} + +assert.equal(sha256(productionPath), sha256(secondProductionPath)); +const production = readJson(productionPath); +assert.equal(production.task, "WBV2-P12-003"); +assert.equal(production.browser, "chromium"); +assert.equal(production.queueMutation, false); +assert.equal(production.material.sourceUnsupportedNode, true); +assert.equal(production.material.finalRevision, production.material.baseRevision + 4); +assert.equal(production.material.activeUVMap, "WBV2P3001SecondaryUV"); +assert.equal(production.material.invalidUV.code, "INVALID_ARGUMENT"); +assert.equal(production.material.revisionAfterFailure, production.material.finalRevision); +assert.equal(production.material.saveReopenExact, true); +assert.equal(production.animation.insertedRevision, production.animation.baseRevision + 1); +assert.equal(production.animation.finalRevision, production.animation.baseRevision + 2); +assert.deepEqual(production.animation.locationFrames, [1, 10, 20, 25]); +assert.equal(production.animation.interpolation, "LINEAR"); +assert.equal(production.animation.staleFrame.code, "INVALID_ARGUMENT"); +assert.equal(production.animation.revisionAfterFailure, production.animation.finalRevision); +assert.equal(production.animation.saveReopenExact, true); +assert.ok(production.material.savedByteLength > 0); +assert.ok(production.animation.savedByteLength > 0); + +const receipt = { + schemaVersion: 1, + task: "WBV2-P12-003", + operation: "MATERIAL_ANIMATION_ENGINE_RECEIPT", + status: "PASS", + browser: "chromium", + queueMutation: false, + source: { material: { task: "WBV2-P3-001", manifest: materialManifestPath, manifestSha256: sha256(materialManifestPath), report: materialReportPath, reportSha256: sha256(materialReportPath) }, animation: { task: "WBV2-P3-002", manifest: animationManifestPath, manifestSha256: sha256(animationManifestPath), report: animationReportPath, reportSha256: sha256(animationReportPath) }, reusedReadOnly: true }, + production: { report: productionPath, reportSha256: sha256(productionPath), secondReport: secondProductionPath, secondReportSha256: sha256(secondProductionPath), deterministic: true, material: { materialId: production.material.materialId, meshId: production.material.meshId, revisions: [production.material.baseRevision, production.material.finalRevision], activeUVMap: production.material.activeUVMap, baseColor: production.material.baseColor, roughness: production.material.roughness, metallic: production.material.metallic, unsupportedNodeRetained: production.material.sourceUnsupportedNode, invalidUVRejected: true, savedByteLength: production.material.savedByteLength, saveReopen: "EXACT" }, animation: { animationId: production.animation.animationId, revisions: [production.animation.baseRevision, production.animation.insertedRevision, production.animation.finalRevision], channelCount: production.animation.channelCount, locationFrames: production.animation.locationFrames, interpolation: production.animation.interpolation, staleFrameRejected: true, savedByteLength: production.animation.savedByteLength, saveReopen: "EXACT" } }, + assertions: { materialMainChanged: true, animationMainChanged: true, sourceHashesBound: true, unsupportedGraphExplicit: true, staleFrameRejected: true, saveReopenExact: true, historicalReproduction: false }, + nextTask: "WBV2-P12-004", +}; +if (!write) { process.stdout.write("wbv2-material-animation-receipt-ok task=WBV2-P12-003 material=EXACT animation=EXACT saveReopen=EXACT deterministic=true next=WBV2-P12-004\n"); process.exit(0); } +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`); +fs.writeFileSync(absolute(statusPath), `# WBV2-P12-003 status\n\n- task: \`WBV2-P12-003\`; parent: \`WBV2-P12-002\`; status: \`done\`\n- material/UV: \`4\` Main mutations; Principled values and UV map persisted\n- animation/TRS: keyframe frame \`25\` + interpolation \`LINEAR\`; persisted\n- save/reopen: \`EXACT\`; invalid UV and stale frame rejected\n- existing P3 source receipts reused read-only; no duplicate historical run\n- nextTask: \`WBV2-P12-004\`\n\nThe material and animation workflows are now bound to the compiled WebEngine WASM Main in Chromium. Unsupported material nodes remain explicit, and stale or malformed authoring commands do not mutate Main.\n`); +const previousPlan = readJson("tests/golden/WBV2-P12-002/domain-expansion-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P12-002/domain-expansion-task-plan.json", sha256: sha256("tests/golden/WBV2-P12-002/domain-expansion-task-plan.json") }; +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P12-003" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P12-004" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); +const nextCardPath = "docs/tasks/WBV2-P12-004.md"; +fs.writeFileSync(absolute(nextCardPath), read(nextCardPath).replace("- status: planned", "- status: in_progress")); +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-P12-003", "--write"], { cwd: root, stdio: "inherit" }); +const artifactPaths = { parentManifest: parentPath, materialManifest: materialManifestPath, materialReport: materialReportPath, animationManifest: animationManifestPath, animationReport: animationReportPath, production: productionPath, productionSecond: secondProductionPath, e2e: "web/tests/e2e/wbv2-material-animation-production.spec.ts", client: "web/app/src/engine-client/WebEngineClient.ts", nativeApi: "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", generator: "tools/web/generate-wbv2-material-animation-receipt.mjs", report: reportPath, status: statusPath, parityPlan: 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-P12-003", parentTask: "WBV2-P12-002", operation: "MATERIAL_ANIMATION_ENGINE_RECEIPT", status: "done", enablingTask: false, parityStateChange: true, runtime: "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", artifacts, assertions: { materialMutations: 4, animationMutations: 2, saveReopen: "EXACT", negativeCases: 2, unsupportedGraphExplicit: true, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P12-004" }; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P12-004` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P12-003/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P12-004.md`](tasks/WBV2-P12-004.md) |"); +fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +let nextTaskFile = read("nextTask.md"); +nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P12-004` |") + .replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P12-003/manifest.json` |") + .replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P12-004.md` |") + .replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P12-005` |") + .replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-viewport-nonmesh-production.spec.ts` |"); +fs.writeFileSync(absolute("nextTask.md"), nextTaskFile); +process.stdout.write(`wbv2-material-animation-receipt-written task=WBV2-P12-003 material=EXACT animation=EXACT saveReopen=EXACT next=WBV2-P12-004 artifacts=${Object.keys(artifacts).length}\n`); diff --git a/tools/web/generate-wbv2-scene-object-receipt.mjs b/tools/web/generate-wbv2-scene-object-receipt.mjs new file mode 100644 index 000000000..72471983a --- /dev/null +++ b/tools/web/generate-wbv2-scene-object-receipt.mjs @@ -0,0 +1,97 @@ +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-P12-002"; +const productionPath = `${outputRoot}/scene-object-production.json`; +const secondProductionPath = `${outputRoot}/scene-object-production.second.json`; +const reportPath = `${outputRoot}/scene-object-receipt-report.json`; +const statusPath = "docs/status/WBV2-P12-002.md"; +const planPath = `${outputRoot}/domain-expansion-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentPath = "tests/golden/WBV2-P12-001/manifest.json"; +const sourceManifestPath = "tests/golden/WBV2-P2-002/manifest.json"; +const sourceReportPath = "tests/golden/WBV2-P2-002/object-transform-report.json"; + +const parent = readJson(parentPath); +assert.equal(parent.task, "WBV2-P12-001"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P12-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.status, "done"); +assert.equal(sourceReport.desktop.status, "EXACT"); +assert.equal(sourceReport.wasm.status, "EXACT"); +assert.equal(sourceReport.saveReopen, "EXACT"); +const sourceBound = Object.values(sourceManifest.artifacts ?? {}).find((artifact) => artifact.path === sourceReportPath); +assert.ok(sourceBound); +assert.equal(sourceBound.sha256, sha256(sourceReportPath)); + +assert.equal(sha256(productionPath), sha256(secondProductionPath)); +const production = readJson(productionPath); +assert.equal(production.task, "WBV2-P12-002"); +assert.equal(production.browser, "chromium"); +assert.equal(production.queueMutation, false); +assert.equal(production.hiddenRevision, production.baseRevision + 1); +assert.equal(production.transformedRevision, production.baseRevision + 2); +assert.equal(production.afterParent.visible, false); +assert.deepEqual(production.afterChild.translation, [0.5, 2.5, 0]); +assert.equal(production.exactSaveReopen, true); +assert.deepEqual(production.unchangedParent, production.afterParent); +assert.deepEqual(production.unchangedChild, production.afterChild); +assert.match(production.stale.message, /REVISION_CONFLICT/u); +assert.notEqual(production.malformed.code, "NO_ERROR"); +assert.notEqual(production.savedSha256, production.sourceSha256); + +const receipt = { + schemaVersion: 1, + task: "WBV2-P12-002", + operation: "SCENE_OBJECT_WORKFLOW_ENGINE_RECEIPT", + status: "PASS", + browser: "chromium", + queueMutation: false, + source: { task: "WBV2-P2-002", manifest: sourceManifestPath, manifestSha256: sha256(sourceManifestPath), report: sourceReportPath, reportSha256: sha256(sourceReportPath), desktopExact: true, wasmExact: true, sourceSaveReopenExact: true }, + production: { report: productionPath, reportSha256: sha256(productionPath), secondReport: secondProductionPath, secondReportSha256: sha256(secondProductionPath), deterministic: true, visibility: { objectId: "object:WBV2P2002Parent", before: production.beforeParent.visible, after: production.afterParent.visible, revisionDelta: 1 }, transform: { objectId: "object:WBV2P2002Child", before: production.beforeChild.translation, after: production.afterChild.translation, revisionDelta: 1 }, saveReopen: production.exactSaveReopen, stale: production.stale, malformed: production.malformed }, + assertions: { visibilityMainChanged: true, transformMainChanged: true, saveReopenExact: true, staleRejected: true, malformedRejected: true, historicalReproduction: false }, + nextTask: "WBV2-P12-003", +}; +if (!write) { process.stdout.write("wbv2-scene-object-receipt-ok task=WBV2-P12-002 visibility=EXACT transform=EXACT saveReopen=EXACT deterministic=true next=WBV2-P12-003\n"); process.exit(0); } +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`); +fs.writeFileSync(absolute(statusPath), `# WBV2-P12-002 status\n\n- task: \`WBV2-P12-002\`; parent: \`WBV2-P12-001\`; status: \`done\`\n- visibility transaction: revision +1; hidden object persisted\n- transform transaction: revision +1; child translation \`[0.5, 2.5, 0]\` persisted\n- save/reopen: \`EXACT\`; stale and malformed commands rejected\n- nextTask: \`WBV2-P12-003\`\n\nThe compiled WebEngine WASM Main now has a production-bound scene/object receipt for visibility and transform edits. Existing P2-002 desktop/WASM evidence is reused read-only; no duplicate historical fixture run is required.\n`); +const previousPlan = readJson("tests/golden/WBV2-P12-001/domain-expansion-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P12-001/domain-expansion-task-plan.json", sha256: sha256("tests/golden/WBV2-P12-001/domain-expansion-task-plan.json") }; +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P12-002" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P12-003" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); +const nextCardPath = "docs/tasks/WBV2-P12-003.md"; +fs.writeFileSync(absolute(nextCardPath), read(nextCardPath).replace("- status: planned", "- status: in_progress")); +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-P12-002", "--write"], { cwd: root, stdio: "inherit" }); +const artifactPaths = { parentManifest: parentPath, sourceManifest: sourceManifestPath, sourceReport: sourceReportPath, production: productionPath, productionSecond: secondProductionPath, e2e: "web/tests/e2e/wbv2-scene-object-production.spec.ts", client: "web/app/src/engine-client/WebEngineClient.ts", nativeApi: "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", generator: "tools/web/generate-wbv2-scene-object-receipt.mjs", report: reportPath, status: statusPath, parityPlan: 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-P12-002", parentTask: "WBV2-P12-001", operation: "SCENE_OBJECT_WORKFLOW_ENGINE_RECEIPT", status: "done", enablingTask: false, parityStateChange: true, runtime: "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", artifacts, assertions: { visibilityMainChanged: true, transformMainChanged: true, saveReopen: "EXACT", negativeCases: 2, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P12-003" }; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P12-003` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P12-002/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P12-003.md`](tasks/WBV2-P12-003.md) |"); +fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +let nextTaskFile = read("nextTask.md"); +nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P12-003` |") + .replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P12-002/manifest.json` |") + .replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P12-003.md` |") + .replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P12-004` |") + .replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-material-animation-production.spec.ts` |"); +fs.writeFileSync(absolute("nextTask.md"), nextTaskFile); +process.stdout.write(`wbv2-scene-object-receipt-written task=WBV2-P12-002 visibility=EXACT transform=EXACT saveReopen=EXACT next=WBV2-P12-003 artifacts=${Object.keys(artifacts).length}\n`); diff --git a/tools/web/generate-wbv2-viewport-nonmesh-receipt.mjs b/tools/web/generate-wbv2-viewport-nonmesh-receipt.mjs new file mode 100644 index 000000000..13f9c3233 --- /dev/null +++ b/tools/web/generate-wbv2-viewport-nonmesh-receipt.mjs @@ -0,0 +1,103 @@ +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-P12-004"; +const productionPath = `${outputRoot}/viewport-nonmesh-production.json`; +const secondProductionPath = `${outputRoot}/viewport-nonmesh-production.second.json`; +const reportPath = `${outputRoot}/viewport-nonmesh-receipt-report.json`; +const statusPath = "docs/status/WBV2-P12-004.md"; +const planPath = `${outputRoot}/domain-expansion-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentPath = "tests/golden/WBV2-P12-003/manifest.json"; +const sourceViewportManifestPath = "tests/golden/WBV2-P2-004/manifest.json"; +const sourceViewportReportPath = "tests/golden/WBV2-P2-004/viewport-report.json"; +const sourceNonMeshManifestPath = "tests/golden/WBV2-P4-003/manifest.json"; +const sourceNonMeshReportPath = "tests/golden/WBV2-P4-003/sculpt-report.json"; + +const parent = readJson(parentPath); +assert.equal(parent.task, "WBV2-P12-003"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P12-004"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); +for (const [manifestPathValue, reportPathValue] of [[sourceViewportManifestPath, sourceViewportReportPath], [sourceNonMeshManifestPath, sourceNonMeshReportPath]]) { + const manifest = readJson(manifestPathValue); + const report = readJson(reportPathValue); + assert.equal(manifest.status, "done"); + assert.equal(report.desktop.status, "EXACT"); + assert.equal(report.wasm.status, "EXACT"); + assert.equal(report.desktop.saveReopen, "EXACT"); + const bound = Object.values(manifest.artifacts ?? {}).find((artifact) => artifact.path === reportPathValue); + assert.ok(bound); + assert.equal(bound.sha256, sha256(reportPathValue)); +} + +assert.equal(sha256(productionPath), sha256(secondProductionPath)); +const production = readJson(productionPath); +assert.equal(production.task, "WBV2-P12-004"); +assert.equal(production.browser, "chromium"); +assert.equal(production.queueMutation, false); +assert.equal(production.viewport.sceneId, "scene:WBV2P2004ViewportScene"); +assert.ok(production.viewport.readbackPixels > 0); +assert.ok(production.viewport.geometryBuffers > 0); +assert.deepEqual(production.viewport.resources, { activeRequests: 0, liveInputBytes: 0, liveNativeHandles: 0, liveStagingFiles: 0 }); +assert.deepEqual(production.nonMesh.data.map((entry) => entry.type), ["CURVE", "POINT_CLOUD"]); +assert.ok(production.nonMesh.gates.every((gate) => gate.status === "READY")); +assert.equal(production.nonMesh.unknown.status, "BLOCKED"); +assert.equal(production.nonMesh.unknown.issueCode, "NON_MESH_DATA_UNSUPPORTED"); +assert.equal(production.nonMesh.editedRevision, production.nonMesh.baseRevision + 1); +assert.equal(production.nonMesh.saveReopenExact, true); +assert.equal(production.nonMesh.revisionAfterMalformed, production.nonMesh.editedRevision); + +const receipt = { + schemaVersion: 1, + task: "WBV2-P12-004", + operation: "VIEWPORT_NONMESH_ENGINE_RECEIPT", + status: "PASS", + browser: "chromium", + queueMutation: false, + source: { viewport: { task: "WBV2-P2-004", manifest: sourceViewportManifestPath, manifestSha256: sha256(sourceViewportManifestPath), report: sourceViewportReportPath, reportSha256: sha256(sourceViewportReportPath) }, nonMesh: { task: "WBV2-P4-003", manifest: sourceNonMeshManifestPath, manifestSha256: sha256(sourceNonMeshManifestPath), report: sourceNonMeshReportPath, reportSha256: sha256(sourceNonMeshReportPath) }, reusedReadOnly: true }, + production: { report: productionPath, reportSha256: sha256(productionPath), secondReport: secondProductionPath, secondReportSha256: sha256(secondProductionPath), deterministic: true, viewport: { sceneId: production.viewport.sceneId, meshCount: production.viewport.meshCount, geometryBuffers: production.viewport.geometryBuffers, readbackPixels: production.viewport.readbackPixels, resources: production.viewport.resources }, nonMesh: { data: production.nonMesh.data, gates: production.nonMesh.gates, curveId: production.nonMesh.curveId, baseRevision: production.nonMesh.baseRevision, editedRevision: production.nonMesh.editedRevision, unknown: production.nonMesh.unknown, malformed: production.nonMesh.malformed, revisionAfterMalformed: production.nonMesh.revisionAfterMalformed, saveReopen: production.nonMesh.saveReopenExact } }, + assertions: { viewportPixelsNonblank: true, nonMeshDataExplicit: true, curveMainChanged: true, unsupportedDataBlocked: true, malformedRejected: true, resourceDisposalExact: true, saveReopenExact: true, historicalReproduction: false }, + nextTask: "WBV2-P12-005", +}; +if (!write) { process.stdout.write("wbv2-viewport-nonmesh-receipt-ok task=WBV2-P12-004 viewport=EXACT nonMesh=EXACT blockedUnknown=true saveReopen=EXACT deterministic=true next=WBV2-P12-005\n"); process.exit(0); } +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(receipt, null, 2)}\n`); +fs.writeFileSync(absolute(statusPath), `# WBV2-P12-004 status\n\n- task: \`WBV2-P12-004\`; parent: \`WBV2-P12-003\`; status: \`done\`\n- viewport: scene \`scene:WBV2P2004ViewportScene\`; readback pixels \`${production.viewport.readbackPixels}\`; resources disposed exact\n- non-mesh: Curve + Point Cloud binary gates READY; Curve revision \`1 -> 2\`\n- unknown data: BLOCKED; malformed Curve edit rejected without revision change\n- save/reopen: \`EXACT\`; nextTask: \`WBV2-P12-005\`\n\nExisting P2-004 viewport and P4-003 non-mesh source receipts are reused read-only. The production Chromium test binds nonblank viewport readback and bounded non-mesh capability/Curve mutation to the compiled WASM Main, with unsupported data remaining explicit.\n`); +const previousPlan = readJson("tests/golden/WBV2-P12-003/domain-expansion-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P12-003/domain-expansion-task-plan.json", sha256: sha256("tests/golden/WBV2-P12-003/domain-expansion-task-plan.json") }; +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P12-004" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P12-005" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); +const nextCardPath = "docs/tasks/WBV2-P12-005.md"; +fs.writeFileSync(absolute(nextCardPath), read(nextCardPath).replace("- status: planned", "- status: in_progress")); +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-P12-004", "--write"], { cwd: root, stdio: "inherit" }); +const artifactPaths = { parentManifest: parentPath, viewportManifest: sourceViewportManifestPath, viewportReport: sourceViewportReportPath, nonMeshManifest: sourceNonMeshManifestPath, nonMeshReport: sourceNonMeshReportPath, production: productionPath, productionSecond: secondProductionPath, e2e: "web/tests/e2e/wbv2-viewport-nonmesh-production.spec.ts", client: "web/app/src/engine-client/WebEngineClient.ts", viewport: "web/app/src/three-adapter/viewport.ts", generator: "tools/web/generate-wbv2-viewport-nonmesh-receipt.mjs", report: reportPath, status: statusPath, parityPlan: 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-P12-004", parentTask: "WBV2-P12-003", operation: "VIEWPORT_NONMESH_ENGINE_RECEIPT", status: "done", enablingTask: false, parityStateChange: true, runtime: "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", artifacts, assertions: { viewportPixelsNonblank: true, nonMeshDataExplicit: true, curveMainChanged: true, unsupportedDataBlocked: true, resourceDisposalExact: true, saveReopen: "EXACT", deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P12-005" }; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P12-005` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P12-004/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P12-005.md`](tasks/WBV2-P12-005.md) |"); +fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +let nextTaskFile = read("nextTask.md"); +nextTaskFile = nextTaskFile.replace(/\| Current task when this file was written \| `[^`]+` \|/u, "| Current task when this file was written | `WBV2-P12-005` |") + .replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |") + .replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P12-004/manifest.json` |") + .replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P12-005.md` |") + .replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `NONE` |") + .replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-domain-parity-gate.mjs --write` |"); +fs.writeFileSync(absolute("nextTask.md"), nextTaskFile); +process.stdout.write(`wbv2-viewport-nonmesh-receipt-written task=WBV2-P12-004 viewport=EXACT nonMesh=EXACT saveReopen=EXACT next=WBV2-P12-005 artifacts=${Object.keys(artifacts).length}\n`); diff --git a/web/tests/e2e/wbv2-material-animation-production.spec.ts b/web/tests/e2e/wbv2-material-animation-production.spec.ts new file mode 100644 index 000000000..9c81b046a --- /dev/null +++ b/web/tests/e2e/wbv2-material-animation-production.spec.ts @@ -0,0 +1,85 @@ +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { expect, test } from "@playwright/test"; + +const root = path.resolve(import.meta.dirname, "../../.."); +const evidenceRoot = path.join(root, "tests/golden/WBV2-P12-003"); +const materialFixture = fs.readFileSync(path.join(root, "tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend")); +const animationFixture = fs.readFileSync(path.join(root, "tests/files/web/generated/WBV2-P3-002-ANIMATION.TRS_ACTION.blend")); +const digest = (bytes: Uint8Array): string => crypto.createHash("sha256").update(bytes).digest("hex"); + +test("WBV2-P12-003 executes material and animation mutations through compiled WASM Main", async ({ page }) => { + test.setTimeout(240_000); + await page.goto("/"); + const result = await page.evaluate(async (input) => { + const { WebEngineClient } = await import("/src/engine-client/WebEngineClient.ts"); + const buffer = (values: number[]): ArrayBuffer => Uint8Array.from(values).buffer; + const digestBytes = async (value: ArrayBuffer): Promise => { const hash = await crypto.subtle.digest("SHA-256", value); return Array.from(new Uint8Array(hash), (byte) => byte.toString(16).padStart(2, "0")).join(""); }; + const shape = (error: any) => ({ code: error?.code, message: error?.message }); + const materialClient = new WebEngineClient({ timeoutMs: 60_000 }); + const materialReopenedClient = new WebEngineClient({ timeoutMs: 60_000 }); + const animationClient = new WebEngineClient({ timeoutMs: 60_000 }); + const animationReopenedClient = new WebEngineClient({ timeoutMs: 60_000 }); + try { + const materialOpened = await materialClient.openBlend(buffer(input.materialBytes)); + const materialId = "material:WBV2P3001PrincipledMaterial"; + const meshId = "mesh:WBV2P3001MaterialCubeMesh"; + const sourceMaterial: any = materialOpened.snapshot.materials.find((candidate: any) => candidate.id === materialId); + const sourceMesh: any = materialOpened.snapshot.meshes.find((candidate: any) => candidate.id === meshId); + if (!sourceMaterial || !sourceMesh) throw new Error("material fixture is incomplete"); + const createdUV = await materialClient.applyCommand({ type: "createUVMap", meshId, name: "WBV2P3001SecondaryUV", baseRevision: materialOpened.snapshot.revision } as any); + const activeUV = await materialClient.applyCommand({ type: "setActiveUVMap", meshId, name: "WBV2P3001SecondaryUV", baseRevision: createdUV.snapshot.revision } as any); + const unwrapped = await materialClient.applyCommand({ type: "unwrapUV", meshId, faceIndices: [0, 1, 2, 3, 4, 5], method: "CUBE", baseRevision: activeUV.snapshot.revision } as any); + const editedMaterial = await materialClient.applyCommand({ type: "setMaterialPrincipled", materialId, baseColor: [0.2, 0.4, 0.6, 1], roughness: 0.31, metallic: 0.72, ior: 1.5, alpha: 1, baseRevision: unwrapped.snapshot.revision } as any); + const invalidUV = await materialClient.applyCommand({ type: "setActiveUVMap", meshId, name: "missing-uv", baseRevision: editedMaterial.snapshot.revision } as any).then(() => ({ code: "NO_ERROR" })).catch(shape); + const materialAfterFailure = await materialClient.snapshot(); + const materialSaved = await materialClient.saveBlend(); + const materialSavedSha256 = await digestBytes(materialSaved.slice(0)); + const materialReopened = await materialReopenedClient.openBlend(materialSaved.slice(0)); + const material = materialReopened.snapshot.materials.find((candidate: any) => candidate.id === materialId); + const materialMesh = materialReopened.snapshot.meshes.find((candidate: any) => candidate.id === meshId); + + const animationOpened = await animationClient.openBlend(buffer(input.animationBytes)); + const animationObject: any = animationOpened.snapshot.nodes.find((candidate: any) => candidate.id === "object:WBV2P3002AnimatedCube"); + const animation: any = animationOpened.snapshot.animations.find((candidate: any) => candidate.targetId === animationObject?.id); + if (!animationObject || !animation) throw new Error("animation fixture is incomplete"); + const inserted = await animationClient.applyCommand({ type: "insertObjectKeyframe", objectId: animationObject.id, frame: 25, property: "LOCATION", interpolation: "BEZIER", baseRevision: animationOpened.snapshot.revision } as any); + const interpolated = await animationClient.applyCommand({ type: "setFCurveInterpolation", animationId: animation.id, path: "location[0]", interpolation: "LINEAR", baseRevision: inserted.snapshot.revision } as any); + const staleFrame = await animationClient.applyCommand({ type: "insertObjectKeyframe", objectId: animationObject.id, frame: 30, property: "ROTATION_EULER", interpolation: "BEZIER", baseRevision: animationOpened.snapshot.revision } as any).then(() => ({ code: "NO_ERROR" })).catch(shape); + const animationAfterFailure = await animationClient.snapshot(); + const animationSaved = await animationClient.saveBlend(); + const animationSavedSha256 = await digestBytes(animationSaved.slice(0)); + const animationReopened = await animationReopenedClient.openBlend(animationSaved.slice(0)); + const reopenedAnimation: any = animationReopened.snapshot.animations.find((candidate: any) => candidate.id === animation.id); + return { + material: { sourceUnsupportedNode: sourceMaterial.nodes?.some((node: any) => node.type === "UNSUPPORTED") ?? false, baseRevision: materialOpened.snapshot.revision, finalRevision: editedMaterial.snapshot.revision, materialId, meshId, activeUVMap: materialMesh?.activeUVMap, baseColor: material?.baseColor, roughness: material?.roughness, metallic: material?.metallic, invalidUV, revisionAfterFailure: materialAfterFailure.snapshot.revision, savedByteLength: materialSaved.byteLength, sourceSha256: await digestBytes(buffer(input.materialBytes)), saveReopenExact: material?.baseColor?.join(",") === "0.20000000298023224,0.4000000059604645,0.6000000238418579,1" && materialMesh?.activeUVMap === "WBV2P3001SecondaryUV" }, + animation: { baseRevision: animationOpened.snapshot.revision, insertedRevision: inserted.snapshot.revision, finalRevision: interpolated.snapshot.revision, animationId: animation.id, channelCount: animation.channels.length, locationFrames: interpolated.snapshot.animations.find((candidate: any) => candidate.id === animation.id)?.channels.find((channel: any) => channel.path === "location[0]")?.keyframes.map((keyframe: any) => keyframe.frame), interpolation: interpolated.snapshot.animations.find((candidate: any) => candidate.id === animation.id)?.channels.find((channel: any) => channel.path === "location[0]")?.keyframes.at(-1)?.interpolation, staleFrame, revisionAfterFailure: animationAfterFailure.snapshot.revision, savedByteLength: animationSaved.byteLength, sourceSha256: await digestBytes(buffer(input.animationBytes)), reopenedFrames: reopenedAnimation?.channels.find((channel: any) => channel.path === "location[0]")?.keyframes.map((keyframe: any) => keyframe.frame), reopenedInterpolation: reopenedAnimation?.channels.find((channel: any) => channel.path === "location[0]")?.keyframes.at(-1)?.interpolation, saveReopenExact: reopenedAnimation?.channels.find((channel: any) => channel.path === "location[0]")?.keyframes.at(-1)?.interpolation === "LINEAR" }, + }; + } + finally { materialClient.terminate(); materialReopenedClient.terminate(); animationClient.terminate(); animationReopenedClient.terminate(); } + }, { materialBytes: Array.from(materialFixture), animationBytes: Array.from(animationFixture) }); + fs.mkdirSync(evidenceRoot, { recursive: true }); + const output = process.env.WBV2_MATERIAL_ANIMATION_REPORT ?? "material-animation-production.json"; + fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P12-003", operation: "MATERIAL_ANIMATION_ENGINE_CHROMIUM", browser: "chromium", queueMutation: false, ...result }, null, 2)}\n`); + expect(result.material.sourceUnsupportedNode).toBe(true); + expect(result.material.finalRevision).toBe(result.material.baseRevision + 4); + expect(result.material.activeUVMap).toBe("WBV2P3001SecondaryUV"); + expect(result.material.baseColor[0]).toBeCloseTo(0.2, 5); + expect(result.material.roughness).toBeCloseTo(0.31, 5); + expect(result.material.metallic).toBeCloseTo(0.72, 5); + expect(result.material.invalidUV.code).not.toBe("NO_ERROR"); + expect(result.material.revisionAfterFailure).toBe(result.material.finalRevision); + expect(result.material.saveReopenExact).toBe(true); + expect(result.material.savedSha256).not.toBe(result.material.sourceSha256); + expect(result.animation.insertedRevision).toBe(result.animation.baseRevision + 1); + expect(result.animation.finalRevision).toBe(result.animation.baseRevision + 2); + expect(result.animation.locationFrames).toEqual([1, 10, 20, 25]); + expect(result.animation.interpolation).toBe("LINEAR"); + expect(result.animation.staleFrame.code).not.toBe("NO_ERROR"); + expect(result.animation.revisionAfterFailure).toBe(result.animation.finalRevision); + expect(result.animation.reopenedFrames).toEqual([1, 10, 20, 25]); + expect(result.animation.reopenedInterpolation).toBe("LINEAR"); + expect(result.animation.saveReopenExact).toBe(true); + expect(result.animation.savedSha256).not.toBe(result.animation.sourceSha256); +}); diff --git a/web/tests/e2e/wbv2-scene-object-production.spec.ts b/web/tests/e2e/wbv2-scene-object-production.spec.ts new file mode 100644 index 000000000..053806f85 --- /dev/null +++ b/web/tests/e2e/wbv2-scene-object-production.spec.ts @@ -0,0 +1,62 @@ +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { expect, test } from "@playwright/test"; + +const root = path.resolve(import.meta.dirname, "../../.."); +const evidenceRoot = path.join(root, "tests/golden/WBV2-P12-002"); +const fixture = fs.readFileSync(path.join(root, "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend")); +const sourceSha256 = crypto.createHash("sha256").update(fixture).digest("hex"); + +test("WBV2-P12-002 executes visibility and transform transactions through compiled WASM Main", async ({ page }) => { + test.setTimeout(180_000); + await page.goto("/"); + const result = await page.evaluate(async (input) => { + const { WebEngineClient } = await import("/src/engine-client/WebEngineClient.ts"); + const client = new WebEngineClient({ timeoutMs: 60_000 }); + const reopenedClient = new WebEngineClient({ timeoutMs: 60_000 }); + const shape = (error: any) => ({ code: error?.code, message: error?.message }); + const objectState = (snapshot: any, id: string) => { + const object = snapshot.nodes.find((candidate: any) => candidate.id === id); + if (!object) throw new Error(`object missing: ${id}`); + return { id: object.id, visible: object.visible, parentId: object.parentId, translation: object.transform?.translation ?? object.translation, worldMatrix: object.worldMatrix }; + }; + const digest = async (value: ArrayBuffer): Promise => { const hash = await crypto.subtle.digest("SHA-256", value); return Array.from(new Uint8Array(hash), (byte) => byte.toString(16).padStart(2, "0")).join(""); }; + try { + const opened = await client.openBlend(Uint8Array.from(input.bytes).buffer); + const parentId = "object:WBV2P2002Parent"; + const childId = "object:WBV2P2002Child"; + const beforeParent = objectState(opened.snapshot, parentId); + const beforeChild = objectState(opened.snapshot, childId); + const hidden = await client.applyCommand({ type: "setObjectVisibility", objectId: parentId, visible: false, baseRevision: opened.snapshot.revision } as any); + const transformed = await client.applyCommand({ type: "setObjectTransform", objectId: childId, translation: [0.5, 2.5, 0], rotationEuler: [0, 0, 0], scale: [1, 1, 1], baseRevision: hidden.snapshot.revision } as any); + const afterParent = objectState(transformed.snapshot, parentId); + const afterChild = objectState(transformed.snapshot, childId); + const stale = await client.applyCommand({ type: "setObjectVisibility", objectId: parentId, visible: true, baseRevision: opened.snapshot.revision } as any).then(() => ({ code: "NO_ERROR" })).catch(shape); + const malformed = await client.applyCommand({ type: "setObjectTransform", objectId: childId, translation: [0.5, 2.5], rotationEuler: [0, 0, 0], scale: [1, 1, 1], baseRevision: transformed.snapshot.revision } as any).then(() => ({ code: "NO_ERROR" })).catch(shape); + const unchanged = (await client.snapshot()).snapshot; + const saved = await client.saveBlend(); + const savedSha256 = await digest(saved.slice(0)); + const reopened = await reopenedClient.openBlend(saved.slice(0)); + const reopenedParent = objectState(reopened.snapshot, parentId); + const reopenedChild = objectState(reopened.snapshot, childId); + return { baseRevision: opened.snapshot.revision, hiddenRevision: hidden.snapshot.revision, transformedRevision: transformed.snapshot.revision, beforeParent, beforeChild, afterParent, afterChild, stale, malformed, unchangedParent: objectState(unchanged, parentId), unchangedChild: objectState(unchanged, childId), reopenedParent, reopenedChild, savedSha256, sourceSha256: await digest(Uint8Array.from(input.bytes).buffer), exactSaveReopen: JSON.stringify({ parent: afterParent, child: afterChild }) === JSON.stringify({ parent: reopenedParent, child: reopenedChild }) }; + } + finally { client.terminate(); reopenedClient.terminate(); } + }, { bytes: Array.from(fixture) }); + fs.mkdirSync(evidenceRoot, { recursive: true }); + const output = process.env.WBV2_SCENE_OBJECT_REPORT ?? "scene-object-production.json"; + fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P12-002", operation: "SCENE_OBJECT_WORKFLOW_ENGINE_CHROMIUM", browser: "chromium", queueMutation: false, ...result }, null, 2)}\n`); + expect(result.sourceSha256).toBe(sourceSha256); + expect(result.hiddenRevision).toBe(result.baseRevision + 1); + expect(result.transformedRevision).toBe(result.baseRevision + 2); + expect(result.afterParent.visible).toBe(false); + expect(result.afterChild.translation).toEqual([0.5, 2.5, 0]); + expect(result.exactSaveReopen).toBe(true); + expect(result.stale.code).not.toBe("NO_ERROR"); + expect(result.stale.message).toContain("REVISION_CONFLICT"); + expect(result.malformed.code).not.toBe("NO_ERROR"); + expect(result.unchangedParent).toEqual(result.afterParent); + expect(result.unchangedChild).toEqual(result.afterChild); + expect(result.savedSha256).not.toBe(sourceSha256); +}); diff --git a/web/tests/e2e/wbv2-viewport-nonmesh-production.spec.ts b/web/tests/e2e/wbv2-viewport-nonmesh-production.spec.ts new file mode 100644 index 000000000..d54378e1b --- /dev/null +++ b/web/tests/e2e/wbv2-viewport-nonmesh-production.spec.ts @@ -0,0 +1,83 @@ +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import { expect, test } from "@playwright/test"; + +const root = path.resolve(import.meta.dirname, "../../.."); +const evidenceRoot = path.join(root, "tests/golden/WBV2-P12-004"); +const viewportFixture = fs.readFileSync(path.join(root, "tests/files/web/generated/WBV2-P2-004-VIEWPORT.MAIN_OFFSCREEN.blend")); +const nonMeshFixture = fs.readFileSync(path.join(root, "tests/files/web/generated/WBV2-P4-003-SCULPT.NONMESH.PAINT_BOUNDED.blend")); +const digest = (bytes: Uint8Array): string => crypto.createHash("sha256").update(bytes).digest("hex"); + +test("WBV2-P12-004 binds viewport pixels and non-mesh boundaries to compiled WASM Main", async ({ page }) => { + test.setTimeout(240_000); + await page.goto("/"); + const result = await page.evaluate(async (input) => { + const [{ WebEngineClient }, { ViewportRenderer }] = await Promise.all([ + import("/src/engine-client/WebEngineClient.ts"), + import("/src/three-adapter/viewport.ts"), + ]); + const buffer = (values: number[]): ArrayBuffer => Uint8Array.from(values).buffer; + const digestBytes = async (value: ArrayBuffer): Promise => { const hash = await crypto.subtle.digest("SHA-256", value); return Array.from(new Uint8Array(hash), (byte) => byte.toString(16).padStart(2, "0")).join(""); }; + const viewportClient = new WebEngineClient({ timeoutMs: 60_000 }); + const nonMeshClient = new WebEngineClient({ timeoutMs: 60_000 }); + const nonMeshReopenedClient = new WebEngineClient({ timeoutMs: 60_000 }); + const canvas = document.createElement("canvas"); + canvas.width = 320; + canvas.height = 240; + canvas.style.cssText = "position:fixed;left:0;top:0;width:320px;height:240px"; + document.body.append(canvas); + let renderer: any; + try { + const viewport = await viewportClient.openBlend(buffer(input.viewportBytes)); + renderer = new ViewportRenderer(canvas); + renderer.setSnapshot(viewport.snapshot, viewport.geometryBuffers, viewport.nonMeshGeometryBuffers ?? []); + await new Promise((resolve) => requestAnimationFrame(() => requestAnimationFrame(resolve))); + const gl = renderer.renderer.getContext(); + const pixels = new Uint8Array(32 * 32 * 4); + gl.readPixels(0, 0, 32, 32, gl.RGBA, gl.UNSIGNED_BYTE, pixels); + const readbackPixels = Array.from({ length: 32 * 32 }, (_, index) => pixels[index * 4] + pixels[index * 4 + 1] + pixels[index * 4 + 2] > 30).filter(Boolean).length; + const viewportResources = await viewportClient.openResourceStatus(); + + const opened = await nonMeshClient.openBlend(buffer(input.nonMeshBytes)); + const data = opened.snapshot.nonMeshData ?? []; + const curve = data.find((entry: any) => entry.type === "CURVE"); + if (!curve) throw new Error("non-mesh fixture has no Curve data"); + const gates = data.map((entry: any) => ({ id: entry.id, type: entry.type, status: nonMeshClient.queryNonMeshCapability(entry.id) })); + const resolvedGates = []; + for (const entry of gates) resolvedGates.push({ id: entry.id, type: entry.type, gate: await entry.status }); + const curveControlPoints = [0, 0, 0, 1, 0, 0, 2, 0, 0]; + const curveSplineOffsets = [0, 3]; + const editedCurve = await nonMeshClient.applyCommand({ type: "setCurveControlPoints", dataId: curve.id, controlPoints: curveControlPoints, splineOffsets: curveSplineOffsets, resolution: curve.resolution ?? 12, baseRevision: opened.snapshot.revision } as any); + const unknown = await nonMeshClient.queryNonMeshCapability("nonmesh:missing"); + const saved = await nonMeshClient.saveBlend(); + const savedSha256 = await digestBytes(saved.slice(0)); + const reopened = await nonMeshReopenedClient.openBlend(saved.slice(0)); + const reopenedCurve = reopened.snapshot.nonMeshData?.find((entry: any) => entry.id === curve.id); + const malformed = await nonMeshClient.applyCommand({ type: "setCurveControlPoints", dataId: curve.id, controlPoints: [0, 1], splineOffsets: [0, 1], resolution: curve.resolution, baseRevision: editedCurve.snapshot.revision } as any).then(() => ({ code: "NO_ERROR" })).catch((error: any) => ({ code: error?.code, message: error?.message })); + const afterMalformed = (await nonMeshClient.snapshot()).snapshot; + return { viewport: { revision: viewport.snapshot.revision, sceneId: viewport.snapshot.sceneId, meshCount: viewport.snapshot.meshes.length, geometryBuffers: viewport.geometryBuffers.length, readbackPixels, resources: viewportResources }, nonMesh: { baseRevision: opened.snapshot.revision, editedRevision: editedCurve.snapshot.revision, data: data.map((entry: any) => ({ id: entry.id, type: entry.type, geometryStatus: entry.geometryStatus, pointCount: entry.pointCount, splineCount: entry.splineCount })), gates: resolvedGates.map((entry: any) => ({ id: entry.id, type: entry.type, status: entry.gate.status, capability: entry.gate.capability, issueCodes: entry.gate.issues.map((issue: any) => issue.code) })), unknown: { status: unknown.status, capability: unknown.capability, issueCode: unknown.issues[0]?.code }, curveId: curve.id, curveBefore: { controlPoints: curve.controlPoints, pointCount: curve.pointCount }, curveAfter: { controlPoints: editedCurve.snapshot.nonMeshData?.find((entry: any) => entry.id === curve.id)?.controlPoints, pointCount: editedCurve.snapshot.nonMeshData?.find((entry: any) => entry.id === curve.id)?.pointCount }, reopenedCurve: { controlPoints: reopenedCurve?.controlPoints, pointCount: reopenedCurve?.pointCount }, malformed, revisionAfterMalformed: afterMalformed.revision, savedSha256, sourceSha256: await digestBytes(buffer(input.nonMeshBytes)), saveReopenExact: JSON.stringify(editedCurve.snapshot.nonMeshData?.find((entry: any) => entry.id === curve.id)) === JSON.stringify(reopenedCurve) } }; + } + catch (error: any) { return { error: { code: error?.code, message: error?.message, detail: String(error) } } as any; } + finally { renderer?.dispose(); canvas.remove(); viewportClient.terminate(); nonMeshClient.terminate(); nonMeshReopenedClient.terminate(); } + }, { viewportBytes: Array.from(viewportFixture), nonMeshBytes: Array.from(nonMeshFixture) }); + fs.mkdirSync(evidenceRoot, { recursive: true }); + const output = process.env.WBV2_VIEWPORT_NONMESH_REPORT ?? "viewport-nonmesh-production.json"; + fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P12-004", operation: "VIEWPORT_NONMESH_ENGINE_CHROMIUM", browser: "chromium", queueMutation: false, ...result }, null, 2)}\n`); + expect(result.error).toBeUndefined(); + expect(result.viewport.sceneId).toBe("scene:WBV2P2004ViewportScene"); + expect(result.viewport.meshCount).toBeGreaterThan(0); + expect(result.viewport.geometryBuffers).toBeGreaterThan(0); + expect(result.viewport.readbackPixels).toBeGreaterThan(0); + expect(result.viewport.resources).toMatchObject({ activeRequests: 0, liveInputBytes: 0, liveStagingFiles: 0 }); + expect(result.nonMesh.data.length).toBe(2); + expect(result.nonMesh.data.map((entry) => entry.type)).toEqual(["CURVE", "POINT_CLOUD"]); + expect(result.nonMesh.gates.some((gate) => gate.status === "READY")).toBe(true); + expect(result.nonMesh.unknown.status).toBe("BLOCKED"); + expect(result.nonMesh.unknown.issueCode).toBe("NON_MESH_DATA_UNSUPPORTED"); + expect(result.nonMesh.editedRevision).toBe(result.nonMesh.baseRevision + 1); + expect(result.nonMesh.saveReopenExact).toBe(true); + expect(result.nonMesh.malformed.code).not.toBe("NO_ERROR"); + expect(result.nonMesh.revisionAfterMalformed).toBe(result.nonMesh.editedRevision); + expect(result.nonMesh.savedSha256).not.toBe(result.nonMesh.sourceSha256); +});