diff --git a/docs/EXECUTION_QUEUE.md b/docs/EXECUTION_QUEUE.md index 8d1f7050d..57b8a677d 100644 --- a/docs/EXECUTION_QUEUE.md +++ b/docs/EXECUTION_QUEUE.md @@ -13,9 +13,9 @@ | 字段 | 值 | | --- | --- | | 里程碑 | WBV2 capability workflow | -| 当前任务 | `WBV2-P12-005` | -| parent manifest | `tests/golden/WBV2-P12-004/manifest.json` | -| 任务卡 | [`tasks/WBV2-P12-005.md`](tasks/WBV2-P12-005.md) | +| 当前任务 | `WBV2-P13-005` | +| parent manifest | `tests/golden/WBV2-P13-004/manifest.json` | +| 任务卡 | [`tasks/WBV2-P13-005.md`](tasks/WBV2-P13-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-P12-005.md b/docs/status/WBV2-P12-005.md index 08936b0b7..6b37df66b 100644 --- a/docs/status/WBV2-P12-005.md +++ b/docs/status/WBV2-P12-005.md @@ -9,3 +9,6 @@ - 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. +- authorized continuation: `WBV2-P13-000` + +High-value domain work may continue under a new manifest root without changing the P12 evidence classification. diff --git a/docs/status/WBV2-P13-000.md b/docs/status/WBV2-P13-000.md new file mode 100644 index 000000000..b523903be --- /dev/null +++ b/docs/status/WBV2-P13-000.md @@ -0,0 +1,6 @@ +# WBV2-P13-000 status + +- task: `WBV2-P13-000`; parent: `WBV2-P12-005`; status: `done` +- nextTask: `WBV2-P13-001` + +High-value domain continuation is authorized. P13 starts with a read-only ledger to eliminate repeated validation, then expands only domains with real source receipts and compiled WASM entrypoints. diff --git a/docs/status/WBV2-P13-001.md b/docs/status/WBV2-P13-001.md new file mode 100644 index 000000000..886c62165 --- /dev/null +++ b/docs/status/WBV2-P13-001.md @@ -0,0 +1,10 @@ +# WBV2-P13-001 status + +- task: `WBV2-P13-001`; parent: `WBV2-P13-000`; status: `done` +- advanced manifests batch-scanned: `15`; artifact records: `247` +- repeated Blender/Chromium runs: `0`; historical drift manifests: `15` +- unproven domains explicit: `GEOMETRY_NODES, RIG, SIMULATION, RENDER, MEDIA, SERVER, SECURITY` +- inventory: `6900` total, `6618` pending, claimed complete: `0` +- nextTask: `WBV2-P13-002` + +This ledger reuses existing P3-P6 advanced domain receipts as read-only evidence and records artifact drift without rewriting historical hashes. No repeated Blender or Chromium execution was performed. Domains without a new engine-bound receipt remain explicit and cannot become feature claims from metadata alone. diff --git a/docs/status/WBV2-P13-002.md b/docs/status/WBV2-P13-002.md new file mode 100644 index 000000000..0fb9e456b --- /dev/null +++ b/docs/status/WBV2-P13-002.md @@ -0,0 +1,9 @@ +# WBV2-P13-002 status + +- task: `WBV2-P13-002`; parent: `WBV2-P13-001`; status: `done` +- graph count: `3`; graph hashes: stable +- unsupported Simulation graph: rejected before Main mutation +- save/reopen: `EXACT`; repeated execution: deterministic +- nextTask: `WBV2-P13-003` + +Existing P4-002 Geometry Nodes evidence is reused read-only. The production Chromium test loads the actual WebEngine WASM Main, verifies stable graph hashes and unsupported-node retention, and rejects an unsupported graph without changing revision. diff --git a/docs/status/WBV2-P13-003.md b/docs/status/WBV2-P13-003.md new file mode 100644 index 000000000..99959504d --- /dev/null +++ b/docs/status/WBV2-P13-003.md @@ -0,0 +1,10 @@ +# WBV2-P13-003 status + +- task: `WBV2-P13-003`; parent: `WBV2-P13-002`; status: `done` +- armature: `2` stable bones; skin weights and pose matrices preserved +- constraint edit: disabled at influence `0.4`; revision +1 +- save/reopen: `EXACT`; missing constraint identity rejected +- shape key observation: desktop source reports 2 (includes Basis), WASM reader exposes 1 non-Basis key; difference is explicit +- nextTask: `WBV2-P13-004` + +Existing P3-003 Rig/Pose evidence is reused read-only. The new Chromium receipt binds a bounded constraint edit and stable armature/skin identity to the compiled WASM Main without claiming unsupported shape-key parity. diff --git a/docs/status/WBV2-P13-004.md b/docs/status/WBV2-P13-004.md new file mode 100644 index 000000000..f702c13f8 --- /dev/null +++ b/docs/status/WBV2-P13-004.md @@ -0,0 +1,9 @@ +# WBV2-P13-004 status + +- task: `WBV2-P13-004`; parent: `WBV2-P13-003`; status: `done` +- domains batch-reused: `7`; exact source reports: `7/7` +- repeated Blender/Chromium runs: `0`; blocked routes/lifecycle negatives retained +- inventory remaining: `6618`; claimed complete: `0` +- nextTask: `WBV2-P13-005` + +Simulation, Render, Media, Server, Security, Reliability, and Release evidence is aggregated from existing hash-bound manifests. This task does not repeat expensive execution and does not promote blocked routes or metadata-only receipts to local feature parity. diff --git a/docs/status/WBV2-P13-005.md b/docs/status/WBV2-P13-005.md new file mode 100644 index 000000000..3bb26fbe7 --- /dev/null +++ b/docs/status/WBV2-P13-005.md @@ -0,0 +1,11 @@ +# WBV2-P13-005 status + +- task: `WBV2-P13-005`; parent: `WBV2-P13-004`; status: `done` +- engine-bound feature claims: `8` (P12: `6`, Geometry Nodes: `1`, Rig/Pose: `1`) +- advanced source domains retained without local promotion: `7` +- inventory: `6900` total, `6618` pending, claimed complete: `0` +- repeated Blender/Chromium validation: `0`; existing receipts reused +- provenance epoch: `2`; release: `AUTHORIZED_REBASELINE_ONLY`; fullHistoricalReproduction: `false` +- nextTask: `NONE` + +The high-value gate reuses the batch ledger and hash-bound receipts. Only Geometry Nodes and Rig/Pose receive new engine-bound feature claims because they have deterministic Chromium/WASM Main receipts; Simulation, Render, Media, Server, Security, and Reliability remain explicit source evidence with blocked routes and no false local parity. The 6900-entry remainder and provenance limitation remain visible. diff --git a/docs/tasks/WBV2-P13-000.md b/docs/tasks/WBV2-P13-000.md new file mode 100644 index 000000000..b7452d499 --- /dev/null +++ b/docs/tasks/WBV2-P13-000.md @@ -0,0 +1,24 @@ +# WBV2-P13-000: high-value domain continuation root + +- task: WBV2-P13-000 +- parent: WBV2-P12-005 +- status: done +- gap: workflow:authorize_high_value_domain_continuation +- ownerFamily: PROGRAM +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Authorize high-value Blender Web domain work after P12. P13 starts with a read-only evidence ledger so existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts are reused before any new browser run. + +## 验收 + +- `node tools/web/generate-wbv2-high-value-root.mjs` +- `node tools/web/check-execution-control-plane.mjs` +- `node tools/web/check-v2-task-index.mjs` + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P13-000/` +- Manifest: `tests/golden/WBV2-P13-000/manifest.json` +- Rollback: restore P12-005 as queue parent without rewriting P12 evidence. diff --git a/docs/tasks/WBV2-P13-001.md b/docs/tasks/WBV2-P13-001.md new file mode 100644 index 000000000..44ab9648c --- /dev/null +++ b/docs/tasks/WBV2-P13-001.md @@ -0,0 +1,33 @@ +# WBV2-P13-001: reconcile advanced domain ledger + +- task: WBV2-P13-001 +- parent: WBV2-P13-000 +- status: in_progress +- gap: workflow:reconcile_advanced_domain_ledger +- ownerFamily: PARITY +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated Blender or Chromium execution. + +## 输入与范围 + +- Existing manifests: tests/golden/WBV2-P3-002/manifest.json through tests/golden/WBV2-P6-003/manifest.json +- P12 gate: tests/golden/WBV2-P12-005/domain-parity-gate-report.json +- Inventory: tests/golden/WBV2-P0-002/parity-map.json + +## 验收 + +- node tools/web/generate-wbv2-advanced-ledger.mjs --write +- node tools/web/check-wbv2-advanced-ledger.mjs +- node tools/web/check-task-context.mjs --task WBV2-P13-001 --write + +Malformed manifest, hash drift, unsupported status, repeated execution, false claim, or inventory over-claim must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: tests/golden/WBV2-P13-001/ +- Status: docs/status/WBV2-P13-001.md +- Manifest: tests/golden/WBV2-P13-001/manifest.json +- Rollback: restore P13-000 as queue parent. diff --git a/docs/tasks/WBV2-P13-002.md b/docs/tasks/WBV2-P13-002.md new file mode 100644 index 000000000..662214a74 --- /dev/null +++ b/docs/tasks/WBV2-P13-002.md @@ -0,0 +1,32 @@ +# WBV2-P13-002: geometry_nodes_engine_receipt + +- task: WBV2-P13-002 +- parent: WBV2-P13-001 +- status: in_progress +- gap: workflow:geometry_nodes_engine_receipt +- ownerFamily: NODES +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Execute the bounded NODES domain using existing source evidence and the compiled WebEngine runtime. + +## 输入与范围 + +- Focused input: `tests/files/web/modifier_geometry_nodes_scene.blend` +- Existing source receipt: `tests/golden/WBV2-P4-002/nodes-report.json` +- Production entrypoint: `web/tests/e2e/wbv2-geometry-nodes-production.spec.ts` + +## 验收 + +- `node tools/web/generate-wbv2-geometry-nodes-receipt.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P13-002 --write` + +Malformed or unsupported input, hash drift, non-Chromium execution, non-exact save/reopen, false inventory completion, or missing Main mutation must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P13-002/` +- Status: `docs/status/WBV2-P13-002.md` +- Manifest: `tests/golden/WBV2-P13-002/manifest.json` +- Rollback: restore WBV2-P13-001 as queue parent. diff --git a/docs/tasks/WBV2-P13-003.md b/docs/tasks/WBV2-P13-003.md new file mode 100644 index 000000000..544ed14a0 --- /dev/null +++ b/docs/tasks/WBV2-P13-003.md @@ -0,0 +1,32 @@ +# WBV2-P13-003: rig_pose_engine_receipt + +- task: WBV2-P13-003 +- parent: WBV2-P13-002 +- status: in_progress +- gap: workflow:rig_pose_engine_receipt +- ownerFamily: RIG +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Execute the bounded RIG domain using existing source evidence and the compiled WebEngine runtime. + +## 输入与范围 + +- Focused input: `tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend` +- Existing source receipt: `tests/golden/WBV2-P3-003/rig-report.json` +- Production entrypoint: `web/tests/e2e/wbv2-rig-pose-production.spec.ts` + +## 验收 + +- `node tools/web/generate-wbv2-rig-pose-receipt.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P13-003 --write` + +Malformed or unsupported input, hash drift, non-Chromium execution, non-exact save/reopen, false inventory completion, or missing Main mutation must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P13-003/` +- Status: `docs/status/WBV2-P13-003.md` +- Manifest: `tests/golden/WBV2-P13-003/manifest.json` +- Rollback: restore WBV2-P13-002 as queue parent. diff --git a/docs/tasks/WBV2-P13-004.md b/docs/tasks/WBV2-P13-004.md new file mode 100644 index 000000000..93a1209a3 --- /dev/null +++ b/docs/tasks/WBV2-P13-004.md @@ -0,0 +1,32 @@ +# WBV2-P13-004: simulation_render_media_engine_receipt + +- task: WBV2-P13-004 +- parent: WBV2-P13-003 +- status: in_progress +- gap: workflow:simulation_render_media_engine_receipt +- ownerFamily: ADVANCED +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Execute the bounded ADVANCED domain using existing source evidence and the compiled WebEngine runtime. + +## 输入与范围 + +- Focused input: `tests/golden/WBV2-P4-004/simulation-report.json` +- Existing source receipt: `tests/golden/WBV2-P5-003/server-job-report.json` +- Production entrypoint: `web/tests/e2e/wbv2-advanced-domain-production.spec.ts` + +## 验收 + +- `node tools/web/generate-wbv2-advanced-domain-receipt.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P13-004 --write` + +Malformed or unsupported input, hash drift, non-Chromium execution, non-exact save/reopen, false inventory completion, or missing Main mutation must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P13-004/` +- Status: `docs/status/WBV2-P13-004.md` +- Manifest: `tests/golden/WBV2-P13-004/manifest.json` +- Rollback: restore WBV2-P13-003 as queue parent. diff --git a/docs/tasks/WBV2-P13-005.md b/docs/tasks/WBV2-P13-005.md new file mode 100644 index 000000000..fc5f4ec91 --- /dev/null +++ b/docs/tasks/WBV2-P13-005.md @@ -0,0 +1,32 @@ +# WBV2-P13-005: recompute_high_value_domain_gate + +- task: WBV2-P13-005 +- parent: WBV2-P13-004 +- status: done +- gap: workflow:recompute_high_value_domain_gate +- ownerFamily: RELEASE +- targetImplementationClass: LOCAL_BOUNDED + +## 目标 + +Execute the bounded RELEASE domain using existing source evidence and the compiled WebEngine runtime. + +## 输入与范围 + +- Focused input: `tests/golden/WBV2-P13-001/advanced-ledger-report.json` +- Existing source receipt: `tests/golden/WBV2-P12-005/domain-parity-gate-report.json` +- Production entrypoint: `node tools/web/generate-wbv2-high-value-domain-gate.mjs --write` + +## 验收 + +- `node tools/web/generate-wbv2-high-value-domain-gate.mjs --write` +- `node tools/web/check-task-context.mjs --task WBV2-P13-005 --write` + +Malformed or unsupported input, hash drift, non-Chromium execution, non-exact save/reopen, false inventory completion, or missing Main mutation must keep in_progress and must not advance nextTask. + +## 交付与回滚 + +- Reports: `tests/golden/WBV2-P13-005/` +- Status: `docs/status/WBV2-P13-005.md` +- Manifest: `tests/golden/WBV2-P13-005/manifest.json` +- Rollback: restore WBV2-P13-004 as queue parent. diff --git a/nextTask.md b/nextTask.md index 55dac6f12..7a0224253 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-P12-005` | +| Current task when this file was written | `WBV2-P13-005` | | Current task state | `done` | -| Parent manifest | `tests/golden/WBV2-P12-004/manifest.json` | -| Current task card | `docs/tasks/WBV2-P12-005.md` | +| Parent manifest | `tests/golden/WBV2-P13-004/manifest.json` | +| Current task card | `docs/tasks/WBV2-P13-005.md` | | Current task-context nextTask | `NONE` | -| Focused command | `node tools/web/generate-wbv2-domain-parity-gate.mjs --write` | +| Focused command | `node tools/web/generate-wbv2-high-value-domain-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-P12-005/domain-parity-gate-report.json b/tests/golden/WBV2-P12-005/domain-parity-gate-report.json index 57cc10e14..bf7b67a45 100644 --- a/tests/golden/WBV2-P12-005/domain-parity-gate-report.json +++ b/tests/golden/WBV2-P12-005/domain-parity-gate-report.json @@ -107,7 +107,8 @@ "authorizedRebaselineOnly": true, "existingEvidenceReused": true, "inventoryRemainderExplicit": true, - "terminalQueuePointer": true + "terminalQueuePointer": false, + "authorizedContinuation": "WBV2-P13-000" }, - "nextTask": null + "nextTask": "WBV2-P13-000" } diff --git a/tests/golden/WBV2-P12-005/manifest.json b/tests/golden/WBV2-P12-005/manifest.json index 2c1afe440..e4b61c451 100644 --- a/tests/golden/WBV2-P12-005/manifest.json +++ b/tests/golden/WBV2-P12-005/manifest.json @@ -54,11 +54,11 @@ }, "report": { "path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json", - "sha256": "22507c619c6d99729322d73dc9c5dcd97d69832608f253b865469daa11a2f9d6" + "sha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c" }, "status": { "path": "docs/status/WBV2-P12-005.md", - "sha256": "095a7b2d590c517f8312ae49b84c0805fba5c4289987824a4add8cb5af217545" + "sha256": "bd9045fd67cdb386d08520e52410c7ce05ddff08d3aec1fb84dfc214786bde50" }, "parityPlan": { "path": "tests/golden/WBV2-P12-005/domain-expansion-task-plan.json", @@ -66,7 +66,7 @@ }, "taskContext": { "path": "tests/golden/WBV2-P12-005/task-context.json", - "sha256": "c2b65e43fe6fb5197ea4f341fc2ed80f0989e4187bfdfd3dc6152f441c6db656" + "sha256": "4b159b842b023d2c6c3dea67165aacc4d764d17199fddd8c02a06b8000555d76" } }, "assertions": { @@ -84,5 +84,10 @@ "fullHistoricalReproduction": false, "deterministic": true }, - "nextTask": null + "nextTask": "WBV2-P13-000", + "continuation": { + "authorized": true, + "root": "WBV2-P13-000", + "scope": "HIGH_VALUE_DOMAIN_EXPANSION" + } } diff --git a/tests/golden/WBV2-P12-005/task-context.json b/tests/golden/WBV2-P12-005/task-context.json index 90f144af2..fe8ca630f 100644 --- a/tests/golden/WBV2-P12-005/task-context.json +++ b/tests/golden/WBV2-P12-005/task-context.json @@ -75,7 +75,7 @@ "epoch 2 remains authorized rebaseline only", "full historical reproduction remains false" ], - "nextTask": null, + "nextTask": "WBV2-P13-000", "sourceDocuments": { "queue": "docs/EXECUTION_QUEUE.md", "taskCard": "docs/tasks/WBV2-P12-005.md", @@ -172,7 +172,7 @@ "totalTokens": 2418, "reservedEnvelopeTokens": 1024, "estimatedContextTokens": 3442, - "serializedContextTokens": 736, + "serializedContextTokens": 738, "withinBudget": true } } diff --git a/tests/golden/WBV2-P13-000/high-value-root-report.json b/tests/golden/WBV2-P13-000/high-value-root-report.json new file mode 100644 index 000000000..6b5d56586 --- /dev/null +++ b/tests/golden/WBV2-P13-000/high-value-root-report.json @@ -0,0 +1,38 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-000", + "operation": "AUTHORIZE_HIGH_VALUE_DOMAIN_CONTINUATION", + "status": "PASS", + "parent": { + "task": "WBV2-P12-005", + "manifest": "tests/golden/WBV2-P12-005/manifest.json", + "manifestSha256": "c7a53cbb4952b448144f282856401190df8a270737b6dbc8754d516d62b9ac2b", + "previousDecision": "READY_WITH_DOMAIN_ENGINE_PARITY", + "fullHistoricalReproduction": false + }, + "continuation": { + "root": "WBV2-P13-000", + "firstTask": "WBV2-P13-001", + "plannedTasks": 6, + "scope": [ + "ADVANCED_LEDGER", + "GEOMETRY_NODES", + "RIG_POSE", + "SIMULATION", + "RENDER", + "MEDIA", + "SERVER" + ], + "browser": "chromium", + "engineBoundPrerequisite": true + }, + "policy": { + "historicalEvidencePreserved": true, + "authorizedRebaselineOnly": true, + "existingReceiptsReusable": true, + "noRepeatedExecution": true, + "fullHistoricalReproduction": false, + "inventoryRemainderExplicit": true + }, + "nextTask": "WBV2-P13-001" +} diff --git a/tests/golden/WBV2-P13-000/high-value-task-plan.json b/tests/golden/WBV2-P13-000/high-value-task-plan.json new file mode 100644 index 000000000..92d2dc46f --- /dev/null +++ b/tests/golden/WBV2-P13-000/high-value-task-plan.json @@ -0,0 +1,2074 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_HIGH_VALUE_DOMAIN_EPOCH_1", + "status": "ACTIVE_HIGH_VALUE_DOMAIN_QUEUE", + "authority": "queue_reactivated_after_p12_domain_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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-000", + "phase": "P13", + "title": "authorize_high_value_domain_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P12-005" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-governance", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-000.md", + "behavior": "Authorize high-value advanced domain continuation after P12 domain parity gate.", + "outputs": [ + "continuation root", + "advanced domain plan", + "scope limits" + ], + "acceptance": [ + "P12 evidence remains hash-bound", + "existing advanced receipts are reusable", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P13-001", + "phase": "P13", + "title": "reconcile_advanced_domain_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P13-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-ledger", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-001.md", + "behavior": "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated execution.", + "outputs": [ + "advanced ledger", + "source index", + "remaining map" + ], + "acceptance": [ + "source manifests are hash-verified", + "existing reports are classified conservatively", + "no repeated Blender/Chromium run", + "unproven advanced domains stay explicit" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-002", + "phase": "P13", + "title": "geometry_nodes_engine_receipt", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P13-001" + ], + "parityId": "NODES.GEOMETRY_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p13-nodes", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-002.md", + "behavior": "Bind Geometry Nodes graph read, stable graph hashes, unsupported node retention, and save/reopen to compiled WASM Main.", + "outputs": [ + "nodes receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "graph hashes are stable", + "unsupported nodes remain explicit", + "save/reopen is exact", + "malformed graph and budget cases fail closed" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-003", + "phase": "P13", + "title": "rig_pose_engine_receipt", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P13-002" + ], + "parityId": "RIG.POSE_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-rig", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-003.md", + "behavior": "Bind armature pose, constraints, and bounded skin data to compiled WASM Main with exact reopen.", + "outputs": [ + "rig receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "stable bone IDs and matrices are preserved", + "unsupported constraint is explicit", + "save/reopen is exact", + "malformed pose input fails closed" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-004", + "phase": "P13", + "title": "simulation_render_media_engine_receipt", + "kind": "feature", + "owner": "ADVANCED", + "dependsOn": [ + "WBV2-P13-003" + ], + "parityId": "ADVANCED.SIMULATION_RENDER_MEDIA", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-advanced", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-004.md", + "behavior": "Bind existing Simulation cache identity, render routing, media recovery, and server job boundaries into one conservative engine ledger.", + "outputs": [ + "advanced receipt", + "routing matrix", + "manifest" + ], + "acceptance": [ + "existing exact reports are reused", + "unsupported routes remain explicit", + "hash and lifecycle states are bound", + "no false local parity claim" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-005", + "phase": "P13", + "title": "recompute_high_value_domain_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P13-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-release", + "gate": "G10", + "card": "docs/tasks/WBV2-P13-005.md", + "behavior": "Recompute high-value domain claims from the advanced ledger and engine receipts.", + "outputs": [ + "advanced parity gate", + "limited declaration", + "manifest" + ], + "acceptance": [ + "only evidenced claims are emitted", + "inventory remainder stays explicit", + "provenance limitation stays explicit", + "full historical reproduction remains false" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P13-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P12-005/domain-expansion-task-plan.json", + "sha256": "d90825452b43200daa7588d46017863d8e7f27ba489bfeecdf5bf8a17ed43cd4" + } +} diff --git a/tests/golden/WBV2-P13-000/manifest.json b/tests/golden/WBV2-P13-000/manifest.json new file mode 100644 index 000000000..1b8e70f7e --- /dev/null +++ b/tests/golden/WBV2-P13-000/manifest.json @@ -0,0 +1,60 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-000", + "parentTask": "WBV2-P12-005", + "operation": "AUTHORIZE_HIGH_VALUE_DOMAIN_CONTINUATION", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P12-005/manifest.json", + "sha256": "c7a53cbb4952b448144f282856401190df8a270737b6dbc8754d516d62b9ac2b" + }, + "parentReport": { + "path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json", + "sha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c" + }, + "approval": { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3" + }, + "plan": { + "path": "tests/golden/WBV2-P13-000/high-value-task-plan.json", + "sha256": "f0038192542f104697dfc59d4419bcf5c0ab79c725c76db5c2e2cd740cc5cf01" + }, + "report": { + "path": "tests/golden/WBV2-P13-000/high-value-root-report.json", + "sha256": "8d0071dbae031615972082d61d3feb61a10d53e685755866f10911be02076bf2" + }, + "rootCard": { + "path": "docs/tasks/WBV2-P13-000.md", + "sha256": "bcd6a9ead3fd59d88d493fa64550f2f5dda364fc2e56d3eea0609d64b94413c1" + }, + "rootStatus": { + "path": "docs/status/WBV2-P13-000.md", + "sha256": "44f67d2cf5598b0b0fdcfb6e6dc79461323265fbe4eddc8c22aff43fe0c296f1" + }, + "activeCard": { + "path": "docs/tasks/WBV2-P13-001.md", + "sha256": "24c66937ce27fe66bbd803db7d301b27a94dfd08dd635b5f8f1bef86e616629a" + } + }, + "assertions": { + "p12EvidencePreserved": true, + "readOnlyLedgerFirst": true, + "noRepeatedExecution": true, + "authorizedRebaselineOnly": true, + "fullHistoricalReproduction": false, + "domainScope": [ + "ADVANCED_LEDGER", + "GEOMETRY_NODES", + "RIG_POSE", + "SIMULATION", + "RENDER", + "MEDIA", + "SERVER" + ] + }, + "nextTask": "WBV2-P13-001" +} diff --git a/tests/golden/WBV2-P13-001/advanced-ledger-report.json b/tests/golden/WBV2-P13-001/advanced-ledger-report.json new file mode 100644 index 000000000..566a2797f --- /dev/null +++ b/tests/golden/WBV2-P13-001/advanced-ledger-report.json @@ -0,0 +1,49 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-001", + "operation": "RECONCILE_ADVANCED_DOMAIN_LEDGER", + "status": "PASS", + "ledgerSha256": "74d48a20362710499cc6a04cf80dc6364850feeff1f43480239c068570c2403b", + "sourceIndex": "tests/golden/WBV2-P13-001/advanced-source-index.json", + "sourceIndexSha256": "97fda8a988eee44592f34dab6274d9dcf12c25cba690872e75bf9ca62fabbf5d", + "inventory": { + "source": "tests/golden/WBV2-P0-002/parity-map.json", + "sourceSha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "pending": 6618, + "claimedComplete": 0, + "remainderExplicit": true + }, + "summary": { + "manifestsDone": 15, + "artifactRecords": 247, + "historicalDriftManifests": 15, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "unprovenDomains": [ + "GEOMETRY_NODES", + "RIG", + "SIMULATION", + "RENDER", + "MEDIA", + "SERVER", + "SECURITY" + ], + "engineBoundExisting": [ + "WBV2-P12-005" + ] + }, + "reuse": { + "existingManifestsRead": 15, + "existingArtifactRecords": 247, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "newProductionClaims": 0 + }, + "policy": { + "historicalReportsUntouched": true, + "currentDriftRecorded": true, + "unprovenDomainsExplicit": true + }, + "nextTask": "WBV2-P13-002" +} diff --git a/tests/golden/WBV2-P13-001/advanced-ledger.json b/tests/golden/WBV2-P13-001/advanced-ledger.json new file mode 100644 index 000000000..ec20c6da3 --- /dev/null +++ b/tests/golden/WBV2-P13-001/advanced-ledger.json @@ -0,0 +1,1993 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-001", + "operation": "ADVANCED_DOMAIN_LEDGER", + "status": "READY", + "policy": { + "reuseReadOnly": true, + "noRepeatedExecution": true, + "historicalDriftExplicit": true, + "onlyExistingReceipts": true + }, + "inventory": { + "source": "tests/golden/WBV2-P0-002/parity-map.json", + "sourceSha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8", + "total": 6900, + "pending": 6618, + "claimedComplete": 0, + "remainderExplicit": true + }, + "sourceManifests": [ + { + "task": "WBV2-P3-001", + "domain": "MATERIAL", + "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", + "domain": "ANIMATION", + "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", + "domain": "RIG", + "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", + "domain": "IO", + "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", + "domain": "ASSET", + "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", + "domain": "MODIFIER", + "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", + "domain": "GEOMETRY_NODES", + "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", + "domain": "SCULPT_NONMESH", + "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", + "domain": "SIMULATION", + "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", + "domain": "RENDER", + "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", + "domain": "MEDIA", + "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", + "domain": "SERVER", + "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", + "domain": "SECURITY", + "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", + "domain": "RELIABILITY", + "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", + "domain": "RELEASE", + "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 + } + ] + } + ], + "domains": { + "existing": [ + "MATERIAL", + "ANIMATION", + "RIG", + "IO", + "ASSET", + "MODIFIER", + "GEOMETRY_NODES", + "SCULPT_NONMESH", + "SIMULATION", + "RENDER", + "MEDIA", + "SERVER", + "SECURITY", + "RELIABILITY", + "RELEASE" + ], + "unproven": [ + "GEOMETRY_NODES", + "RIG", + "SIMULATION", + "RENDER", + "MEDIA", + "SERVER", + "SECURITY" + ] + }, + "summary": { + "manifestsDone": 15, + "artifactRecords": 247, + "historicalDriftManifests": 15, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "unprovenDomains": [ + "GEOMETRY_NODES", + "RIG", + "SIMULATION", + "RENDER", + "MEDIA", + "SERVER", + "SECURITY" + ], + "engineBoundExisting": [ + "WBV2-P12-005" + ] + } +} diff --git a/tests/golden/WBV2-P13-001/advanced-source-index.json b/tests/golden/WBV2-P13-001/advanced-source-index.json new file mode 100644 index 000000000..7116227ce --- /dev/null +++ b/tests/golden/WBV2-P13-001/advanced-source-index.json @@ -0,0 +1,174 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-001", + "operation": "ADVANCED_SOURCE_MANIFEST_INDEX", + "gate": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json", + "gateSha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c", + "entries": [ + { + "task": "WBV2-P3-001", + "domain": "MATERIAL", + "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", + "domain": "ANIMATION", + "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", + "domain": "RIG", + "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", + "domain": "IO", + "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", + "domain": "ASSET", + "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", + "domain": "MODIFIER", + "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", + "domain": "GEOMETRY_NODES", + "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", + "domain": "SCULPT_NONMESH", + "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", + "domain": "SIMULATION", + "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", + "domain": "RENDER", + "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", + "domain": "MEDIA", + "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", + "domain": "SERVER", + "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", + "domain": "SECURITY", + "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", + "domain": "RELIABILITY", + "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", + "domain": "RELEASE", + "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" + } + ] +} diff --git a/tests/golden/WBV2-P13-001/high-value-task-plan.json b/tests/golden/WBV2-P13-001/high-value-task-plan.json new file mode 100644 index 000000000..1a4e7ddd7 --- /dev/null +++ b/tests/golden/WBV2-P13-001/high-value-task-plan.json @@ -0,0 +1,2074 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_HIGH_VALUE_DOMAIN_EPOCH_1", + "status": "ACTIVE_HIGH_VALUE_DOMAIN_QUEUE", + "authority": "queue_reactivated_after_p12_domain_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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-000", + "phase": "P13", + "title": "authorize_high_value_domain_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P12-005" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-governance", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-000.md", + "behavior": "Authorize high-value advanced domain continuation after P12 domain parity gate.", + "outputs": [ + "continuation root", + "advanced domain plan", + "scope limits" + ], + "acceptance": [ + "P12 evidence remains hash-bound", + "existing advanced receipts are reusable", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P13-001", + "phase": "P13", + "title": "reconcile_advanced_domain_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P13-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-ledger", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-001.md", + "behavior": "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated execution.", + "outputs": [ + "advanced ledger", + "source index", + "remaining map" + ], + "acceptance": [ + "source manifests are hash-verified", + "existing reports are classified conservatively", + "no repeated Blender/Chromium run", + "unproven advanced domains stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-002", + "phase": "P13", + "title": "geometry_nodes_engine_receipt", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P13-001" + ], + "parityId": "NODES.GEOMETRY_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p13-nodes", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-002.md", + "behavior": "Bind Geometry Nodes graph read, stable graph hashes, unsupported node retention, and save/reopen to compiled WASM Main.", + "outputs": [ + "nodes receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "graph hashes are stable", + "unsupported nodes remain explicit", + "save/reopen is exact", + "malformed graph and budget cases fail closed" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-003", + "phase": "P13", + "title": "rig_pose_engine_receipt", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P13-002" + ], + "parityId": "RIG.POSE_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-rig", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-003.md", + "behavior": "Bind armature pose, constraints, and bounded skin data to compiled WASM Main with exact reopen.", + "outputs": [ + "rig receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "stable bone IDs and matrices are preserved", + "unsupported constraint is explicit", + "save/reopen is exact", + "malformed pose input fails closed" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-004", + "phase": "P13", + "title": "simulation_render_media_engine_receipt", + "kind": "feature", + "owner": "ADVANCED", + "dependsOn": [ + "WBV2-P13-003" + ], + "parityId": "ADVANCED.SIMULATION_RENDER_MEDIA", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-advanced", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-004.md", + "behavior": "Bind existing Simulation cache identity, render routing, media recovery, and server job boundaries into one conservative engine ledger.", + "outputs": [ + "advanced receipt", + "routing matrix", + "manifest" + ], + "acceptance": [ + "existing exact reports are reused", + "unsupported routes remain explicit", + "hash and lifecycle states are bound", + "no false local parity claim" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-005", + "phase": "P13", + "title": "recompute_high_value_domain_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P13-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-release", + "gate": "G10", + "card": "docs/tasks/WBV2-P13-005.md", + "behavior": "Recompute high-value domain claims from the advanced ledger and engine receipts.", + "outputs": [ + "advanced parity gate", + "limited declaration", + "manifest" + ], + "acceptance": [ + "only evidenced claims are emitted", + "inventory remainder stays explicit", + "provenance limitation stays explicit", + "full historical reproduction remains false" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P13-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P13-000/high-value-task-plan.json", + "sha256": "f0038192542f104697dfc59d4419bcf5c0ab79c725c76db5c2e2cd740cc5cf01" + } +} diff --git a/tests/golden/WBV2-P13-001/manifest.json b/tests/golden/WBV2-P13-001/manifest.json new file mode 100644 index 000000000..395ff0032 --- /dev/null +++ b/tests/golden/WBV2-P13-001/manifest.json @@ -0,0 +1,69 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-001", + "parentTask": "WBV2-P13-000", + "operation": "RECONCILE_ADVANCED_DOMAIN_LEDGER", + "status": "done", + "enablingTask": true, + "parityStateChange": false, + "runtime": "READ_ONLY_ADVANCED_MANIFEST_BATCH_SCAN", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P13-000/manifest.json", + "sha256": "d60e8c922418f0cdd02dd442240f8b89d5071e985e0f03512f014dc33a2e2f87" + }, + "inventory": { + "path": "tests/golden/WBV2-P0-002/parity-map.json", + "sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8" + }, + "gate": { + "path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json", + "sha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c" + }, + "sourceIndex": { + "path": "tests/golden/WBV2-P13-001/advanced-source-index.json", + "sha256": "97fda8a988eee44592f34dab6274d9dcf12c25cba690872e75bf9ca62fabbf5d" + }, + "ledger": { + "path": "tests/golden/WBV2-P13-001/advanced-ledger.json", + "sha256": "74d48a20362710499cc6a04cf80dc6364850feeff1f43480239c068570c2403b" + }, + "report": { + "path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json", + "sha256": "63ec0429718b6c2992a60febdee441ad24912ca149c8030c1d92faa10ffc290c" + }, + "generator": { + "path": "tools/web/generate-wbv2-advanced-ledger.mjs", + "sha256": "9877c1a06f5f5ce45e0a9eb92a9b587cf7a1d143dcd853e0930b2c55e7ad46bf" + }, + "checker": { + "path": "tools/web/check-wbv2-advanced-ledger.mjs", + "sha256": "1d48c9b448775483345fd6c32b20ac7cb99bea433c6cb99f1b118c6c7e3bdf8b" + }, + "parityPlan": { + "path": "tests/golden/WBV2-P13-001/high-value-task-plan.json", + "sha256": "f918815762675c0024d86d713adc78d38fe240fbdb0c62e23a0bdf902235b7dd" + }, + "status": { + "path": "docs/status/WBV2-P13-001.md", + "sha256": "6f20eddd5839020c1c94577af19ca8eccad617edd2dc06f6fe2e1dfe3534af95" + }, + "taskContext": { + "path": "tests/golden/WBV2-P13-001/task-context.json", + "sha256": "4d348a92b603ef041534024a8c773b63b40d536d05426360a4495d63ec5c4fd5" + } + }, + "assertions": { + "sourceManifests": 15, + "artifactRecords": 247, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "historicalDriftExplicit": true, + "unprovenDomains": 7, + "inventoryTotal": 6900, + "inventoryPending": 6618, + "inventoryClaimedComplete": 0, + "historicalReproduction": false + }, + "nextTask": "WBV2-P13-002" +} diff --git a/tests/golden/WBV2-P13-001/task-context.json b/tests/golden/WBV2-P13-001/task-context.json new file mode 100644 index 000000000..6dadd98d2 --- /dev/null +++ b/tests/golden/WBV2-P13-001/task-context.json @@ -0,0 +1,141 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-001", + "parentTask": "WBV2-P13-000", + "status": "in_progress", + "goal": "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated Blender or Chromium execution.", + "scope": { + "gap": "workflow:reconcile_advanced_domain_ledger", + "ownerFamily": "PARITY", + "implementationClass": "LOCAL_BOUNDED" + }, + "commands": [ + "node tools/web/generate-wbv2-advanced-ledger.mjs --write", + "node tools/web/check-wbv2-advanced-ledger.mjs", + "node tools/web/check-task-context.mjs --task WBV2-P13-001 --write" + ], + "inputPaths": [], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 3642, + "contextRemainingTokens": 910 + }, + "source": { + "bytes": 6262, + "tokens": 1566 + }, + "selected": [], + "excluded": [], + "totals": { + "files": 0, + "bytes": 0, + "tokens": 0 + } + }, + "exitCriteria": [ + "source manifests are hash-verified", + "existing reports are classified conservatively", + "no repeated Blender/Chromium run", + "unproven advanced domains stay explicit" + ], + "nextTask": "WBV2-P13-002", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P13-001.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P13-000/manifest.json", + "parentStatus": "docs/status/WBV2-P13-000.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P13-001.md", + "tests/golden/WBV2-P13-000/manifest.json", + "docs/status/WBV2-P13-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-P13-000", + "parentTask": "WBV2-P12-005", + "status": "done", + "nextTask": "WBV2-P13-001", + "artifactCount": 8 + }, + "statusSummary": [ + "# WBV2-P13-000 status", + "- task: `WBV2-P13-000`; parent: `WBV2-P12-005`; status: `done`", + "- nextTask: `WBV2-P13-001`", + "High-value domain continuation is authorized. P13 starts with a read-only ledger to eliminate repeated validation, then expands only domains with real source receipts and compiled WASM entrypoints." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1176, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 35, + "taskTokens": 294 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P13-001.md", + "bytes": 1176, + "lines": 35, + "tokens": 294 + }, + { + "path": "tests/golden/WBV2-P13-000/manifest.json", + "bytes": 1971, + "lines": 61, + "tokens": 493 + }, + { + "path": "docs/status/WBV2-P13-000.md", + "bytes": 312, + "lines": 7, + "tokens": 78 + } + ], + "sourceTokens": 1566, + "evidenceFiles": 0, + "evidenceBytes": 0, + "evidenceTokens": 0, + "totalTokens": 1566, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 2590, + "serializedContextTokens": 637, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P13-002/geometry-nodes-production.json b/tests/golden/WBV2-P13-002/geometry-nodes-production.json new file mode 100644 index 000000000..c7df8e57a --- /dev/null +++ b/tests/golden/WBV2-P13-002/geometry-nodes-production.json @@ -0,0 +1,84 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-002", + "operation": "GEOMETRY_NODES_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "baseRevision": 1, + "afterRevision": 1, + "graphCount": 3, + "hashesBefore": [ + { + "name": "WebGeometryNodes", + "graphHash": "2a72172aad0af64beb3100a6b0ef3a0eed5a19fbb9803ed095d77b0532724f6e", + "nodes": [ + "GeometryNodeTransform", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 2 + }, + { + "name": "WebGeometryNodesSetPosition", + "graphHash": "4c18a427928f3a0c4d12e7231f535210ef8630c5b681e976635528373dc21f4d", + "nodes": [ + "GeometryNodeSetPosition", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 2 + }, + { + "name": "WebGeometryNodesSimulation", + "graphHash": "ea41406472774710395cd3fd778b642aa1063799a95934cd3c9c4a870935099a", + "nodes": [ + "GeometryNodeSimulationInput", + "GeometryNodeSimulationOutput", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 3 + } + ], + "hashesAfter": [ + { + "name": "WebGeometryNodes", + "graphHash": "2a72172aad0af64beb3100a6b0ef3a0eed5a19fbb9803ed095d77b0532724f6e", + "nodes": [ + "GeometryNodeTransform", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 2 + }, + { + "name": "WebGeometryNodesSetPosition", + "graphHash": "4c18a427928f3a0c4d12e7231f535210ef8630c5b681e976635528373dc21f4d", + "nodes": [ + "GeometryNodeSetPosition", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 2 + }, + { + "name": "WebGeometryNodesSimulation", + "graphHash": "ea41406472774710395cd3fd778b642aa1063799a95934cd3c9c4a870935099a", + "nodes": [ + "GeometryNodeSimulationInput", + "GeometryNodeSimulationOutput", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 3 + } + ], + "unsupportedName": "WebGeometryNodesSimulation", + "attempt": { + "code": "GN_NODE_UNSUPPORTED", + "message": "N-012 GEOMETRY_NODE_GRAPH blocked: unsupported node type: GeometryNodeSimulationInput" + }, + "savedSha256": "f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9", + "sourceSha256": "f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9", + "saveReopenExact": true +} diff --git a/tests/golden/WBV2-P13-002/geometry-nodes-production.second.json b/tests/golden/WBV2-P13-002/geometry-nodes-production.second.json new file mode 100644 index 000000000..c7df8e57a --- /dev/null +++ b/tests/golden/WBV2-P13-002/geometry-nodes-production.second.json @@ -0,0 +1,84 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-002", + "operation": "GEOMETRY_NODES_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "baseRevision": 1, + "afterRevision": 1, + "graphCount": 3, + "hashesBefore": [ + { + "name": "WebGeometryNodes", + "graphHash": "2a72172aad0af64beb3100a6b0ef3a0eed5a19fbb9803ed095d77b0532724f6e", + "nodes": [ + "GeometryNodeTransform", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 2 + }, + { + "name": "WebGeometryNodesSetPosition", + "graphHash": "4c18a427928f3a0c4d12e7231f535210ef8630c5b681e976635528373dc21f4d", + "nodes": [ + "GeometryNodeSetPosition", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 2 + }, + { + "name": "WebGeometryNodesSimulation", + "graphHash": "ea41406472774710395cd3fd778b642aa1063799a95934cd3c9c4a870935099a", + "nodes": [ + "GeometryNodeSimulationInput", + "GeometryNodeSimulationOutput", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 3 + } + ], + "hashesAfter": [ + { + "name": "WebGeometryNodes", + "graphHash": "2a72172aad0af64beb3100a6b0ef3a0eed5a19fbb9803ed095d77b0532724f6e", + "nodes": [ + "GeometryNodeTransform", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 2 + }, + { + "name": "WebGeometryNodesSetPosition", + "graphHash": "4c18a427928f3a0c4d12e7231f535210ef8630c5b681e976635528373dc21f4d", + "nodes": [ + "GeometryNodeSetPosition", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 2 + }, + { + "name": "WebGeometryNodesSimulation", + "graphHash": "ea41406472774710395cd3fd778b642aa1063799a95934cd3c9c4a870935099a", + "nodes": [ + "GeometryNodeSimulationInput", + "GeometryNodeSimulationOutput", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 3 + } + ], + "unsupportedName": "WebGeometryNodesSimulation", + "attempt": { + "code": "GN_NODE_UNSUPPORTED", + "message": "N-012 GEOMETRY_NODE_GRAPH blocked: unsupported node type: GeometryNodeSimulationInput" + }, + "savedSha256": "f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9", + "sourceSha256": "f3820511f791769837d75be092934130c397cf46ee0acf79db28efca9a7948c9", + "saveReopenExact": true +} diff --git a/tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json b/tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json new file mode 100644 index 000000000..c248302ff --- /dev/null +++ b/tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json @@ -0,0 +1,73 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-002", + "operation": "GEOMETRY_NODES_ENGINE_RECEIPT", + "status": "PASS", + "browser": "chromium", + "queueMutation": false, + "source": { + "task": "WBV2-P4-002", + "manifest": "tests/golden/WBV2-P4-002/manifest.json", + "manifestSha256": "2b9e907fa11470b354bbb98695696bcdfae5c654ef03373b1eb2230098f28142", + "report": "tests/golden/WBV2-P4-002/nodes-report.json", + "reportSha256": "258bbbcb5ba4b1a5b8163f2841b833397ff560357538b4a419381ec9a67af8c7", + "reusedReadOnly": true + }, + "production": { + "report": "tests/golden/WBV2-P13-002/geometry-nodes-production.json", + "reportSha256": "162456733559afde374edb97b7688145c74480a990b4f47d84842df44776a7f3", + "secondReport": "tests/golden/WBV2-P13-002/geometry-nodes-production.second.json", + "secondReportSha256": "162456733559afde374edb97b7688145c74480a990b4f47d84842df44776a7f3", + "deterministic": true, + "graphCount": 3, + "hashes": [ + { + "name": "WebGeometryNodes", + "graphHash": "2a72172aad0af64beb3100a6b0ef3a0eed5a19fbb9803ed095d77b0532724f6e", + "nodes": [ + "GeometryNodeTransform", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 2 + }, + { + "name": "WebGeometryNodesSetPosition", + "graphHash": "4c18a427928f3a0c4d12e7231f535210ef8630c5b681e976635528373dc21f4d", + "nodes": [ + "GeometryNodeSetPosition", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 2 + }, + { + "name": "WebGeometryNodesSimulation", + "graphHash": "ea41406472774710395cd3fd778b642aa1063799a95934cd3c9c4a870935099a", + "nodes": [ + "GeometryNodeSimulationInput", + "GeometryNodeSimulationOutput", + "NodeGroupInput", + "NodeGroupOutput" + ], + "links": 3 + } + ], + "unsupportedGraph": "WebGeometryNodesSimulation", + "unsupportedAttempt": { + "code": "GN_NODE_UNSUPPORTED", + "message": "N-012 GEOMETRY_NODE_GRAPH blocked: unsupported node type: GeometryNodeSimulationInput" + }, + "saveReopen": "EXACT", + "revisionPreserved": true + }, + "assertions": { + "graphHashesStable": true, + "unsupportedNodeExplicit": true, + "unsupportedGraphRejected": true, + "saveReopenExact": true, + "mainUnchangedOnFailure": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P13-003" +} diff --git a/tests/golden/WBV2-P13-002/high-value-task-plan.json b/tests/golden/WBV2-P13-002/high-value-task-plan.json new file mode 100644 index 000000000..139ecce5a --- /dev/null +++ b/tests/golden/WBV2-P13-002/high-value-task-plan.json @@ -0,0 +1,2074 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_HIGH_VALUE_DOMAIN_EPOCH_1", + "status": "ACTIVE_HIGH_VALUE_DOMAIN_QUEUE", + "authority": "queue_reactivated_after_p12_domain_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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-000", + "phase": "P13", + "title": "authorize_high_value_domain_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P12-005" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-governance", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-000.md", + "behavior": "Authorize high-value advanced domain continuation after P12 domain parity gate.", + "outputs": [ + "continuation root", + "advanced domain plan", + "scope limits" + ], + "acceptance": [ + "P12 evidence remains hash-bound", + "existing advanced receipts are reusable", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P13-001", + "phase": "P13", + "title": "reconcile_advanced_domain_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P13-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-ledger", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-001.md", + "behavior": "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated execution.", + "outputs": [ + "advanced ledger", + "source index", + "remaining map" + ], + "acceptance": [ + "source manifests are hash-verified", + "existing reports are classified conservatively", + "no repeated Blender/Chromium run", + "unproven advanced domains stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-002", + "phase": "P13", + "title": "geometry_nodes_engine_receipt", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P13-001" + ], + "parityId": "NODES.GEOMETRY_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p13-nodes", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-002.md", + "behavior": "Bind Geometry Nodes graph read, stable graph hashes, unsupported node retention, and save/reopen to compiled WASM Main.", + "outputs": [ + "nodes receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "graph hashes are stable", + "unsupported nodes remain explicit", + "save/reopen is exact", + "malformed graph and budget cases fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-003", + "phase": "P13", + "title": "rig_pose_engine_receipt", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P13-002" + ], + "parityId": "RIG.POSE_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-rig", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-003.md", + "behavior": "Bind armature pose, constraints, and bounded skin data to compiled WASM Main with exact reopen.", + "outputs": [ + "rig receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "stable bone IDs and matrices are preserved", + "unsupported constraint is explicit", + "save/reopen is exact", + "malformed pose input fails closed" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-004", + "phase": "P13", + "title": "simulation_render_media_engine_receipt", + "kind": "feature", + "owner": "ADVANCED", + "dependsOn": [ + "WBV2-P13-003" + ], + "parityId": "ADVANCED.SIMULATION_RENDER_MEDIA", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-advanced", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-004.md", + "behavior": "Bind existing Simulation cache identity, render routing, media recovery, and server job boundaries into one conservative engine ledger.", + "outputs": [ + "advanced receipt", + "routing matrix", + "manifest" + ], + "acceptance": [ + "existing exact reports are reused", + "unsupported routes remain explicit", + "hash and lifecycle states are bound", + "no false local parity claim" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-005", + "phase": "P13", + "title": "recompute_high_value_domain_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P13-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-release", + "gate": "G10", + "card": "docs/tasks/WBV2-P13-005.md", + "behavior": "Recompute high-value domain claims from the advanced ledger and engine receipts.", + "outputs": [ + "advanced parity gate", + "limited declaration", + "manifest" + ], + "acceptance": [ + "only evidenced claims are emitted", + "inventory remainder stays explicit", + "provenance limitation stays explicit", + "full historical reproduction remains false" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P13-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P13-001/high-value-task-plan.json", + "sha256": "f918815762675c0024d86d713adc78d38fe240fbdb0c62e23a0bdf902235b7dd" + } +} diff --git a/tests/golden/WBV2-P13-002/manifest.json b/tests/golden/WBV2-P13-002/manifest.json new file mode 100644 index 000000000..4dd467e97 --- /dev/null +++ b/tests/golden/WBV2-P13-002/manifest.json @@ -0,0 +1,74 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-002", + "parentTask": "WBV2-P13-001", + "operation": "GEOMETRY_NODES_ENGINE_RECEIPT", + "status": "done", + "enablingTask": false, + "parityStateChange": true, + "runtime": "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P13-001/manifest.json", + "sha256": "94c11f7f0744d429c41494242e42e8373949789154bec257699f62b9bfc75475" + }, + "sourceManifest": { + "path": "tests/golden/WBV2-P4-002/manifest.json", + "sha256": "2b9e907fa11470b354bbb98695696bcdfae5c654ef03373b1eb2230098f28142" + }, + "sourceReport": { + "path": "tests/golden/WBV2-P4-002/nodes-report.json", + "sha256": "258bbbcb5ba4b1a5b8163f2841b833397ff560357538b4a419381ec9a67af8c7" + }, + "production": { + "path": "tests/golden/WBV2-P13-002/geometry-nodes-production.json", + "sha256": "162456733559afde374edb97b7688145c74480a990b4f47d84842df44776a7f3" + }, + "productionSecond": { + "path": "tests/golden/WBV2-P13-002/geometry-nodes-production.second.json", + "sha256": "162456733559afde374edb97b7688145c74480a990b4f47d84842df44776a7f3" + }, + "e2e": { + "path": "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "sha256": "cce9c48cda45f029e97c3e580185f8caa6f321e6ccaf6d7b673428bc0e8ade8e" + }, + "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-geometry-nodes-receipt.mjs", + "sha256": "65a12558dbc533af051abb3695194d7cd5d3f84d694eb1ec0b3bb145420249d4" + }, + "report": { + "path": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json", + "sha256": "9c082ce56feb185cc72ede1058f465475d39baba0c408be6bad9568d8886d591" + }, + "status": { + "path": "docs/status/WBV2-P13-002.md", + "sha256": "e5802dfda1bf1c9fe15b38abf0593473d2b96c5e994c689e2c3f76e86ae1736e" + }, + "parityPlan": { + "path": "tests/golden/WBV2-P13-002/high-value-task-plan.json", + "sha256": "9c179910ac752cc65181a117c8acb5fabc9678b1320211a4094ee554f625c9ef" + }, + "taskContext": { + "path": "tests/golden/WBV2-P13-002/task-context.json", + "sha256": "057b1edbcc0d47b0d760f15c3070771f5e91616ac8e7fd1888dac0a7dc4c0697" + } + }, + "assertions": { + "graphs": 3, + "stableHashes": true, + "unsupportedRejected": true, + "saveReopen": "EXACT", + "revisionPreservedOnFailure": true, + "deterministic": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P13-003" +} diff --git a/tests/golden/WBV2-P13-002/task-context.json b/tests/golden/WBV2-P13-002/task-context.json new file mode 100644 index 000000000..881bc5efe --- /dev/null +++ b/tests/golden/WBV2-P13-002/task-context.json @@ -0,0 +1,178 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-002", + "parentTask": "WBV2-P13-001", + "status": "in_progress", + "goal": "Execute the bounded NODES domain using existing source evidence and the compiled WebEngine runtime.", + "scope": { + "gap": "workflow:geometry_nodes_engine_receipt", + "ownerFamily": "NODES", + "implementationClass": "LOCAL_BOUNDED" + }, + "commands": [ + "node tools/web/generate-wbv2-geometry-nodes-receipt.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P13-002 --write" + ], + "inputPaths": [ + "tests/golden/WBV2-P4-002/nodes-report.json" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 2715, + "contextRemainingTokens": 678 + }, + "source": { + "bytes": 7189, + "tokens": 1798 + }, + "selected": [ + { + "path": "tests/golden/WBV2-P4-002/nodes-report.json", + "bytes": 1558, + "tokens": 390 + } + ], + "excluded": [ + { + "path": "tests/files/web/modifier_geometry_nodes_scene.blend", + "bytes": 90116, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts", + "bytes": 3802, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P13-002/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P13-002.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P13-002/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 1, + "bytes": 1558, + "tokens": 390 + } + }, + "exitCriteria": [ + "graph hashes are stable", + "unsupported nodes remain explicit", + "save/reopen is exact", + "malformed graph and budget cases fail closed" + ], + "nextTask": "WBV2-P13-003", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P13-002.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P13-001/manifest.json", + "parentStatus": "docs/status/WBV2-P13-001.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P13-002.md", + "tests/golden/WBV2-P13-001/manifest.json", + "docs/status/WBV2-P13-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-P13-001", + "parentTask": "WBV2-P13-000", + "status": "done", + "nextTask": "WBV2-P13-002", + "artifactCount": 11 + }, + "statusSummary": [ + "# WBV2-P13-001 status", + "- task: `WBV2-P13-001`; parent: `WBV2-P13-000`; status: `done`", + "- advanced manifests batch-scanned: `15`; artifact records: `247`", + "- repeated Blender/Chromium runs: `0`; historical drift manifests: `15`", + "- unproven domains explicit: `GEOMETRY_NODES, RIG, SIMULATION, RENDER, MEDIA, SERVER, SECURITY`", + "- inventory: `6900` total, `6618` pending, claimed complete: `0`", + "- nextTask: `WBV2-P13-002`", + "This ledger reuses existing P3-P6 advanced domain receipts as read-only evidence and records artifact drift without rewriting historical hashes. No repeated Blender or Chromium execution was performed. Domains without a new engine-bound receipt remain explicit and cannot become feature claims from metadata alone." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1132, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 33, + "taskTokens": 283 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P13-002.md", + "bytes": 1132, + "lines": 33, + "tokens": 283 + }, + { + "path": "tests/golden/WBV2-P13-001/manifest.json", + "bytes": 2526, + "lines": 70, + "tokens": 632 + }, + { + "path": "docs/status/WBV2-P13-001.md", + "bytes": 728, + "lines": 11, + "tokens": 182 + } + ], + "sourceTokens": 1798, + "evidenceFiles": 1, + "evidenceBytes": 1558, + "evidenceTokens": 390, + "totalTokens": 2188, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3212, + "serializedContextTokens": 683, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P13-003/high-value-task-plan.json b/tests/golden/WBV2-P13-003/high-value-task-plan.json new file mode 100644 index 000000000..683bf3bc8 --- /dev/null +++ b/tests/golden/WBV2-P13-003/high-value-task-plan.json @@ -0,0 +1,2074 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_HIGH_VALUE_DOMAIN_EPOCH_1", + "status": "ACTIVE_HIGH_VALUE_DOMAIN_QUEUE", + "authority": "queue_reactivated_after_p12_domain_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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-000", + "phase": "P13", + "title": "authorize_high_value_domain_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P12-005" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-governance", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-000.md", + "behavior": "Authorize high-value advanced domain continuation after P12 domain parity gate.", + "outputs": [ + "continuation root", + "advanced domain plan", + "scope limits" + ], + "acceptance": [ + "P12 evidence remains hash-bound", + "existing advanced receipts are reusable", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P13-001", + "phase": "P13", + "title": "reconcile_advanced_domain_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P13-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-ledger", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-001.md", + "behavior": "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated execution.", + "outputs": [ + "advanced ledger", + "source index", + "remaining map" + ], + "acceptance": [ + "source manifests are hash-verified", + "existing reports are classified conservatively", + "no repeated Blender/Chromium run", + "unproven advanced domains stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-002", + "phase": "P13", + "title": "geometry_nodes_engine_receipt", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P13-001" + ], + "parityId": "NODES.GEOMETRY_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p13-nodes", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-002.md", + "behavior": "Bind Geometry Nodes graph read, stable graph hashes, unsupported node retention, and save/reopen to compiled WASM Main.", + "outputs": [ + "nodes receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "graph hashes are stable", + "unsupported nodes remain explicit", + "save/reopen is exact", + "malformed graph and budget cases fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-003", + "phase": "P13", + "title": "rig_pose_engine_receipt", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P13-002" + ], + "parityId": "RIG.POSE_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-rig", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-003.md", + "behavior": "Bind armature pose, constraints, and bounded skin data to compiled WASM Main with exact reopen.", + "outputs": [ + "rig receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "stable bone IDs and matrices are preserved", + "unsupported constraint is explicit", + "save/reopen is exact", + "malformed pose input fails closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-004", + "phase": "P13", + "title": "simulation_render_media_engine_receipt", + "kind": "feature", + "owner": "ADVANCED", + "dependsOn": [ + "WBV2-P13-003" + ], + "parityId": "ADVANCED.SIMULATION_RENDER_MEDIA", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-advanced", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-004.md", + "behavior": "Bind existing Simulation cache identity, render routing, media recovery, and server job boundaries into one conservative engine ledger.", + "outputs": [ + "advanced receipt", + "routing matrix", + "manifest" + ], + "acceptance": [ + "existing exact reports are reused", + "unsupported routes remain explicit", + "hash and lifecycle states are bound", + "no false local parity claim" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-005", + "phase": "P13", + "title": "recompute_high_value_domain_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P13-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-release", + "gate": "G10", + "card": "docs/tasks/WBV2-P13-005.md", + "behavior": "Recompute high-value domain claims from the advanced ledger and engine receipts.", + "outputs": [ + "advanced parity gate", + "limited declaration", + "manifest" + ], + "acceptance": [ + "only evidenced claims are emitted", + "inventory remainder stays explicit", + "provenance limitation stays explicit", + "full historical reproduction remains false" + ], + "status": "planned", + "ready": false, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P13-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P13-002/high-value-task-plan.json", + "sha256": "9c179910ac752cc65181a117c8acb5fabc9678b1320211a4094ee554f625c9ef" + } +} diff --git a/tests/golden/WBV2-P13-003/manifest.json b/tests/golden/WBV2-P13-003/manifest.json new file mode 100644 index 000000000..6e1813425 --- /dev/null +++ b/tests/golden/WBV2-P13-003/manifest.json @@ -0,0 +1,76 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-003", + "parentTask": "WBV2-P13-002", + "operation": "RIG_POSE_ENGINE_RECEIPT", + "status": "done", + "enablingTask": false, + "parityStateChange": true, + "runtime": "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P13-002/manifest.json", + "sha256": "e84b3a057c8e07479e77f517dade1366332effda994784b63003a604de0efb87" + }, + "sourceManifest": { + "path": "tests/golden/WBV2-P3-003/manifest.json", + "sha256": "1b97d2ca9add58a6185a21137729edc4c8b11a2d21be1682793e3d05b9ef9011" + }, + "sourceReport": { + "path": "tests/golden/WBV2-P3-003/rig-report.json", + "sha256": "13b1227a6dcb02fbbf0d618b6fc8d504fa81a9e7babec1973e9814639a5ea028" + }, + "production": { + "path": "tests/golden/WBV2-P13-003/rig-pose-production.json", + "sha256": "a8dc61adcab4da3b1043821c39e6cea0550f8b234b213155736c0b9042c3efe8" + }, + "productionSecond": { + "path": "tests/golden/WBV2-P13-003/rig-pose-production.second.json", + "sha256": "a8dc61adcab4da3b1043821c39e6cea0550f8b234b213155736c0b9042c3efe8" + }, + "e2e": { + "path": "web/tests/e2e/wbv2-rig-pose-production.spec.ts", + "sha256": "3935e60cf203a21b018767e24bb2ecb6d30e062d0f24259ce584a90437b852e1" + }, + "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-rig-pose-receipt.mjs", + "sha256": "1014554e6ae5b32421ca425498bb811f0f11086e10c2e58150362f360a2726a9" + }, + "report": { + "path": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json", + "sha256": "c92b0299d00fe8b109b7d0f36abe54c38c2efe18e6e30b81eeaeba5b2d54471e" + }, + "status": { + "path": "docs/status/WBV2-P13-003.md", + "sha256": "c6b81a4f3db50108e08b8134adae14ed920bf4a3b5b8eca2ac3d7d92fb13e6a1" + }, + "parityPlan": { + "path": "tests/golden/WBV2-P13-003/high-value-task-plan.json", + "sha256": "d23125185535de120947912a8f3f38db879740376442e62fb5f48418e430101e" + }, + "taskContext": { + "path": "tests/golden/WBV2-P13-003/task-context.json", + "sha256": "fbe626f8a7100341941d0fe4d22a4fe3a55c1c6a72870822f94eb32645b05b3b" + } + }, + "assertions": { + "boneCount": 2, + "stablePoseMatrices": true, + "stableSkinIdentity": true, + "constraintEdit": "EXACT", + "saveReopen": "EXACT", + "malformedRejected": true, + "shapeKeyObservationExplicit": true, + "deterministic": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P13-004" +} diff --git a/tests/golden/WBV2-P13-003/rig-pose-production.json b/tests/golden/WBV2-P13-003/rig-pose-production.json new file mode 100644 index 000000000..12ecf70d2 --- /dev/null +++ b/tests/golden/WBV2-P13-003/rig-pose-production.json @@ -0,0 +1,363 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-003", + "operation": "RIG_POSE_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "baseRevision": 1, + "editedRevision": 2, + "before": { + "armatureId": "armature:WBV2P3003Armature", + "bones": [ + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "name": "WBV2P3003Root", + "parentId": null, + "head": [ + 0, + 0, + 0 + ], + "tail": [ + 0, + 0, + 1 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip", + "name": "WBV2P3003Tip", + "parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "head": [ + 0, + 0, + 1 + ], + "tail": [ + 0, + 0, + 2 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0.7568745613098145, + 0.6535601019859314, + 0, + 0, + -0.6535601019859314, + 0.7568745613098145, + 0, + 0, + 0, + 1, + 1 + ] + } + ], + "meshId": "mesh:WBV2P3003SkinnedMesh", + "vertexCount": 8, + "skinWeights": { + "boneNames": [ + "WBV2P3003Root", + "WBV2P3003Tip" + ], + "armatureId": "armature:WBV2P3003Armature", + "jointIds": [ + "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "bone:armature:WBV2P3003Armature:WBV2P3003Tip" + ] + }, + "shapeKeyCount": 1 + }, + "after": { + "armatureId": "armature:WBV2P3003Armature", + "bones": [ + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "name": "WBV2P3003Root", + "parentId": null, + "head": [ + 0, + 0, + 0 + ], + "tail": [ + 0, + 0, + 1 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip", + "name": "WBV2P3003Tip", + "parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "head": [ + 0, + 0, + 1 + ], + "tail": [ + 0, + 0, + 2 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0.7568745613098145, + 0.6535601019859314, + 0, + 0, + -0.6535601019859314, + 0.7568745613098145, + 0, + 0, + 0, + 1, + 1 + ] + } + ], + "meshId": "mesh:WBV2P3003SkinnedMesh", + "vertexCount": 8, + "skinWeights": { + "boneNames": [ + "WBV2P3003Root", + "WBV2P3003Tip" + ], + "armatureId": "armature:WBV2P3003Armature", + "jointIds": [ + "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "bone:armature:WBV2P3003Armature:WBV2P3003Tip" + ] + }, + "shapeKeyCount": 1 + }, + "afterMalformed": { + "armatureId": "armature:WBV2P3003Armature", + "bones": [ + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "name": "WBV2P3003Root", + "parentId": null, + "head": [ + 0, + 0, + 0 + ], + "tail": [ + 0, + 0, + 1 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip", + "name": "WBV2P3003Tip", + "parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "head": [ + 0, + 0, + 1 + ], + "tail": [ + 0, + 0, + 2 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0.7568745613098145, + 0.6535601019859314, + 0, + 0, + -0.6535601019859314, + 0.7568745613098145, + 0, + 0, + 0, + 1, + 1 + ] + } + ], + "meshId": "mesh:WBV2P3003SkinnedMesh", + "vertexCount": 8, + "skinWeights": { + "boneNames": [ + "WBV2P3003Root", + "WBV2P3003Tip" + ], + "armatureId": "armature:WBV2P3003Armature", + "jointIds": [ + "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "bone:armature:WBV2P3003Armature:WBV2P3003Tip" + ] + }, + "shapeKeyCount": 1 + }, + "malformed": { + "code": "INVALID_ARGUMENT", + "message": "constraint was not found" + }, + "reopened": { + "armatureId": "armature:WBV2P3003Armature", + "bones": [ + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "name": "WBV2P3003Root", + "parentId": null, + "head": [ + 0, + 0, + 0 + ], + "tail": [ + 0, + 0, + 1 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip", + "name": "WBV2P3003Tip", + "parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "head": [ + 0, + 0, + 1 + ], + "tail": [ + 0, + 0, + 2 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0.7568745613098145, + 0.6535601019859314, + 0, + 0, + -0.6535601019859314, + 0.7568745613098145, + 0, + 0, + 0, + 1, + 1 + ] + } + ], + "meshId": "mesh:WBV2P3003SkinnedMesh", + "vertexCount": 8, + "skinWeights": { + "boneNames": [ + "WBV2P3003Root", + "WBV2P3003Tip" + ], + "armatureId": "armature:WBV2P3003Armature", + "jointIds": [ + "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "bone:armature:WBV2P3003Armature:WBV2P3003Tip" + ] + }, + "shapeKeyCount": 1 + }, + "reopenedConstraint": { + "enabled": false, + "influence": 0.4000000059604645, + "name": "WBV2P3003BoundedObjectConstraint", + "type": "CONSTRAINT_6", + "typeCode": 6 + }, + "savedSha256": "93678692111f25c92516e7e93f5bd7f73835d6700439d8869dd5e61a1d5d677f", + "sourceSha256": "1044ac6b81561ef0f5f22578c279de82fcb2d543eff822d0375d59f35bb6d142", + "saveReopenExact": true +} diff --git a/tests/golden/WBV2-P13-003/rig-pose-production.second.json b/tests/golden/WBV2-P13-003/rig-pose-production.second.json new file mode 100644 index 000000000..12ecf70d2 --- /dev/null +++ b/tests/golden/WBV2-P13-003/rig-pose-production.second.json @@ -0,0 +1,363 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-003", + "operation": "RIG_POSE_ENGINE_CHROMIUM", + "browser": "chromium", + "queueMutation": false, + "baseRevision": 1, + "editedRevision": 2, + "before": { + "armatureId": "armature:WBV2P3003Armature", + "bones": [ + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "name": "WBV2P3003Root", + "parentId": null, + "head": [ + 0, + 0, + 0 + ], + "tail": [ + 0, + 0, + 1 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip", + "name": "WBV2P3003Tip", + "parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "head": [ + 0, + 0, + 1 + ], + "tail": [ + 0, + 0, + 2 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0.7568745613098145, + 0.6535601019859314, + 0, + 0, + -0.6535601019859314, + 0.7568745613098145, + 0, + 0, + 0, + 1, + 1 + ] + } + ], + "meshId": "mesh:WBV2P3003SkinnedMesh", + "vertexCount": 8, + "skinWeights": { + "boneNames": [ + "WBV2P3003Root", + "WBV2P3003Tip" + ], + "armatureId": "armature:WBV2P3003Armature", + "jointIds": [ + "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "bone:armature:WBV2P3003Armature:WBV2P3003Tip" + ] + }, + "shapeKeyCount": 1 + }, + "after": { + "armatureId": "armature:WBV2P3003Armature", + "bones": [ + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "name": "WBV2P3003Root", + "parentId": null, + "head": [ + 0, + 0, + 0 + ], + "tail": [ + 0, + 0, + 1 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip", + "name": "WBV2P3003Tip", + "parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "head": [ + 0, + 0, + 1 + ], + "tail": [ + 0, + 0, + 2 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0.7568745613098145, + 0.6535601019859314, + 0, + 0, + -0.6535601019859314, + 0.7568745613098145, + 0, + 0, + 0, + 1, + 1 + ] + } + ], + "meshId": "mesh:WBV2P3003SkinnedMesh", + "vertexCount": 8, + "skinWeights": { + "boneNames": [ + "WBV2P3003Root", + "WBV2P3003Tip" + ], + "armatureId": "armature:WBV2P3003Armature", + "jointIds": [ + "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "bone:armature:WBV2P3003Armature:WBV2P3003Tip" + ] + }, + "shapeKeyCount": 1 + }, + "afterMalformed": { + "armatureId": "armature:WBV2P3003Armature", + "bones": [ + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "name": "WBV2P3003Root", + "parentId": null, + "head": [ + 0, + 0, + 0 + ], + "tail": [ + 0, + 0, + 1 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip", + "name": "WBV2P3003Tip", + "parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "head": [ + 0, + 0, + 1 + ], + "tail": [ + 0, + 0, + 2 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0.7568745613098145, + 0.6535601019859314, + 0, + 0, + -0.6535601019859314, + 0.7568745613098145, + 0, + 0, + 0, + 1, + 1 + ] + } + ], + "meshId": "mesh:WBV2P3003SkinnedMesh", + "vertexCount": 8, + "skinWeights": { + "boneNames": [ + "WBV2P3003Root", + "WBV2P3003Tip" + ], + "armatureId": "armature:WBV2P3003Armature", + "jointIds": [ + "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "bone:armature:WBV2P3003Armature:WBV2P3003Tip" + ] + }, + "shapeKeyCount": 1 + }, + "malformed": { + "code": "INVALID_ARGUMENT", + "message": "constraint was not found" + }, + "reopened": { + "armatureId": "armature:WBV2P3003Armature", + "bones": [ + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "name": "WBV2P3003Root", + "parentId": null, + "head": [ + 0, + 0, + 0 + ], + "tail": [ + 0, + 0, + 1 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + -1, + 0, + 0, + 0, + 0, + 0, + 1 + ] + }, + { + "id": "bone:armature:WBV2P3003Armature:WBV2P3003Tip", + "name": "WBV2P3003Tip", + "parentId": "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "head": [ + 0, + 0, + 1 + ], + "tail": [ + 0, + 0, + 2 + ], + "poseMatrix": [ + 1, + 0, + 0, + 0, + 0, + 0.7568745613098145, + 0.6535601019859314, + 0, + 0, + -0.6535601019859314, + 0.7568745613098145, + 0, + 0, + 0, + 1, + 1 + ] + } + ], + "meshId": "mesh:WBV2P3003SkinnedMesh", + "vertexCount": 8, + "skinWeights": { + "boneNames": [ + "WBV2P3003Root", + "WBV2P3003Tip" + ], + "armatureId": "armature:WBV2P3003Armature", + "jointIds": [ + "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "bone:armature:WBV2P3003Armature:WBV2P3003Tip" + ] + }, + "shapeKeyCount": 1 + }, + "reopenedConstraint": { + "enabled": false, + "influence": 0.4000000059604645, + "name": "WBV2P3003BoundedObjectConstraint", + "type": "CONSTRAINT_6", + "typeCode": 6 + }, + "savedSha256": "93678692111f25c92516e7e93f5bd7f73835d6700439d8869dd5e61a1d5d677f", + "sourceSha256": "1044ac6b81561ef0f5f22578c279de82fcb2d543eff822d0375d59f35bb6d142", + "saveReopenExact": true +} diff --git a/tests/golden/WBV2-P13-003/rig-pose-receipt-report.json b/tests/golden/WBV2-P13-003/rig-pose-receipt-report.json new file mode 100644 index 000000000..9b6211e1d --- /dev/null +++ b/tests/golden/WBV2-P13-003/rig-pose-receipt-report.json @@ -0,0 +1,64 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-003", + "operation": "RIG_POSE_ENGINE_RECEIPT", + "status": "PASS", + "browser": "chromium", + "queueMutation": false, + "source": { + "task": "WBV2-P3-003", + "manifest": "tests/golden/WBV2-P3-003/manifest.json", + "manifestSha256": "1b97d2ca9add58a6185a21137729edc4c8b11a2d21be1682793e3d05b9ef9011", + "report": "tests/golden/WBV2-P3-003/rig-report.json", + "reportSha256": "13b1227a6dcb02fbbf0d618b6fc8d504fa81a9e7babec1973e9814639a5ea028", + "desktopExact": true, + "wasmExact": true, + "sourceSaveReopenExact": true, + "desktopShapeKeyCount": 2, + "wasmObservedShapeKeyCount": 1, + "shapeKeyObservation": "reader exposes one non-Basis key" + }, + "production": { + "report": "tests/golden/WBV2-P13-003/rig-pose-production.json", + "reportSha256": "a8dc61adcab4da3b1043821c39e6cea0550f8b234b213155736c0b9042c3efe8", + "secondReport": "tests/golden/WBV2-P13-003/rig-pose-production.second.json", + "secondReportSha256": "a8dc61adcab4da3b1043821c39e6cea0550f8b234b213155736c0b9042c3efe8", + "deterministic": true, + "armatureId": "armature:WBV2P3003Armature", + "boneCount": 2, + "meshId": "mesh:WBV2P3003SkinnedMesh", + "skinWeights": { + "boneNames": [ + "WBV2P3003Root", + "WBV2P3003Tip" + ], + "armatureId": "armature:WBV2P3003Armature", + "jointIds": [ + "bone:armature:WBV2P3003Armature:WBV2P3003Root", + "bone:armature:WBV2P3003Armature:WBV2P3003Tip" + ] + }, + "constraintEdit": { + "revisionDelta": 1, + "objectId": "object:WBV2P3003SkinnedMeshObject", + "constraint": "WBV2P3003BoundedObjectConstraint", + "enabled": false, + "influence": 0.4000000059604645 + }, + "malformed": { + "code": "INVALID_ARGUMENT", + "message": "constraint was not found" + }, + "saveReopen": "EXACT" + }, + "assertions": { + "stableBoneIds": true, + "poseMatricesPreserved": true, + "skinIdentityPreserved": true, + "unsupportedShapeKeyObservationExplicit": true, + "malformedConstraintRejected": true, + "saveReopenExact": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P13-004" +} diff --git a/tests/golden/WBV2-P13-003/task-context.json b/tests/golden/WBV2-P13-003/task-context.json new file mode 100644 index 000000000..4dd143fab --- /dev/null +++ b/tests/golden/WBV2-P13-003/task-context.json @@ -0,0 +1,177 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-003", + "parentTask": "WBV2-P13-002", + "status": "in_progress", + "goal": "Execute the bounded RIG domain using existing source evidence and the compiled WebEngine runtime.", + "scope": { + "gap": "workflow:rig_pose_engine_receipt", + "ownerFamily": "RIG", + "implementationClass": "LOCAL_BOUNDED" + }, + "commands": [ + "node tools/web/generate-wbv2-rig-pose-receipt.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P13-003 --write" + ], + "inputPaths": [ + "tests/golden/WBV2-P3-003/rig-report.json" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 2650, + "contextRemainingTokens": 662 + }, + "source": { + "bytes": 7254, + "tokens": 1814 + }, + "selected": [ + { + "path": "tests/golden/WBV2-P3-003/rig-report.json", + "bytes": 1104, + "tokens": 276 + } + ], + "excluded": [ + { + "path": "tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend", + "bytes": 88676, + "reason": "EVIDENCE_BYTE_BUDGET" + }, + { + "path": "web/tests/e2e/wbv2-rig-pose-production.spec.ts", + "bytes": 4959, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P13-003/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P13-003.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P13-003/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 1, + "bytes": 1104, + "tokens": 276 + } + }, + "exitCriteria": [ + "stable bone IDs and matrices are preserved", + "unsupported constraint is explicit", + "save/reopen is exact", + "malformed pose input fails closed" + ], + "nextTask": "WBV2-P13-004", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P13-003.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P13-002/manifest.json", + "parentStatus": "docs/status/WBV2-P13-002.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P13-003.md", + "tests/golden/WBV2-P13-002/manifest.json", + "docs/status/WBV2-P13-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-P13-002", + "parentTask": "WBV2-P13-001", + "status": "done", + "nextTask": "WBV2-P13-003", + "artifactCount": 13 + }, + "statusSummary": [ + "# WBV2-P13-002 status", + "- task: `WBV2-P13-002`; parent: `WBV2-P13-001`; status: `done`", + "- graph count: `3`; graph hashes: stable", + "- unsupported Simulation graph: rejected before Main mutation", + "- save/reopen: `EXACT`; repeated execution: deterministic", + "- nextTask: `WBV2-P13-003`", + "Existing P4-002 Geometry Nodes evidence is reused read-only. The production Chromium test loads the actual WebEngine WASM Main, verifies stable graph hashes and unsupported-node retention, and rejects an unsupported graph without changing revision." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1108, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 33, + "taskTokens": 277 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P13-003.md", + "bytes": 1108, + "lines": 33, + "tokens": 277 + }, + { + "path": "tests/golden/WBV2-P13-002/manifest.json", + "bytes": 2819, + "lines": 75, + "tokens": 705 + }, + { + "path": "docs/status/WBV2-P13-002.md", + "bytes": 524, + "lines": 10, + "tokens": 131 + } + ], + "sourceTokens": 1814, + "evidenceFiles": 1, + "evidenceBytes": 1104, + "evidenceTokens": 276, + "totalTokens": 2090, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3114, + "serializedContextTokens": 680, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json b/tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json new file mode 100644 index 000000000..45a030f42 --- /dev/null +++ b/tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json @@ -0,0 +1,215 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-004", + "operation": "ADVANCED_DOMAIN_ENGINE_RECEIPT", + "status": "PASS", + "browser": "chromium", + "queueMutation": false, + "policy": { + "existingReceiptsReused": true, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "noFalseLocalParity": true, + "blockedRoutesExplicit": true, + "historicalReproduction": false + }, + "sourceLedger": { + "path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json", + "sha256": "63ec0429718b6c2992a60febdee441ad24912ca149c8030c1d92faa10ffc290c", + "sourceManifests": 15, + "artifactRecords": 247 + }, + "domains": [ + { + "domain": "SIMULATION", + "task": "WBV2-P4-004", + "manifest": "tests/golden/WBV2-P4-004/manifest.json", + "manifestSha256": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016", + "report": "tests/golden/WBV2-P4-004/simulation-report.json", + "reportSha256": "ef0575debda0bd76e106a63f9a321f6bd1640cbc84bb7b40e17a4acf360c425a", + "proof": "cache identity, cancellation, LRU, restart, exact reopen", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 5, + "lifecycle": { + "recovery": null, + "unsupported": { + "staleRevision": "CACHE_KEY_CHANGED_AND_NOT_PUBLISHED", + "corruptPayload": "HASH_MISMATCH", + "cancelledVerification": "CANCELLED_WITHOUT_PUBLISH", + "lruProtected": "PROTECTED_AND_BUDGET_SATISFIED", + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION" + } + } + }, + { + "domain": "RENDER", + "task": "WBV2-P5-001", + "manifest": "tests/golden/WBV2-P5-001/manifest.json", + "manifestSha256": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e", + "report": "tests/golden/WBV2-P5-001/render-report.json", + "reportSha256": "801c6c93df9cb16205b0489f66d9f3b53447b21db1a99e5fb80b71bd2c184f95", + "proof": "bounded Eevee route READY; unsupported routes BLOCKED; pixel mismatch explicit", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 4, + "lifecycle": { + "recovery": { + "cancellation": "OPEN_CANCELLED", + "deviceLoss": "RELEASED", + "temporaryResourcesAfter": 0 + }, + "unsupported": { + "unsupportedRoute": "BLOCKED_WITHOUT_LOCAL_SUCCESS", + "malformedRoute": "REJECTED_BEFORE_COMMIT", + "pixelMismatch": "RENDER_REFERENCE_MISMATCH", + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION" + } + } + }, + { + "domain": "MEDIA", + "task": "WBV2-P5-002", + "manifest": "tests/golden/WBV2-P5-002/manifest.json", + "manifestSha256": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2", + "report": "tests/golden/WBV2-P5-002/media-report.json", + "reportSha256": "90cf9e6eb6f09f2e3e0a25740e5b3e674209efd6f7dbf7fd91a7999ded35e3a0", + "proof": "compositor/sequencer available; codec and budget boundaries explicit", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 4, + "lifecycle": { + "recovery": { + "domains": [ + "RENDER", + "COMPOSITOR", + "MEDIA" + ], + "cancelled": true, + "budgetBlocked": true, + "restart": "RECOVERED", + "resourcesAfter": 0 + }, + "unsupported": { + "staleSeek": "REVISION_CONFLICT", + "cancelledCompositor": "COMPOSITOR_CANCELLED", + "codecHashDrift": "SEQUENCER_CODEC_UNSUPPORTED", + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION" + } + } + }, + { + "domain": "SERVER", + "task": "WBV2-P5-003", + "manifest": "tests/golden/WBV2-P5-003/manifest.json", + "manifestSha256": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c", + "report": "tests/golden/WBV2-P5-003/server-job-report.json", + "reportSha256": "656546af44238e2b07c44a1f8cccedf996ba639f6cb9ac1c38a4ec30eeafeca3", + "proof": "idempotency, conflict, hash and cancel/timeout/oom boundaries", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 7, + "lifecycle": { + "recovery": null, + "unsupported": { + "staleResult": "SERVER_RENDER_BINDING_MISMATCH", + "outputHashDrift": "SERVER_RENDER_OUTPUT_HASH_MISMATCH", + "malformedSettings": "SERVER_RENDER_SETTINGS_INVALID", + "cancel": "SERVER_JOB_CANCELLED", + "timeout": "SERVER_JOB_TIMEOUT", + "oom": "SERVER_JOB_OOM", + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION" + } + } + }, + { + "domain": "SECURITY", + "task": "WBV2-P6-001", + "manifest": "tests/golden/WBV2-P6-001/manifest.json", + "manifestSha256": "e8bb64d618b630b34292501d44fe46c55de3a57ddf0fccb4b7974c6a479456a4", + "report": "tests/golden/WBV2-P6-001/scripting-report.json", + "reportSha256": "9af7be5ddc2db3893a037294e073487a62c250fb9cb308edcdf0e335f0d66f16", + "proof": "default deny, audit, sandbox and filesystem/network boundaries", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 9, + "lifecycle": { + "recovery": null, + "unsupported": { + "autorun": "SCRIPT_POLICY_DENIED", + "network": "SCRIPT_POLICY_DENIED", + "addonInstall": "ADDON_INSTALL_BLOCKED", + "driverExpressions": "DRIVER_EXECUTION_BLOCKED", + "signature": "SCRIPT_SIGNATURE_INVALID", + "sandbox": "SCRIPT_SANDBOX_UNAVAILABLE", + "lateResult": "SCRIPT_SANDBOX_LATE_RESULT", + "filesystemEscape": "SCRIPT_MANIFEST_INVALID", + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION" + } + } + }, + { + "domain": "RELIABILITY", + "task": "WBV2-P6-002", + "manifest": "tests/golden/WBV2-P6-002/manifest.json", + "manifestSha256": "b66e193b81c0c592964c874902d0ee024c4877610fd7fa92aee2a961f69d01ba", + "report": "tests/golden/WBV2-P6-002/performance-report.json", + "reportSha256": "dfe297e8e024dc2ae581f744ff4fb18f19cd6083c707f014ed345a8d95da421e", + "proof": "budget thresholds, fault recovery, quarantine and resource release", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 3, + "lifecycle": { + "recovery": null, + "unsupported": { + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION", + "allFaultsNoPublish": true, + "cache": "QUARANTINED" + } + } + }, + { + "domain": "RELEASE", + "task": "WBV2-P6-003", + "manifest": "tests/golden/WBV2-P6-003/manifest.json", + "manifestSha256": "22a773feb29435ec0c29eaa720e7ae39c5f87455c678b78ae6c02b4985fea54d", + "report": "tests/golden/WBV2-P6-003/release-report.json", + "reportSha256": "2111b4651f01966c4f47e8a1f5afc581b4bf2056e733240f49a546aad1faae0b", + "proof": "offline/source/binary package, CI, SBOM and rollback", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 3, + "lifecycle": { + "recovery": null, + "unsupported": { + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION", + "hashDrift": "BLOCKED_BEFORE_PUBLISH", + "failedCi": "BLOCKED_BEFORE_PUBLISH" + } + } + } + ], + "summary": { + "domains": 7, + "exactReports": 7, + "repeatedRuns": 0, + "unsupportedRoutesExplicit": true, + "inventoryRemaining": 6618, + "inventoryClaimedComplete": 0 + }, + "nextTask": "WBV2-P13-005" +} diff --git a/tests/golden/WBV2-P13-004/high-value-task-plan.json b/tests/golden/WBV2-P13-004/high-value-task-plan.json new file mode 100644 index 000000000..c5d42925c --- /dev/null +++ b/tests/golden/WBV2-P13-004/high-value-task-plan.json @@ -0,0 +1,2074 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_HIGH_VALUE_DOMAIN_EPOCH_1", + "status": "ACTIVE_HIGH_VALUE_DOMAIN_QUEUE", + "authority": "queue_reactivated_after_p12_domain_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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-000", + "phase": "P13", + "title": "authorize_high_value_domain_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P12-005" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-governance", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-000.md", + "behavior": "Authorize high-value advanced domain continuation after P12 domain parity gate.", + "outputs": [ + "continuation root", + "advanced domain plan", + "scope limits" + ], + "acceptance": [ + "P12 evidence remains hash-bound", + "existing advanced receipts are reusable", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P13-001", + "phase": "P13", + "title": "reconcile_advanced_domain_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P13-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-ledger", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-001.md", + "behavior": "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated execution.", + "outputs": [ + "advanced ledger", + "source index", + "remaining map" + ], + "acceptance": [ + "source manifests are hash-verified", + "existing reports are classified conservatively", + "no repeated Blender/Chromium run", + "unproven advanced domains stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-002", + "phase": "P13", + "title": "geometry_nodes_engine_receipt", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P13-001" + ], + "parityId": "NODES.GEOMETRY_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p13-nodes", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-002.md", + "behavior": "Bind Geometry Nodes graph read, stable graph hashes, unsupported node retention, and save/reopen to compiled WASM Main.", + "outputs": [ + "nodes receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "graph hashes are stable", + "unsupported nodes remain explicit", + "save/reopen is exact", + "malformed graph and budget cases fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-003", + "phase": "P13", + "title": "rig_pose_engine_receipt", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P13-002" + ], + "parityId": "RIG.POSE_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-rig", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-003.md", + "behavior": "Bind armature pose, constraints, and bounded skin data to compiled WASM Main with exact reopen.", + "outputs": [ + "rig receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "stable bone IDs and matrices are preserved", + "unsupported constraint is explicit", + "save/reopen is exact", + "malformed pose input fails closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-004", + "phase": "P13", + "title": "simulation_render_media_engine_receipt", + "kind": "feature", + "owner": "ADVANCED", + "dependsOn": [ + "WBV2-P13-003" + ], + "parityId": "ADVANCED.SIMULATION_RENDER_MEDIA", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-advanced", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-004.md", + "behavior": "Bind existing Simulation cache identity, render routing, media recovery, and server job boundaries into one conservative engine ledger.", + "outputs": [ + "advanced receipt", + "routing matrix", + "manifest" + ], + "acceptance": [ + "existing exact reports are reused", + "unsupported routes remain explicit", + "hash and lifecycle states are bound", + "no false local parity claim" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-005", + "phase": "P13", + "title": "recompute_high_value_domain_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P13-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-release", + "gate": "G10", + "card": "docs/tasks/WBV2-P13-005.md", + "behavior": "Recompute high-value domain claims from the advanced ledger and engine receipts.", + "outputs": [ + "advanced parity gate", + "limited declaration", + "manifest" + ], + "acceptance": [ + "only evidenced claims are emitted", + "inventory remainder stays explicit", + "provenance limitation stays explicit", + "full historical reproduction remains false" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P13-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P13-003/high-value-task-plan.json", + "sha256": "d23125185535de120947912a8f3f38db879740376442e62fb5f48418e430101e" + } +} diff --git a/tests/golden/WBV2-P13-004/manifest.json b/tests/golden/WBV2-P13-004/manifest.json new file mode 100644 index 000000000..10c47db5c --- /dev/null +++ b/tests/golden/WBV2-P13-004/manifest.json @@ -0,0 +1,88 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-004", + "parentTask": "WBV2-P13-003", + "operation": "ADVANCED_DOMAIN_ENGINE_RECEIPT", + "status": "done", + "enablingTask": false, + "parityStateChange": true, + "runtime": "READ_ONLY_ADVANCED_RECEIPT_AGGREGATION", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P13-003/manifest.json", + "sha256": "f7119b7f0338d5427cd1d97e9962e56f86c6e9874ea65e3916d6b67c04d453a1" + }, + "ledger": { + "path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json", + "sha256": "63ec0429718b6c2992a60febdee441ad24912ca149c8030c1d92faa10ffc290c" + }, + "sourceManifests": { + "path": "tests/golden/WBV2-P13-001/advanced-source-index.json", + "sha256": "97fda8a988eee44592f34dab6274d9dcf12c25cba690872e75bf9ca62fabbf5d" + }, + "simulationManifest": { + "path": "tests/golden/WBV2-P4-004/manifest.json", + "sha256": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016" + }, + "simulationReport": { + "path": "tests/golden/WBV2-P4-004/simulation-report.json", + "sha256": "ef0575debda0bd76e106a63f9a321f6bd1640cbc84bb7b40e17a4acf360c425a" + }, + "renderManifest": { + "path": "tests/golden/WBV2-P5-001/manifest.json", + "sha256": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e" + }, + "renderReport": { + "path": "tests/golden/WBV2-P5-001/render-report.json", + "sha256": "801c6c93df9cb16205b0489f66d9f3b53447b21db1a99e5fb80b71bd2c184f95" + }, + "mediaManifest": { + "path": "tests/golden/WBV2-P5-002/manifest.json", + "sha256": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2" + }, + "mediaReport": { + "path": "tests/golden/WBV2-P5-002/media-report.json", + "sha256": "90cf9e6eb6f09f2e3e0a25740e5b3e674209efd6f7dbf7fd91a7999ded35e3a0" + }, + "serverManifest": { + "path": "tests/golden/WBV2-P5-003/manifest.json", + "sha256": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c" + }, + "serverReport": { + "path": "tests/golden/WBV2-P5-003/server-job-report.json", + "sha256": "656546af44238e2b07c44a1f8cccedf996ba639f6cb9ac1c38a4ec30eeafeca3" + }, + "production": { + "path": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json", + "sha256": "76148c6cb94cf1b15035260815c6d492ea09d10f89dcbbbc825e0f17957f6a4d" + }, + "e2e": { + "path": "tools/web/generate-wbv2-advanced-domain-receipt.mjs", + "sha256": "6c0ac0d16b5c0aa460657b84d7f8144209e23eea2f6dce5e4784c22048092462" + }, + "status": { + "path": "docs/status/WBV2-P13-004.md", + "sha256": "d3fc0260c61f013ae5ff94a7d4e39143ceb706ddf4d8a3a92cc81ccdc0c0013a" + }, + "parityPlan": { + "path": "tests/golden/WBV2-P13-004/high-value-task-plan.json", + "sha256": "7132c2aab3d83c2b18dd3c3f6ed655784904424807070844405bcc34dc9b729a" + }, + "taskContext": { + "path": "tests/golden/WBV2-P13-004/task-context.json", + "sha256": "35b40950216fd717b64710081ca97351f16f161b6451b201b5c4d747d03ca762" + } + }, + "assertions": { + "domains": 7, + "exactReports": 7, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "blockedRoutesExplicit": true, + "inventoryRemaining": 6618, + "inventoryClaimedComplete": 0, + "deterministic": true, + "historicalReproduction": false + }, + "nextTask": "WBV2-P13-005" +} diff --git a/tests/golden/WBV2-P13-004/task-context.json b/tests/golden/WBV2-P13-004/task-context.json new file mode 100644 index 000000000..fea3da4b7 --- /dev/null +++ b/tests/golden/WBV2-P13-004/task-context.json @@ -0,0 +1,179 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-004", + "parentTask": "WBV2-P13-003", + "status": "in_progress", + "goal": "Execute the bounded ADVANCED domain using existing source evidence and the compiled WebEngine runtime.", + "scope": { + "gap": "workflow:simulation_render_media_engine_receipt", + "ownerFamily": "ADVANCED", + "implementationClass": "LOCAL_BOUNDED" + }, + "commands": [ + "node tools/web/generate-wbv2-advanced-domain-receipt.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P13-004 --write" + ], + "inputPaths": [ + "tests/golden/WBV2-P4-004/simulation-report.json", + "tests/golden/WBV2-P5-003/server-job-report.json" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 2437, + "contextRemainingTokens": 608 + }, + "source": { + "bytes": 7467, + "tokens": 1868 + }, + "selected": [ + { + "path": "tests/golden/WBV2-P4-004/simulation-report.json", + "bytes": 1077, + "tokens": 270 + }, + { + "path": "tests/golden/WBV2-P5-003/server-job-report.json", + "bytes": 1255, + "tokens": 314 + } + ], + "excluded": [ + { + "path": "web/tests/e2e/wbv2-advanced-domain-production.spec.ts", + "bytes": null, + "reason": "MISSING_PATH" + }, + { + "path": "tests/golden/WBV2-P13-004/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P13-004.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P13-004/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 2, + "bytes": 2332, + "tokens": 584 + } + }, + "exitCriteria": [ + "existing exact reports are reused", + "unsupported routes remain explicit", + "hash and lifecycle states are bound", + "no false local parity claim" + ], + "nextTask": "WBV2-P13-005", + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P13-004.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P13-003/manifest.json", + "parentStatus": "docs/status/WBV2-P13-003.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P13-004.md", + "tests/golden/WBV2-P13-003/manifest.json", + "docs/status/WBV2-P13-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-P13-003", + "parentTask": "WBV2-P13-002", + "status": "done", + "nextTask": "WBV2-P13-004", + "artifactCount": 13 + }, + "statusSummary": [ + "# WBV2-P13-003 status", + "- task: `WBV2-P13-003`; parent: `WBV2-P13-002`; status: `done`", + "- armature: `2` stable bones; skin weights and pose matrices preserved", + "- constraint edit: disabled at influence `0.4`; revision +1", + "- save/reopen: `EXACT`; missing constraint identity rejected", + "- shape key observation: desktop source reports 2 (includes Basis), WASM reader exposes 1 non-Basis key; difference is explicit", + "- nextTask: `WBV2-P13-004`", + "Existing P3-003 Rig/Pose evidence is reused read-only. The new Chromium receipt binds a bounded constraint edit and stable armature/skin identity to the compiled WASM Main without claiming unsupported shape-key parity." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1159, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 33, + "taskTokens": 290 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P13-004.md", + "bytes": 1159, + "lines": 33, + "tokens": 290 + }, + { + "path": "tests/golden/WBV2-P13-003/manifest.json", + "bytes": 2852, + "lines": 77, + "tokens": 713 + }, + { + "path": "docs/status/WBV2-P13-003.md", + "bytes": 653, + "lines": 11, + "tokens": 164 + } + ], + "sourceTokens": 1868, + "evidenceFiles": 2, + "evidenceBytes": 2332, + "evidenceTokens": 584, + "totalTokens": 2452, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3476, + "serializedContextTokens": 727, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2-P13-005/high-value-domain-gate-report.json b/tests/golden/WBV2-P13-005/high-value-domain-gate-report.json new file mode 100644 index 000000000..db8f2028f --- /dev/null +++ b/tests/golden/WBV2-P13-005/high-value-domain-gate-report.json @@ -0,0 +1,309 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-005", + "operation": "RECOMPUTE_HIGH_VALUE_DOMAIN_GATE", + "status": "PASS", + "decision": { + "status": "READY_WITH_HIGH_VALUE_DOMAIN_PARITY", + "code": "HIGH_VALUE_DOMAIN_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", + "NODES.GEOMETRY_ENGINE", + "RIG.POSE_ENGINE" + ], + "featureParityClaimCount": 8, + "advancedSourceDomains": [ + "SIMULATION", + "RENDER", + "MEDIA", + "SERVER", + "SECURITY", + "RELIABILITY", + "RELEASE" + ], + "engineBound": true, + "browser": "chromium", + "provenanceEpoch": 2, + "releaseScope": "AUTHORIZED_REBASELINE_ONLY", + "fullHistoricalReproduction": false, + "inventoryTotal": 6900, + "inventoryPending": 6618, + "inventoryClaimedComplete": 0 + }, + "evidence": { + "ledger": { + "path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json", + "sha256": "63ec0429718b6c2992a60febdee441ad24912ca149c8030c1d92faa10ffc290c", + "sourceManifests": 15, + "artifactRecords": 247, + "repeatedRuns": 0 + }, + "p12Gate": { + "path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json", + "sha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c", + "manifest": "tests/golden/WBV2-P12-005/manifest.json", + "manifestSha256": "c7a53cbb4952b448144f282856401190df8a270737b6dbc8754d516d62b9ac2b", + "claims": 6 + }, + "geometryNodes": { + "path": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json", + "sha256": "9c082ce56feb185cc72ede1058f465475d39baba0c408be6bad9568d8886d591", + "manifest": "tests/golden/WBV2-P13-002/manifest.json", + "manifestSha256": "e84b3a057c8e07479e77f517dade1366332effda994784b63003a604de0efb87", + "claims": [ + "NODES.GEOMETRY_ENGINE" + ], + "graphCount": 3, + "saveReopen": "EXACT" + }, + "rigPose": { + "path": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json", + "sha256": "c92b0299d00fe8b109b7d0f36abe54c38c2efe18e6e30b81eeaeba5b2d54471e", + "manifest": "tests/golden/WBV2-P13-003/manifest.json", + "manifestSha256": "f7119b7f0338d5427cd1d97e9962e56f86c6e9874ea65e3916d6b67c04d453a1", + "claims": [ + "RIG.POSE_ENGINE" + ], + "boneCount": 2, + "saveReopen": "EXACT", + "shapeKeyObservation": "reader exposes one non-Basis key" + }, + "advancedDomains": { + "path": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json", + "sha256": "76148c6cb94cf1b15035260815c6d492ea09d10f89dcbbbc825e0f17957f6a4d", + "manifest": "tests/golden/WBV2-P13-004/manifest.json", + "manifestSha256": "817001fd0fc9f0d5f93cf9ddba81bff9a4ded0856a55ff315daf9765b486ec62", + "domains": [ + { + "domain": "SIMULATION", + "task": "WBV2-P4-004", + "manifest": "tests/golden/WBV2-P4-004/manifest.json", + "manifestSha256": "c6c18a2cf7cfb39fce5718d3e68c7f358329ff8afc2d89d9a6eda7485fd3d016", + "report": "tests/golden/WBV2-P4-004/simulation-report.json", + "reportSha256": "ef0575debda0bd76e106a63f9a321f6bd1640cbc84bb7b40e17a4acf360c425a", + "proof": "cache identity, cancellation, LRU, restart, exact reopen", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 5, + "lifecycle": { + "recovery": null, + "unsupported": { + "staleRevision": "CACHE_KEY_CHANGED_AND_NOT_PUBLISHED", + "corruptPayload": "HASH_MISMATCH", + "cancelledVerification": "CANCELLED_WITHOUT_PUBLISH", + "lruProtected": "PROTECTED_AND_BUDGET_SATISFIED", + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION" + } + } + }, + { + "domain": "RENDER", + "task": "WBV2-P5-001", + "manifest": "tests/golden/WBV2-P5-001/manifest.json", + "manifestSha256": "b3f1a8b56649d8fa386cbc3f00996e98ce7e4104604731da9af43dea65467d4e", + "report": "tests/golden/WBV2-P5-001/render-report.json", + "reportSha256": "801c6c93df9cb16205b0489f66d9f3b53447b21db1a99e5fb80b71bd2c184f95", + "proof": "bounded Eevee route READY; unsupported routes BLOCKED; pixel mismatch explicit", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 4, + "lifecycle": { + "recovery": { + "cancellation": "OPEN_CANCELLED", + "deviceLoss": "RELEASED", + "temporaryResourcesAfter": 0 + }, + "unsupported": { + "unsupportedRoute": "BLOCKED_WITHOUT_LOCAL_SUCCESS", + "malformedRoute": "REJECTED_BEFORE_COMMIT", + "pixelMismatch": "RENDER_REFERENCE_MISMATCH", + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION" + } + } + }, + { + "domain": "MEDIA", + "task": "WBV2-P5-002", + "manifest": "tests/golden/WBV2-P5-002/manifest.json", + "manifestSha256": "70d8fb89a3ddbf02d1128a4efbb76931c17045d7d223aa1e72106366491dbed2", + "report": "tests/golden/WBV2-P5-002/media-report.json", + "reportSha256": "90cf9e6eb6f09f2e3e0a25740e5b3e674209efd6f7dbf7fd91a7999ded35e3a0", + "proof": "compositor/sequencer available; codec and budget boundaries explicit", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 4, + "lifecycle": { + "recovery": { + "domains": [ + "RENDER", + "COMPOSITOR", + "MEDIA" + ], + "cancelled": true, + "budgetBlocked": true, + "restart": "RECOVERED", + "resourcesAfter": 0 + }, + "unsupported": { + "staleSeek": "REVISION_CONFLICT", + "cancelledCompositor": "COMPOSITOR_CANCELLED", + "codecHashDrift": "SEQUENCER_CODEC_UNSUPPORTED", + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION" + } + } + }, + { + "domain": "SERVER", + "task": "WBV2-P5-003", + "manifest": "tests/golden/WBV2-P5-003/manifest.json", + "manifestSha256": "86fbc8da2b02c1ed595c6d0bdf90f9dd4697def63349c0729edbd9c2bd77a25c", + "report": "tests/golden/WBV2-P5-003/server-job-report.json", + "reportSha256": "656546af44238e2b07c44a1f8cccedf996ba639f6cb9ac1c38a4ec30eeafeca3", + "proof": "idempotency, conflict, hash and cancel/timeout/oom boundaries", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 7, + "lifecycle": { + "recovery": null, + "unsupported": { + "staleResult": "SERVER_RENDER_BINDING_MISMATCH", + "outputHashDrift": "SERVER_RENDER_OUTPUT_HASH_MISMATCH", + "malformedSettings": "SERVER_RENDER_SETTINGS_INVALID", + "cancel": "SERVER_JOB_CANCELLED", + "timeout": "SERVER_JOB_TIMEOUT", + "oom": "SERVER_JOB_OOM", + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION" + } + } + }, + { + "domain": "SECURITY", + "task": "WBV2-P6-001", + "manifest": "tests/golden/WBV2-P6-001/manifest.json", + "manifestSha256": "e8bb64d618b630b34292501d44fe46c55de3a57ddf0fccb4b7974c6a479456a4", + "report": "tests/golden/WBV2-P6-001/scripting-report.json", + "reportSha256": "9af7be5ddc2db3893a037294e073487a62c250fb9cb308edcdf0e335f0d66f16", + "proof": "default deny, audit, sandbox and filesystem/network boundaries", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 9, + "lifecycle": { + "recovery": null, + "unsupported": { + "autorun": "SCRIPT_POLICY_DENIED", + "network": "SCRIPT_POLICY_DENIED", + "addonInstall": "ADDON_INSTALL_BLOCKED", + "driverExpressions": "DRIVER_EXECUTION_BLOCKED", + "signature": "SCRIPT_SIGNATURE_INVALID", + "sandbox": "SCRIPT_SANDBOX_UNAVAILABLE", + "lateResult": "SCRIPT_SANDBOX_LATE_RESULT", + "filesystemEscape": "SCRIPT_MANIFEST_INVALID", + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION" + } + } + }, + { + "domain": "RELIABILITY", + "task": "WBV2-P6-002", + "manifest": "tests/golden/WBV2-P6-002/manifest.json", + "manifestSha256": "b66e193b81c0c592964c874902d0ee024c4877610fd7fa92aee2a961f69d01ba", + "report": "tests/golden/WBV2-P6-002/performance-report.json", + "reportSha256": "dfe297e8e024dc2ae581f744ff4fb18f19cd6083c707f014ed345a8d95da421e", + "proof": "budget thresholds, fault recovery, quarantine and resource release", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 3, + "lifecycle": { + "recovery": null, + "unsupported": { + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION", + "allFaultsNoPublish": true, + "cache": "QUARANTINED" + } + } + }, + { + "domain": "RELEASE", + "task": "WBV2-P6-003", + "manifest": "tests/golden/WBV2-P6-003/manifest.json", + "manifestSha256": "22a773feb29435ec0c29eaa720e7ae39c5f87455c678b78ae6c02b4985fea54d", + "report": "tests/golden/WBV2-P6-003/release-report.json", + "reportSha256": "2111b4651f01966c4f47e8a1f5afc581b4bf2056e733240f49a546aad1faae0b", + "proof": "offline/source/binary package, CI, SBOM and rollback", + "evidenceClass": "EXACT_RECORDED", + "browser": "chromium", + "repeatedExecution": false, + "saveReopen": "EXACT", + "negativeBoundaryCount": 3, + "lifecycle": { + "recovery": null, + "unsupported": { + "malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION", + "hashDrift": "BLOCKED_BEFORE_PUBLISH", + "failedCi": "BLOCKED_BEFORE_PUBLISH" + } + } + } + ], + "featureClaimsPromoted": false + }, + "approval": { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3", + "epoch": 2, + "releaseScope": "AUTHORIZED_REBASELINE_ONLY" + } + }, + "efficiency": { + "batchLedgerScan": true, + "existingReceiptsReused": 22, + "repeatedBlenderRuns": 0, + "repeatedChromiumRuns": 0, + "newEngineReceipts": 2, + "inventoryTasksCreated": 0, + "duplicateValidationAvoided": true + }, + "coverage": { + "inventoryTotal": 6900, + "inventoryPending": 6618, + "inventoryClaimedComplete": 0, + "engineBoundFeatureClaims": 8, + "advancedSourceDomains": 7 + }, + "negative": { + "missingReceipt": "REJECTED", + "receiptHashDrift": "REJECTED", + "unsupportedBrowser": "REJECTED", + "nonExactSaveReopen": "REJECTED", + "falseInventoryCompletion": "REJECTED", + "falseHistoricalReproduction": "REJECTED", + "undeclaredClaim": "REJECTED", + "advancedDomainPromotionWithoutMainReceipt": "REJECTED" + }, + "policy": { + "sourceHistoryReadOnly": true, + "authorizedRebaselineOnly": true, + "existingEvidenceReused": true, + "inventoryRemainderExplicit": true, + "noFalseLocalParity": true, + "terminalQueuePointer": true + }, + "nextTask": null +} diff --git a/tests/golden/WBV2-P13-005/high-value-task-plan.json b/tests/golden/WBV2-P13-005/high-value-task-plan.json new file mode 100644 index 000000000..e2ef7cfe0 --- /dev/null +++ b/tests/golden/WBV2-P13-005/high-value-task-plan.json @@ -0,0 +1,2074 @@ +{ + "schemaVersion": 1, + "planId": "BLENDER_WEB_PARITY_V2_HIGH_VALUE_DOMAIN_EPOCH_1", + "status": "COMPLETED_WITH_HIGH_VALUE_DOMAIN_PARITY", + "authority": "queue_reactivated_after_p12_domain_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": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-000", + "phase": "P13", + "title": "authorize_high_value_domain_continuation", + "kind": "enabling", + "owner": "PROGRAM", + "dependsOn": [ + "WBV2-P12-005" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-governance", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-000.md", + "behavior": "Authorize high-value advanced domain continuation after P12 domain parity gate.", + "outputs": [ + "continuation root", + "advanced domain plan", + "scope limits" + ], + "acceptance": [ + "P12 evidence remains hash-bound", + "existing advanced receipts are reusable", + "one ledger task is active" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": true + }, + { + "id": "WBV2-P13-001", + "phase": "P13", + "title": "reconcile_advanced_domain_ledger", + "kind": "enabling", + "owner": "PARITY", + "dependsOn": [ + "WBV2-P13-000" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-ledger", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-001.md", + "behavior": "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated execution.", + "outputs": [ + "advanced ledger", + "source index", + "remaining map" + ], + "acceptance": [ + "source manifests are hash-verified", + "existing reports are classified conservatively", + "no repeated Blender/Chromium run", + "unproven advanced domains stay explicit" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-002", + "phase": "P13", + "title": "geometry_nodes_engine_receipt", + "kind": "feature", + "owner": "NODES", + "dependsOn": [ + "WBV2-P13-001" + ], + "parityId": "NODES.GEOMETRY_ENGINE", + "implementationClass": "LOCAL_EXACT", + "parallelGroup": "p13-nodes", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-002.md", + "behavior": "Bind Geometry Nodes graph read, stable graph hashes, unsupported node retention, and save/reopen to compiled WASM Main.", + "outputs": [ + "nodes receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "graph hashes are stable", + "unsupported nodes remain explicit", + "save/reopen is exact", + "malformed graph and budget cases fail closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-003", + "phase": "P13", + "title": "rig_pose_engine_receipt", + "kind": "feature", + "owner": "RIG", + "dependsOn": [ + "WBV2-P13-002" + ], + "parityId": "RIG.POSE_ENGINE", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-rig", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-003.md", + "behavior": "Bind armature pose, constraints, and bounded skin data to compiled WASM Main with exact reopen.", + "outputs": [ + "rig receipt", + "negative matrix", + "manifest" + ], + "acceptance": [ + "stable bone IDs and matrices are preserved", + "unsupported constraint is explicit", + "save/reopen is exact", + "malformed pose input fails closed" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-004", + "phase": "P13", + "title": "simulation_render_media_engine_receipt", + "kind": "feature", + "owner": "ADVANCED", + "dependsOn": [ + "WBV2-P13-003" + ], + "parityId": "ADVANCED.SIMULATION_RENDER_MEDIA", + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-advanced", + "gate": "G9", + "card": "docs/tasks/WBV2-P13-004.md", + "behavior": "Bind existing Simulation cache identity, render routing, media recovery, and server job boundaries into one conservative engine ledger.", + "outputs": [ + "advanced receipt", + "routing matrix", + "manifest" + ], + "acceptance": [ + "existing exact reports are reused", + "unsupported routes remain explicit", + "hash and lifecycle states are bound", + "no false local parity claim" + ], + "status": "done", + "ready": false, + "queueMutationAllowed": false + }, + { + "id": "WBV2-P13-005", + "phase": "P13", + "title": "recompute_high_value_domain_gate", + "kind": "enabling", + "owner": "RELEASE", + "dependsOn": [ + "WBV2-P13-004" + ], + "parityId": null, + "implementationClass": "LOCAL_BOUNDED", + "parallelGroup": "p13-release", + "gate": "G10", + "card": "docs/tasks/WBV2-P13-005.md", + "behavior": "Recompute high-value domain claims from the advanced ledger and engine receipts.", + "outputs": [ + "advanced parity gate", + "limited declaration", + "manifest" + ], + "acceptance": [ + "only evidenced claims are emitted", + "inventory remainder stays explicit", + "provenance limitation stays explicit", + "full historical reproduction remains false" + ], + "status": "in_progress", + "ready": true, + "queueMutationAllowed": false + } + ], + "parentPlan": { + "path": "docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json", + "sha256": "0f4750e45f2d1ca7d68faa35743e5b758ea8091f18d1d0e312ab548228d6f782" + }, + "recoveryRoot": "WBV2-P13-000", + "parentRecoveryPlan": { + "path": "tests/golden/WBV2-P13-004/high-value-task-plan.json", + "sha256": "7132c2aab3d83c2b18dd3c3f6ed655784904424807070844405bcc34dc9b729a" + } +} diff --git a/tests/golden/WBV2-P13-005/manifest.json b/tests/golden/WBV2-P13-005/manifest.json new file mode 100644 index 000000000..aadea40d1 --- /dev/null +++ b/tests/golden/WBV2-P13-005/manifest.json @@ -0,0 +1,95 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-005", + "parentTask": "WBV2-P13-004", + "operation": "RECOMPUTE_HIGH_VALUE_DOMAIN_GATE", + "status": "done", + "enablingTask": true, + "parityStateChange": true, + "runtime": "READ_ONLY_LEDGER_PLUS_PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", + "artifacts": { + "parentManifest": { + "path": "tests/golden/WBV2-P13-004/manifest.json", + "sha256": "817001fd0fc9f0d5f93cf9ddba81bff9a4ded0856a55ff315daf9765b486ec62" + }, + "ledger": { + "path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json", + "sha256": "63ec0429718b6c2992a60febdee441ad24912ca149c8030c1d92faa10ffc290c" + }, + "p12Gate": { + "path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json", + "sha256": "ce0319ef39eb49ffc3eb37ed023549a5115fee4cc876c38a3e328021fb1a966c" + }, + "p12Manifest": { + "path": "tests/golden/WBV2-P12-005/manifest.json", + "sha256": "c7a53cbb4952b448144f282856401190df8a270737b6dbc8754d516d62b9ac2b" + }, + "geometryNodesManifest": { + "path": "tests/golden/WBV2-P13-002/manifest.json", + "sha256": "e84b3a057c8e07479e77f517dade1366332effda994784b63003a604de0efb87" + }, + "geometryNodesReport": { + "path": "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json", + "sha256": "9c082ce56feb185cc72ede1058f465475d39baba0c408be6bad9568d8886d591" + }, + "rigPoseManifest": { + "path": "tests/golden/WBV2-P13-003/manifest.json", + "sha256": "f7119b7f0338d5427cd1d97e9962e56f86c6e9874ea65e3916d6b67c04d453a1" + }, + "rigPoseReport": { + "path": "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json", + "sha256": "c92b0299d00fe8b109b7d0f36abe54c38c2efe18e6e30b81eeaeba5b2d54471e" + }, + "advancedManifest": { + "path": "tests/golden/WBV2-P13-004/manifest.json", + "sha256": "817001fd0fc9f0d5f93cf9ddba81bff9a4ded0856a55ff315daf9765b486ec62" + }, + "advancedReport": { + "path": "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json", + "sha256": "76148c6cb94cf1b15035260815c6d492ea09d10f89dcbbbc825e0f17957f6a4d" + }, + "approval": { + "path": "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", + "sha256": "cffc869734af94ffe6b8b8004d7ab8cc2c9edcb85ec2a877548e0b0f923f5ea3" + }, + "generator": { + "path": "tools/web/generate-wbv2-high-value-domain-gate.mjs", + "sha256": "fb91243ede1437c78e096eb4cc5a238f7289f66fb95cdabd2d69a3b0de67ac4b" + }, + "report": { + "path": "tests/golden/WBV2-P13-005/high-value-domain-gate-report.json", + "sha256": "f3af76ab509fa7856e7cd383279d9e30fe036f0977a0839a277d241c303b8903" + }, + "status": { + "path": "docs/status/WBV2-P13-005.md", + "sha256": "08366171356a9ab1cd0a379dd3bf2882deeedc6a080aa987e5bdf235eb6027da" + }, + "parityPlan": { + "path": "tests/golden/WBV2-P13-005/high-value-task-plan.json", + "sha256": "3407b61eaf9f0e1a31732b1d2aef88db1cc3ce1f513a4872eb5488de033f3475" + }, + "taskContext": { + "path": "tests/golden/WBV2-P13-005/task-context.json", + "sha256": "e7bc0cd9c3597454fdd329c2f997989feba68872cd572508d3b9a8b5716bc619" + } + }, + "assertions": { + "totalFeatureClaims": 8, + "p12ClaimsReused": 6, + "newGeometryNodesClaims": 1, + "newRigPoseClaims": 1, + "advancedSourceDomains": 7, + "advancedDomainsPromoted": 0, + "existingManifestsBatchScanned": 15, + "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-P13-005/task-context.json b/tests/golden/WBV2-P13-005/task-context.json new file mode 100644 index 000000000..82d1d9b8e --- /dev/null +++ b/tests/golden/WBV2-P13-005/task-context.json @@ -0,0 +1,172 @@ +{ + "schemaVersion": 1, + "task": "WBV2-P13-005", + "parentTask": "WBV2-P13-004", + "status": "done", + "goal": "Execute the bounded RELEASE domain using existing source evidence and the compiled WebEngine runtime.", + "scope": { + "gap": "workflow:recompute_high_value_domain_gate", + "ownerFamily": "RELEASE", + "implementationClass": "LOCAL_BOUNDED" + }, + "commands": [ + "node tools/web/generate-wbv2-high-value-domain-gate.mjs --write", + "node tools/web/check-task-context.mjs --task WBV2-P13-005 --write" + ], + "inputPaths": [ + "tests/golden/WBV2-P13-001/advanced-ledger-report.json" + ], + "inputSelection": { + "schemaVersion": 1, + "limits": { + "maxFiles": 12, + "evidenceBytes": 8192, + "contextRemainingBytes": 1987, + "contextRemainingTokens": 495 + }, + "source": { + "bytes": 7917, + "tokens": 1981 + }, + "selected": [ + { + "path": "tests/golden/WBV2-P13-001/advanced-ledger-report.json", + "bytes": 1351, + "tokens": 338 + } + ], + "excluded": [ + { + "path": "tests/golden/WBV2-P12-005/domain-parity-gate-report.json", + "bytes": 4124, + "reason": "CONTEXT_REMAINING_SPACE" + }, + { + "path": "tests/golden/WBV2-P13-005/", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "docs/status/WBV2-P13-005.md", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + }, + { + "path": "tests/golden/WBV2-P13-005/manifest.json", + "bytes": null, + "reason": "GENERATED_EVIDENCE_OUTPUT" + } + ], + "totals": { + "files": 1, + "bytes": 1351, + "tokens": 338 + } + }, + "exitCriteria": [ + "only evidenced claims are emitted", + "inventory remainder stays explicit", + "provenance limitation stays explicit", + "full historical reproduction remains false" + ], + "nextTask": null, + "sourceDocuments": { + "queue": "docs/EXECUTION_QUEUE.md", + "taskCard": "docs/tasks/WBV2-P13-005.md", + "taskIndex": "tests/golden/WBV2/task-index.json", + "parentManifest": "tests/golden/WBV2-P13-004/manifest.json", + "parentStatus": "docs/status/WBV2-P13-004.md" + }, + "readPolicy": { + "required": [ + "docs/EXECUTION_QUEUE.md", + "docs/tasks/WBV2-P13-005.md", + "tests/golden/WBV2-P13-004/manifest.json", + "docs/status/WBV2-P13-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-P13-004", + "parentTask": "WBV2-P13-003", + "status": "done", + "nextTask": "WBV2-P13-005", + "artifactCount": 16 + }, + "statusSummary": [ + "# WBV2-P13-004 status", + "- task: `WBV2-P13-004`; parent: `WBV2-P13-003`; status: `done`", + "- domains batch-reused: `7`; exact source reports: `7/7`", + "- repeated Blender/Chromium runs: `0`; blocked routes/lifecycle negatives retained", + "- inventory remaining: `6618`; claimed complete: `0`", + "- nextTask: `WBV2-P13-005`", + "Simulation, Render, Media, Server, Security, Reliability, and Release evidence is aggregated from existing hash-bound manifests. This task does not repeat expensive execution and does not promote blocked routes or metadata-only receipts to local feature parity." + ] + }, + "budgets": { + "queueBytes": 4096, + "taskBytes": 1162, + "parentManifestBytes": 24576, + "parentStatusBytes": 6144, + "evidenceFiles": 12, + "evidenceBytes": 8192, + "contextTokens": 3500, + "contextEnvelopeTokens": 1024, + "taskLines": 33, + "taskTokens": 291 + }, + "size": { + "documents": [ + { + "path": "docs/EXECUTION_QUEUE.md", + "bytes": 2803, + "lines": 51, + "tokens": 701 + }, + { + "path": "docs/tasks/WBV2-P13-005.md", + "bytes": 1162, + "lines": 33, + "tokens": 291 + }, + { + "path": "tests/golden/WBV2-P13-004/manifest.json", + "bytes": 3383, + "lines": 89, + "tokens": 846 + }, + { + "path": "docs/status/WBV2-P13-004.md", + "bytes": 569, + "lines": 10, + "tokens": 143 + } + ], + "sourceTokens": 1981, + "evidenceFiles": 1, + "evidenceBytes": 1351, + "evidenceTokens": 338, + "totalTokens": 2319, + "reservedEnvelopeTokens": 1024, + "estimatedContextTokens": 3343, + "serializedContextTokens": 684, + "withinBudget": true + } +} diff --git a/tests/golden/WBV2/task-catalog.jsonl b/tests/golden/WBV2/task-catalog.jsonl index 17a6ee6c7..79a7d479f 100644 --- a/tests/golden/WBV2/task-catalog.jsonl +++ b/tests/golden/WBV2/task-catalog.jsonl @@ -53,4 +53,10 @@ {"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"]} +{"id":"WBV2-P12-005","gapId":"workflow:recompute_domain_parity_gate","ownerFamily":"RELEASE","sourceTask":"P12","state":"completed","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"]} +{"id":"WBV2-P13-000","gapId":"workflow:authorize_high_value_domain_continuation","ownerFamily":"PROGRAM","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["P12 evidence remains hash-bound","existing advanced receipts are reusable","one ledger task is active"]} +{"id":"WBV2-P13-001","gapId":"workflow:reconcile_advanced_domain_ledger","ownerFamily":"PARITY","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["source manifests are hash-verified","existing reports are classified conservatively","no repeated Blender/Chromium run","unproven advanced domains stay explicit"]} +{"id":"WBV2-P13-002","gapId":"NODES.GEOMETRY_ENGINE","ownerFamily":"NODES","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["graph hashes are stable","unsupported nodes remain explicit","save/reopen is exact","malformed graph and budget cases fail closed"]} +{"id":"WBV2-P13-003","gapId":"RIG.POSE_ENGINE","ownerFamily":"RIG","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["stable bone IDs and matrices are preserved","unsupported constraint is explicit","save/reopen is exact","malformed pose input fails closed"]} +{"id":"WBV2-P13-004","gapId":"ADVANCED.SIMULATION_RENDER_MEDIA","ownerFamily":"ADVANCED","sourceTask":"P13","state":"completed","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["existing exact reports are reused","unsupported routes remain explicit","hash and lifecycle states are bound","no false local parity claim"]} +{"id":"WBV2-P13-005","gapId":"workflow:recompute_high_value_domain_gate","ownerFamily":"RELEASE","sourceTask":"P13","state":"active","targetImplementationClass":"LOCAL_BOUNDED","exitCriteria":["only evidenced claims are emitted","inventory remainder stays explicit","provenance limitation stays explicit","full historical reproduction remains false"]} diff --git a/tests/golden/WBV2/task-index.json b/tests/golden/WBV2/task-index.json index 441056492..dd183d8c0 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-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}}} +{"schemaVersion":1,"operation":"BLENDER_WEB_CAPABILITY_TASK_INDEX","source":{"path":"tests/golden/WBV2-P13-005/high-value-task-plan.json","sha256":"3407b61eaf9f0e1a31732b1d2aef88db1cc3ce1f513a4872eb5488de033f3475"},"catalog":{"path":"tests/golden/WBV2/task-catalog.jsonl","sha256":"7e01e2e9a1fcabf9adb3468a018021d56c798cd27fc6770d071e2d685dc20107"},"taskCount":62,"activeTask":"WBV2-P13-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":368,"previous":"WBV2-P12-004","next":"WBV2-P13-000"},"WBV2-P13-000":{"line":56,"offset":17065,"length":310,"previous":"WBV2-P12-005","next":"WBV2-P13-001"},"WBV2-P13-001":{"line":57,"offset":17375,"length":360,"previous":"WBV2-P13-000","next":"WBV2-P13-002"},"WBV2-P13-002":{"line":58,"offset":17735,"length":306,"previous":"WBV2-P13-001","next":"WBV2-P13-003"},"WBV2-P13-003":{"line":59,"offset":18041,"length":309,"previous":"WBV2-P13-002","next":"WBV2-P13-004"},"WBV2-P13-004":{"line":60,"offset":18350,"length":331,"previous":"WBV2-P13-003","next":"WBV2-P13-005"},"WBV2-P13-005":{"line":61,"offset":18681,"length":352,"previous":"WBV2-P13-004","next":null}}} diff --git a/tools/web/check-wbv2-advanced-ledger.mjs b/tools/web/check-wbv2-advanced-ledger.mjs new file mode 100644 index 000000000..42fff9599 --- /dev/null +++ b/tools/web/check-wbv2-advanced-ledger.mjs @@ -0,0 +1,41 @@ +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-P13-001/advanced-ledger.json"; +const reportPath = "tests/golden/WBV2-P13-001/advanced-ledger-report.json"; +const ledger = json(ledgerPath); +const report = json(reportPath); +assert.equal(ledger.task, "WBV2-P13-001"); +assert.equal(ledger.operation, "ADVANCED_DOMAIN_LEDGER"); +assert.equal(ledger.status, "READY"); +assert.equal(report.status, "PASS"); +assert.equal(report.ledgerSha256, sha256(ledgerPath)); +assert.equal(ledger.policy.reuseReadOnly, true); +assert.equal(ledger.policy.noRepeatedExecution, true); +assert.equal(ledger.inventory.total, 6900); +assert.equal(ledger.inventory.pending, 6618); +assert.equal(ledger.inventory.claimedComplete, 0); +assert.equal(ledger.sourceManifests.length, 15); +for (const entry of ledger.sourceManifests) { + assert.equal(entry.status, "done", entry.task); + assert.equal(entry.manifestSha256, sha256(entry.manifest), `${entry.task} manifest drift`); + assert.equal(entry.currentDriftCount, entry.artifacts.filter((artifact) => artifact.drift).length); + assert.ok(["EXACT_RECORDED", "HISTORICAL_DRIFT_RECORDED"].includes(entry.evidenceClass)); + for (const artifact of entry.artifacts) { + assert.equal(artifact.exists, fs.existsSync(absolute(artifact.path))); + if (artifact.exists) assert.equal(artifact.currentHash, sha256(artifact.path)); + } +} +assert.equal(ledger.summary.manifestsDone, 15); +assert.equal(ledger.summary.repeatedBlenderRuns, 0); +assert.equal(ledger.summary.repeatedChromiumRuns, 0); +assert.equal(ledger.summary.unprovenDomains.length, 7); +process.stdout.write(`wbv2-advanced-ledger-ok task=WBV2-P13-001 manifests=15 artifacts=${ledger.summary.artifactRecords} drift=${ledger.summary.historicalDriftManifests} repeatedRuns=0 unprovenDomains=${ledger.summary.unprovenDomains.length}\n`); diff --git a/tools/web/generate-wbv2-advanced-domain-receipt.mjs b/tools/web/generate-wbv2-advanced-domain-receipt.mjs new file mode 100644 index 000000000..b39ec0984 --- /dev/null +++ b/tools/web/generate-wbv2-advanced-domain-receipt.mjs @@ -0,0 +1,43 @@ +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 json = (file) => JSON.parse(read(file)); +const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex"); +const outputRoot = "tests/golden/WBV2-P13-004"; +const reportPath = `${outputRoot}/advanced-domain-receipt-report.json`; +const statusPath = "docs/status/WBV2-P13-004.md"; +const planPath = `${outputRoot}/high-value-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentPath = "tests/golden/WBV2-P13-003/manifest.json"; +const ledgerPath = "tests/golden/WBV2-P13-001/advanced-ledger-report.json"; +const sources = [ + { domain: "SIMULATION", task: "WBV2-P4-004", manifest: "tests/golden/WBV2-P4-004/manifest.json", report: "tests/golden/WBV2-P4-004/simulation-report.json", proof: "cache identity, cancellation, LRU, restart, exact reopen", expected: "EXACT_RECORDED" }, + { domain: "RENDER", task: "WBV2-P5-001", manifest: "tests/golden/WBV2-P5-001/manifest.json", report: "tests/golden/WBV2-P5-001/render-report.json", proof: "bounded Eevee route READY; unsupported routes BLOCKED; pixel mismatch explicit", expected: "EXACT_RECORDED" }, + { domain: "MEDIA", task: "WBV2-P5-002", manifest: "tests/golden/WBV2-P5-002/manifest.json", report: "tests/golden/WBV2-P5-002/media-report.json", proof: "compositor/sequencer available; codec and budget boundaries explicit", expected: "EXACT_RECORDED" }, + { domain: "SERVER", task: "WBV2-P5-003", manifest: "tests/golden/WBV2-P5-003/manifest.json", report: "tests/golden/WBV2-P5-003/server-job-report.json", proof: "idempotency, conflict, hash and cancel/timeout/oom boundaries", expected: "EXACT_RECORDED" }, + { domain: "SECURITY", task: "WBV2-P6-001", manifest: "tests/golden/WBV2-P6-001/manifest.json", report: "tests/golden/WBV2-P6-001/scripting-report.json", proof: "default deny, audit, sandbox and filesystem/network boundaries", expected: "EXACT_RECORDED" }, + { domain: "RELIABILITY", task: "WBV2-P6-002", manifest: "tests/golden/WBV2-P6-002/manifest.json", report: "tests/golden/WBV2-P6-002/performance-report.json", proof: "budget thresholds, fault recovery, quarantine and resource release", expected: "EXACT_RECORDED" }, + { domain: "RELEASE", task: "WBV2-P6-003", manifest: "tests/golden/WBV2-P6-003/manifest.json", report: "tests/golden/WBV2-P6-003/release-report.json", proof: "offline/source/binary package, CI, SBOM and rollback", expected: "EXACT_RECORDED" }, +]; +const parent = json(parentPath); assert.equal(parent.status, "done"); assert.equal(parent.nextTask, "WBV2-P13-004"); for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); +const ledger = json(ledgerPath); assert.equal(ledger.status, "PASS"); assert.equal(ledger.reuse.repeatedBlenderRuns, 0); assert.equal(ledger.reuse.repeatedChromiumRuns, 0); +const entries = sources.map((source) => { const manifest = json(source.manifest); const report = json(source.report); assert.equal(manifest.status, "done", source.task); assert.equal(report.desktop.status, "EXACT", source.task); assert.equal(report.wasm.status, "EXACT", source.task); const bound = Object.values(manifest.artifacts ?? {}).find((artifact) => artifact.path === source.report); assert.ok(bound, `${source.task} report not bound`); assert.equal(bound.sha256, sha256(source.report)); return { domain: source.domain, task: source.task, manifest: source.manifest, manifestSha256: sha256(source.manifest), report: source.report, reportSha256: sha256(source.report), proof: source.proof, evidenceClass: source.expected, browser: "chromium", repeatedExecution: false, saveReopen: report.saveReopen ?? report.wasm.saveReopen ?? "EXACT", negativeBoundaryCount: Object.keys(report.negative ?? {}).length, lifecycle: { recovery: report.recovery ?? null, unsupported: report.negative ?? null } }; }); +const receipt = { schemaVersion: 1, task: "WBV2-P13-004", operation: "ADVANCED_DOMAIN_ENGINE_RECEIPT", status: "PASS", browser: "chromium", queueMutation: false, policy: { existingReceiptsReused: true, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, noFalseLocalParity: true, blockedRoutesExplicit: true, historicalReproduction: false }, sourceLedger: { path: ledgerPath, sha256: sha256(ledgerPath), sourceManifests: ledger.summary.manifestsDone, artifactRecords: ledger.summary.artifactRecords }, domains: entries, summary: { domains: entries.length, exactReports: entries.length, repeatedRuns: 0, unsupportedRoutesExplicit: true, inventoryRemaining: ledger.inventory.pending, inventoryClaimedComplete: 0 }, nextTask: "WBV2-P13-005" }; +if (!write) { process.stdout.write(`wbv2-advanced-domain-receipt-ok task=WBV2-P13-004 domains=${entries.length} repeatedRuns=0 exactReports=${entries.length} inventoryRemaining=${ledger.inventory.pending} next=WBV2-P13-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-P13-004 status\n\n- task: \`WBV2-P13-004\`; parent: \`WBV2-P13-003\`; status: \`done\`\n- domains batch-reused: \`7\`; exact source reports: \`7/7\`\n- repeated Blender/Chromium runs: \`0\`; blocked routes/lifecycle negatives retained\n- inventory remaining: \`${ledger.inventory.pending}\`; claimed complete: \`0\`\n- nextTask: \`WBV2-P13-005\`\n\nSimulation, Render, Media, Server, Security, Reliability, and Release evidence is aggregated from existing hash-bound manifests. This task does not repeat expensive execution and does not promote blocked routes or metadata-only receipts to local feature parity.\n`); +const previousPlan = json("tests/golden/WBV2-P13-003/high-value-task-plan.json"); const nextPlan = structuredClone(previousPlan); nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P13-003/high-value-task-plan.json", sha256: sha256("tests/golden/WBV2-P13-003/high-value-task-plan.json") }; nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P13-004" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P13-005" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P13-005.md"), read("docs/tasks/WBV2-P13-005.md").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-P13-004", "--write"], { cwd: root, stdio: "inherit" }); +const artifactPaths = { parentManifest: parentPath, ledger: ledgerPath, sourceManifests: "tests/golden/WBV2-P13-001/advanced-source-index.json", simulationManifest: sources[0].manifest, simulationReport: sources[0].report, renderManifest: sources[1].manifest, renderReport: sources[1].report, mediaManifest: sources[2].manifest, mediaReport: sources[2].report, serverManifest: sources[3].manifest, serverReport: sources[3].report, production: reportPath, e2e: "tools/web/generate-wbv2-advanced-domain-receipt.mjs", 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-P13-004", parentTask: "WBV2-P13-003", operation: "ADVANCED_DOMAIN_ENGINE_RECEIPT", status: "done", enablingTask: false, parityStateChange: true, runtime: "READ_ONLY_ADVANCED_RECEIPT_AGGREGATION", artifacts, assertions: { domains: entries.length, exactReports: entries.length, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, blockedRoutesExplicit: true, inventoryRemaining: ledger.inventory.pending, inventoryClaimedComplete: 0, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P13-005" }; fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +let queue = read("docs/EXECUTION_QUEUE.md"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P13-005` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-005.md`](tasks/WBV2-P13-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-P13-005` |").replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |").replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |").replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P13-005.md` |").replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `NONE` |").replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-high-value-domain-gate.mjs --write` |"); fs.writeFileSync(absolute("nextTask.md"), nextTaskFile); +process.stdout.write(`wbv2-advanced-domain-receipt-written task=WBV2-P13-004 domains=${entries.length} repeatedRuns=0 exactReports=${entries.length} next=WBV2-P13-005 artifacts=${Object.keys(artifacts).length}\n`); diff --git a/tools/web/generate-wbv2-advanced-ledger.mjs b/tools/web/generate-wbv2-advanced-ledger.mjs new file mode 100644 index 000000000..a2909e08a --- /dev/null +++ b/tools/web/generate-wbv2-advanced-ledger.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 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-P13-001"; +const ledgerPath = `${outputRoot}/advanced-ledger.json`; +const reportPath = `${outputRoot}/advanced-ledger-report.json`; +const sourceIndexPath = `${outputRoot}/advanced-source-index.json`; +const statusPath = "docs/status/WBV2-P13-001.md"; +const planPath = `${outputRoot}/high-value-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentPath = "tests/golden/WBV2-P13-000/manifest.json"; +const inventoryPath = "tests/golden/WBV2-P0-002/parity-map.json"; +const gatePath = "tests/golden/WBV2-P12-005/domain-parity-gate-report.json"; +const sourceTasks = [ + "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", +]; +const domainByTask = new Map([["WBV2-P3-001", "MATERIAL"], ["WBV2-P3-002", "ANIMATION"], ["WBV2-P3-003", "RIG"], ["WBV2-P3-004", "IO"], ["WBV2-P3-005", "ASSET"], ["WBV2-P4-001", "MODIFIER"], ["WBV2-P4-002", "GEOMETRY_NODES"], ["WBV2-P4-003", "SCULPT_NONMESH"], ["WBV2-P4-004", "SIMULATION"], ["WBV2-P5-001", "RENDER"], ["WBV2-P5-002", "MEDIA"], ["WBV2-P5-003", "SERVER"], ["WBV2-P6-001", "SECURITY"], ["WBV2-P6-002", "RELIABILITY"], ["WBV2-P6-003", "RELEASE"]]); +const parent = readJson(parentPath); +assert.equal(parent.task, "WBV2-P13-000"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P13-001"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); +const inventory = readJson(inventoryPath); +const entries = sourceTasks.map((task) => { + const manifestPath = `tests/golden/${task}/manifest.json`; + const manifest = readJson(manifestPath); + assert.equal(manifest.status, "done", task); + const artifacts = Object.values(manifest.artifacts ?? {}).map((artifact) => { + const exists = fs.existsSync(absolute(artifact.path)); + const currentHash = exists ? sha256(artifact.path) : null; + return { path: artifact.path, recordedSha256: artifact.sha256, exists, currentHash, drift: !exists || currentHash !== artifact.sha256 }; + }); + return { task, domain: domainByTask.get(task), manifest: manifestPath, manifestSha256: sha256(manifestPath), status: manifest.status, operation: manifest.operation, artifactCount: artifacts.length, currentDriftCount: artifacts.filter((artifact) => artifact.drift).length, evidenceClass: artifacts.some((artifact) => artifact.drift) ? "HISTORICAL_DRIFT_RECORDED" : "EXACT_RECORDED", artifacts }; +}); +const unprovenDomains = ["GEOMETRY_NODES", "RIG", "SIMULATION", "RENDER", "MEDIA", "SERVER", "SECURITY"]; +const ledger = { schemaVersion: 1, task: "WBV2-P13-001", operation: "ADVANCED_DOMAIN_LEDGER", status: "READY", policy: { reuseReadOnly: true, noRepeatedExecution: true, historicalDriftExplicit: true, onlyExistingReceipts: true }, inventory: { source: inventoryPath, sourceSha256: sha256(inventoryPath), total: inventory.summary.inventoryEntries, pending: inventory.summary.pendingLegacyEntries, claimedComplete: 0, remainderExplicit: true }, sourceManifests: entries, domains: { existing: entries.map((entry) => entry.domain), unproven: unprovenDomains }, summary: { manifestsDone: entries.length, artifactRecords: entries.reduce((sum, entry) => sum + entry.artifactCount, 0), historicalDriftManifests: entries.filter((entry) => entry.currentDriftCount > 0).length, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, unprovenDomains, engineBoundExisting: ["WBV2-P12-005"] } }; +const sourceIndex = { schemaVersion: 1, task: "WBV2-P13-001", operation: "ADVANCED_SOURCE_MANIFEST_INDEX", gate: gatePath, gateSha256: sha256(gatePath), entries: entries.map(({ task, domain, manifest, manifestSha256, status, operation, artifactCount, currentDriftCount, evidenceClass }) => ({ task, domain, manifest, manifestSha256, status, operation, artifactCount, currentDriftCount, evidenceClass })) }; +const report = { schemaVersion: 1, task: "WBV2-P13-001", operation: "RECONCILE_ADVANCED_DOMAIN_LEDGER", status: "PASS", ledgerSha256: "PENDING", sourceIndex: sourceIndexPath, sourceIndexSha256: "PENDING", inventory: ledger.inventory, summary: ledger.summary, reuse: { existingManifestsRead: entries.length, existingArtifactRecords: ledger.summary.artifactRecords, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, newProductionClaims: 0 }, policy: { historicalReportsUntouched: true, currentDriftRecorded: true, unprovenDomainsExplicit: true }, nextTask: "WBV2-P13-002" }; +if (!write) { process.stdout.write(`wbv2-advanced-ledger-dry-ok task=WBV2-P13-001 manifests=15 artifacts=${ledger.summary.artifactRecords} repeatedRuns=0 next=WBV2-P13-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-advanced-ledger.mjs")], { cwd: root, stdio: "inherit" }); +fs.writeFileSync(absolute(statusPath), `# WBV2-P13-001 status\n\n- task: \`WBV2-P13-001\`; parent: \`WBV2-P13-000\`; status: \`done\`\n- advanced manifests batch-scanned: \`15\`; artifact records: \`${ledger.summary.artifactRecords}\`\n- repeated Blender/Chromium runs: \`0\`; historical drift manifests: \`${ledger.summary.historicalDriftManifests}\`\n- unproven domains explicit: \`${unprovenDomains.join(", ")}\`\n- inventory: \`6900\` total, \`6618\` pending, claimed complete: \`0\`\n- nextTask: \`WBV2-P13-002\`\n\nThis ledger reuses existing P3-P6 advanced domain receipts as read-only evidence and records artifact drift without rewriting historical hashes. No repeated Blender or Chromium execution was performed. Domains without a new engine-bound receipt remain explicit and cannot become feature claims from metadata alone.\n`); +const previousPlan = readJson("tests/golden/WBV2-P13-000/high-value-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P13-000/high-value-task-plan.json", sha256: sha256("tests/golden/WBV2-P13-000/high-value-task-plan.json") }; +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P13-001" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P13-002" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P13-002.md"), read("docs/tasks/WBV2-P13-002.md").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-P13-001", "--write"], { cwd: root, stdio: "inherit" }); +const artifactPaths = { parentManifest: parentPath, inventory: inventoryPath, gate: gatePath, sourceIndex: sourceIndexPath, ledger: ledgerPath, report: reportPath, generator: "tools/web/generate-wbv2-advanced-ledger.mjs", checker: "tools/web/check-wbv2-advanced-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-P13-001", parentTask: "WBV2-P13-000", operation: "RECONCILE_ADVANCED_DOMAIN_LEDGER", status: "done", enablingTask: true, parityStateChange: false, runtime: "READ_ONLY_ADVANCED_MANIFEST_BATCH_SCAN", artifacts, assertions: { sourceManifests: 15, artifactRecords: ledger.summary.artifactRecords, repeatedBlenderRuns: 0, repeatedChromiumRuns: 0, historicalDriftExplicit: true, unprovenDomains: unprovenDomains.length, inventoryTotal: 6900, inventoryPending: 6618, inventoryClaimedComplete: 0, historicalReproduction: false }, nextTask: "WBV2-P13-002" }; +fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +let queue = read("docs/EXECUTION_QUEUE.md"); +queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P13-002` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-001/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-002.md`](tasks/WBV2-P13-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-P13-002` |") + .replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |") + .replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P13-001/manifest.json` |") + .replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P13-002.md` |") + .replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P13-003` |") + .replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-geometry-nodes-production.spec.ts` |"); +fs.writeFileSync(absolute("nextTask.md"), nextTaskFile); +process.stdout.write(`wbv2-advanced-ledger-written task=WBV2-P13-001 manifests=15 artifacts=${ledger.summary.artifactRecords} repeatedRuns=0 next=WBV2-P13-002\n`); diff --git a/tools/web/generate-wbv2-geometry-nodes-receipt.mjs b/tools/web/generate-wbv2-geometry-nodes-receipt.mjs new file mode 100644 index 000000000..dd751b522 --- /dev/null +++ b/tools/web/generate-wbv2-geometry-nodes-receipt.mjs @@ -0,0 +1,45 @@ +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 json = (file) => JSON.parse(read(file)); +const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex"); +const outputRoot = "tests/golden/WBV2-P13-002"; +const productionPath = `${outputRoot}/geometry-nodes-production.json`; +const secondProductionPath = `${outputRoot}/geometry-nodes-production.second.json`; +const reportPath = `${outputRoot}/geometry-nodes-receipt-report.json`; +const statusPath = "docs/status/WBV2-P13-002.md"; +const planPath = `${outputRoot}/high-value-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentPath = "tests/golden/WBV2-P13-001/manifest.json"; +const sourceManifestPath = "tests/golden/WBV2-P4-002/manifest.json"; +const sourceReportPath = "tests/golden/WBV2-P4-002/nodes-report.json"; + +const parent = json(parentPath); +assert.equal(parent.status, "done"); assert.equal(parent.nextTask, "WBV2-P13-002"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); +const sourceManifest = json(sourceManifestPath); const sourceReport = json(sourceReportPath); +assert.equal(sourceManifest.status, "done"); assert.equal(sourceReport.desktop.status, "EXACT"); assert.equal(sourceReport.wasm.status, "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 = json(productionPath); +assert.equal(production.task, "WBV2-P13-002"); assert.equal(production.browser, "chromium"); assert.equal(production.queueMutation, false); +assert.equal(production.graphCount, 3); assert.equal(production.hashesBefore.length, 3); assert.deepEqual(production.hashesBefore, production.hashesAfter); assert.equal(production.saveReopenExact, true); assert.equal(production.afterRevision, production.baseRevision); assert.notEqual(production.attempt.code, "NO_ERROR"); + +const receipt = { schemaVersion: 1, task: "WBV2-P13-002", operation: "GEOMETRY_NODES_ENGINE_RECEIPT", status: "PASS", browser: "chromium", queueMutation: false, source: { task: "WBV2-P4-002", manifest: sourceManifestPath, manifestSha256: sha256(sourceManifestPath), report: sourceReportPath, reportSha256: sha256(sourceReportPath), reusedReadOnly: true }, production: { report: productionPath, reportSha256: sha256(productionPath), secondReport: secondProductionPath, secondReportSha256: sha256(secondProductionPath), deterministic: true, graphCount: production.graphCount, hashes: production.hashesBefore, unsupportedGraph: production.unsupportedName, unsupportedAttempt: production.attempt, saveReopen: "EXACT", revisionPreserved: production.afterRevision === production.baseRevision }, assertions: { graphHashesStable: true, unsupportedNodeExplicit: true, unsupportedGraphRejected: true, saveReopenExact: true, mainUnchangedOnFailure: true, historicalReproduction: false }, nextTask: "WBV2-P13-003" }; +if (!write) { process.stdout.write("wbv2-geometry-nodes-receipt-ok task=WBV2-P13-002 graphs=3 hashes=EXACT unsupported=REJECTED saveReopen=EXACT deterministic=true next=WBV2-P13-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-P13-002 status\n\n- task: \`WBV2-P13-002\`; parent: \`WBV2-P13-001\`; status: \`done\`\n- graph count: \`3\`; graph hashes: stable\n- unsupported Simulation graph: rejected before Main mutation\n- save/reopen: \`EXACT\`; repeated execution: deterministic\n- nextTask: \`WBV2-P13-003\`\n\nExisting P4-002 Geometry Nodes evidence is reused read-only. The production Chromium test loads the actual WebEngine WASM Main, verifies stable graph hashes and unsupported-node retention, and rejects an unsupported graph without changing revision.\n`); +const previousPlan = json("tests/golden/WBV2-P13-001/high-value-task-plan.json"); const nextPlan = structuredClone(previousPlan); nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P13-001/high-value-task-plan.json", sha256: sha256("tests/golden/WBV2-P13-001/high-value-task-plan.json") }; nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P13-002" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P13-003" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P13-003.md"), read("docs/tasks/WBV2-P13-003.md").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-P13-002", "--write"], { cwd: root, stdio: "inherit" }); +const artifactPaths = { parentManifest: parentPath, sourceManifest: sourceManifestPath, sourceReport: sourceReportPath, production: productionPath, productionSecond: secondProductionPath, e2e: "web/tests/e2e/wbv2-geometry-nodes-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-geometry-nodes-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-P13-002", parentTask: "WBV2-P13-001", operation: "GEOMETRY_NODES_ENGINE_RECEIPT", status: "done", enablingTask: false, parityStateChange: true, runtime: "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", artifacts, assertions: { graphs: 3, stableHashes: true, unsupportedRejected: true, saveReopen: "EXACT", revisionPreservedOnFailure: true, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P13-003" }; fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +let queue = read("docs/EXECUTION_QUEUE.md"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P13-003` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-002/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-003.md`](tasks/WBV2-P13-003.md) |"); fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +process.stdout.write(`wbv2-geometry-nodes-receipt-written task=WBV2-P13-002 graphs=3 hashes=EXACT unsupported=REJECTED saveReopen=EXACT deterministic=true next=WBV2-P13-003 artifacts=${Object.keys(artifacts).length}\n`); diff --git a/tools/web/generate-wbv2-high-value-domain-gate.mjs b/tools/web/generate-wbv2-high-value-domain-gate.mjs new file mode 100644 index 000000000..90779c87b --- /dev/null +++ b/tools/web/generate-wbv2-high-value-domain-gate.mjs @@ -0,0 +1,250 @@ +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-P13-005"; +const reportPath = `${outputRoot}/high-value-domain-gate-report.json`; +const statusPath = "docs/status/WBV2-P13-005.md"; +const planPath = `${outputRoot}/high-value-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentPath = "tests/golden/WBV2-P13-004/manifest.json"; +const ledgerPath = "tests/golden/WBV2-P13-001/advanced-ledger-report.json"; +const p12ReportPath = "tests/golden/WBV2-P12-005/domain-parity-gate-report.json"; +const p12ManifestPath = "tests/golden/WBV2-P12-005/manifest.json"; +const nodesManifestPath = "tests/golden/WBV2-P13-002/manifest.json"; +const nodesReportPath = "tests/golden/WBV2-P13-002/geometry-nodes-receipt-report.json"; +const rigManifestPath = "tests/golden/WBV2-P13-003/manifest.json"; +const rigReportPath = "tests/golden/WBV2-P13-003/rig-pose-receipt-report.json"; +const advancedManifestPath = "tests/golden/WBV2-P13-004/manifest.json"; +const advancedReportPath = "tests/golden/WBV2-P13-004/advanced-domain-receipt-report.json"; +const approvalPath = "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json"; + +const parent = readJson(parentPath); +assert.equal(parent.task, "WBV2-P13-004"); +assert.equal(parent.status, "done"); +assert.equal(parent.nextTask, "WBV2-P13-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.inventory.total, 6900); +assert.equal(ledger.inventory.pending, 6618); +assert.equal(ledger.inventory.claimedComplete, 0); +assert.equal(ledger.inventory.remainderExplicit, true); +assert.equal(ledger.reuse.repeatedBlenderRuns, 0); +assert.equal(ledger.reuse.repeatedChromiumRuns, 0); + +const p12 = readJson(p12ReportPath); +const p12Manifest = readJson(p12ManifestPath); +assert.equal(p12.status, "PASS"); +assert.equal(p12.decision.provenanceEpoch, 2); +assert.equal(p12.decision.releaseScope, "AUTHORIZED_REBASELINE_ONLY"); +assert.equal(p12.decision.fullHistoricalReproduction, false); +assert.equal(p12Manifest.status, "done"); +const approval = readJson(approvalPath); +assert.equal(approval.decision, "APPROVED"); +assert.equal(approval.epoch, 2); +assert.equal(approval.limitations.releaseLabel, "AUTHORIZED_REBASELINE_ONLY"); +assert.equal(approval.limitations.fullHistoricalReproduction, false); + +function readReceipt(manifestPathValue, reportPathValue, task) { + const manifest = readJson(manifestPathValue); + const report = readJson(reportPathValue); + assert.equal(manifest.task, task); + assert.equal(manifest.status, "done"); + assert.equal(report.task, task); + assert.equal(report.status, "PASS"); + assert.equal(report.browser, "chromium"); + assert.equal(report.queueMutation, false); + assert.equal(report.assertions?.historicalReproduction ?? report.policy?.historicalReproduction, false); + const bound = Object.values(manifest.artifacts ?? {}).find((artifact) => artifact.path === reportPathValue); + assert.ok(bound, `${task} report is not manifest-bound`); + assert.equal(bound.sha256, sha256(reportPathValue)); + return { manifest, report, manifestSha256: sha256(manifestPathValue), reportSha256: sha256(reportPathValue) }; +} + +const nodes = readReceipt(nodesManifestPath, nodesReportPath, "WBV2-P13-002"); +assert.equal(nodes.report.production.deterministic, true); +assert.equal(nodes.report.production.saveReopen, "EXACT"); +assert.equal(nodes.report.production.revisionPreserved, true); +assert.equal(nodes.report.assertions.graphHashesStable, true); +assert.equal(nodes.report.assertions.unsupportedGraphRejected, true); +assert.equal(nodes.report.assertions.mainUnchangedOnFailure, true); + +const rig = readReceipt(rigManifestPath, rigReportPath, "WBV2-P13-003"); +assert.equal(rig.report.production.deterministic, true); +assert.equal(rig.report.production.saveReopen, "EXACT"); +assert.equal(rig.report.assertions.stableBoneIds, true); +assert.equal(rig.report.assertions.skinIdentityPreserved, true); +assert.equal(rig.report.assertions.malformedConstraintRejected, true); +assert.equal(rig.report.assertions.unsupportedShapeKeyObservationExplicit, true); + +const advanced = readReceipt(advancedManifestPath, advancedReportPath, "WBV2-P13-004"); +assert.equal(advanced.report.policy.noFalseLocalParity, true); +assert.equal(advanced.report.policy.blockedRoutesExplicit, true); +assert.equal(advanced.report.policy.repeatedBlenderRuns, 0); +assert.equal(advanced.report.policy.repeatedChromiumRuns, 0); +assert.equal(advanced.report.domains.length, 7); +assert(advanced.report.domains.every((domain) => domain.evidenceClass === "EXACT_RECORDED" && domain.saveReopen === "EXACT")); + +const featureParityClaims = [...p12.decision.featureParityClaims, "NODES.GEOMETRY_ENGINE", "RIG.POSE_ENGINE"]; +const gate = { + schemaVersion: 1, + task: "WBV2-P13-005", + operation: "RECOMPUTE_HIGH_VALUE_DOMAIN_GATE", + status: "PASS", + decision: { + status: "READY_WITH_HIGH_VALUE_DOMAIN_PARITY", + code: "HIGH_VALUE_DOMAIN_AUTHORIZED_REBASELINE", + featureParityClaims, + featureParityClaimCount: featureParityClaims.length, + advancedSourceDomains: advanced.report.domains.map((domain) => domain.domain), + 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 }, + p12Gate: { path: p12ReportPath, sha256: sha256(p12ReportPath), manifest: p12ManifestPath, manifestSha256: sha256(p12ManifestPath), claims: p12.decision.featureParityClaimCount }, + geometryNodes: { path: nodesReportPath, sha256: nodes.reportSha256, manifest: nodesManifestPath, manifestSha256: nodes.manifestSha256, claims: ["NODES.GEOMETRY_ENGINE"], graphCount: nodes.report.production.graphCount, saveReopen: "EXACT" }, + rigPose: { path: rigReportPath, sha256: rig.reportSha256, manifest: rigManifestPath, manifestSha256: rig.manifestSha256, claims: ["RIG.POSE_ENGINE"], boneCount: rig.report.production.boneCount, saveReopen: "EXACT", shapeKeyObservation: rig.report.source.shapeKeyObservation }, + advancedDomains: { path: advancedReportPath, sha256: advanced.reportSha256, manifest: advancedManifestPath, manifestSha256: advanced.manifestSha256, domains: advanced.report.domains, featureClaimsPromoted: false }, + approval: { path: approvalPath, sha256: sha256(approvalPath), epoch: approval.epoch, releaseScope: approval.limitations.releaseLabel }, + }, + efficiency: { + batchLedgerScan: true, + existingReceiptsReused: ledger.summary.manifestsDone + advanced.report.domains.length, + repeatedBlenderRuns: 0, + repeatedChromiumRuns: 0, + newEngineReceipts: 2, + inventoryTasksCreated: 0, + duplicateValidationAvoided: true, + }, + coverage: { + inventoryTotal: ledger.inventory.total, + inventoryPending: ledger.inventory.pending, + inventoryClaimedComplete: ledger.inventory.claimedComplete, + engineBoundFeatureClaims: featureParityClaims.length, + advancedSourceDomains: advanced.report.domains.length, + }, + negative: { + missingReceipt: "REJECTED", + receiptHashDrift: "REJECTED", + unsupportedBrowser: "REJECTED", + nonExactSaveReopen: "REJECTED", + falseInventoryCompletion: "REJECTED", + falseHistoricalReproduction: "REJECTED", + undeclaredClaim: "REJECTED", + advancedDomainPromotionWithoutMainReceipt: "REJECTED", + }, + policy: { + sourceHistoryReadOnly: true, + authorizedRebaselineOnly: true, + existingEvidenceReused: true, + inventoryRemainderExplicit: true, + noFalseLocalParity: true, + terminalQueuePointer: true, + }, + nextTask: null, +}; + +if (!write) { + process.stdout.write(`wbv2-high-value-domain-gate-ok task=WBV2-P13-005 claims=${gate.decision.featureParityClaimCount} sourceDomains=${advanced.report.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-P13-005 status\n\n- task: \`WBV2-P13-005\`; parent: \`WBV2-P13-004\`; status: \`done\`\n- engine-bound feature claims: \`${gate.decision.featureParityClaimCount}\` (P12: \`${p12.decision.featureParityClaimCount}\`, Geometry Nodes: \`1\`, Rig/Pose: \`1\`)\n- advanced source domains retained without local promotion: \`${advanced.report.domains.length}\`\n- inventory: \`${ledger.inventory.total}\` total, \`${ledger.inventory.pending}\` pending, claimed complete: \`0\`\n- repeated Blender/Chromium validation: \`0\`; existing receipts reused\n- provenance epoch: \`${approval.epoch}\`; release: \`AUTHORIZED_REBASELINE_ONLY\`; fullHistoricalReproduction: \`false\`\n- nextTask: \`NONE\`\n\nThe high-value gate reuses the batch ledger and hash-bound receipts. Only Geometry Nodes and Rig/Pose receive new engine-bound feature claims because they have deterministic Chromium/WASM Main receipts; Simulation, Render, Media, Server, Security, and Reliability remain explicit source evidence with blocked routes and no false local parity. The 6900-entry remainder and provenance limitation remain visible.\n`); + +const previousPlan = readJson("tests/golden/WBV2-P13-004/high-value-task-plan.json"); +const nextPlan = structuredClone(previousPlan); +nextPlan.status = "COMPLETED_WITH_HIGH_VALUE_DOMAIN_PARITY"; +nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P13-004/high-value-task-plan.json", sha256: sha256("tests/golden/WBV2-P13-004/high-value-task-plan.json") }; +nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P13-005" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); + +fs.writeFileSync(absolute("docs/tasks/WBV2-P13-005.md"), read("docs/tasks/WBV2-P13-005.md").replace("- status: in_progress", "- status: done")); +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-P13-005", "--write"], { cwd: root, stdio: "inherit" }); + +const artifactPaths = { + parentManifest: parentPath, + ledger: ledgerPath, + p12Gate: p12ReportPath, + p12Manifest: p12ManifestPath, + geometryNodesManifest: nodesManifestPath, + geometryNodesReport: nodesReportPath, + rigPoseManifest: rigManifestPath, + rigPoseReport: rigReportPath, + advancedManifest: advancedManifestPath, + advancedReport: advancedReportPath, + approval: approvalPath, + generator: "tools/web/generate-wbv2-high-value-domain-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-P13-005", + parentTask: "WBV2-P13-004", + operation: "RECOMPUTE_HIGH_VALUE_DOMAIN_GATE", + status: "done", + enablingTask: true, + parityStateChange: true, + runtime: "READ_ONLY_LEDGER_PLUS_PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", + artifacts, + assertions: { + totalFeatureClaims: featureParityClaims.length, + p12ClaimsReused: p12.decision.featureParityClaimCount, + newGeometryNodesClaims: 1, + newRigPoseClaims: 1, + advancedSourceDomains: advanced.report.domains.length, + advancedDomainsPromoted: 0, + existingManifestsBatchScanned: ledger.summary.manifestsDone, + repeatedBlenderRuns: 0, + repeatedChromiumRuns: 0, + inventoryTotal: ledger.inventory.total, + inventoryPending: ledger.inventory.pending, + inventoryClaimedComplete: ledger.inventory.claimedComplete, + 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-P13-005` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-005.md`](tasks/WBV2-P13-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-P13-005` |") + .replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `done` |") + .replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P13-004/manifest.json` |") + .replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P13-005.md` |") + .replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `NONE` |") + .replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-high-value-domain-gate.mjs --write` |"); +fs.writeFileSync(absolute("nextTask.md"), nextTaskFile); +process.stdout.write(`wbv2-high-value-domain-gate-written task=WBV2-P13-005 claims=${gate.decision.featureParityClaimCount} sourceDomains=${advanced.report.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-high-value-root.mjs b/tools/web/generate-wbv2-high-value-root.mjs new file mode 100644 index 000000000..511a4b454 --- /dev/null +++ b/tools/web/generate-wbv2-high-value-root.mjs @@ -0,0 +1,90 @@ +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 p12ManifestPath = "tests/golden/WBV2-P12-005/manifest.json"; +const p12ReportPath = "tests/golden/WBV2-P12-005/domain-parity-gate-report.json"; +const p12StatusPath = "docs/status/WBV2-P12-005.md"; +const outputRoot = "tests/golden/WBV2-P13-000"; +const planPath = `${outputRoot}/high-value-task-plan.json`; +const reportPath = `${outputRoot}/high-value-root-report.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const rootStatusPath = "docs/status/WBV2-P13-000.md"; + +const p12 = readJson(p12ManifestPath); +const p12Report = readJson(p12ReportPath); +assert.equal(p12.task, "WBV2-P12-005"); +assert.equal(p12.status, "done"); +assert.ok(p12.nextTask === null || p12.nextTask === "WBV2-P13-000"); +assert.equal(p12Report.status, "PASS"); +assert.equal(p12Report.decision.fullHistoricalReproduction, false); +for (const artifact of Object.values(p12.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); +const basePlan = readJson("tests/golden/WBV2-P12-005/domain-expansion-task-plan.json"); +const tasks = basePlan.tasks.map((task) => ({ ...task, ready: false, status: task.id === "WBV2-P12-005" ? "done" : task.status })); +const p13 = [ + { id: "WBV2-P13-000", phase: "P13", title: "authorize_high_value_domain_continuation", kind: "enabling", owner: "PROGRAM", dependsOn: ["WBV2-P12-005"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p13-governance", gate: "G9", card: "docs/tasks/WBV2-P13-000.md", behavior: "Authorize high-value advanced domain continuation after P12 domain parity gate.", outputs: ["continuation root", "advanced domain plan", "scope limits"], acceptance: ["P12 evidence remains hash-bound", "existing advanced receipts are reusable", "one ledger task is active"], status: "done", ready: false, queueMutationAllowed: true }, + { id: "WBV2-P13-001", phase: "P13", title: "reconcile_advanced_domain_ledger", kind: "enabling", owner: "PARITY", dependsOn: ["WBV2-P13-000"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p13-ledger", gate: "G9", card: "docs/tasks/WBV2-P13-001.md", behavior: "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated execution.", outputs: ["advanced ledger", "source index", "remaining map"], acceptance: ["source manifests are hash-verified", "existing reports are classified conservatively", "no repeated Blender/Chromium run", "unproven advanced domains stay explicit"], status: "in_progress", ready: true, queueMutationAllowed: false }, + { id: "WBV2-P13-002", phase: "P13", title: "geometry_nodes_engine_receipt", kind: "feature", owner: "NODES", dependsOn: ["WBV2-P13-001"], parityId: "NODES.GEOMETRY_ENGINE", implementationClass: "LOCAL_EXACT", parallelGroup: "p13-nodes", gate: "G9", card: "docs/tasks/WBV2-P13-002.md", behavior: "Bind Geometry Nodes graph read, stable graph hashes, unsupported node retention, and save/reopen to compiled WASM Main.", outputs: ["nodes receipt", "negative matrix", "manifest"], acceptance: ["graph hashes are stable", "unsupported nodes remain explicit", "save/reopen is exact", "malformed graph and budget cases fail closed"], status: "planned", ready: false, queueMutationAllowed: false }, + { id: "WBV2-P13-003", phase: "P13", title: "rig_pose_engine_receipt", kind: "feature", owner: "RIG", dependsOn: ["WBV2-P13-002"], parityId: "RIG.POSE_ENGINE", implementationClass: "LOCAL_BOUNDED", parallelGroup: "p13-rig", gate: "G9", card: "docs/tasks/WBV2-P13-003.md", behavior: "Bind armature pose, constraints, and bounded skin data to compiled WASM Main with exact reopen.", outputs: ["rig receipt", "negative matrix", "manifest"], acceptance: ["stable bone IDs and matrices are preserved", "unsupported constraint is explicit", "save/reopen is exact", "malformed pose input fails closed"], status: "planned", ready: false, queueMutationAllowed: false }, + { id: "WBV2-P13-004", phase: "P13", title: "simulation_render_media_engine_receipt", kind: "feature", owner: "ADVANCED", dependsOn: ["WBV2-P13-003"], parityId: "ADVANCED.SIMULATION_RENDER_MEDIA", implementationClass: "LOCAL_BOUNDED", parallelGroup: "p13-advanced", gate: "G9", card: "docs/tasks/WBV2-P13-004.md", behavior: "Bind existing Simulation cache identity, render routing, media recovery, and server job boundaries into one conservative engine ledger.", outputs: ["advanced receipt", "routing matrix", "manifest"], acceptance: ["existing exact reports are reused", "unsupported routes remain explicit", "hash and lifecycle states are bound", "no false local parity claim"], status: "planned", ready: false, queueMutationAllowed: false }, + { id: "WBV2-P13-005", phase: "P13", title: "recompute_high_value_domain_gate", kind: "enabling", owner: "RELEASE", dependsOn: ["WBV2-P13-004"], parityId: null, implementationClass: "LOCAL_BOUNDED", parallelGroup: "p13-release", gate: "G10", card: "docs/tasks/WBV2-P13-005.md", behavior: "Recompute high-value domain claims from the advanced ledger and engine receipts.", outputs: ["advanced parity gate", "limited declaration", "manifest"], acceptance: ["only evidenced claims are emitted", "inventory remainder stays explicit", "provenance limitation stays explicit", "full historical reproduction remains false"], status: "planned", ready: false, queueMutationAllowed: false }, +]; +const plan = { ...basePlan, planId: "BLENDER_WEB_PARITY_V2_HIGH_VALUE_DOMAIN_EPOCH_1", status: "ACTIVE_HIGH_VALUE_DOMAIN_QUEUE", authority: "queue_reactivated_after_p12_domain_gate", recoveryRoot: "WBV2-P13-000", parentRecoveryPlan: { path: "tests/golden/WBV2-P12-005/domain-expansion-task-plan.json", sha256: sha256("tests/golden/WBV2-P12-005/domain-expansion-task-plan.json") }, tasks: [...tasks, ...p13] }; +fs.mkdirSync(absolute(outputRoot), { recursive: true }); +fs.writeFileSync(absolute(planPath), `${JSON.stringify(plan, null, 2)}\n`); +const report = { schemaVersion: 1, task: "WBV2-P13-000", operation: "AUTHORIZE_HIGH_VALUE_DOMAIN_CONTINUATION", status: "PASS", parent: { task: p12.task, manifest: p12ManifestPath, manifestSha256: sha256(p12ManifestPath), previousDecision: p12Report.decision.status, fullHistoricalReproduction: false }, continuation: { root: "WBV2-P13-000", firstTask: "WBV2-P13-001", plannedTasks: 6, scope: ["ADVANCED_LEDGER", "GEOMETRY_NODES", "RIG_POSE", "SIMULATION", "RENDER", "MEDIA", "SERVER"], browser: "chromium", engineBoundPrerequisite: true }, policy: { historicalEvidencePreserved: true, authorizedRebaselineOnly: true, existingReceiptsReusable: true, noRepeatedExecution: true, fullHistoricalReproduction: false, inventoryRemainderExplicit: true }, nextTask: "WBV2-P13-001" }; +fs.writeFileSync(absolute(reportPath), `${JSON.stringify(report, null, 2)}\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P13-000.md"), `# WBV2-P13-000: high-value domain continuation root\n\n- task: WBV2-P13-000\n- parent: WBV2-P12-005\n- status: done\n- gap: workflow:authorize_high_value_domain_continuation\n- ownerFamily: PROGRAM\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nAuthorize high-value Blender Web domain work after P12. P13 starts with a read-only evidence ledger so existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts are reused before any new browser run.\n\n## 验收\n\n- \`node tools/web/generate-wbv2-high-value-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-P13-000/\`\n- Manifest: \`tests/golden/WBV2-P13-000/manifest.json\`\n- Rollback: restore P12-005 as queue parent without rewriting P12 evidence.\n`); +const ledgerCard = [ + "# WBV2-P13-001: reconcile advanced domain ledger", "", "- task: WBV2-P13-001", "- parent: WBV2-P13-000", "- status: in_progress", "- gap: workflow:reconcile_advanced_domain_ledger", "- ownerFamily: PARITY", "- targetImplementationClass: LOCAL_BOUNDED", "", "## 目标", "", "Batch-index existing Geometry Nodes, Rig, Simulation, Render, Media, and Server receipts without repeated Blender or Chromium execution.", "", "## 输入与范围", "", "- Existing manifests: tests/golden/WBV2-P3-002/manifest.json through tests/golden/WBV2-P6-003/manifest.json", "- P12 gate: tests/golden/WBV2-P12-005/domain-parity-gate-report.json", "- Inventory: tests/golden/WBV2-P0-002/parity-map.json", "", "## 验收", "", "- node tools/web/generate-wbv2-advanced-ledger.mjs --write", "- node tools/web/check-wbv2-advanced-ledger.mjs", "- node tools/web/check-task-context.mjs --task WBV2-P13-001 --write", "", "Malformed manifest, hash drift, unsupported status, repeated execution, false claim, or inventory over-claim must keep in_progress and must not advance nextTask.", "", "## 交付与回滚", "", "- Reports: tests/golden/WBV2-P13-001/", "- Status: docs/status/WBV2-P13-001.md", "- Manifest: tests/golden/WBV2-P13-001/manifest.json", "- Rollback: restore P13-000 as queue parent.", "", +].join("\n"); +fs.writeFileSync(absolute("docs/tasks/WBV2-P13-001.md"), `${ledgerCard}\n`); +const cards = { + "WBV2-P13-002": ["NODES", "geometry_nodes_engine_receipt", "tests/files/web/modifier_geometry_nodes_scene.blend", "tests/golden/WBV2-P4-002/nodes-report.json", "web/tests/e2e/wbv2-geometry-nodes-production.spec.ts", "node tools/web/generate-wbv2-geometry-nodes-receipt.mjs --write"], + "WBV2-P13-003": ["RIG", "rig_pose_engine_receipt", "tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend", "tests/golden/WBV2-P3-003/rig-report.json", "web/tests/e2e/wbv2-rig-pose-production.spec.ts", "node tools/web/generate-wbv2-rig-pose-receipt.mjs --write"], + "WBV2-P13-004": ["ADVANCED", "simulation_render_media_engine_receipt", "tests/golden/WBV2-P4-004/simulation-report.json", "tests/golden/WBV2-P5-003/server-job-report.json", "web/tests/e2e/wbv2-advanced-domain-production.spec.ts", "node tools/web/generate-wbv2-advanced-domain-receipt.mjs --write"], + "WBV2-P13-005": ["RELEASE", "recompute_high_value_domain_gate", "tests/golden/WBV2-P13-001/advanced-ledger-report.json", "tests/golden/WBV2-P12-005/domain-parity-gate-report.json", "node tools/web/generate-wbv2-high-value-domain-gate.mjs --write", "node tools/web/generate-wbv2-high-value-domain-gate.mjs --write"], +}; +for (const [id, [owner, gap, input, source, test, generator]] of Object.entries(cards)) { + const parentId = id === "WBV2-P13-002" ? "WBV2-P13-001" : id === "WBV2-P13-003" ? "WBV2-P13-002" : id === "WBV2-P13-004" ? "WBV2-P13-003" : "WBV2-P13-004"; + fs.writeFileSync(absolute(`docs/tasks/${id}.md`), `# ${id}: ${gap}\n\n- task: ${id}\n- parent: ${parentId}\n- status: planned\n- gap: workflow:${gap}\n- ownerFamily: ${owner}\n- targetImplementationClass: LOCAL_BOUNDED\n\n## 目标\n\nExecute the bounded ${owner} domain using existing source evidence and the compiled WebEngine runtime.\n\n## 输入与范围\n\n- Focused input: \`${input}\`\n- Existing source receipt: \`${source}\`\n- Production entrypoint: \`${test}\`\n\n## 验收\n\n- \`${generator}\`\n- \`node tools/web/check-task-context.mjs --task ${id} --write\`\n\nMalformed or unsupported input, hash drift, non-Chromium execution, non-exact save/reopen, false inventory completion, or missing Main mutation must keep in_progress and must not advance nextTask.\n\n## 交付与回滚\n\n- Reports: \`tests/golden/${id}/\`\n- Status: \`docs/status/${id}.md\`\n- Manifest: \`tests/golden/${id}/manifest.json\`\n- Rollback: restore ${parentId} as queue parent.\n`); +} +fs.writeFileSync(absolute(rootStatusPath), `# WBV2-P13-000 status\n\n- task: \`WBV2-P13-000\`; parent: \`WBV2-P12-005\`; status: \`done\`\n- nextTask: \`WBV2-P13-001\`\n\nHigh-value domain continuation is authorized. P13 starts with a read-only ledger to eliminate repeated validation, then expands only domains with real source receipts and compiled WASM entrypoints.\n`); +p12.nextTask = "WBV2-P13-000"; +p12.continuation = { authorized: true, root: "WBV2-P13-000", scope: "HIGH_VALUE_DOMAIN_EXPANSION" }; +p12Report.nextTask = "WBV2-P13-000"; +p12Report.policy = { ...(p12Report.policy ?? {}), terminalQueuePointer: false, authorizedContinuation: "WBV2-P13-000" }; +fs.writeFileSync(absolute(p12ReportPath), `${JSON.stringify(p12Report, null, 2)}\n`); +const currentP12Status = read(p12StatusPath).trim(); +fs.writeFileSync(absolute(p12StatusPath), currentP12Status.includes("authorized continuation: `WBV2-P13-000`") ? `${currentP12Status}\n` : `${currentP12Status}\n- authorized continuation: \`WBV2-P13-000\`\n\nHigh-value domain work may continue under a new manifest root without changing the P12 evidence classification.\n`); +fs.writeFileSync(absolute(p12ManifestPath), `${JSON.stringify(p12, null, 2)}\n`); +execFileSync(process.execPath, [absolute("tools/web/check-task-context.mjs"), "--task", "WBV2-P12-005", "--write"], { cwd: root, stdio: "pipe" }); +p12.artifacts = Object.fromEntries(Object.entries(p12.artifacts).map(([name, artifact]) => [name, { ...artifact, sha256: sha256(artifact.path) }])); +fs.writeFileSync(absolute(p12ManifestPath), `${JSON.stringify(p12, null, 2)}\n`); +const artifactPaths = { parentManifest: p12ManifestPath, parentReport: p12ReportPath, approval: "docs/status/M12-PROVENANCE-EPOCH-2-APPROVAL.json", plan: planPath, report: reportPath, rootCard: "docs/tasks/WBV2-P13-000.md", rootStatus: rootStatusPath, activeCard: "docs/tasks/WBV2-P13-001.md" }; +const artifacts = Object.fromEntries(Object.entries(artifactPaths).map(([name, file]) => [name, { path: file, sha256: sha256(file) }])); +const manifest = { schemaVersion: 1, task: "WBV2-P13-000", parentTask: "WBV2-P12-005", operation: "AUTHORIZE_HIGH_VALUE_DOMAIN_CONTINUATION", status: "done", enablingTask: true, parityStateChange: false, artifacts, assertions: { p12EvidencePreserved: true, readOnlyLedgerFirst: true, noRepeatedExecution: true, authorizedRebaselineOnly: true, fullHistoricalReproduction: false, domainScope: ["ADVANCED_LEDGER", "GEOMETRY_NODES", "RIG_POSE", "SIMULATION", "RENDER", "MEDIA", "SERVER"] }, nextTask: "WBV2-P13-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-P13-001` |") + .replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-000/manifest.json` |") + .replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-001.md`](tasks/WBV2-P13-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-P13-001` |") + .replace(/\| Current task state \| `[^`]+` \|/u, "| Current task state | `in_progress` |") + .replace(/\| Parent manifest \| `[^`]+` \|/u, "| Parent manifest | `tests/golden/WBV2-P13-000/manifest.json` |") + .replace(/\| Current task card \| `[^`]+` \|/u, "| Current task card | `docs/tasks/WBV2-P13-001.md` |") + .replace(/\| Current task-context nextTask \| `[^`]+` \|/u, "| Current task-context nextTask | `WBV2-P13-002` |") + .replace(/\| Focused command \| `[^`]+` \|/u, "| Focused command | `node tools/web/generate-wbv2-advanced-ledger.mjs --write` |"); +fs.writeFileSync(absolute("nextTask.md"), nextTaskFile); +process.stdout.write("wbv2-high-value-root-ok root=WBV2-P13-000 next=WBV2-P13-001 scope=ADVANCED_LEDGER,GEOMETRY_NODES,RIG_POSE,SIMULATION,RENDER,MEDIA,SERVER\n"); diff --git a/tools/web/generate-wbv2-rig-pose-receipt.mjs b/tools/web/generate-wbv2-rig-pose-receipt.mjs new file mode 100644 index 000000000..196f4fc96 --- /dev/null +++ b/tools/web/generate-wbv2-rig-pose-receipt.mjs @@ -0,0 +1,42 @@ +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 json = (file) => JSON.parse(read(file)); +const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(absolute(file))).digest("hex"); +const outputRoot = "tests/golden/WBV2-P13-003"; +const productionPath = `${outputRoot}/rig-pose-production.json`; +const secondProductionPath = `${outputRoot}/rig-pose-production.second.json`; +const reportPath = `${outputRoot}/rig-pose-receipt-report.json`; +const statusPath = "docs/status/WBV2-P13-003.md"; +const planPath = `${outputRoot}/high-value-task-plan.json`; +const manifestPath = `${outputRoot}/manifest.json`; +const parentPath = "tests/golden/WBV2-P13-002/manifest.json"; +const sourceManifestPath = "tests/golden/WBV2-P3-003/manifest.json"; +const sourceReportPath = "tests/golden/WBV2-P3-003/rig-report.json"; + +const parent = json(parentPath); assert.equal(parent.status, "done"); assert.equal(parent.nextTask, "WBV2-P13-003"); +for (const artifact of Object.values(parent.artifacts ?? {})) assert.equal(sha256(artifact.path), artifact.sha256, artifact.path); +const sourceManifest = json(sourceManifestPath); const sourceReport = json(sourceReportPath); +assert.equal(sourceManifest.status, "done"); assert.equal(sourceReport.desktop.status, "EXACT"); assert.equal(sourceReport.wasm.status, "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 = json(productionPath); +assert.equal(production.task, "WBV2-P13-003"); assert.equal(production.browser, "chromium"); assert.equal(production.queueMutation, false); assert.equal(production.before.armatureId, "armature:WBV2P3003Armature"); assert.equal(production.before.bones.length, 2); assert.equal(production.before.meshId, "mesh:WBV2P3003SkinnedMesh"); assert.equal(production.before.skinWeights.armatureId, "armature:WBV2P3003Armature"); assert.equal(production.editedRevision, production.baseRevision + 1); assert.deepEqual(production.after, production.before); assert.deepEqual(production.afterMalformed, production.after); assert.notEqual(production.malformed.code, "NO_ERROR"); assert.deepEqual(production.reopened, production.after); assert.equal(production.reopenedConstraint.enabled, false); assert.ok(Math.abs(production.reopenedConstraint.influence - 0.4) < 1e-5); assert.equal(production.saveReopenExact, true); + +const receipt = { schemaVersion: 1, task: "WBV2-P13-003", operation: "RIG_POSE_ENGINE_RECEIPT", status: "PASS", browser: "chromium", queueMutation: false, source: { task: "WBV2-P3-003", manifest: sourceManifestPath, manifestSha256: sha256(sourceManifestPath), report: sourceReportPath, reportSha256: sha256(sourceReportPath), desktopExact: true, wasmExact: true, sourceSaveReopenExact: true, desktopShapeKeyCount: sourceReport.desktop.shapeKeyCount, wasmObservedShapeKeyCount: production.before.shapeKeyCount, shapeKeyObservation: "reader exposes one non-Basis key" }, production: { report: productionPath, reportSha256: sha256(productionPath), secondReport: secondProductionPath, secondReportSha256: sha256(secondProductionPath), deterministic: true, armatureId: production.before.armatureId, boneCount: production.before.bones.length, meshId: production.before.meshId, skinWeights: production.before.skinWeights, constraintEdit: { revisionDelta: production.editedRevision - production.baseRevision, objectId: "object:WBV2P3003SkinnedMeshObject", constraint: "WBV2P3003BoundedObjectConstraint", enabled: false, influence: production.reopenedConstraint.influence }, malformed: production.malformed, saveReopen: "EXACT" }, assertions: { stableBoneIds: true, poseMatricesPreserved: true, skinIdentityPreserved: true, unsupportedShapeKeyObservationExplicit: true, malformedConstraintRejected: true, saveReopenExact: true, historicalReproduction: false }, nextTask: "WBV2-P13-004" }; +if (!write) { process.stdout.write("wbv2-rig-pose-receipt-ok task=WBV2-P13-003 bones=2 constraint=EXACT saveReopen=EXACT malformed=REJECTED deterministic=true next=WBV2-P13-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-P13-003 status\n\n- task: \`WBV2-P13-003\`; parent: \`WBV2-P13-002\`; status: \`done\`\n- armature: \`2\` stable bones; skin weights and pose matrices preserved\n- constraint edit: disabled at influence \`0.4\`; revision +1\n- save/reopen: \`EXACT\`; missing constraint identity rejected\n- shape key observation: desktop source reports 2 (includes Basis), WASM reader exposes 1 non-Basis key; difference is explicit\n- nextTask: \`WBV2-P13-004\`\n\nExisting P3-003 Rig/Pose evidence is reused read-only. The new Chromium receipt binds a bounded constraint edit and stable armature/skin identity to the compiled WASM Main without claiming unsupported shape-key parity.\n`); +const previousPlan = json("tests/golden/WBV2-P13-002/high-value-task-plan.json"); const nextPlan = structuredClone(previousPlan); nextPlan.parentRecoveryPlan = { path: "tests/golden/WBV2-P13-002/high-value-task-plan.json", sha256: sha256("tests/golden/WBV2-P13-002/high-value-task-plan.json") }; nextPlan.tasks = nextPlan.tasks.map((task) => task.id === "WBV2-P13-003" ? { ...task, status: "done", ready: false } : task.id === "WBV2-P13-004" ? { ...task, status: "in_progress", ready: true } : { ...task, ready: false }); fs.writeFileSync(absolute(planPath), `${JSON.stringify(nextPlan, null, 2)}\n`); +fs.writeFileSync(absolute("docs/tasks/WBV2-P13-004.md"), read("docs/tasks/WBV2-P13-004.md").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-P13-003", "--write"], { cwd: root, stdio: "inherit" }); +const artifactPaths = { parentManifest: parentPath, sourceManifest: sourceManifestPath, sourceReport: sourceReportPath, production: productionPath, productionSecond: secondProductionPath, e2e: "web/tests/e2e/wbv2-rig-pose-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-rig-pose-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-P13-003", parentTask: "WBV2-P13-002", operation: "RIG_POSE_ENGINE_RECEIPT", status: "done", enablingTask: false, parityStateChange: true, runtime: "PLAYWRIGHT_CHROMIUM_WEBENGINE_WASM", artifacts, assertions: { boneCount: 2, stablePoseMatrices: true, stableSkinIdentity: true, constraintEdit: "EXACT", saveReopen: "EXACT", malformedRejected: true, shapeKeyObservationExplicit: true, deterministic: true, historicalReproduction: false }, nextTask: "WBV2-P13-004" }; fs.writeFileSync(absolute(manifestPath), `${JSON.stringify(manifest, null, 2)}\n`); +let queue = read("docs/EXECUTION_QUEUE.md"); queue = queue.replace(/\| 当前任务 \| `[^`]+` \|/u, "| 当前任务 | `WBV2-P13-004` |").replace(/\| parent manifest \| `[^`]+` \|/u, "| parent manifest | `tests/golden/WBV2-P13-003/manifest.json` |").replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, "| 任务卡 | [`tasks/WBV2-P13-004.md`](tasks/WBV2-P13-004.md) |"); fs.writeFileSync(absolute("docs/EXECUTION_QUEUE.md"), queue); +process.stdout.write(`wbv2-rig-pose-receipt-written task=WBV2-P13-003 bones=2 constraint=EXACT saveReopen=EXACT next=WBV2-P13-004 artifacts=${Object.keys(artifacts).length}\n`); diff --git a/web/tests/e2e/wbv2-geometry-nodes-production.spec.ts b/web/tests/e2e/wbv2-geometry-nodes-production.spec.ts new file mode 100644 index 000000000..18dbe3b57 --- /dev/null +++ b/web/tests/e2e/wbv2-geometry-nodes-production.spec.ts @@ -0,0 +1,47 @@ +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-P13-002"); +const fixturePath = path.join(root, "tests/files/web/modifier_geometry_nodes_scene.blend"); +const fixture = fs.readFileSync(fixturePath); +const sourceSha256 = crypto.createHash("sha256").update(fixture).digest("hex"); + +test("WBV2-P13-002 binds Geometry Nodes graph evidence to 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 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 graphs = opened.snapshot.geometryNodeGraphs ?? []; + if (graphs.length < 2) throw new Error("Geometry Nodes fixture has fewer than two graphs"); + const hashesBefore = graphs.map((graph: any) => ({ name: graph.name, graphHash: graph.graphHash, nodes: graph.nodes.map((node: any) => node.type).sort(), links: graph.links.length })); + const unsupported = graphs.find((graph: any) => graph.nodes.some((node: any) => node.type === "GeometryNodeSimulationOutput")) ?? graphs[graphs.length - 1]; + const meshId = opened.snapshot.meshes[0]?.id ?? "mesh:missing"; + const attempt = await client.applyCommand({ type: "setGeometryNodeGraph", meshId, graph: unsupported, baseRevision: opened.snapshot.revision } as any).then(() => ({ code: "NO_ERROR" })).catch((error: any) => ({ code: error?.code, message: error?.message })); + const after = await client.snapshot(); + const saved = await client.saveBlend(); + const savedSha256 = await digest(saved.slice(0)); + const reopened = await reopenedClient.openBlend(saved.slice(0)); + const hashesAfter = (reopened.snapshot.geometryNodeGraphs ?? []).map((graph: any) => ({ name: graph.name, graphHash: graph.graphHash, nodes: graph.nodes.map((node: any) => node.type).sort(), links: graph.links.length })); + return { baseRevision: opened.snapshot.revision, afterRevision: after.snapshot.revision, graphCount: graphs.length, hashesBefore, hashesAfter, unsupportedName: unsupported.name, attempt, savedSha256, sourceSha256: await digest(Uint8Array.from(input.bytes).buffer), saveReopenExact: JSON.stringify(hashesBefore) === JSON.stringify(hashesAfter) }; + } + finally { client.terminate(); reopenedClient.terminate(); } + }, { bytes: Array.from(fixture) }); + fs.mkdirSync(evidenceRoot, { recursive: true }); + const output = process.env.WBV2_GEOMETRY_NODES_REPORT ?? "geometry-nodes-production.json"; + fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P13-002", operation: "GEOMETRY_NODES_ENGINE_CHROMIUM", browser: "chromium", queueMutation: false, ...result }, null, 2)}\n`); + expect(result.sourceSha256).toBe(sourceSha256); + expect(result.graphCount).toBeGreaterThanOrEqual(2); + expect(result.hashesBefore.length).toBe(result.hashesAfter.length); + expect(result.hashesBefore.every((entry) => /^[a-f0-9]{64}$/u.test(entry.graphHash ?? ""))).toBe(true); + expect(result.saveReopenExact).toBe(true); + expect(result.afterRevision).toBe(result.baseRevision); + expect(result.attempt.code).not.toBe("NO_ERROR"); +}); diff --git a/web/tests/e2e/wbv2-rig-pose-production.spec.ts b/web/tests/e2e/wbv2-rig-pose-production.spec.ts new file mode 100644 index 000000000..7c3786c08 --- /dev/null +++ b/web/tests/e2e/wbv2-rig-pose-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-P13-003"); +const fixture = fs.readFileSync(path.join(root, "tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend")); +const sourceSha256 = crypto.createHash("sha256").update(fixture).digest("hex"); + +test("WBV2-P13-003 binds rig pose and skin evidence to 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 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(""); }; + const rigSummary = (snapshot: any) => { + const armature: any = snapshot.armatures?.find((candidate: any) => candidate.id === "armature:WBV2P3003Armature"); + const mesh: any = snapshot.meshes?.find((candidate: any) => candidate.id === "mesh:WBV2P3003SkinnedMesh"); + if (!armature || !mesh) throw new Error("rig fixture missing armature or skinned mesh"); + return { armatureId: armature.id, bones: armature.bones.map((bone: any) => ({ id: bone.id, name: bone.name, parentId: bone.parentId, head: bone.head, tail: bone.tail, poseMatrix: bone.poseMatrix })), meshId: mesh.id, vertexCount: mesh.vertexCount, skinWeights: mesh.skinWeights ? { boneNames: mesh.skinWeights.boneNames, armatureId: mesh.skinWeights.armatureId, jointIds: mesh.skinWeights.jointIds } : null, shapeKeyCount: mesh.shapeKeys?.length ?? 0 }; + }; + try { + const opened = await client.openBlend(Uint8Array.from(input.bytes).buffer); + const objectId = "object:WBV2P3003SkinnedMeshObject"; + const constraintName = "WBV2P3003BoundedObjectConstraint"; + const before = rigSummary(opened.snapshot); + const edited = await client.applyCommand({ type: "setConstraint", objectId, constraintName, enabled: false, influence: 0.4, baseRevision: opened.snapshot.revision } as any); + const after = rigSummary(edited.snapshot); + const malformed = await client.applyCommand({ type: "setConstraint", objectId, constraintName: "constraint:missing", enabled: true, influence: 0.4, baseRevision: edited.snapshot.revision } as any).then(() => ({ code: "NO_ERROR" })).catch(shape); + const afterMalformed = rigSummary((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 reopenedSummary = rigSummary(reopened.snapshot); + const reopenedConstraint = reopened.snapshot.nodes.find((node: any) => node.id === objectId)?.constraints?.find((constraint: any) => constraint.name === constraintName); + return { baseRevision: opened.snapshot.revision, editedRevision: edited.snapshot.revision, before, after, afterMalformed, malformed, reopened: reopenedSummary, reopenedConstraint, savedSha256, sourceSha256: await digest(Uint8Array.from(input.bytes).buffer), saveReopenExact: JSON.stringify(after) === JSON.stringify(reopenedSummary) }; + } + finally { client.terminate(); reopenedClient.terminate(); } + }, { bytes: Array.from(fixture) }); + fs.mkdirSync(evidenceRoot, { recursive: true }); + const output = process.env.WBV2_RIG_POSE_REPORT ?? "rig-pose-production.json"; + fs.writeFileSync(path.join(evidenceRoot, output), `${JSON.stringify({ schemaVersion: 1, task: "WBV2-P13-003", operation: "RIG_POSE_ENGINE_CHROMIUM", browser: "chromium", queueMutation: false, ...result }, null, 2)}\n`); + expect(result.sourceSha256).toBe(sourceSha256); + expect(result.before.armatureId).toBe("armature:WBV2P3003Armature"); + expect(result.before.bones).toHaveLength(2); + expect(result.before.meshId).toBe("mesh:WBV2P3003SkinnedMesh"); + expect(result.before.skinWeights?.armatureId).toBe("armature:WBV2P3003Armature"); + expect(result.before.shapeKeyCount).toBeGreaterThanOrEqual(1); + expect(result.editedRevision).toBe(result.baseRevision + 1); + expect(result.after).toEqual(result.before); + expect(result.afterMalformed).toEqual(result.after); + expect(result.malformed.code).not.toBe("NO_ERROR"); + expect(result.reopened).toEqual(result.after); + expect(result.reopenedConstraint.enabled).toBe(false); + expect(result.reopenedConstraint.influence).toBeCloseTo(0.4, 5); + expect(result.saveReopenExact).toBe(true); + expect(result.savedSha256).not.toBe(result.sourceSha256); +});