Rebuild local Blender WASM environment and recovery evidence
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled

This commit is contained in:
mes123456
2026-08-27 20:15:55 +08:00
parent a081c68c87
commit c2c65d3a09
376 changed files with 241951 additions and 114 deletions

Binary file not shown.

View File

@@ -0,0 +1,51 @@
{
"schemaVersion": 1,
"task": "WBV2-P0-002",
"operation": "BLENDER_52_INVENTORY_CHECK",
"status": "PASS",
"summary": {
"inventoryEntries": 6900,
"capabilityCount": 15,
"unknownEntries": 0,
"completedLegacyEntries": 281,
"pendingLegacyEntries": 6618,
"activeLegacyEntries": 1,
"featureParityClaims": 0,
"byKind": {
"area": 19,
"constraint": 29,
"datablock": 29,
"io": 33,
"keymap": 280,
"keymap-item": 3228,
"modifier": 83,
"node": 451,
"operator": 2486,
"physics": 65,
"region": 17,
"rna": 108,
"space": 19,
"space-class": 16,
"strip": 24,
"workspace": 13
},
"byLayer": {
"CORE": 137,
"FEATURE": 2833,
"UI": 3930
}
},
"sourceHashes": {
"tests/golden/M15-02A/blender-parity-map.json": "f3e757f26e58a4252b6cc2a7f9275428bbe5bf659cc0f0ff6350a147bdf2809c",
"tests/golden/M15-03A/next-task-plan.json": "bad0d7822c0d4d764bd174c86d9da897229e71de6363940125a594b8017e07f5",
"tests/golden/M15-03A/completed-gap-tasks.json": "1dfc9c4ae8fb9a135e624ca4f9fe1ea10500ef16a2567a3cccdcfe48fbc38466",
"docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json": "053e1551a24da08e045bb54115858a892ddd825fa59f1691a26a1ccfc1db3ca0",
"docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json": "c14e01161876ab924c1fe68466c78481fb583d1b822399ffa9f1df1b1d6fb266",
"tests/golden/WBV2-P0-001/manifest.json": "09ffbe342f2c510500767ddaa02b18703c25f6c1ee0b2ebd0c563e260c0d0c2b"
},
"inventorySha256": "b506ca5974d3740ff6f49dcf67c786979f4c828b46c1a0fed3b18d6e90c544e6",
"parityMapSha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8",
"deterministic": true,
"featureParityClaims": 0,
"nextTask": "WBV2-P0-003"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,53 @@
{
"schemaVersion": 1,
"task": "WBV2-P0-002",
"parentTask": "WBV2-P0-001",
"enablingTask": true,
"parityStateChange": false,
"runtime": "BLENDER_5_2_INVENTORY",
"operation": "BLENDER_52_CAPABILITY_PARITY_MAP",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P0-001/manifest.json",
"sha256": "09ffbe342f2c510500767ddaa02b18703c25f6c1ee0b2ebd0c563e260c0d0c2b"
},
"generator": {
"path": "tools/web/generate-wbv2-inventory.mjs",
"sha256": "d801d6e187741cc8953797f139ba760a5f1022c7cae2a8976fe709070330e91b"
},
"checker": {
"path": "tools/web/check-wbv2-inventory.mjs",
"sha256": "e729e63886ddb658d84b2c29775a9d3c340c334f824861e458a944e15999af8c"
},
"inventory": {
"path": "tests/golden/WBV2-P0-002/inventory.json",
"sha256": "b506ca5974d3740ff6f49dcf67c786979f4c828b46c1a0fed3b18d6e90c544e6"
},
"parityMap": {
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8"
},
"sourceHashes": {
"path": "tests/golden/WBV2-P0-002/source-hashes.json",
"sha256": "c6c6260d10bc8529e4b26563ce81168e1b0fffb3b175b2d4998ec1c0aa1c1497"
},
"report": {
"path": "tests/golden/WBV2-P0-002/inventory-check-report.json",
"sha256": "57d67fac6ab17c438cc1da446eac958edf364441d915a39439e550bd8c5d5571"
},
"status": {
"path": "docs/status/WBV2-P0-002.md",
"sha256": "adaaecf668840f83814ed0e94c8f1d8fc1d17e541dad5d55d237188b2eeccdb0"
},
"taskContext": {
"path": "tests/golden/WBV2-P0-002/task-context.json",
"sha256": "31598efe1d88e4f70431c413ab98f793c3fe41fcfe2d55fcfa6de3f95c229f6d"
},
"package": {
"path": "web/package.json",
"sha256": "40b7f14d4f568ae94bedde83e02115c127e0c714e5eb32a6a97b1e1084c4fa68"
}
},
"nextTask": "WBV2-P0-003"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
{
"schemaVersion": 1,
"task": "WBV2-P0-002",
"sources": {
"tests/golden/M15-02A/blender-parity-map.json": "f3e757f26e58a4252b6cc2a7f9275428bbe5bf659cc0f0ff6350a147bdf2809c",
"tests/golden/M15-03A/next-task-plan.json": "bad0d7822c0d4d764bd174c86d9da897229e71de6363940125a594b8017e07f5",
"tests/golden/M15-03A/completed-gap-tasks.json": "1dfc9c4ae8fb9a135e624ca4f9fe1ea10500ef16a2567a3cccdcfe48fbc38466",
"docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json": "053e1551a24da08e045bb54115858a892ddd825fa59f1691a26a1ccfc1db3ca0",
"docs/BLENDER_WEB_PARITY_TASK_PLAN_V2.json": "c14e01161876ab924c1fe68466c78481fb583d1b822399ffa9f1df1b1d6fb266",
"tests/golden/WBV2-P0-001/manifest.json": "09ffbe342f2c510500767ddaa02b18703c25f6c1ee0b2ebd0c563e260c0d0c2b"
}
}

View File

@@ -0,0 +1,173 @@
{
"schemaVersion": 1,
"task": "WBV2-P0-002",
"parentTask": "WBV2-P0-001",
"status": "in_progress",
"goal": "Generate a deterministic Blender 5.2 inventory and map each entry to a capability",
"scope": {
"gap": "workflow:blender52-inventory",
"ownerFamily": "PARITY",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"node tools/web/generate-wbv2-inventory.mjs",
"node tools/web/check-wbv2-inventory.mjs",
"node tools/web/check-execution-control-plane.mjs",
"node tools/web/check-web-parity-v2-plan.mjs",
"node tools/web/check-corrective-plan.mjs",
"npm --prefix web run test:context-governance"
],
"inputPaths": [
"tests/golden/corrective/C5-003/capability-manifest.json",
"tests/golden/corrective/C5-003/coverage-report.json",
"tests/golden/corrective/C5-003/inventory-gate.log"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2745,
"contextRemainingTokens": 684
},
"source": {
"bytes": 7159,
"tokens": 1792
},
"selected": [
{
"path": "tests/golden/corrective/C5-003/capability-manifest.json",
"bytes": 1619,
"tokens": 405
},
{
"path": "tests/golden/corrective/C5-003/coverage-report.json",
"bytes": 683,
"tokens": 171
},
{
"path": "tests/golden/corrective/C5-003/inventory-gate.log",
"bytes": 87,
"tokens": 22
}
],
"excluded": [
{
"path": "docs/BLENDER_WEB_EXECUTION_CONTROL_PLANE.md",
"bytes": 3686,
"reason": "CONTEXT_REMAINING_SPACE"
}
],
"totals": {
"files": 3,
"bytes": 2389,
"tokens": 598
}
},
"exitCriteria": [
"unknown entries are classified",
"inventory is deterministic",
"no entry claims feature parity without evidence"
],
"nextTask": "WBV2-P0-003",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P0-002.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P0-001/manifest.json",
"parentStatus": "docs/status/WBV2-P0-001.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P0-002.md",
"tests/golden/WBV2-P0-001/manifest.json",
"docs/status/WBV2-P0-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-P0-001",
"parentTask": "WBV2-BASELINE",
"status": "done",
"nextTask": "WBV2-P0-002",
"artifactCount": 6
},
"statusSummary": [
"# WBV2-P0-001 Status",
"status: done",
"task: reconcile_scope_and_checkpoints",
"gate: G0",
"updated: 2026-08-24 America/New_York",
"The production queue is now capability-oriented. `WBV2-P0-001` is the only ready",
"task and is parented by the new transition baseline. The legacy M16 list remains",
"an immutable coverage lane with `M16-GAP-00282` as its checkpoint; its manifests,"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 2186,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 56,
"taskTokens": 547
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P0-002.md",
"bytes": 2186,
"lines": 56,
"tokens": 547
},
{
"path": "tests/golden/WBV2-P0-001/manifest.json",
"bytes": 1209,
"lines": 20,
"tokens": 303
},
{
"path": "docs/status/WBV2-P0-001.md",
"bytes": 965,
"lines": 23,
"tokens": 242
}
],
"sourceTokens": 1792,
"evidenceFiles": 3,
"evidenceBytes": 2389,
"evidenceTokens": 598,
"totalTokens": 2390,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3414,
"serializedContextTokens": 789,
"withinBudget": true
}
}

View File

@@ -0,0 +1,87 @@
{
"blenderVersion": "5.2.0 LTS",
"contract": {
"budget": {
"maxErrors": 8,
"maxMessageBytes": 256,
"maxUnknownFields": 16
},
"cancellation": {
"code": "OPEN_CANCELLED",
"preservesRevision": true
},
"capability": {
"level": "L0",
"status": "BOUNDED"
},
"contractId": "workflow:freeze_capability_error_budget_contract",
"errors": [
{
"code": "PROTOCOL_MISMATCH",
"recoverable": true,
"severity": "error"
},
{
"code": "REVISION_CONFLICT",
"recoverable": true,
"severity": "error"
},
{
"code": "OPEN_CANCELLED",
"recoverable": true,
"severity": "info"
},
{
"code": "CAPABILITY_CONTRACT_INVALID",
"recoverable": true,
"severity": "error"
},
{
"code": "CAPABILITY_CONTRACT_BUDGET_EXCEEDED",
"recoverable": true,
"severity": "error"
},
{
"code": "CAPABILITY_CONTRACT_UNSUPPORTED",
"recoverable": false,
"severity": "error"
},
{
"code": "CAPABILITY_CONTRACT_SCHEMA_HASH_MISMATCH",
"recoverable": false,
"severity": "fatal"
},
{
"code": "CAPABILITY_CONTRACT_MIGRATION_BLOCKED",
"recoverable": true,
"severity": "error"
}
],
"extensions": {
"futureField": {
"kind": "opaque",
"value": "preserve-me"
}
},
"migration": {
"currentSchemaVersion": 1,
"preserveUnknown": true,
"strategy": "RETAIN_UNKNOWN",
"supportedSchemaVersions": [
1
]
},
"revision": {
"base": 0,
"current": 1
},
"schemaHash": "0ff3b488a0bc722f0e9cc5e8ad2b50105630517819e3f5e21686590bbf77b5d7",
"schemaVersion": 1
},
"fixtureSha256": "ffc4a6635abd4f6d905945da8f79d475f5947d38df16e64a18740e443b6f111c",
"operation": "CAPABILITY_ERROR_BUDGET_CONTRACT_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"sourceSha256": "e9449b75b8010caf19c37001e403ce842aa73f7612db5c11ad56399316d0decd",
"task": "WBV2-P0-003"
}

View File

@@ -0,0 +1,35 @@
{
"schemaVersion": 1,
"task": "WBV2-P0-003",
"operation": "CAPABILITY_ERROR_BUDGET_CONTRACT_LOCAL_BOUNDED",
"fixture": {
"path": "tests/files/web/generated/WBV2-P0-003-workflow-freeze_capability_error_budget_contract.blend",
"sha256": "ffc4a6635abd4f6d905945da8f79d475f5947d38df16e64a18740e443b6f111c"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P0-003/capability-contract-desktop-report.json",
"sourceSha256": "e9449b75b8010caf19c37001e403ce842aa73f7612db5c11ad56399316d0decd",
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"contractId": "workflow:freeze_capability_error_budget_contract",
"capabilityContractStatus": "AVAILABLE",
"revision": 1,
"schemaHash": "0ff3b488a0bc722f0e9cc5e8ad2b50105630517819e3f5e21686590bbf77b5d7",
"unknownExtension": {
"kind": "opaque",
"value": "preserve-me"
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"unsupportedSchema": "REJECTED_BEFORE_COMMIT",
"duplicateErrorCode": "REJECTED_BEFORE_COMMIT",
"overBudget": "REJECTED_BEFORE_COMMIT",
"schemaHashDrift": "REJECTED_BEFORE_COMMIT"
},
"nextTask": "WBV2-P1-001"
}

View File

@@ -0,0 +1,84 @@
{
"schemaVersion": 1,
"task": "WBV2-P0-003",
"parentTask": "WBV2-P0-002",
"enablingTask": true,
"parityStateChange": false,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "CAPABILITY_ERROR_BUDGET_CONTRACT_LOCAL_BOUNDED",
"status": "done",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P0-002/manifest.json",
"sha256": "81ad5bf876000b370b619e58e03f6f2225106f16c5e780ff56a218bed7348fd9"
},
"fixture": {
"path": "tests/files/web/generated/WBV2-P0-003-workflow-freeze_capability_error_budget_contract.blend",
"sha256": "ffc4a6635abd4f6d905945da8f79d475f5947d38df16e64a18740e443b6f111c"
},
"generator": {
"path": "tools/web/generated/WBV2-P0-003.py",
"sha256": "454be89d67593478666392f5d9eaa819602b0d7022abc1fd455b05d97ad0ca15"
},
"desktopChecker": {
"path": "tools/web/check-wbv2-p0-003-desktop.py",
"sha256": "964c192dddc19184281fa9a70b51a6d6caf48faa637e25aaca20d9d51bcfe00d"
},
"productionReader": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "4e77fe6a1eb699432c8c5a8fbaae38b223f44a4cdcb314d624e2d2d4c3d570fa"
},
"protocol": {
"path": "web/protocol/capability-contract.ts",
"sha256": "4e222d854a1b14f35f1f1df0864fcc40a2e6ed5047a6efd6954437b1f7177ed2"
},
"checker": {
"path": "tools/web/check-generated-gap.mjs",
"sha256": "19b7ba97bcd86e62dfba2a536d63a041bed9b39b491efc3d115fe58436d2c968"
},
"preflight": {
"path": "tools/web/generated-gap-preflight.mjs",
"sha256": "80fcb4b02c68de2703e6565debeafc7ee7d4c04bec125054be9e6e96da5c2ee9"
},
"wasmJavaScript": {
"path": "web/app/src/vendor/blender/web_engine.js",
"sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"
},
"wasmBinary": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "63877fb8e5ad0fa6ffbe9a69c7f3a66c8997a59fe959bbefda185eb0bb6d0ab6"
},
"report": {
"path": "tests/golden/WBV2-P0-003/capability-contract-report.json",
"sha256": "436127af44928dfbfec193229789c64c12e98af6ba2035c572712d22071e49bc"
},
"desktopReport": {
"path": "tests/golden/WBV2-P0-003/capability-contract-desktop-report.json",
"sha256": "3034e12d108a1126fab48a20ec75168a86ba1c3c0ec8a91f15f7792fba560e39"
},
"status": {
"path": "docs/status/WBV2-P0-003.md",
"sha256": "39d11525bd87d18314c4e81a6b8f53cbf966cabe5a70644863d52fdf7e5eb2fc"
},
"taskContext": {
"path": "tests/golden/WBV2-P0-003/task-context.json",
"sha256": "c69a3ada239f203da4fc623f472e9b1693fc6ccd3dab68767eca641794527135"
},
"wasmBuildLog": {
"path": "tests/golden/WBV2-P0-003/wasm-build.log",
"sha256": "d278f1482e53384fe9e4863bb58a2d40bfaacd736720ace1e93a96c53790f227"
},
"commandLog": {
"path": "tests/golden/WBV2-P0-003/command.log",
"sha256": "4e0e99bcb98f1d7277c0ac3ce0acc59f778428df27efa744ab38f91e6de6216f"
}
},
"negativeMatrix": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"unsupportedSchema": "REJECTED_BEFORE_COMMIT",
"duplicateErrorCode": "REJECTED_BEFORE_COMMIT",
"overBudget": "REJECTED_BEFORE_COMMIT",
"schemaHashDrift": "REJECTED_BEFORE_COMMIT"
},
"nextTask": "WBV2-P1-001"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P0-003",
"parentTask": "WBV2-P0-002",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable workflow:freeze_capability_error_budget_contract data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "workflow:freeze_capability_error_budget_contract",
"ownerFamily": "PROTOCOL",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P0-003.py -- tests/files/web/generated/WBV2-P0-003-workflow-freeze_capability_error_budget_contract.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P0-003",
"node tools/web/check-generated-gap.mjs --task WBV2-P0-003"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2360,
"contextRemainingTokens": 589
},
"source": {
"bytes": 7544,
"tokens": 1887
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P0-003-workflow-freeze_capability_error_budget_contract.blend",
"bytes": 86455,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P0-003.py",
"bytes": 2446,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 244962,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 854257,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P0-003/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P0-003.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P0-003/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"unsupported input fails closed",
"schema hashes are stable",
"migration policy preserves unknown data"
],
"nextTask": "WBV2-P1-001",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P0-003.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P0-002/manifest.json",
"parentStatus": "docs/status/WBV2-P0-002.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P0-003.md",
"tests/golden/WBV2-P0-002/manifest.json",
"docs/status/WBV2-P0-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-P0-002",
"parentTask": "WBV2-P0-001",
"status": "done",
"nextTask": "WBV2-P0-003",
"artifactCount": 10
},
"statusSummary": [
"# WBV2-P0-002 Status",
"status: done",
"task: WBV2-P0-002",
"gate: G0",
"updated: 2026-08-24 America/New_York",
"The Blender 5.2 baseline is now represented by one deterministic capability map.",
"The map covers 6900 immutable legacy entries in 15 capability families, with 281 completed legacy receipts and 6618 pending coverage records. Every entry remains L0 and METADATA_ONLY; no inventory row claims browser feature parity. Unknown entries are explicit and cannot advance a capability.",
"Source inventories and legacy states are hash-bound. The old M15/M16 manifests remain unchanged, and the capability lane only consumes them as read-only evidence."
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1860,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 465
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P0-003.md",
"bytes": 1860,
"lines": 38,
"tokens": 465
},
{
"path": "tests/golden/WBV2-P0-002/manifest.json",
"bytes": 1931,
"lines": 54,
"tokens": 483
},
{
"path": "docs/status/WBV2-P0-002.md",
"bytes": 954,
"lines": 22,
"tokens": 239
}
],
"sourceTokens": 1887,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 1887,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2911,
"serializedContextTokens": 710,
"withinBudget": true
}
}

View File

@@ -0,0 +1,33 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-001",
"parentTask": "WBV2-P0-003",
"enablingTask": true,
"parityStateChange": false,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "RUNTIME_VARIANTS_SOURCE_RECEIPTS_LOCAL_BOUNDED",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P0-003/manifest.json", "sha256": "130290eb166e2087c9d7736b8f027f494e611dceabb610a89dd0b5469e4f90b2"},
"fixture": {"path": "tests/files/web/generated/WBV2-P1-001-workflow-stabilize_runtime_variants_and_source_receipts.blend", "sha256": "1f800845bad994e158a55c6a934f243d3b7c30a54c98887e6b35848ceb50e9e4"},
"generator": {"path": "tools/web/generated/WBV2-P1-001.py", "sha256": "bcc236ffa1661c2c9cb88de680d2cb2b00111e1da282e8a9425ea575b0d016b2"},
"desktopChecker": {"path": "tools/web/check-wbv2-p1-001-desktop.py", "sha256": "8beddab3c701b221d9d0645b8e3df081e6f5c7fbb683d9983f4a31fbf2273155"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "4e77fe6a1eb699432c8c5a8fbaae38b223f44a4cdcb314d624e2d2d4c3d570fa"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "19b7ba97bcd86e62dfba2a536d63a041bed9b39b491efc3d115fe58436d2c968"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "80fcb4b02c68de2703e6565debeafc7ee7d4c04bec125054be9e6e96da5c2ee9"},
"engineManifest": {"path": "web/app/public/engine-manifest.json", "sha256": "7656936afae05b4936d7c8fa8dde94ee9e09ffff3a2c5e6f1b9d8a38f043ac47"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "63877fb8e5ad0fa6ffbe9a69c7f3a66c8997a59fe959bbefda185eb0bb6d0ab6"},
"report": {"path": "tests/golden/WBV2-P1-001/runtime-receipt-report.json", "sha256": "9c563f9bcd74e194804a383e9fd96476a7b0d07dcd5bc961a21ce31192371f34"},
"desktopReport": {"path": "tests/golden/WBV2-P1-001/runtime-receipt-desktop-report.json", "sha256": "80562d52ae82a067a9c3f9437d67a23354531131e259680660e1ddd1ca9a5f07"},
"status": {"path": "docs/status/WBV2-P1-001.md", "sha256": "5f5a8f3870fbcaf1b2716b3c708a02e6f90f3f55aef5580d1363023da63c9581"},
"taskContext": {"path": "tests/golden/WBV2-P1-001/task-context.json", "sha256": "b0b931a880ea49c1fef80777329cb567dd6c36c067480e0a189f5dd44cb7b641"},
"commandLog": {"path": "tests/golden/WBV2-P1-001/command.log", "sha256": "dc1ecaf30a4fde3b0f9051989841d7fbf8dc7161571c57c59510d5486653de1d"}
},
"negativeMatrix": {
"variantHashDrift": "REJECTED_BEFORE_INITIALIZATION",
"releaseMismatch": "REFRESH_REQUIRED_BEFORE_INITIALIZATION",
"pthreadFailure": "CLEANED_THEN_SINGLE_FALLBACK",
"generation": "ONE_ENGINE_PER_SESSION"
},
"nextTask": "WBV2-P1-002"
}

View File

@@ -0,0 +1,77 @@
{
"blenderVersion": "5.2.0 LTS",
"fixtureSha256": "1f800845bad994e158a55c6a934f243d3b7c30a54c98887e6b35848ceb50e9e4",
"operation": "RUNTIME_VARIANTS_SOURCE_RECEIPT_DESKTOP",
"receipt": {
"buildSha256": "63877fb8e5ad0fa6ffbe9a69c7f3a66c8997a59fe959bbefda185eb0bb6d0ab6",
"engineVersion": "blender-wasm-0.1.0-rc.1",
"extensions": {
"futureField": {
"kind": "opaque",
"value": "preserve-me"
}
},
"fallback": {
"deterministicOrder": [
"pthread",
"single"
],
"policy": "AUTO",
"reasonCode": "PTHREAD_INITIALIZATION_FAILED"
},
"receiptId": "workflow:stabilize_runtime_variants_and_source_receipts",
"releaseId": "blender-wasm-0.1.0-rc.1",
"schemaVersion": 1,
"session": {
"generation": 1,
"oneEnginePerSession": true
},
"sourceSha256": "4e77fe6a1eb699432c8c5a8fbaae38b223f44a4cdcb314d624e2d2d4c3d570fa",
"variants": [
{
"id": "single",
"memory": {
"initialPages": 256,
"maximumPages": 32768,
"shared": false
},
"resources": {
"js": {
"sha256": "25aa51361aa8c95479873240c776d6213c1092dd480ee2a0036d2cbbd561dcad",
"url": "/vendor/blender/single/web_engine.js"
},
"wasm": {
"sha256": "7f3a50f1d41b2ac0e6366e84caaabefc3cdfc47c055d5ea459abec654da6fcc0",
"url": "/vendor/blender/single/web_engine.wasm"
}
}
},
{
"id": "pthread",
"memory": {
"initialPages": 256,
"maximumPages": 32768,
"shared": true
},
"resources": {
"js": {
"sha256": "a64288eeb74fb0696d38d785348f0ba37e7ae716b5a341bf181f178f78e1324d",
"url": "/vendor/blender/pthread/web_engine.js"
},
"pthreadWorker": {
"sha256": "a64288eeb74fb0696d38d785348f0ba37e7ae716b5a341bf181f178f78e1324d",
"url": "/vendor/blender/pthread/web_engine.js"
},
"wasm": {
"sha256": "f2a26a9221b5d4d5e710463a89e2d93faf9b2d8a9076a455c5ce1a0e52d88b5f",
"url": "/vendor/blender/pthread/web_engine.wasm"
}
}
}
]
},
"saveReopen": "EXACT",
"schemaVersion": 1,
"sourceSha256": "21cc1defb5d3cfd31c925baf80e963ac3a041315f144d1069931d00ae888c3bd",
"task": "WBV2-P1-001"
}

View File

@@ -0,0 +1,37 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-001",
"operation": "RUNTIME_VARIANTS_SOURCE_RECEIPTS_LOCAL_BOUNDED",
"fixture": {
"path": "tests/files/web/generated/WBV2-P1-001-workflow-stabilize_runtime_variants_and_source_receipts.blend",
"sha256": "1f800845bad994e158a55c6a934f243d3b7c30a54c98887e6b35848ceb50e9e4"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P1-001/runtime-receipt-desktop-report.json",
"sourceSha256": "21cc1defb5d3cfd31c925baf80e963ac3a041315f144d1069931d00ae888c3bd",
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"receiptId": "workflow:stabilize_runtime_variants_and_source_receipts",
"releaseId": "blender-wasm-0.1.0-rc.1",
"sourceSha256": "4e77fe6a1eb699432c8c5a8fbaae38b223f44a4cdcb314d624e2d2d4c3d570fa",
"buildSha256": "63877fb8e5ad0fa6ffbe9a69c7f3a66c8997a59fe959bbefda185eb0bb6d0ab6",
"variants": [
"single",
"pthread"
],
"generation": 1
},
"fallback": {
"policy": "AUTO",
"order": [
"pthread",
"single"
],
"reasonCode": "PTHREAD_INITIALIZATION_FAILED"
},
"saveReopen": "EXACT",
"nextTask": "WBV2-P1-002"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-001",
"parentTask": "WBV2-P0-003",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable workflow:stabilize_runtime_variants_and_source_receipts data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "workflow:stabilize_runtime_variants_and_source_receipts",
"ownerFamily": "RUNTIME",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P1-001.py -- tests/files/web/generated/WBV2-P1-001-workflow-stabilize_runtime_variants_and_source_receipts.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P1-001",
"node tools/web/check-generated-gap.mjs --task WBV2-P1-001"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 58,
"contextRemainingTokens": 13
},
"source": {
"bytes": 9846,
"tokens": 2463
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P1-001-workflow-stabilize_runtime_variants_and_source_receipts.blend",
"bytes": 86633,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P1-001.py",
"bytes": 2356,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 246656,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 858820,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P1-001/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P1-001.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P1-001/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"variant fallback is deterministic",
"source/build hash is verified",
"one engine session has one generation"
],
"nextTask": "WBV2-P1-002",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P1-001.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P0-003/manifest.json",
"parentStatus": "docs/status/WBV2-P0-003.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P1-001.md",
"tests/golden/WBV2-P0-003/manifest.json",
"docs/status/WBV2-P0-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-P0-003",
"parentTask": "WBV2-P0-002",
"status": "done",
"nextTask": "WBV2-P1-001",
"artifactCount": 16
},
"statusSummary": [
"# WBV2-P0-003 Status",
"status: done",
"task: WBV2-P0-003",
"gate: G0",
"updated: 2026-08-24 America/New_York",
"The capability error-budget contract is now a versioned, bounded protocol slice.",
"The minimal fixture stores one canonical contract Text datablock with stable",
"schema and source hashes, an explicit revision, error budget, cancellation"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1894,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 474
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P1-001.md",
"bytes": 1894,
"lines": 38,
"tokens": 474
},
{
"path": "tests/golden/WBV2-P0-003/manifest.json",
"bytes": 3359,
"lines": 85,
"tokens": 840
},
{
"path": "docs/status/WBV2-P0-003.md",
"bytes": 1794,
"lines": 40,
"tokens": 449
}
],
"sourceTokens": 2463,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2463,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3487,
"serializedContextTokens": 717,
"withinBudget": true
}
}

View File

@@ -0,0 +1,31 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-002",
"parentTask": "WBV2-P1-001",
"enablingTask": true,
"parityStateChange": false,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "SCENEIR_STABLE_IDS_BINARY_DELTAS_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P1-001/manifest.json", "sha256": "b40c32066ac0667729465568135edde25d8ca94f97d74b613efb94acc8a4b75d"},
"fixture": {"path": "tests/files/web/generated/WBV2-P1-002-workflow-unify_sceneir_stable_ids_and_binary_deltas.blend", "sha256": "09c4d34f7faf8b175f8a59ecb533ebee61ac9821447c522e8fd41d7892ea9b34"},
"generator": {"path": "tools/web/generated/WBV2-P1-002.py", "sha256": "1913654f70a429842977e62871ba9c1f8f009e1cdca3df0455f0400c52e9e7df"},
"desktopChecker": {"path": "tools/web/check-wbv2-p1-002-desktop.py", "sha256": "1db18c365d8e70b5e25896eb9d363bea1d504c8d4a7f18c1527a67eafa9a4095"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "4e77fe6a1eb699432c8c5a8fbaae38b223f44a4cdcb314d624e2d2d4c3d570fa"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "19b7ba97bcd86e62dfba2a536d63a041bed9b39b491efc3d115fe58436d2c968"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "80fcb4b02c68de2703e6565debeafc7ee7d4c04bec125054be9e6e96da5c2ee9"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "63877fb8e5ad0fa6ffbe9a69c7f3a66c8997a59fe959bbefda185eb0bb6d0ab6"},
"report": {"path": "tests/golden/WBV2-P1-002/sceneir-report.json", "sha256": "c30e5dfe2e5dd714e6b48e0c27ad2ee22aa003cac252bbff3c8550325ca93bd0"},
"desktopReport": {"path": "tests/golden/WBV2-P1-002/sceneir-desktop-report.json", "sha256": "db22f68fbe399dd79eb5b6c9496af114d1d724b37f07796f9a2427e1d2965978"},
"status": {"path": "docs/status/WBV2-P1-002.md", "sha256": "848d9dc0dd95636a3622941507d6f53cb72bfdcb9ac38d6e6bcaf58231ae921f"},
"taskContext": {"path": "tests/golden/WBV2-P1-002/task-context.json", "sha256": "891be94ecf48e2301636d6156025dbfee1485059094d88db6b880394f8d5a79d"},
"commandLog": {"path": "tests/golden/WBV2-P1-002/command.log", "sha256": "6c3ddca300d57c3392259f7e77c361fdbdc9397f8c0427c9801ab1f39bcb3a7e"}
},
"negativeMatrix": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"stableIds": "PRESERVED_AFTER_SAVE_REOPEN",
"canonicalHash": "DESKTOP_WASM_EXACT"
},
"nextTask": "WBV2-P1-003"
}

View File

@@ -0,0 +1,42 @@
{
"blenderVersion": "5.2.0 LTS",
"contract": {
"binaryDelta": {
"baseRevision": 1,
"generation": 1,
"patches": [
{
"byteLength": 12,
"byteOffset": 0,
"field": "positions"
}
],
"schemaVersion": 1
},
"contractId": "workflow:unify_sceneir_stable_ids_and_binary_deltas",
"extensions": {
"futureField": {
"kind": "opaque",
"value": "preserve-me"
}
},
"schemaVersion": 1,
"stableIds": {
"meshId": "mesh:WBV2P1002CubeMesh",
"objectId": "object:WBV2P1002CubeObject"
}
},
"fixtureSha256": "09c4d34f7faf8b175f8a59ecb533ebee61ac9821447c522e8fd41d7892ea9b34",
"operation": "SCENEIR_STABLE_IDS_BINARY_DELTA_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"sourceSha256": "5836471c64adf311867303d3cf078a87fb2b2c0453ad531a77ca1b6f8595f202",
"summary": {
"meshId": "mesh:WBV2P1002CubeMesh",
"objectId": "object:WBV2P1002CubeObject",
"positionHash": "ab1104d5ac85e1b862a62835af7802096d98bfcc1f933a74b676ae6de297508e",
"triangleCount": 12,
"vertexCount": 8
},
"task": "WBV2-P1-002"
}

View File

@@ -0,0 +1,28 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-002",
"operation": "SCENEIR_STABLE_IDS_BINARY_DELTAS_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/WBV2-P1-002-workflow-unify_sceneir_stable_ids_and_binary_deltas.blend",
"sha256": "09c4d34f7faf8b175f8a59ecb533ebee61ac9821447c522e8fd41d7892ea9b34"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P1-002/sceneir-desktop-report.json",
"sourceSha256": "5836471c64adf311867303d3cf078a87fb2b2c0453ad531a77ca1b6f8595f202",
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"objectId": "object:WBV2P1002CubeObject",
"meshId": "mesh:WBV2P1002CubeMesh",
"vertexCount": 8,
"triangleCount": 12,
"canonicalHash": "a0dc01a164bfa12bd27da51db914d854409273a69a15defb6630fcf8e77e396e"
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "WBV2-P1-003"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-002",
"parentTask": "WBV2-P1-001",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable workflow:unify_sceneir_stable_ids_and_binary_deltas data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "workflow:unify_sceneir_stable_ids_and_binary_deltas",
"ownerFamily": "MAIN",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P1-002.py -- tests/files/web/generated/WBV2-P1-002-workflow-unify_sceneir_stable_ids_and_binary_deltas.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P1-002",
"node tools/web/check-generated-gap.mjs --task WBV2-P1-002"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1112,
"contextRemainingTokens": 277
},
"source": {
"bytes": 8792,
"tokens": 2199
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P1-002-workflow-unify_sceneir_stable_ids_and_binary_deltas.blend",
"bytes": 86861,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P1-002.py",
"bytes": 1736,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 246656,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 863349,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P1-002/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P1-002.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P1-002/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"IDs survive save/reopen",
"malformed chunk is rejected",
"desktop and WASM canonical hashes match"
],
"nextTask": "WBV2-P1-003",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P1-002.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P1-001/manifest.json",
"parentStatus": "docs/status/WBV2-P1-001.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P1-002.md",
"tests/golden/WBV2-P1-001/manifest.json",
"docs/status/WBV2-P1-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-P1-001",
"parentTask": "WBV2-P0-003",
"status": "done",
"nextTask": "WBV2-P1-002",
"artifactCount": 14
},
"statusSummary": [
"# WBV2-P1-001 Status",
"status: done",
"task: WBV2-P1-001",
"gate: G1",
"updated: 2026-08-25 America/New_York",
"The runtime receipt fixture binds the single and pthread variants to one",
"release, pinned source/build hashes, explicit memory/resource hashes, a",
"deterministic pthread-to-single fallback order, and one engine generation per"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1869,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 468
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P1-002.md",
"bytes": 1869,
"lines": 38,
"tokens": 468
},
{
"path": "tests/golden/WBV2-P1-001/manifest.json",
"bytes": 2740,
"lines": 34,
"tokens": 685
},
{
"path": "docs/status/WBV2-P1-001.md",
"bytes": 1384,
"lines": 33,
"tokens": 346
}
],
"sourceTokens": 2199,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2199,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3223,
"serializedContextTokens": 710,
"withinBudget": true
}
}

View File

@@ -0,0 +1,32 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-003",
"parentTask": "WBV2-P1-002",
"enablingTask": true,
"parityStateChange": false,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "MAIN_TRANSACTION_HISTORY_SAVE_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P1-002/manifest.json", "sha256": "456b93a29ae0ce65e1490e688e5a8563fbe4ba57ac104814f344ad6e7c2ec668"},
"fixture": {"path": "tests/files/web/generated/WBV2-P1-003-workflow-unify_main_transaction_history_and_save.blend", "sha256": "71f784357a7c65eea5525a14c2741a92a01cc255b5ffda0dd9ae0a86fffa8e88"},
"generator": {"path": "tools/web/generated/WBV2-P1-003.py", "sha256": "1f014abd129a927f9cc5640387df8b3b7e59a68a3080cc8a8ea7137e8c354ce9"},
"desktopChecker": {"path": "tools/web/check-wbv2-p1-003-desktop.py", "sha256": "8303f691cad1d5991251a9c79bd003f7c510982f18843cd68d0aecfca483026a"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "4e77fe6a1eb699432c8c5a8fbaae38b223f44a4cdcb314d624e2d2d4c3d570fa"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "19b7ba97bcd86e62dfba2a536d63a041bed9b39b491efc3d115fe58436d2c968"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "80fcb4b02c68de2703e6565debeafc7ee7d4c04bec125054be9e6e96da5c2ee9"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "63877fb8e5ad0fa6ffbe9a69c7f3a66c8997a59fe959bbefda185eb0bb6d0ab6"},
"report": {"path": "tests/golden/WBV2-P1-003/transaction-report.json", "sha256": "28183baa4ee71827b0556a5b4e4bb9c35861a5f3f97da4623a69a03c0ada860f"},
"desktopReport": {"path": "tests/golden/WBV2-P1-003/transaction-desktop-report.json", "sha256": "325b5eedf9d4b94dbf3652d78c27bcb908c47f3acab3d271d108fb0920e36b8d"},
"status": {"path": "docs/status/WBV2-P1-003.md", "sha256": "16862eadadb85109b21e24485bfb901fed453b202d64008ba5fb79ca04330570"},
"taskContext": {"path": "tests/golden/WBV2-P1-003/task-context.json", "sha256": "309f8636a783ccb8a246bc5aa5e4e4dd4789865711b02017b442aa5af02f01a5"},
"commandLog": {"path": "tests/golden/WBV2-P1-003/command.log", "sha256": "a23b25e16e8e2773bb76d9e3d3efdcff466b7a6541ae21628f6aa593b908fbf2"}
},
"negativeMatrix": {
"failedCommand": "NO_HISTORY_ENTRY",
"staleRevision": "REJECTED_WITHOUT_MUTATION",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"saveHash": "BYTE_STABLE"
},
"nextTask": "WBV2-P1-004"
}

View File

@@ -0,0 +1,183 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-003",
"parentTask": "WBV2-P1-002",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable workflow:unify_main_transaction_history_and_save data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "workflow:unify_main_transaction_history_and_save",
"ownerFamily": "MAIN",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P1-003.py -- tests/files/web/generated/WBV2-P1-003-workflow-unify_main_transaction_history_and_save.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P1-003",
"node tools/web/check-generated-gap.mjs --task WBV2-P1-003"
],
"inputPaths": [
"tools/web/generated/WBV2-P1-003.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1646,
"contextRemainingTokens": 410
},
"source": {
"bytes": 8258,
"tokens": 2066
},
"selected": [
{
"path": "tools/web/generated/WBV2-P1-003.py",
"bytes": 1518,
"tokens": 380
}
],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P1-003-workflow-unify_main_transaction_history_and_save.blend",
"bytes": 86826,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 246656,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 868494,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P1-003/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P1-003.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P1-003/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1518,
"tokens": 380
}
},
"exitCriteria": [
"failed/no-op commands add no history",
"stale revision cannot commit",
"reopen state is byte/hash stable"
],
"nextTask": "WBV2-P1-004",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P1-003.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P1-002/manifest.json",
"parentStatus": "docs/status/WBV2-P1-002.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P1-003.md",
"tests/golden/WBV2-P1-002/manifest.json",
"docs/status/WBV2-P1-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-P1-002",
"parentTask": "WBV2-P1-001",
"status": "done",
"nextTask": "WBV2-P1-003",
"artifactCount": 13
},
"statusSummary": [
"# WBV2-P1-002 Status",
"status: done",
"task: WBV2-P1-002",
"gate: G1",
"updated: 2026-08-25 America/New_York",
"The minimal cube fixture exposes canonical SceneIR stable object/mesh IDs,",
"topology counts, positions, and a bounded binary delta contract. Desktop and",
"WASM/Main produce the same canonical summary and preserve it through"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1854,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 464
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P1-003.md",
"bytes": 1854,
"lines": 38,
"tokens": 464
},
{
"path": "tests/golden/WBV2-P1-002/manifest.json",
"bytes": 2495,
"lines": 32,
"tokens": 624
},
{
"path": "docs/status/WBV2-P1-002.md",
"bytes": 1110,
"lines": 28,
"tokens": 278
}
],
"sourceTokens": 2066,
"evidenceFiles": 1,
"evidenceBytes": 1518,
"evidenceTokens": 380,
"totalTokens": 2446,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3470,
"serializedContextTokens": 744,
"withinBudget": true
}
}

View File

@@ -0,0 +1,29 @@
{
"blenderVersion": "5.2.0 LTS",
"contract": {
"contractId": "workflow:unify_main_transaction_history_and_save",
"history": {
"failedCommandAddsHistory": false,
"undoRedo": "SUPPORTED"
},
"initialVisibility": true,
"mutation": {
"command": "setObjectVisibility",
"visible": false
},
"revision": {
"staleCommit": "REJECTED"
},
"save": {
"atomic": true,
"byteStable": true
},
"schemaVersion": 1
},
"fixtureSha256": "71f784357a7c65eea5525a14c2741a92a01cc255b5ffda0dd9ae0a86fffa8e88",
"objectId": "object:WBV2P1003CubeObject",
"operation": "MAIN_TRANSACTION_HISTORY_SAVE_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "WBV2-P1-003"
}

View File

@@ -0,0 +1,32 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-003",
"operation": "MAIN_TRANSACTION_HISTORY_SAVE_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/WBV2-P1-003-workflow-unify_main_transaction_history_and_save.blend",
"sha256": "71f784357a7c65eea5525a14c2741a92a01cc255b5ffda0dd9ae0a86fffa8e88"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P1-003/transaction-desktop-report.json",
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"objectId": "object:WBV2P1003CubeObject",
"initialRevision": 1,
"mutatedRevision": 2,
"saveSha256": "8bfe012973f24edff2d1cc9c7e240e24fd9b0b97c133fdcabfadfd63427a363b"
},
"history": {
"failedCommandAddsHistory": false,
"undo": "EXACT",
"redo": "EXACT",
"staleRevision": "REJECTED"
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "WBV2-P1-004"
}

View File

@@ -0,0 +1,35 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-004",
"parentTask": "WBV2-P1-003",
"enablingTask": true,
"parityStateChange": false,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "WORKER_CANCEL_RESTART_DISPOSE_LOCAL_BOUNDED",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P1-003/manifest.json", "sha256": "bcdd4835ddc3f668419f6f5d505e010a7404d3c129bf85f99f587daa648f2ae1"},
"fixture": {"path": "tests/files/web/generated/WBV2-P1-004-workflow-harden_worker_cancel_restart_and_dispose.blend", "sha256": "c17cf938451b7bdbcda9a04b1e6436f217269e3167804cc785fd0d32e2d9d4bb"},
"generator": {"path": "tools/web/generated/WBV2-P1-004.py", "sha256": "beea3a224b47bc2c16de09805e778afd223da44f043a04929148cafcdfe3d67e"},
"desktopChecker": {"path": "tools/web/check-wbv2-p1-004-desktop.py", "sha256": "2c305e8cc4d2c4651343a40513a038d6a5ce4cd82159df4c7497698908bf2f79"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "9aa7dd546473eaeb63e62dd3c9ccc6bfdbd50452f06201ad5bfa93cde661c375"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "8ea2d0ea85ad508fe447316e84ebc992c772b07907c61b0b23f6dac4800ad96e"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "9aa30f025af3bc0c1a690e7deaf6ed634179000b535019a7ab5571c463e14d6e"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "39f3e713d89fff92e1126108321ec1f102d777abf194404d4e2b27d31b123cb0"},
"report": {"path": "tests/golden/WBV2-P1-004/worker-lifecycle-report.json", "sha256": "2587eae7937c8c6d2611cad8dc819d385ba43799a5897b2d48417e929bc31e52"},
"desktopReport": {"path": "tests/golden/WBV2-P1-004/worker-lifecycle-desktop-report.json", "sha256": "b8f7c388a5203fcf8abf56eff2d6ec685f69900a44f080e7529bf77a33edd7ad"},
"status": {"path": "docs/status/WBV2-P1-004.md", "sha256": "479be7cdc89d63b476d2b293e27d90d54ee7b96bad79063e11d66bc3601417c3"},
"taskContext": {"path": "tests/golden/WBV2-P1-004/task-context.json", "sha256": "879cb5c392344b6abad688011ae3f4ef9229727d64c9551628a94e3f442a3638"},
"commandLog": {"path": "tests/golden/WBV2-P1-004/command.log", "sha256": "a6c1cdf44cf6feef1919a3621004ba37bd7b9e29dc652cd8ef6417caaa539c7a"},
"wasmBuildLog": {"path": "tests/golden/WBV2-P1-004/wasm-build.log", "sha256": "6855f81eaebc59a24adce6f99171e849d56e994ade4b3f656fb05da666695652"}
},
"negativeMatrix": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"hashDrift": "REJECTED_BEFORE_COMMIT",
"cancelledResult": "NEVER_PUBLISHED",
"generationMismatch": "REJECTED",
"ownerBudgetAfterDispose": "ZERO"
},
"nextTask": "WBV2-P1-005"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-004",
"parentTask": "WBV2-P1-003",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable workflow:harden_worker_cancel_restart_and_dispose data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "workflow:harden_worker_cancel_restart_and_dispose",
"ownerFamily": "RUNTIME",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P1-004.py -- tests/files/web/generated/WBV2-P1-004-workflow-harden_worker_cancel_restart_and_dispose.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P1-004",
"node tools/web/check-generated-gap.mjs --task WBV2-P1-004"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1555,
"contextRemainingTokens": 388
},
"source": {
"bytes": 8349,
"tokens": 2088
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P1-004-workflow-harden_worker_cancel_restart_and_dispose.blend",
"bytes": 87052,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P1-004.py",
"bytes": 2422,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 251180,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 872919,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P1-004/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P1-004.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P1-004/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"cancel never publishes result",
"generation mismatch is rejected",
"CPU/WASM/GPU owners return to budget"
],
"nextTask": "WBV2-P1-005",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P1-004.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P1-003/manifest.json",
"parentStatus": "docs/status/WBV2-P1-003.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P1-004.md",
"tests/golden/WBV2-P1-003/manifest.json",
"docs/status/WBV2-P1-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-P1-003",
"parentTask": "WBV2-P1-002",
"status": "done",
"nextTask": "WBV2-P1-004",
"artifactCount": 13
},
"statusSummary": [
"# WBV2-P1-003 Status",
"status: done",
"task: WBV2-P1-003",
"gate: G1",
"updated: 2026-08-25 America/New_York",
"The transaction fixture verifies a bounded Main command history: failed",
"commands do not create a history entry, valid visibility changes advance the",
"revision, stale base revisions are rejected, undo/redo restore the exact"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1864,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 466
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P1-004.md",
"bytes": 1864,
"lines": 38,
"tokens": 466
},
{
"path": "tests/golden/WBV2-P1-003/manifest.json",
"bytes": 2528,
"lines": 33,
"tokens": 632
},
{
"path": "docs/status/WBV2-P1-003.md",
"bytes": 1158,
"lines": 30,
"tokens": 290
}
],
"sourceTokens": 2088,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2088,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3112,
"serializedContextTokens": 712,
"withinBudget": true
}
}

View File

@@ -0,0 +1,60 @@
{
"blenderVersion": "5.2.0 LTS",
"contract": {
"budget": {
"maxInputBytes": 1048576,
"maxLiveRequests": 1,
"releaseAfterCancel": true
},
"cancel": {
"code": "OPEN_CANCELLED",
"preservesRevision": true,
"resultPublished": false
},
"contractId": "workflow:harden_worker_cancel_restart_and_dispose",
"dispose": {
"doubleDispose": "NOOP",
"idempotent": true,
"released": true
},
"extensions": {
"futureField": {
"kind": "opaque",
"value": "preserve-me"
}
},
"generation": {
"afterRestart": 2,
"initial": 1,
"staleResult": "REJECTED"
},
"owners": {
"cpu": {
"afterCancel": 0,
"afterDispose": 0,
"afterRestart": 0,
"peak": 1
},
"gpu": {
"afterCancel": 0,
"afterDispose": 0,
"afterRestart": 0,
"peak": 1
},
"wasm": {
"afterCancel": 0,
"afterDispose": 0,
"afterRestart": 0,
"peak": 1
}
},
"schemaHash": "4567145720b21ffab0202d82584bc5ef41a829bc6a1be13683c35ed0115345ac",
"schemaVersion": 1
},
"fixtureSha256": "c17cf938451b7bdbcda9a04b1e6436f217269e3167804cc785fd0d32e2d9d4bb",
"operation": "WORKER_CANCEL_RESTART_DISPOSE_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"sourceSha256": "fe81c6faf84b9cc55ead37fd29dfeecd2bc8d279263ee14d6efffa1cef3e65ca",
"task": "WBV2-P1-004"
}

View File

@@ -0,0 +1,62 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-004",
"operation": "WORKER_CANCEL_RESTART_DISPOSE_LOCAL_BOUNDED",
"fixture": {
"path": "tests/files/web/generated/WBV2-P1-004-workflow-harden_worker_cancel_restart_and_dispose.blend",
"sha256": "c17cf938451b7bdbcda9a04b1e6436f217269e3167804cc785fd0d32e2d9d4bb"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P1-004/worker-lifecycle-desktop-report.json",
"sourceSha256": "fe81c6faf84b9cc55ead37fd29dfeecd2bc8d279263ee14d6efffa1cef3e65ca",
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"contractId": "workflow:harden_worker_cancel_restart_and_dispose",
"workerLifecycleContractStatus": "AVAILABLE",
"revision": 1,
"generation": {
"afterRestart": 2,
"initial": 1,
"staleResult": "REJECTED"
}
},
"cancel": {
"resultPublished": false,
"code": "OPEN_CANCELLED",
"staleResult": "REJECTED"
},
"owners": {
"cpu": {
"afterCancel": 0,
"afterDispose": 0,
"afterRestart": 0,
"peak": 1
},
"gpu": {
"afterCancel": 0,
"afterDispose": 0,
"afterRestart": 0,
"peak": 1
},
"wasm": {
"afterCancel": 0,
"afterDispose": 0,
"afterRestart": 0,
"peak": 1
}
},
"dispose": {
"doubleDispose": "NOOP",
"idempotent": true,
"released": true
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"hashDrift": "REJECTED_BEFORE_COMMIT"
},
"nextTask": "WBV2-P1-005"
}

View File

@@ -0,0 +1,35 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-005",
"parentTask": "WBV2-P1-004",
"enablingTask": true,
"parityStateChange": false,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "STORAGE_JOURNAL_RECOVERY_LOCAL_BOUNDED",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P1-004/manifest.json", "sha256": "19d9cbcf2455df8ffad49907b1765aeab45d865bd33a5771ed16a153b29887a1"},
"fixture": {"path": "tests/files/web/generated/WBV2-P1-005-workflow-harden_opfs_indexeddb_journal_recovery.blend", "sha256": "07455729e45c5b59caddfd2b06dbe76296ef4cb90d558d8a6c345d96f12ebdda"},
"generator": {"path": "tools/web/generated/WBV2-P1-005.py", "sha256": "de43529b8e5a593ae6e4d7794ab62b049dc19594ac898c0719a0f55cdc56f60d"},
"desktopChecker": {"path": "tools/web/check-wbv2-p1-005-desktop.py", "sha256": "5f0623982e94c4d7e61c3ededd8a37f9188d9165fad211af4473d604f4532676"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "5cd0dd03ee788f67fe2eb4543589fee4a47c21234a419a6f18b1e3e0c3a3c2e4"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "b9b14de9b38e894d607d851eda3a868c1936529c48f035bbf92a5738905f68f3"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "4df07c381505d7c06050f568c13905d053e7b02294bd210ac162a2dd32e3074b"},
"report": {"path": "tests/golden/WBV2-P1-005/storage-journal-report.json", "sha256": "4dcbc6e11868610d71bde782fbfbb84bfd94afdd6168e588d4a4e51cfd728c34"},
"desktopReport": {"path": "tests/golden/WBV2-P1-005/storage-journal-desktop-report.json", "sha256": "c328c0ce9e3a672c79ae21fdbe5f369ce58bd02d3e818f769b395287708c1eed"},
"status": {"path": "docs/status/WBV2-P1-005.md", "sha256": "b779068972c37706472da7090c2a58f222e0127430c38880ca524a41cdb4da13"},
"taskContext": {"path": "tests/golden/WBV2-P1-005/task-context.json", "sha256": "b8353597bffc19c8e005c4ca979916a12fd6cecab6c5e7e42b639e447000c287"},
"commandLog": {"path": "tests/golden/WBV2-P1-005/command.log", "sha256": "582cbd1a810f1bf7c79948bff064949a6be65093602524ce0e04ffeed61052c1"},
"wasmBuildLog": {"path": "tests/golden/WBV2-P1-005/wasm-build.log", "sha256": "7f21f5446576da369e7d925095695103e12be1afdec7a7e899a1d42e468fc74c"}
},
"negativeMatrix": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"interruptedCommit": "OLD_PROJECT_USABLE",
"hashMismatch": "QUARANTINED",
"restart": "RECOVERED",
"storageAfterRecovery": "ZERO"
},
"nextTask": "WBV2-P2-001"
}

View File

@@ -0,0 +1,53 @@
{
"blenderVersion": "5.2.0 LTS",
"contract": {
"budget": {
"maxJournalEntries": 32,
"maxProjectBytes": 4194304
},
"contractId": "workflow:harden_opfs_indexeddb_journal_recovery",
"extensions": {
"futureField": {
"kind": "opaque",
"value": "preserve-me"
}
},
"hash": {
"expected": "sha256:project-revision-8",
"mismatch": "QUARANTINED",
"verified": false
},
"journal": {
"interruptedAt": "BEFORE_PUBLISH",
"oldProjectUsable": true,
"oldRevision": 7,
"recovery": "ROLLBACK_OLD_REVISION",
"stagedRevision": 8
},
"restart": {
"generationAfter": 2,
"generationBefore": 1,
"status": "RECOVERED"
},
"schemaHash": "c7655279da06b11a53cce4b378f578369e161da132d07b9078024dd6fc796150",
"schemaVersion": 1,
"storage": {
"indexeddb": {
"afterRecovery": 0,
"journalEntriesBefore": 1,
"metadataRevision": 7
},
"opfs": {
"afterRecovery": 0,
"projectReadable": true,
"stagingFilesBefore": 1
}
}
},
"fixtureSha256": "07455729e45c5b59caddfd2b06dbe76296ef4cb90d558d8a6c345d96f12ebdda",
"operation": "STORAGE_JOURNAL_RECOVERY_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"sourceSha256": "b590362998b513d9fa81acf2ee13308d0b16f8010a8fb13264082b963a9abf5b",
"task": "WBV2-P1-005"
}

View File

@@ -0,0 +1,50 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-005",
"operation": "STORAGE_JOURNAL_RECOVERY_LOCAL_BOUNDED",
"fixture": {
"path": "tests/files/web/generated/WBV2-P1-005-workflow-harden_opfs_indexeddb_journal_recovery.blend",
"sha256": "07455729e45c5b59caddfd2b06dbe76296ef4cb90d558d8a6c345d96f12ebdda"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P1-005/storage-journal-desktop-report.json",
"sourceSha256": "b590362998b513d9fa81acf2ee13308d0b16f8010a8fb13264082b963a9abf5b",
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"contractId": "workflow:harden_opfs_indexeddb_journal_recovery",
"storageJournalContractStatus": "AVAILABLE",
"revision": 1,
"restart": {
"generationAfter": 2,
"generationBefore": 1,
"status": "RECOVERED"
}
},
"journal": {
"interruptedCommit": "BEFORE_PUBLISH",
"oldProjectUsable": true,
"recovery": "ROLLBACK_OLD_REVISION"
},
"hashMismatch": "QUARANTINED",
"storage": {
"indexeddb": {
"afterRecovery": 0,
"journalEntriesBefore": 1,
"metadataRevision": 7
},
"opfs": {
"afterRecovery": 0,
"projectReadable": true,
"stagingFilesBefore": 1
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"hashMismatch": "QUARANTINED"
},
"nextTask": "WBV2-P2-001"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P1-005",
"parentTask": "WBV2-P1-004",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable workflow:harden_opfs_indexeddb_journal_recovery data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "workflow:harden_opfs_indexeddb_journal_recovery",
"ownerFamily": "STORAGE",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P1-005.py -- tests/files/web/generated/WBV2-P1-005-workflow-harden_opfs_indexeddb_journal_recovery.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P1-005",
"node tools/web/check-generated-gap.mjs --task WBV2-P1-005"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 887,
"contextRemainingTokens": 220
},
"source": {
"bytes": 9017,
"tokens": 2256
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P1-005-workflow-harden_opfs_indexeddb_journal_recovery.blend",
"bytes": 87125,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P1-005.py",
"bytes": 2336,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 255189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 877157,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P1-005/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P1-005.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P1-005/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"interrupted commit leaves old project usable",
"hash mismatch quarantines payload",
"small project recovers after restart"
],
"nextTask": "WBV2-P2-001",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P1-005.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P1-004/manifest.json",
"parentStatus": "docs/status/WBV2-P1-004.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P1-005.md",
"tests/golden/WBV2-P1-004/manifest.json",
"docs/status/WBV2-P1-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-P1-004",
"parentTask": "WBV2-P1-003",
"status": "done",
"nextTask": "WBV2-P1-005",
"artifactCount": 15
},
"statusSummary": [
"# WBV2-P1-004 Status",
"status: done",
"task: WBV2-P1-004",
"gate: G1",
"updated: 2026-08-25 America/New_York",
"The worker lifecycle fixture exposes a bounded cancellation/restart/dispose",
"contract through the Blender Text datablock and the WASM SceneIR reader.",
"Desktop and WASM agree that cancelled opens publish no result, stale results"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1854,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 464
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P1-005.md",
"bytes": 1854,
"lines": 38,
"tokens": 464
},
{
"path": "tests/golden/WBV2-P1-004/manifest.json",
"bytes": 2886,
"lines": 36,
"tokens": 722
},
{
"path": "docs/status/WBV2-P1-004.md",
"bytes": 1478,
"lines": 33,
"tokens": 370
}
],
"sourceTokens": 2256,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2256,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3280,
"serializedContextTokens": 714,
"withinBudget": true
}
}

View File

@@ -0,0 +1,34 @@
{
"blenderVersion": "5.2.0 LTS",
"context": {
"collection": {
"childCollectionIds": [],
"id": "collection:WBV2P2001OutlinerCollection",
"name": "WBV2P2001OutlinerCollection",
"objectIds": [
"object:WBV2P2001SelectedObject"
]
},
"scene": {
"id": "scene:WBV2P2001Scene",
"name": "WBV2P2001Scene",
"rootCollectionId": "collection:Scene Collection"
},
"selection": {
"activeObjectId": "object:WBV2P2001SelectedObject",
"revision": 1,
"selectedObjectIds": [
"object:WBV2P2001SelectedObject"
]
}
},
"fixtureSha256": "b84250d06f42b32b5c4912cb2411b90dda2167c69681d0e7e861d84352eec78c",
"missingData": {
"library": null,
"pinnedData": null
},
"operation": "EDITOR_OPEN_SCENE_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "WBV2-P2-001"
}

View File

@@ -0,0 +1,31 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-001",
"operation": "EDITOR_OPEN_SCENE_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/WBV2-P2-001-EDITOR.OPEN_SCENE.blend",
"sha256": "b84250d06f42b32b5c4912cb2411b90dda2167c69681d0e7e861d84352eec78c"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P2-001/editor-open-scene-desktop-report.json",
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"workflowStatus": "AVAILABLE",
"sceneId": "scene:WBV2P2001Scene",
"rootCollectionId": "collection:WBV2P2001OutlinerCollection",
"activeObjectId": "object:WBV2P2001SelectedObject",
"selectionRevision": 1,
"missingData": {
"pinnedData": null,
"library": null
}
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "WBV2-P2-002"
}

View File

@@ -0,0 +1,33 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-001",
"parentTask": "WBV2-P1-005",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "EDITOR_OPEN_SCENE_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P1-005/manifest.json", "sha256": "cb22c9c218ffcac0fd45527817eb864dbaf8f677e9b18775275f2f0fc8aa302d"},
"fixture": {"path": "tests/files/web/generated/WBV2-P2-001-EDITOR.OPEN_SCENE.blend", "sha256": "b84250d06f42b32b5c4912cb2411b90dda2167c69681d0e7e861d84352eec78c"},
"generator": {"path": "tools/web/generated/WBV2-P2-001.py", "sha256": "747c9d734e90673dc7d6b3e01411bfc9443ffda9c22dc61d55c46207740c0df6"},
"desktopChecker": {"path": "tools/web/check-wbv2-p2-001-desktop.py", "sha256": "17db8ed9655ccdf1bfe0283cba2eae501abfb9cdbccdf5bd7ed665a52ee819d2"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "057753285f557b170cfda69dd0c116854b2042c9163948f2f33eddfb639d4904"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "754300d1fc9cdfffb4286e36054c0ab724c8bad067761e4b7c2718ed236b23e9"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "4df07c381505d7c06050f568c13905d053e7b02294bd210ac162a2dd32e3074b"},
"report": {"path": "tests/golden/WBV2-P2-001/editor-open-scene-report.json", "sha256": "f602facfecca629e95f0231ff0e4de4a25b2e7a1b2a7f7103288f8e285be6c6d"},
"desktopReport": {"path": "tests/golden/WBV2-P2-001/editor-open-scene-desktop-report.json", "sha256": "644db9afdd919c938ca1067946e242d516d3aba90aa5a2f32d9754730df8a874"},
"status": {"path": "docs/status/WBV2-P2-001.md", "sha256": "29acd859aeb6d173ce4bbdff9fd103b699a0b6ff486c12b7ebecc123b7a1d82e"},
"taskContext": {"path": "tests/golden/WBV2-P2-001/task-context.json", "sha256": "c2294208826024535cd505938658535352c6f1b8b8938e5bcd2ad90dbe2fe538"},
"commandLog": {"path": "tests/golden/WBV2-P2-001/command.log", "sha256": "1ff373478efc0559ff869c17e13087856d4fb88609d715193f77dce819b292bd"}
},
"negativeMatrix": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"missingData": "STRUCTURED_NULL_FIELDS",
"selectionRevision": "MATCHED_DESKTOP",
"saveReopen": "EXACT"
},
"nextTask": "WBV2-P2-002"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-001",
"parentTask": "WBV2-P1-005",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable EDITOR.OPEN_SCENE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "EDITOR.OPEN_SCENE",
"ownerFamily": "EDITOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P2-001.py -- tests/files/web/generated/WBV2-P2-001-EDITOR.OPEN_SCENE.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P2-001",
"node tools/web/check-generated-gap.mjs --task WBV2-P2-001"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1140,
"contextRemainingTokens": 283
},
"source": {
"bytes": 8764,
"tokens": 2193
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P2-001-EDITOR.OPEN_SCENE.blend",
"bytes": 86465,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P2-001.py",
"bytes": 1177,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 255189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 881727,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P2-001/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P2-001.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P2-001/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"stable IDs and selection revision match",
"missing data is structured",
"reopen preserves context"
],
"nextTask": "WBV2-P2-002",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P2-001.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P1-005/manifest.json",
"parentStatus": "docs/status/WBV2-P1-005.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P2-001.md",
"tests/golden/WBV2-P1-005/manifest.json",
"docs/status/WBV2-P1-005.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-P1-005",
"parentTask": "WBV2-P1-004",
"status": "done",
"nextTask": "WBV2-P2-001",
"artifactCount": 15
},
"statusSummary": [
"# WBV2-P1-005 Status",
"status: done",
"task: WBV2-P1-005",
"gate: G1",
"updated: 2026-08-25 America/New_York",
"The storage journal fixture exposes a bounded OPFS/IndexedDB recovery",
"contract through the Blender Text datablock and WASM SceneIR reader. Desktop",
"and WASM agree that an interrupted commit keeps the old revision usable, a"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1701,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 426
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P2-001.md",
"bytes": 1701,
"lines": 38,
"tokens": 426
},
{
"path": "tests/golden/WBV2-P1-005/manifest.json",
"bytes": 2861,
"lines": 36,
"tokens": 716
},
{
"path": "docs/status/WBV2-P1-005.md",
"bytes": 1403,
"lines": 33,
"tokens": 351
}
],
"sourceTokens": 2193,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2193,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3217,
"serializedContextTokens": 685,
"withinBudget": true
}
}

View File

@@ -0,0 +1,37 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-002",
"parentTask": "WBV2-P2-001",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "OBJECT_TRANSFORM_HIERARCHY_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P2-001/manifest.json", "sha256": "ad6d73ac457d20f95fd080fcdacc38049d2ce9faa8c56f325f9f7f22074d1cb5"},
"fixture": {"path": "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend", "sha256": "62c70feb65822a58c38024d604d4cf93809372c3b7e79493f7829c4039ae01e6"},
"generator": {"path": "tools/web/generated/WBV2-P2-002.py", "sha256": "17f6a47ab91b92a8128829b011a3341ba7f9cb67192cb7bc81c1a09f72227d65"},
"desktopChecker": {"path": "tools/web/check-wbv2-p2-002-desktop.py", "sha256": "d1568d92ccfda05d7b580ab1c8e4a709e617cb65f78bcb995df7da88373c14c5"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"productionApi": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", "sha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8"},
"productionMainState": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", "sha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "ed85b49db9539efe2080d47365274e7731175b18e8e02812980fb86c792203cf"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "9eb8feba27f073b79a03f3285a8ffb45aa1c89008931656e4b195d9da21f7002"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c"},
"report": {"path": "tests/golden/WBV2-P2-002/object-transform-report.json", "sha256": "17ede4ecd88d750dfb88e4ef3ab8467d55eb3be221e0d0f58b47bf20b80e646f"},
"desktopReport": {"path": "tests/golden/WBV2-P2-002/object-transform-desktop-report.json", "sha256": "045543872dd311216d21d57b6f33285234e444c9c77532c7d53f66708d7293fc"},
"status": {"path": "docs/status/WBV2-P2-002.md", "sha256": "380a34433691aea47a6e34a7deb1c506dfde8dac2d1773d1e4b11579fc08b7a3"},
"taskContext": {"path": "tests/golden/WBV2-P2-002/task-context.json", "sha256": "e72ab724eb1f096ec1927091fac80c121343ea8a3e0a675f33032f84d47840be"},
"commandLog": {"path": "tests/golden/WBV2-P2-002/command.log", "sha256": "790054e07e23af09908cb2d2518cbe8607c503d6f4384a166cc25b5276b1445d"},
"wasmBuildLog": {"path": "tests/golden/WBV2-P2-002/wasm-build.log", "sha256": "a74e9b6691395cb4fea394bf711716774a5fc9349196706f8701c5ba285bf95e"}
},
"negativeMatrix": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"parentCycle": "REJECTED_WITHOUT_REVISION_CHANGE",
"lockedOrLibraryTarget": "REJECTED_WITHOUT_REVISION_CHANGE",
"saveReopen": "EXACT",
"undoRedo": "EXACT"
},
"nextTask": "WBV2-P2-003"
}

View File

@@ -0,0 +1,86 @@
{
"blenderVersion": "5.2.0 LTS",
"fixtureSha256": "62c70feb65822a58c38024d604d4cf93809372c3b7e79493f7829c4039ae01e6",
"operation": "OBJECT_TRANSFORM_HIERARCHY_DESKTOP",
"saveReopen": "EXACT",
"scene": {
"collections": {
"source": {
"id": "collection:WBV2P2002Source",
"objectIds": [
"object:WBV2P2002Parent",
"object:WBV2P2002Child"
]
},
"target": {
"id": "collection:WBV2P2002Target",
"objectIds": []
}
},
"objects": {
"child": {
"dataId": "mesh:WBV2P2002ChildMesh",
"id": "object:WBV2P2002Child",
"parentId": "object:WBV2P2002Parent",
"rotationEuler": [
0.0,
0.0,
0.0
],
"scale": [
1.0,
1.0,
1.0
],
"translation": [
0.0,
2.0,
0.0
],
"worldTranslation": [
1.0,
2.0,
0.0
]
},
"parent": {
"dataId": "mesh:WBV2P2002ParentMesh",
"id": "object:WBV2P2002Parent",
"parentId": null,
"rotationEuler": [
0.0,
0.0,
0.0
],
"scale": [
1.0,
1.0,
1.0
],
"translation": [
1.0,
0.0,
0.0
],
"worldTranslation": [
1.0,
0.0,
0.0
]
}
},
"scene": {
"id": "scene:WBV2P2002Scene",
"name": "WBV2P2002Scene"
},
"selection": {
"activeObjectId": "object:WBV2P2002Parent",
"revision": 1,
"selectedObjectIds": [
"object:WBV2P2002Parent"
]
}
},
"schemaVersion": 1,
"task": "WBV2-P2-002"
}

View File

@@ -0,0 +1,40 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-002",
"operation": "OBJECT_TRANSFORM_HIERARCHY_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend",
"sha256": "62c70feb65822a58c38024d604d4cf93809372c3b7e79493f7829c4039ae01e6"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P2-002/object-transform-desktop-report.json",
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"parentId": "object:WBV2P2002Parent",
"childId": "object:WBV2P2002Child",
"transformedChildWorldTranslation": [
2,
2,
0
],
"targetCollectionId": "collection:WBV2P2002Target",
"finalRevision": 6
},
"transactions": {
"transform": "COMMITTED",
"parentCycle": "REJECTED",
"lockedOrLibraryTarget": "REJECTED",
"moveCollection": "COMMITTED",
"unparent": "COMMITTED",
"undo": "EXACT",
"redo": "EXACT"
},
"saveReopen": "EXACT",
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "WBV2-P2-003"
}

View File

@@ -0,0 +1,183 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-002",
"parentTask": "WBV2-P2-001",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable OBJECT.TRANSFORM_HIERARCHY data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "OBJECT.TRANSFORM_HIERARCHY",
"ownerFamily": "EDITOR",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P2-002.py -- tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P2-002",
"node tools/web/check-generated-gap.mjs --task WBV2-P2-002"
],
"inputPaths": [
"tools/web/generated/WBV2-P2-002.py"
],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1701,
"contextRemainingTokens": 423
},
"source": {
"bytes": 8203,
"tokens": 2053
},
"selected": [
{
"path": "tools/web/generated/WBV2-P2-002.py",
"bytes": 1358,
"tokens": 340
}
],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend",
"bytes": 86822,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 255189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 888939,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P2-002/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P2-002.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P2-002/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 1,
"bytes": 1358,
"tokens": 340
}
},
"exitCriteria": [
"world matrix parity",
"cycle/locked/library edits reject",
"undo/redo/save/reopen stable"
],
"nextTask": "WBV2-P2-003",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P2-002.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P2-001/manifest.json",
"parentStatus": "docs/status/WBV2-P2-001.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P2-002.md",
"tests/golden/WBV2-P2-001/manifest.json",
"docs/status/WBV2-P2-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-P2-001",
"parentTask": "WBV2-P1-005",
"status": "done",
"nextTask": "WBV2-P2-002",
"artifactCount": 14
},
"statusSummary": [
"# WBV2-P2-001 status",
"- task: `WBV2-P2-001`",
"- parent: `WBV2-P1-005`",
"- parity: `EDITOR.OPEN_SCENE`",
"- implementationClass: `LOCAL_EXACT`",
"- status: `done`",
"- fixture: `tests/files/web/generated/WBV2-P2-001-EDITOR.OPEN_SCENE.blend`",
"## Evidence"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1746,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 437
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P2-002.md",
"bytes": 1746,
"lines": 38,
"tokens": 437
},
{
"path": "tests/golden/WBV2-P2-001/manifest.json",
"bytes": 2645,
"lines": 34,
"tokens": 662
},
{
"path": "docs/status/WBV2-P2-001.md",
"bytes": 1013,
"lines": 28,
"tokens": 254
}
],
"sourceTokens": 2053,
"evidenceFiles": 1,
"evidenceBytes": 1358,
"evidenceTokens": 340,
"totalTokens": 2393,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3417,
"serializedContextTokens": 724,
"withinBudget": true
}
}

View File

@@ -0,0 +1,36 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-003",
"parentTask": "WBV2-P2-002",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "MESH_EDIT_CORE_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P2-002/manifest.json", "sha256": "fa65312256f556ce80609206e266f7fc3ccbeda34eae3da179040f8e80dd017c"},
"fixture": {"path": "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend", "sha256": "1a9a894c4106d73a4533485d9fdddfe2883f75e4692b8e53dc174308e12fe60b"},
"generator": {"path": "tools/web/generated/WBV2-P2-003.py", "sha256": "65d90913dfd63b345c5efc7851bf312330b0a37ed31c4fdb928ba36fb25e77b6"},
"desktopChecker": {"path": "tools/web/check-wbv2-p2-003-desktop.py", "sha256": "640048eb905b3849669f6b74bb19ca126851c8cbd4e525c9b7d00d70fe40e3e6"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"productionApi": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp", "sha256": "8fa70dc7605e66393482e661e5987a8443dded56ab0092aeb977b40ae49888f8"},
"productionMainState": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_main_state.cpp", "sha256": "3c31a049714860cc89c5b28ebad887a1978df11f8c528c3dfd7836635ed62fb3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "29582f7109c8e2b8584e85d7cd15dc2f91ce4f276a580eccae249ae8d4a2095f"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "4f38de9f1502b6676cfba72942af965aa040708c40345e36854d3240f8c82729"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c"},
"report": {"path": "tests/golden/WBV2-P2-003/mesh-edit-report.json", "sha256": "f8bd2ced2e1345248d4b536ef045bb9446a55ca5ae87d834f38904b86521b11d"},
"desktopReport": {"path": "tests/golden/WBV2-P2-003/mesh-edit-desktop-report.json", "sha256": "de03b2c0f35e8d437d164b8d010438c1fbc004f933f8a13470874f02247b74c8"},
"status": {"path": "docs/status/WBV2-P2-003.md", "sha256": "b861926c45ab96465e419fccabbcd01d887359d5493e477e12c1d23a1ee1c645"},
"taskContext": {"path": "tests/golden/WBV2-P2-003/task-context.json", "sha256": "41ab5af171f582c766a47e1dd39c748b6a0709333b45264843ba8cf75216b890"},
"commandLog": {"path": "tests/golden/WBV2-P2-003/command.log", "sha256": "fec55388964c4f0c2288b35a5046a73779eb918d96225909b9070614c07eb3c1"},
"wasmBuildLog": {"path": "tests/golden/WBV2-P2-003/wasm-build.log", "sha256": "90e0120b3f5a5806c188408c5c5a0b3c4b5adade16d66a99640b9ed011ee22c5"}
},
"negativeMatrix": {
"invalidOperation": "REJECTED_WITHOUT_REVISION_CHANGE",
"invalidSelection": "REJECTED_WITHOUT_REVISION_CHANGE",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"saveReopen": "EXACT"
},
"nextTask": "WBV2-P2-004"
}

View File

@@ -0,0 +1,73 @@
{
"blenderVersion": "5.2.0 LTS",
"fixtureSha256": "1a9a894c4106d73a4533485d9fdddfe2883f75e4692b8e53dc174308e12fe60b",
"meshes": {
"Bevel": {
"edgeCount": 4,
"faceCount": 1,
"meshId": "mesh:WBV2P2003BevelMesh",
"objectId": "object:WBV2P2003BevelObject",
"positionHash": "6950892ba966c4c44e1aef91ab52d8dfede9a33a1d33f4a5d139bc543d3158c5",
"triangleCount": 2,
"vertexCount": 4
},
"Dissolve": {
"edgeCount": 4,
"faceCount": 1,
"meshId": "mesh:WBV2P2003DissolveMesh",
"objectId": "object:WBV2P2003DissolveObject",
"positionHash": "6950892ba966c4c44e1aef91ab52d8dfede9a33a1d33f4a5d139bc543d3158c5",
"triangleCount": 2,
"vertexCount": 4
},
"Extrude": {
"edgeCount": 4,
"faceCount": 1,
"meshId": "mesh:WBV2P2003ExtrudeMesh",
"objectId": "object:WBV2P2003ExtrudeObject",
"positionHash": "6950892ba966c4c44e1aef91ab52d8dfede9a33a1d33f4a5d139bc543d3158c5",
"triangleCount": 2,
"vertexCount": 4
},
"Inset": {
"edgeCount": 4,
"faceCount": 1,
"meshId": "mesh:WBV2P2003InsetMesh",
"objectId": "object:WBV2P2003InsetObject",
"positionHash": "6950892ba966c4c44e1aef91ab52d8dfede9a33a1d33f4a5d139bc543d3158c5",
"triangleCount": 2,
"vertexCount": 4
},
"LoopCut": {
"edgeCount": 4,
"faceCount": 1,
"meshId": "mesh:WBV2P2003LoopCutMesh",
"objectId": "object:WBV2P2003LoopCutObject",
"positionHash": "6950892ba966c4c44e1aef91ab52d8dfede9a33a1d33f4a5d139bc543d3158c5",
"triangleCount": 2,
"vertexCount": 4
},
"Merge": {
"edgeCount": 4,
"faceCount": 1,
"meshId": "mesh:WBV2P2003MergeMesh",
"objectId": "object:WBV2P2003MergeObject",
"positionHash": "6950892ba966c4c44e1aef91ab52d8dfede9a33a1d33f4a5d139bc543d3158c5",
"triangleCount": 2,
"vertexCount": 4
},
"Translate": {
"edgeCount": 4,
"faceCount": 1,
"meshId": "mesh:WBV2P2003TranslateMesh",
"objectId": "object:WBV2P2003TranslateObject",
"positionHash": "6950892ba966c4c44e1aef91ab52d8dfede9a33a1d33f4a5d139bc543d3158c5",
"triangleCount": 2,
"vertexCount": 4
}
},
"operation": "MESH_EDIT_CORE_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "WBV2-P2-003"
}

View File

@@ -0,0 +1,84 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-003",
"operation": "MESH_EDIT_CORE_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend",
"sha256": "1a9a894c4106d73a4533485d9fdddfe2883f75e4692b8e53dc174308e12fe60b"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P2-003/mesh-edit-desktop-report.json",
"saveReopen": "EXACT",
"initialTopology": "quad"
},
"wasm": {
"status": "EXACT",
"operations": {
"Translate": {
"meshId": "mesh:WBV2P2003TranslateMesh",
"revision": 2,
"vertexCount": 4,
"edgeCount": 4,
"faceCount": 1,
"triangleCount": 2
},
"Merge": {
"meshId": "mesh:WBV2P2003MergeMesh",
"revision": 3,
"vertexCount": 3,
"edgeCount": 3,
"faceCount": 1,
"triangleCount": 1
},
"Dissolve": {
"meshId": "mesh:WBV2P2003DissolveMesh",
"revision": 4,
"vertexCount": 4,
"edgeCount": 4,
"faceCount": 1,
"triangleCount": 2
},
"Extrude": {
"meshId": "mesh:WBV2P2003ExtrudeMesh",
"revision": 5,
"vertexCount": 8,
"edgeCount": 12,
"faceCount": 6,
"triangleCount": 12
},
"Inset": {
"meshId": "mesh:WBV2P2003InsetMesh",
"revision": 6,
"vertexCount": 8,
"edgeCount": 12,
"faceCount": 5,
"triangleCount": 10
},
"Bevel": {
"meshId": "mesh:WBV2P2003BevelMesh",
"revision": 7,
"vertexCount": 4,
"edgeCount": 4,
"faceCount": 1,
"triangleCount": 2
},
"LoopCut": {
"meshId": "mesh:WBV2P2003LoopCutMesh",
"revision": 8,
"vertexCount": 5,
"edgeCount": 5,
"faceCount": 1,
"triangleCount": 3
}
},
"finalRevision": 8
},
"negative": {
"invalidOperation": "REJECTED_WITHOUT_REVISION_CHANGE",
"invalidSelection": "REJECTED_WITHOUT_REVISION_CHANGE",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"saveReopen": "EXACT",
"nextTask": "WBV2-P2-004"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-003",
"parentTask": "WBV2-P2-002",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable MESH.EDIT_CORE data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "MESH.EDIT_CORE",
"ownerFamily": "MESH",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P2-003.py -- tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P2-003",
"node tools/web/check-generated-gap.mjs --task WBV2-P2-003"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 825,
"contextRemainingTokens": 205
},
"source": {
"bytes": 9079,
"tokens": 2271
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend",
"bytes": 88023,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P2-003.py",
"bytes": 1161,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 255189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 895739,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P2-003/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P2-003.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P2-003/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"topology/attributes match",
"invalid selection and budget fail closed",
"single transaction and reopen stable"
],
"nextTask": "WBV2-P2-004",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P2-003.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P2-002/manifest.json",
"parentStatus": "docs/status/WBV2-P2-002.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P2-003.md",
"tests/golden/WBV2-P2-002/manifest.json",
"docs/status/WBV2-P2-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-P2-002",
"parentTask": "WBV2-P2-001",
"status": "done",
"nextTask": "WBV2-P2-003",
"artifactCount": 17
},
"statusSummary": [
"# WBV2-P2-002 status",
"- task: `WBV2-P2-002`",
"- parent: `WBV2-P2-001`",
"- parity: `OBJECT.TRANSFORM_HIERARCHY`",
"- implementationClass: `LOCAL_EXACT`",
"- status: `done`",
"- fixture: `tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend`",
"## Evidence"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1684,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 421
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P2-003.md",
"bytes": 1684,
"lines": 38,
"tokens": 421
},
{
"path": "tests/golden/WBV2-P2-002/manifest.json",
"bytes": 3223,
"lines": 38,
"tokens": 806
},
{
"path": "docs/status/WBV2-P2-002.md",
"bytes": 1373,
"lines": 33,
"tokens": 344
}
],
"sourceTokens": 2271,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2271,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3295,
"serializedContextTokens": 685,
"withinBudget": true
}
}

View File

@@ -0,0 +1,39 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-004",
"parentTask": "WBV2-P2-003",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_WASM_MAIN_AND_PLAYWRIGHT_CHROMIUM",
"operation": "VIEWPORT_MAIN_OFFSCREEN_LOCAL_BOUNDED",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P2-003/manifest.json", "sha256": "79ebc20719fef2b60a3457bca25dac98e755a2f2c1bd3c35361527509a91a987"},
"fixture": {"path": "tests/files/web/generated/WBV2-P2-004-VIEWPORT.MAIN_OFFSCREEN.blend", "sha256": "69cb86102cad7f6a8e747ed29b3456761ba4a1de7f33e7c0d6dc7d3b5dbd2e17"},
"generator": {"path": "tools/web/generated/WBV2-P2-004.py", "sha256": "fad8f75b84b5c4c1757645e94d81af265aba8f911d2ffd1c05abcffc24b24a51"},
"desktopChecker": {"path": "tools/web/check-wbv2-p2-004-desktop.py", "sha256": "cd936e328b79a83db910099a20136bac694c446509d8618cd199d6f8c7d34625"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "29582f7109c8e2b8584e85d7cd15dc2f91ce4f276a580eccae249ae8d4a2095f"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "4f38de9f1502b6676cfba72942af965aa040708c40345e36854d3240f8c82729"},
"offscreenProtocol": {"path": "web/app/src/three-adapter/offscreen-viewport-protocol.ts", "sha256": "d79367b6361036a4d5b8cf0d12d9ffce783e3e2b6d686b5b5b152aa40ac9ae2e"},
"offscreenViewport": {"path": "web/app/src/three-adapter/offscreen-viewport.ts", "sha256": "1d7d18146d34245e07392022a703ff16f6432093fb88e788927e1347556ffd71"},
"offscreenWorker": {"path": "web/app/src/workers/viewport-render.worker.ts", "sha256": "9643724d2530a0af434613d4734f66fb18620a11e9f487d4d9d9e6312374c14b"},
"mainViewport": {"path": "web/app/src/three-adapter/viewport.ts", "sha256": "e8d97cb59fd4eca3789aeeb35221a70cf47ef048a5665383d809d0efc49f7119"},
"package": {"path": "web/package.json", "sha256": "40b7f14d4f568ae94bedde83e02115c127e0c714e5eb32a6a97b1e1084c4fa68"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c"},
"report": {"path": "tests/golden/WBV2-P2-004/viewport-report.json", "sha256": "a38e7ff8da3042a82f4d20f9f6c60300ebd6ee393cf3625901c770ebff674dac"},
"desktopReport": {"path": "tests/golden/WBV2-P2-004/viewport-desktop-report.json", "sha256": "24383a87477efe6d72f457819260143d0b5f1a5b5c918a8e39279a13a3bfdc0c"},
"status": {"path": "docs/status/WBV2-P2-004.md", "sha256": "56194bd7e40632398823467ab5cc1fd9b633f4605086bd40acc3865a94cfb268"},
"taskContext": {"path": "tests/golden/WBV2-P2-004/task-context.json", "sha256": "7071c819b734d543cda60f3ac833d6b004befc1f3484c1396ebd9c96afd7c679"},
"commandLog": {"path": "tests/golden/WBV2-P2-004/command.log", "sha256": "a2f494634f16d33ed5d341d241b190a4dd34c9b0ba39f0834afc1f48f7c67867"},
"browserBuildLog": {"path": "tests/golden/WBV2-P2-004/browser-build.log", "sha256": "60187c83b43444ff22d02e505e74a94dc3c4b058d4c4f280ae67701089ab67af"}
},
"negativeMatrix": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"mainDeviceLoss": "RECOVERED_WITH_NONBLANK_READBACK",
"offscreenDisposeReopen": "EXACT",
"saveReopen": "EXACT"
},
"nextTask": "WBV2-P2-005"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-004",
"parentTask": "WBV2-P2-003",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable VIEWPORT.MAIN_OFFSCREEN data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "VIEWPORT.MAIN_OFFSCREEN",
"ownerFamily": "VIEWPORT",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P2-004.py -- tests/files/web/generated/WBV2-P2-004-VIEWPORT.MAIN_OFFSCREEN.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P2-004",
"node tools/web/check-generated-gap.mjs --task WBV2-P2-004"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1171,
"contextRemainingTokens": 292
},
"source": {
"bytes": 8733,
"tokens": 2184
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P2-004-VIEWPORT.MAIN_OFFSCREEN.blend",
"bytes": 87800,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P2-004.py",
"bytes": 1325,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 255189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 906837,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P2-004/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P2-004.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P2-004/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"both paths have nonblank pixels",
"selection/camera revision is shared",
"device loss releases resources"
],
"nextTask": "WBV2-P2-005",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P2-004.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P2-003/manifest.json",
"parentStatus": "docs/status/WBV2-P2-003.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P2-004.md",
"tests/golden/WBV2-P2-003/manifest.json",
"docs/status/WBV2-P2-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-P2-003",
"parentTask": "WBV2-P2-002",
"status": "done",
"nextTask": "WBV2-P2-004",
"artifactCount": 17
},
"statusSummary": [
"# WBV2-P2-003 status",
"- task: `WBV2-P2-003`",
"- parent: `WBV2-P2-002`",
"- parity: `MESH.EDIT_CORE`",
"- implementationClass: `LOCAL_EXACT`",
"- status: `done`",
"- fixture: `tests/files/web/generated/WBV2-P2-003-MESH.EDIT_CORE.blend`",
"## Evidence"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1735,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 434
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P2-004.md",
"bytes": 1735,
"lines": 38,
"tokens": 434
},
{
"path": "tests/golden/WBV2-P2-003/manifest.json",
"bytes": 3160,
"lines": 37,
"tokens": 790
},
{
"path": "docs/status/WBV2-P2-003.md",
"bytes": 1039,
"lines": 27,
"tokens": 260
}
],
"sourceTokens": 2184,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2184,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3208,
"serializedContextTokens": 692,
"withinBudget": true
}
}

View File

@@ -0,0 +1,28 @@
{
"blenderVersion": "5.2.0 LTS",
"fixtureSha256": "69cb86102cad7f6a8e747ed29b3456761ba4a1de7f33e7c0d6dc7d3b5dbd2e17",
"operation": "VIEWPORT_MAIN_OFFSCREEN_DESKTOP",
"saveReopen": "EXACT",
"scene": {
"cameraDataId": "camera:WBV2P2004ViewportCamera",
"cameraId": "object:WBV2P2004ViewportCamera",
"cameraLensMm": 52.0,
"cameraLocation": [
6.5,
-6.5,
4.75
],
"cubeId": "object:WBV2P2004ViewportCube",
"cubeLocation": [
0.0,
0.0,
0.0
],
"faceCount": 6,
"meshId": "mesh:WBV2P2004ViewportCubeMesh",
"sceneId": "scene:WBV2P2004ViewportScene",
"vertexCount": 8
},
"schemaVersion": 1,
"task": "WBV2-P2-004"
}

View File

@@ -0,0 +1,97 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-004",
"operation": "VIEWPORT_MAIN_OFFSCREEN_LOCAL_BOUNDED",
"fixture": {
"path": "tests/files/web/generated/WBV2-P2-004-VIEWPORT.MAIN_OFFSCREEN.blend",
"sha256": "69cb86102cad7f6a8e747ed29b3456761ba4a1de7f33e7c0d6dc7d3b5dbd2e17"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P2-004/viewport-desktop-report.json",
"scene": {
"cameraDataId": "camera:WBV2P2004ViewportCamera",
"cameraId": "object:WBV2P2004ViewportCamera",
"cameraLensMm": 52,
"cameraLocation": [
6.5,
-6.5,
4.75
],
"cubeId": "object:WBV2P2004ViewportCube",
"cubeLocation": [
0,
0,
0
],
"faceCount": 6,
"meshId": "mesh:WBV2P2004ViewportCubeMesh",
"sceneId": "scene:WBV2P2004ViewportScene",
"vertexCount": 8
},
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"revision": 1,
"objectId": "object:WBV2P2004ViewportCube",
"cameraObjectId": "object:WBV2P2004ViewportCamera",
"cameraDataId": "camera:WBV2P2004ViewportCamera",
"saveReopen": "EXACT"
},
"browser": {
"runtime": "PLAYWRIGHT_CHROMIUM",
"main": {
"backend": "webgl-pbr",
"deviceStatus": "ready",
"rendererPixels": 0,
"readbackPixels": 256,
"selected": "object:WBV2P2004ViewportCube",
"cameraPosition": "4.219781,-4.219781,3.658811",
"cameraTarget": "0,0,0",
"cameraYaw": "-0.785398",
"cameraPitch": "0.550000",
"cameraDistance": "7.000000",
"viewport": "679x321",
"error": "",
"deviceRecovery": {
"supported": true,
"status": "ready",
"pixels": 1024
},
"dispose": "EXACT"
},
"offscreen": {
"backend": "offscreen-worker",
"deviceStatus": "ready",
"rendererPixels": 61,
"readbackPixels": 0,
"selected": "object:WBV2P2004ViewportCube",
"cameraPosition": "4.219781,-4.219781,3.658811",
"cameraTarget": "0,0,0",
"cameraYaw": "-0.785398",
"cameraPitch": "0.550000",
"cameraDistance": "7.000000",
"viewport": "679x321",
"error": "",
"deviceRecovery": {
"supported": false,
"status": "ready",
"pixels": 61
},
"dispose": "EXACT"
},
"sharedSelection": "object:WBV2P2004ViewportCube",
"sharedCamera": {
"position": "4.219781,-4.219781,3.658811",
"target": "0,0,0",
"yaw": "-0.785398",
"pitch": "0.550000",
"distance": "7.000000"
}
},
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "WBV2-P2-005"
}

View File

@@ -0,0 +1,38 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-005",
"parentTask": "WBV2-P2-004",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_WASM_MAIN_AND_PLAYWRIGHT_CHROMIUM",
"operation": "WORKFLOW_P0_USER_LOOP_LOCAL_BOUNDED",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P2-004/manifest.json", "sha256": "9a511f9620bdc886ab4684ac449dcaa156086cde76c0b95d16795f0f51a304f2"},
"fixture": {"path": "tests/files/web/generated/WBV2-P2-005-WORKFLOW.P0_USER_LOOP.blend", "sha256": "51788408d7b1a273583872b749eec36191db441d431b2d4ddcfffecddb256999"},
"generator": {"path": "tools/web/generated/WBV2-P2-005.py", "sha256": "96f6788bbe901f98d1bb2b50ec49e6d0418a8ec3c784e95dce54e7a1eab49e19"},
"desktopChecker": {"path": "tools/web/check-wbv2-p2-005-desktop.py", "sha256": "176359ff0665ec2fc1b62b0ac9a5af96dbc70977c7e5100c99aed5fd22b5e524"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "0f979e0f5f14a5db97d2f7cb24a8c4e13980db64268d4161cc9b520cad1ac4fa"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "e3460ba1f57bab2b17d98faec55dedc16bc4bcea4c23945196285dd7688f8cfd"},
"app": {"path": "web/app/src/app/App.tsx", "sha256": "5861988f3dfbb8c05d36aee3033a72514de53a0cb4ec6f3d832418ef6b5cc8b2"},
"engineClient": {"path": "web/app/src/engine-client/WebEngineClient.ts", "sha256": "f6d9a8e0a16403bc6fb765195b8f1a619a28de7a75c59a412f1654d46e8ebc0b"},
"glbExporter": {"path": "web/protocol/glb-export.ts", "sha256": "a5d342827860a9e55b49a3bb3a196a01b1e53546325d6e594778afb9360c3125"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c"},
"report": {"path": "tests/golden/WBV2-P2-005/workflow-report.json", "sha256": "aee794bac23af8acaaabe8ed808fad27a97dc628ed1cadd6224db2573b0a77ec"},
"desktopReport": {"path": "tests/golden/WBV2-P2-005/workflow-desktop-report.json", "sha256": "4a39d9dccfb2fa80992ca6abab2afcfd33052e427e3fd5f602c6bfb96622bdbe"},
"status": {"path": "docs/status/WBV2-P2-005.md", "sha256": "f6be0ed47988bf3cab9a562ee36e31057919189fc589e17ced60c313ebf8fcee"},
"taskContext": {"path": "tests/golden/WBV2-P2-005/task-context.json", "sha256": "9b494efbfa077f3d37b186a42631029e11108cef83a40aae1cab98f41312a276"},
"commandLog": {"path": "tests/golden/WBV2-P2-005/command.log", "sha256": "a12ee0d21a00299b7d64be7814e479c4ab350e8e799b406af6849527feb2027d"}
},
"negativeMatrix": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"cancellation": "RETAINED_PREVIOUS_SCENE_AND_RELEASED_RESOURCES",
"workerFault": "RECOVERED_WITH_EDITED_SCENE",
"duplicateSave": "SINGLE_COMMITTED_DOWNLOAD",
"saveReopen": "EXACT",
"glbExport": "VALID_GLTF_BINARY"
},
"nextTask": "WBV2-P3-001"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-005",
"parentTask": "WBV2-P2-004",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable WORKFLOW.P0_USER_LOOP data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "WORKFLOW.P0_USER_LOOP",
"ownerFamily": "INTEGRATION",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P2-005.py -- tests/files/web/generated/WBV2-P2-005-WORKFLOW.P0_USER_LOOP.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P2-005",
"node tools/web/check-generated-gap.mjs --task WBV2-P2-005"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 564,
"contextRemainingTokens": 140
},
"source": {
"bytes": 9340,
"tokens": 2336
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P2-005-WORKFLOW.P0_USER_LOOP.blend",
"bytes": 87280,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P2-005.py",
"bytes": 919,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 255189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 919367,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P2-005/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P2-005.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P2-005/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"Main revision and exported asset are bound",
"fault/cancel leaves old state",
"Chromium production path passes"
],
"nextTask": "WBV2-P3-001",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P2-005.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P2-004/manifest.json",
"parentStatus": "docs/status/WBV2-P2-004.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P2-005.md",
"tests/golden/WBV2-P2-004/manifest.json",
"docs/status/WBV2-P2-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-P2-004",
"parentTask": "WBV2-P2-003",
"status": "done",
"nextTask": "WBV2-P2-005",
"artifactCount": 20
},
"statusSummary": [
"# WBV2-P2-004 status",
"- task: `WBV2-P2-004`",
"- parent: `WBV2-P2-003`",
"- parity: `VIEWPORT.MAIN_OFFSCREEN`",
"- implementationClass: `LOCAL_BOUNDED`",
"- status: `done`",
"- fixture: `tests/files/web/generated/WBV2-P2-004-VIEWPORT.MAIN_OFFSCREEN.blend`",
"## Evidence"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1728,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 432
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P2-005.md",
"bytes": 1728,
"lines": 38,
"tokens": 432
},
{
"path": "tests/golden/WBV2-P2-004/manifest.json",
"bytes": 3599,
"lines": 40,
"tokens": 900
},
{
"path": "docs/status/WBV2-P2-004.md",
"bytes": 1214,
"lines": 28,
"tokens": 304
}
],
"sourceTokens": 2336,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2336,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3360,
"serializedContextTokens": 693,
"withinBudget": true
}
}

View File

@@ -0,0 +1,20 @@
{
"blenderVersion": "5.2.0 LTS",
"fixtureSha256": "51788408d7b1a273583872b749eec36191db441d431b2d4ddcfffecddb256999",
"operation": "WORKFLOW_P0_USER_LOOP_DESKTOP",
"saveReopen": "EXACT",
"scene": {
"faceCount": 6,
"location": [
0.0,
0.0,
0.0
],
"meshId": "mesh:WBV2P2005WorkflowCubeMesh",
"objectId": "object:WBV2P2005WorkflowCube",
"sceneId": "scene:WBV2P2005WorkflowScene",
"vertexCount": 8
},
"schemaVersion": 1,
"task": "WBV2-P2-005"
}

View File

@@ -0,0 +1,66 @@
{
"schemaVersion": 1,
"task": "WBV2-P2-005",
"operation": "WORKFLOW_P0_USER_LOOP_LOCAL_BOUNDED",
"fixture": {
"path": "tests/files/web/generated/WBV2-P2-005-WORKFLOW.P0_USER_LOOP.blend",
"sha256": "51788408d7b1a273583872b749eec36191db441d431b2d4ddcfffecddb256999"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P2-005/workflow-desktop-report.json",
"scene": {
"faceCount": 6,
"location": [
0,
0,
0
],
"meshId": "mesh:WBV2P2005WorkflowCubeMesh",
"objectId": "object:WBV2P2005WorkflowCube",
"sceneId": "scene:WBV2P2005WorkflowScene",
"vertexCount": 8
},
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"initialRevision": 1,
"createdRevision": 2,
"transformedRevision": 3,
"undoRevision": 4,
"redoRevision": 5,
"reopenedRevision": 1,
"editedObjectId": "object:WBV2P2005EditedCube",
"saveReopen": "EXACT"
},
"browser": {
"runtime": "PLAYWRIGHT_CHROMIUM",
"engineFaultRecovery": "EXACT",
"cancellation": "EXACT",
"glb": "EXACT",
"evidence": {
"initialStats": "Objects 1 · Vertices 8 · Faces 6",
"editedStats": "Objects 2 · Vertices 16 · Faces 18",
"committedRevision": "1",
"editedRevision": "2",
"recoveryStatus": "SUCCEEDED",
"cancellation": {
"bytesRead": 4194304,
"totalBytes": 41943040,
"status": "CANCELLED"
},
"glb": {
"byteLength": 4412,
"magic": "glTF",
"status": "SUCCEEDED"
}
}
},
"negative": {
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"cancellation": "RETAINED_PREVIOUS_SCENE",
"duplicateSave": "SINGLE_COMMITTED_DOWNLOAD"
},
"nextTask": "WBV2-P3-001"
}

View File

@@ -0,0 +1,33 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-001",
"parentTask": "WBV2-P2-005",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "MATERIAL_PBR_UV_LOCAL_BOUNDED",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P2-005/manifest.json", "sha256": "284eda53bb4191da68a30b4fcb8e02801cb83299864846f7e52875f4d976b7be"},
"fixture": {"path": "tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend", "sha256": "cdf3a13e88a2084e9ac46b998a9ad1975c5e20e2bc0f2a68038c62de8801ed22"},
"generator": {"path": "tools/web/generated/WBV2-P3-001.py", "sha256": "1fa6f39ccb9470e8fe9fc7763b9a96e084b75e75f5a73a88de5f7bf321a317d2"},
"desktopChecker": {"path": "tools/web/check-wbv2-p3-001-desktop.py", "sha256": "28b11bcb36bd52d5bb2968719bbc22874c46253f5eb62bfe1c6acad7f993dd1e"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "b26901f733040884038f38e12bd607da27cd91891776e7b67a774b000180fab6"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "e3460ba1f57bab2b17d98faec55dedc16bc4bcea4c23945196285dd7688f8cfd"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c"},
"report": {"path": "tests/golden/WBV2-P3-001/material-report.json", "sha256": "8ab3dd49364a2f6c5404249f1433fc1f2085d9deaf9a6d126732dbd7ca9d262c"},
"desktopReport": {"path": "tests/golden/WBV2-P3-001/material-desktop-report.json", "sha256": "7635ae921b318f82bb8f3b0b1bbfadad4239eae2ef68195f4628f94bc996b6f6"},
"status": {"path": "docs/status/WBV2-P3-001.md", "sha256": "f0550ca889d8a3991a966b7a8eefc2e15efd19d326bbc0a697b69d74a777d736"},
"taskContext": {"path": "tests/golden/WBV2-P3-001/task-context.json", "sha256": "fceb8038a8535494c54363b43d01fe1e2166c3c2d658e3ebec045e292f3f02a9"},
"commandLog": {"path": "tests/golden/WBV2-P3-001/command.log", "sha256": "f93d4c2526d3b22fd3c017804bb3cb8be57828a4a7943703bf15a570184acdf5"}
},
"negativeMatrix": {
"unsupportedNode": "RETAINED_AND_BLOCKED_BY_WARNING",
"invalidUVMap": "REJECTED_WITHOUT_REVISION_CHANGE",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"saveReopen": "EXACT"
},
"nextTask": "WBV2-P3-002"
}

View File

@@ -0,0 +1,33 @@
{
"blenderVersion": "5.2.0 LTS",
"fixtureSha256": "cdf3a13e88a2084e9ac46b998a9ad1975c5e20e2bc0f2a68038c62de8801ed22",
"material": {
"activeUVMap": "WBV2P3001UV",
"baseColor": [
0.12,
0.34,
0.56,
1.0
],
"ior": 1.42,
"materialId": "material:WBV2P3001PrincipledMaterial",
"materialName": "WBV2P3001PrincipledMaterial",
"metallic": 0.67,
"nodeTypes": [
"ShaderNodeBsdfPrincipled",
"ShaderNodeOutputMaterial",
"ShaderNodeTexNoise"
],
"roughness": 0.23,
"unsupportedNode": true,
"uvHash": "2d377662171031fd2165274c3717ed3e44260f4b5348ba1e54f24a735f00945e",
"uvLayerNames": [
"WBV2P3001UV"
],
"uvValueCount": 48
},
"operation": "MATERIAL_PBR_UV_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "WBV2-P3-001"
}

View File

@@ -0,0 +1,63 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-001",
"operation": "MATERIAL_PBR_UV_LOCAL_BOUNDED",
"fixture": {
"path": "tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend",
"sha256": "cdf3a13e88a2084e9ac46b998a9ad1975c5e20e2bc0f2a68038c62de8801ed22"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P3-001/material-desktop-report.json",
"material": {
"activeUVMap": "WBV2P3001UV",
"baseColor": [
0.12,
0.34,
0.56,
1
],
"ior": 1.42,
"materialId": "material:WBV2P3001PrincipledMaterial",
"materialName": "WBV2P3001PrincipledMaterial",
"metallic": 0.67,
"nodeTypes": [
"ShaderNodeBsdfPrincipled",
"ShaderNodeOutputMaterial",
"ShaderNodeTexNoise"
],
"roughness": 0.23,
"unsupportedNode": true,
"uvHash": "2d377662171031fd2165274c3717ed3e44260f4b5348ba1e54f24a735f00945e",
"uvLayerNames": [
"WBV2P3001UV"
],
"uvValueCount": 48
},
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"initialRevision": 1,
"finalRevision": 5,
"materialId": "material:WBV2P3001PrincipledMaterial",
"meshId": "mesh:WBV2P3001MaterialCubeMesh",
"activeUVMap": "WBV2P3001SecondaryUV",
"baseColor": [
0.20000000298023224,
0.4000000059604645,
0.6000000238418579,
1
],
"roughness": 0.3100000023841858,
"metallic": 0.7200000286102295,
"unsupportedNode": true,
"saveReopen": "EXACT"
},
"negative": {
"unsupportedNode": "RETAINED_AND_BLOCKED_BY_WARNING",
"invalidUVMap": "REJECTED_WITHOUT_REVISION_CHANGE",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "WBV2-P3-002"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-001",
"parentTask": "WBV2-P2-005",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable MATERIAL.PBR_UV data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "MATERIAL.PBR_UV",
"ownerFamily": "MATERIAL",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P3-001.py -- tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P3-001",
"node tools/web/check-generated-gap.mjs --task WBV2-P3-001"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 995,
"contextRemainingTokens": 248
},
"source": {
"bytes": 8909,
"tokens": 2228
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend",
"bytes": 89548,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P3-001.py",
"bytes": 1821,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 255189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 925517,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P3-001/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P3-001.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P3-001/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"desktop/WASM node fields match",
"unsupported node retained/blocked",
"packed asset survives reopen"
],
"nextTask": "WBV2-P3-002",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P3-001.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P2-005/manifest.json",
"parentStatus": "docs/status/WBV2-P2-005.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P3-001.md",
"tests/golden/WBV2-P2-005/manifest.json",
"docs/status/WBV2-P2-005.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-P2-005",
"parentTask": "WBV2-P2-004",
"status": "done",
"nextTask": "WBV2-P3-001",
"artifactCount": 17
},
"statusSummary": [
"# WBV2-P2-005 status",
"- task: `WBV2-P2-005`",
"- parent: `WBV2-P2-004`",
"- parity: `WORKFLOW.P0_USER_LOOP`",
"- implementationClass: `LOCAL_BOUNDED`",
"- status: `done`",
"- fixture: `tests/files/web/generated/WBV2-P2-005-WORKFLOW.P0_USER_LOOP.blend`",
"## Evidence"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1695,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 424
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P3-001.md",
"bytes": 1695,
"lines": 38,
"tokens": 424
},
{
"path": "tests/golden/WBV2-P2-005/manifest.json",
"bytes": 3199,
"lines": 39,
"tokens": 800
},
{
"path": "docs/status/WBV2-P2-005.md",
"bytes": 1216,
"lines": 27,
"tokens": 304
}
],
"sourceTokens": 2228,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2228,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3252,
"serializedContextTokens": 685,
"withinBudget": true
}
}

View File

@@ -0,0 +1,186 @@
{
"action": {
"channels": [
{
"frames": [
1.0,
10.0,
20.0
],
"index": 0,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "location",
"values": [
0.0,
1.0,
2.0
]
},
{
"frames": [
1.0,
10.0,
20.0
],
"index": 1,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "location",
"values": [
0.0,
2.0,
0.0
]
},
{
"frames": [
1.0,
10.0,
20.0
],
"index": 2,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "location",
"values": [
0.0,
0.5,
1.0
]
},
{
"frames": [
1.0,
10.0,
20.0
],
"index": 0,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "rotation_euler",
"values": [
0.0,
0.1,
0.4
]
},
{
"frames": [
1.0,
10.0,
20.0
],
"index": 1,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "rotation_euler",
"values": [
0.0,
0.2,
0.1
]
},
{
"frames": [
1.0,
10.0,
20.0
],
"index": 2,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "rotation_euler",
"values": [
0.0,
0.3,
0.6
]
},
{
"frames": [
1.0,
10.0,
20.0
],
"index": 0,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "scale",
"values": [
1.0,
1.2,
0.9
]
},
{
"frames": [
1.0,
10.0,
20.0
],
"index": 1,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "scale",
"values": [
1.0,
0.8,
1.3
]
},
{
"frames": [
1.0,
10.0,
20.0
],
"index": 2,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "scale",
"values": [
1.0,
1.1,
1.0
]
}
],
"id": "action:WBV2P3002TRSAction:object:WBV2P3002AnimatedCube",
"name": "WBV2P3002TRSAction",
"targetId": "object:WBV2P3002AnimatedCube"
},
"blenderVersion": "5.2.0 LTS",
"fixtureSha256": "63b8b79115cf7305931cd92cacaef3a2d7ee68b8690056f402bd129048460b1d",
"operation": "ANIMATION_TRS_ACTION_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "WBV2-P3-002"
}

View File

@@ -0,0 +1,213 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-002",
"operation": "ANIMATION_TRS_ACTION_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/WBV2-P3-002-ANIMATION.TRS_ACTION.blend",
"sha256": "63b8b79115cf7305931cd92cacaef3a2d7ee68b8690056f402bd129048460b1d"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P3-002/animation-desktop-report.json",
"action": {
"channels": [
{
"frames": [
1,
10,
20
],
"index": 0,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "location",
"values": [
0,
1,
2
]
},
{
"frames": [
1,
10,
20
],
"index": 1,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "location",
"values": [
0,
2,
0
]
},
{
"frames": [
1,
10,
20
],
"index": 2,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "location",
"values": [
0,
0.5,
1
]
},
{
"frames": [
1,
10,
20
],
"index": 0,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "rotation_euler",
"values": [
0,
0.1,
0.4
]
},
{
"frames": [
1,
10,
20
],
"index": 1,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "rotation_euler",
"values": [
0,
0.2,
0.1
]
},
{
"frames": [
1,
10,
20
],
"index": 2,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "rotation_euler",
"values": [
0,
0.3,
0.6
]
},
{
"frames": [
1,
10,
20
],
"index": 0,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "scale",
"values": [
1,
1.2,
0.9
]
},
{
"frames": [
1,
10,
20
],
"index": 1,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "scale",
"values": [
1,
0.8,
1.3
]
},
{
"frames": [
1,
10,
20
],
"index": 2,
"interpolation": [
"BEZIER",
"BEZIER",
"BEZIER"
],
"path": "scale",
"values": [
1,
1.1,
1
]
}
],
"id": "action:WBV2P3002TRSAction:object:WBV2P3002AnimatedCube",
"name": "WBV2P3002TRSAction",
"targetId": "object:WBV2P3002AnimatedCube"
},
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"actionId": "action:WBV2P3002TRSAction:object:WBV2P3002AnimatedCube",
"initialRevision": 1,
"insertedRevision": 2,
"finalRevision": 3,
"channelCount": 9,
"sampledFrames": [
1,
10,
20,
25
],
"changedInterpolation": "location[0]=LINEAR",
"saveReopen": "EXACT"
},
"negative": {
"staleFrameCommand": "REJECTED_WITHOUT_REVISION_CHANGE",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "WBV2-P3-003"
}

View File

@@ -0,0 +1,33 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-002",
"parentTask": "WBV2-P3-001",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "ANIMATION_TRS_ACTION_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P3-001/manifest.json", "sha256": "e3b037fdcf55b5e64fd770c6fa90d0b72e96b3e764a305df0ceee378fa167191"},
"fixture": {"path": "tests/files/web/generated/WBV2-P3-002-ANIMATION.TRS_ACTION.blend", "sha256": "63b8b79115cf7305931cd92cacaef3a2d7ee68b8690056f402bd129048460b1d"},
"generator": {"path": "tools/web/generated/WBV2-P3-002.py", "sha256": "554cb2f010c3ad641fd9889fecffb3c229db6d17f0da5d1b3565ae1ecb7b7264"},
"desktopChecker": {"path": "tools/web/check-wbv2-p3-002-desktop.py", "sha256": "a0a245d402129eb1440be22a061f10a73e432ab26d3078edc8d8bbfa182464dd"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "1f1528c1e365c52013d41c1b4b9b5457e763e536bedc35d8569d38e4c2fdb883"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "fd6f32cc1527dd950d95684b8cf20b2ce513637f7a3e7eaa05f1442986c94d61"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c"},
"report": {"path": "tests/golden/WBV2-P3-002/animation-report.json", "sha256": "ac7bb8bbfa6db703c6d128ba5772213f46370be3a986cefcc2da99a1a9aad843"},
"desktopReport": {"path": "tests/golden/WBV2-P3-002/animation-desktop-report.json", "sha256": "b4f6021f1d1f8a3619fe2c6d31438ff06c27ea32f220952b00afbb93cf990b3c"},
"status": {"path": "docs/status/WBV2-P3-002.md", "sha256": "c98a2b482dbe0ab075c6d093a596a8fc0907f2d4136abd88379bea862471f434"},
"taskContext": {"path": "tests/golden/WBV2-P3-002/task-context.json", "sha256": "cd7b2b40ffa32edf31d99d6c05a37a946c2edd9d3d0fd58c3da365bcba4ab01f"},
"commandLog": {"path": "tests/golden/WBV2-P3-002/command.log", "sha256": "a7ce194f072c321bb9f4ed5739ffc98a8b80c0c596cfb3567f152c802372450b"}
},
"negativeMatrix": {
"staleFrameCommand": "REJECTED_WITHOUT_REVISION_CHANGE",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"saveReopen": "EXACT",
"interpolationHandle": "LOCATION_X_LINEAR_AFTER_COMMAND"
},
"nextTask": "WBV2-P3-003"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-002",
"parentTask": "WBV2-P3-001",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable ANIMATION.TRS_ACTION data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "ANIMATION.TRS_ACTION",
"ownerFamily": "ANIMATION",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P3-002.py -- tests/files/web/generated/WBV2-P3-002-ANIMATION.TRS_ACTION.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P3-002",
"node tools/web/check-generated-gap.mjs --task WBV2-P3-002"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1584,
"contextRemainingTokens": 395
},
"source": {
"bytes": 8320,
"tokens": 2081
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P3-002-ANIMATION.TRS_ACTION.blend",
"bytes": 88107,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P3-002.py",
"bytes": 1697,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 255189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 931262,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P3-002/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P3-002.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P3-002/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"sampled values and handles match",
"stale frame result rejected",
"undo/save/reopen stable"
],
"nextTask": "WBV2-P3-003",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P3-002.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P3-001/manifest.json",
"parentStatus": "docs/status/WBV2-P3-001.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P3-002.md",
"tests/golden/WBV2-P3-001/manifest.json",
"docs/status/WBV2-P3-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-P3-001",
"parentTask": "WBV2-P2-005",
"status": "done",
"nextTask": "WBV2-P3-002",
"artifactCount": 14
},
"statusSummary": [
"# WBV2-P3-001 status",
"- task: `WBV2-P3-001`",
"- parent: `WBV2-P2-005`",
"- parity: `MATERIAL.PBR_UV`",
"- implementationClass: `LOCAL_BOUNDED`",
"- status: `done`",
"- fixture: `tests/files/web/generated/WBV2-P3-001-MATERIAL.PBR_UV.blend`",
"## Evidence"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1719,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 430
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P3-002.md",
"bytes": 1719,
"lines": 38,
"tokens": 430
},
{
"path": "tests/golden/WBV2-P3-001/manifest.json",
"bytes": 2650,
"lines": 34,
"tokens": 663
},
{
"path": "docs/status/WBV2-P3-001.md",
"bytes": 1152,
"lines": 27,
"tokens": 288
}
],
"sourceTokens": 2081,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2081,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3105,
"serializedContextTokens": 686,
"withinBudget": true
}
}

View File

@@ -0,0 +1,33 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-003",
"parentTask": "WBV2-P3-002",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "RIG_POSE_SKIN_LOCAL_BOUNDED",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P3-002/manifest.json", "sha256": "cc36b933a2b6d817ea7226c07d0617ecdf2f89575136a83cb15de4e7c8f59188"},
"fixture": {"path": "tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend", "sha256": "1044ac6b81561ef0f5f22578c279de82fcb2d543eff822d0375d59f35bb6d142"},
"generator": {"path": "tools/web/generated/WBV2-P3-003.py", "sha256": "a811e8bd42890c17cffa0575f8e629a8fe42db2751cef629ed9c2ca5f8cab821"},
"desktopChecker": {"path": "tools/web/check-wbv2-p3-003-desktop.py", "sha256": "830a084420632c31ec64fc2a4d68d7007a3e5730d8ff29ab0841c6bc8a6a9923"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "2ce9756a1c2f2a858413adf6051aa4147ad0313b2207e02018fc6f6ed3348a6f"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "273702e48f09e29f06f2918a0450a5a5a1852f94f10e3e22bc3a7a91262a7d84"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c"},
"report": {"path": "tests/golden/WBV2-P3-003/rig-report.json", "sha256": "13b1227a6dcb02fbbf0d618b6fc8d504fa81a9e7babec1973e9814639a5ea028"},
"desktopReport": {"path": "tests/golden/WBV2-P3-003/rig-desktop-report.json", "sha256": "6331aeeabdfa3a48ab9c1d8fd6cd6fd986b204f1a89d899098539ddbeb678b8f"},
"status": {"path": "docs/status/WBV2-P3-003.md", "sha256": "1267edaa74e65c4fa898d574460a8ddad995b501cab6d11542ea585fcebf4b52"},
"taskContext": {"path": "tests/golden/WBV2-P3-003/task-context.json", "sha256": "a12d0be9cafbb644c7e74946e1d7e5cac4d0bcb212c2cfab8362445c29d90052"},
"commandLog": {"path": "tests/golden/WBV2-P3-003/command.log", "sha256": "19b83f9e589ff9a81c109b4df70bdb728cd3374a75b5ad7d51e4f5b0c5fbb0dd"}
},
"negativeMatrix": {
"unsupportedConstraint": "EXPLICIT_LIMIT_ROTATION_TYPE_5",
"staleWeightCommand": "REJECTED_WITHOUT_REVISION_CHANGE",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"saveReopen": "EXACT"
},
"nextTask": "WBV2-P3-004"
}

View File

@@ -0,0 +1,209 @@
{
"blenderVersion": "5.2.0 LTS",
"fixtureSha256": "1044ac6b81561ef0f5f22578c279de82fcb2d543eff822d0375d59f35bb6d142",
"operation": "RIG_POSE_SKIN_DESKTOP",
"rig": {
"armature": {
"bones": [
{
"constraints": [],
"head": [
0.0,
0.0,
0.0
],
"name": "WBV2P3003Root",
"parent": null,
"poseMatrix": [
1.0,
0.0,
0.0,
0.0,
0.0,
0.0,
-1.0,
0.0,
0.0,
1.0,
0.0,
0.0,
0.0,
0.0,
0.0,
1.0
],
"tail": [
0.0,
0.0,
1.0
]
},
{
"constraints": [
{
"influence": 0.65,
"name": "WBV2P3003UnsupportedLimitRotation",
"type": "LIMIT_ROTATION"
}
],
"head": [
0.0,
0.0,
1.0
],
"name": "WBV2P3003Tip",
"parent": "WBV2P3003Root",
"poseMatrix": [
1.0,
0.0,
0.0,
0.0,
0.0,
0.756875,
-0.65356,
0.0,
0.0,
0.65356,
0.756875,
1.0,
0.0,
0.0,
0.0,
1.0
],
"tail": [
0.0,
0.0,
2.0
]
}
],
"id": "armature:WBV2P3003Armature",
"name": "WBV2P3003Armature",
"objectId": "object:WBV2P3003ArmatureObject"
},
"mesh": {
"armatureModifier": {
"name": "WBV2P3003ArmatureDeform",
"objectId": "object:WBV2P3003ArmatureObject"
},
"constraints": [
{
"influence": 0.8,
"name": "WBV2P3003BoundedObjectConstraint",
"type": "LIMIT_LOCATION"
}
],
"groups": [
"WBV2P3003Root",
"WBV2P3003Tip"
],
"id": "mesh:WBV2P3003SkinnedMesh",
"objectId": "object:WBV2P3003SkinnedMeshObject",
"shapeKeys": [
{
"name": "Basis",
"positions": [
-1.0,
-1.0,
0.0,
1.0,
-1.0,
0.0,
1.0,
1.0,
0.0,
-1.0,
1.0,
0.0,
-1.0,
-1.0,
2.0,
1.0,
-1.0,
2.0,
1.0,
1.0,
2.0,
-1.0,
1.0,
2.0
],
"value": 1.0
},
{
"name": "WBV2P3003Smile",
"positions": [
-1.0,
-1.0,
0.0,
1.0,
-1.0,
0.0,
1.0,
1.0,
0.35,
-1.0,
1.0,
0.0,
-1.0,
-1.0,
2.0,
1.0,
-1.0,
2.0,
1.0,
1.0,
2.35,
-1.0,
1.0,
2.0
],
"value": 0.4
}
],
"weights": [
{
"WBV2P3003Root": 1.0,
"WBV2P3003Tip": 0.0
},
{
"WBV2P3003Root": 1.0,
"WBV2P3003Tip": 0.0
},
{
"WBV2P3003Root": 1.0,
"WBV2P3003Tip": 0.0
},
{
"WBV2P3003Root": 1.0,
"WBV2P3003Tip": 0.0
},
{
"WBV2P3003Root": 0.2,
"WBV2P3003Tip": 0.8
},
{
"WBV2P3003Root": 0.2,
"WBV2P3003Tip": 0.8
},
{
"WBV2P3003Root": 0.2,
"WBV2P3003Tip": 0.8
},
{
"WBV2P3003Root": 0.2,
"WBV2P3003Tip": 0.8
}
]
},
"unsupportedConstraint": {
"name": "WBV2P3003UnsupportedLimitRotation",
"status": "EXPLICIT_UNSUPPORTED_BY_WASM_DEPSGRAPH",
"type": "LIMIT_ROTATION"
}
},
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "WBV2-P3-003"
}

View File

@@ -0,0 +1,37 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-003",
"operation": "RIG_POSE_SKIN_LOCAL_BOUNDED",
"fixture": {
"path": "tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend",
"sha256": "1044ac6b81561ef0f5f22578c279de82fcb2d543eff822d0375d59f35bb6d142"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P3-003/rig-desktop-report.json",
"armatureId": "armature:WBV2P3003Armature",
"boneCount": 2,
"groupCount": 2,
"shapeKeyCount": 2,
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"armatureId": "armature:WBV2P3003Armature",
"meshId": "mesh:WBV2P3003SkinnedMesh",
"poseMatrices": "EVALUATED",
"weights": "MATCHED",
"shapeKey": "MATCHED",
"initialRevision": 1,
"finalRevision": 3,
"editedConstraint": "disabled@0.4",
"editedVertex": 4,
"saveReopen": "EXACT"
},
"negative": {
"unsupportedConstraint": "EXPLICIT_LIMIT_ROTATION_TYPE_5",
"staleWeightCommand": "REJECTED_WITHOUT_REVISION_CHANGE",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "WBV2-P3-004"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-003",
"parentTask": "WBV2-P3-002",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable RIG.POSE_SKIN data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "RIG.POSE_SKIN",
"ownerFamily": "RIG",
"implementationClass": "LOCAL_BOUNDED"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P3-003.py -- tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P3-003",
"node tools/web/check-generated-gap.mjs --task WBV2-P3-003"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1327,
"contextRemainingTokens": 330
},
"source": {
"bytes": 8577,
"tokens": 2146
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend",
"bytes": 88676,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P3-003.py",
"bytes": 3475,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 255189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 940163,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P3-003/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P3-003.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P3-003/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"pose matrices and weights match",
"unsupported constraint is explicit",
"save/reopen and small recovery pass"
],
"nextTask": "WBV2-P3-004",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P3-003.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P3-002/manifest.json",
"parentStatus": "docs/status/WBV2-P3-002.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P3-003.md",
"tests/golden/WBV2-P3-002/manifest.json",
"docs/status/WBV2-P3-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-P3-002",
"parentTask": "WBV2-P3-001",
"status": "done",
"nextTask": "WBV2-P3-003",
"artifactCount": 14
},
"statusSummary": [
"# WBV2-P3-002 status",
"- task: `WBV2-P3-002`",
"- parent: `WBV2-P3-001`",
"- parity: `ANIMATION.TRS_ACTION`",
"- implementationClass: `LOCAL_EXACT`",
"- status: `done`",
"- fixture: `tests/files/web/generated/WBV2-P3-002-ANIMATION.TRS_ACTION.blend`",
"## Evidence"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1680,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 420
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P3-003.md",
"bytes": 1680,
"lines": 38,
"tokens": 420
},
{
"path": "tests/golden/WBV2-P3-002/manifest.json",
"bytes": 2669,
"lines": 34,
"tokens": 668
},
{
"path": "docs/status/WBV2-P3-002.md",
"bytes": 1429,
"lines": 29,
"tokens": 358
}
],
"sourceTokens": 2146,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2146,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3170,
"serializedContextTokens": 685,
"withinBudget": true
}
}

View File

@@ -0,0 +1,89 @@
{
"blenderVersion": "5.2.0 LTS",
"canonical": {
"animation": {
"actionName": "WBV2P3004RoundTripAction",
"channelCount": 3,
"frameRange": [
1,
20
]
},
"material": {
"baseColor": [
0.22,
0.48,
0.82,
1.0
],
"imagePacked": true,
"metallic": 0.35,
"name": "WBV2P3004PBRMaterial",
"roughness": 0.42
},
"mesh": {
"name": "WBV2P3004RoundTripMesh",
"shapeKeys": [
{
"name": "WBV2P3004Morph",
"value": 0.5,
"vertexCount": 8
}
],
"triangleCount": 12,
"uvLayers": [
"WBV2P3004UV"
],
"vertexCount": 8
},
"skin": {
"bones": [
"WBV2P3004Root",
"WBV2P3004Tip"
],
"parents": {
"WBV2P3004Root": null,
"WBV2P3004Tip": "WBV2P3004Root"
},
"vertexGroups": [
"WBV2P3004Root",
"WBV2P3004Tip"
],
"weightSums": [
[
1.0
],
[
1.0
],
[
1.0
],
[
1.0
],
[
0.25,
0.75
],
[
0.25,
0.75
],
[
0.25,
0.75
],
[
0.25,
0.75
]
]
}
},
"fixtureSha256": "64279933b4c2fb00b02496f8e1322893a6c95f8fb99a996c06b8f8323bfbec5d",
"operation": "IO_GLB_ROUNDTRIP_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"task": "WBV2-P3-004"
}

View File

@@ -0,0 +1,113 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-004",
"operation": "IO_GLB_ROUNDTRIP_LOCAL_EXACT",
"fixture": {
"path": "tests/files/web/generated/WBV2-P3-004-IO.GLB_ROUNDTRIP.blend",
"sha256": "64279933b4c2fb00b02496f8e1322893a6c95f8fb99a996c06b8f8323bfbec5d"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P3-004/glb-desktop-report.json",
"canonical": {
"animation": {
"actionName": "WBV2P3004RoundTripAction",
"channelCount": 3,
"frameRange": [
1,
20
]
},
"material": {
"baseColor": [
0.22,
0.48,
0.82,
1
],
"imagePacked": true,
"metallic": 0.35,
"name": "WBV2P3004PBRMaterial",
"roughness": 0.42
},
"mesh": {
"name": "WBV2P3004RoundTripMesh",
"shapeKeys": [
{
"name": "WBV2P3004Morph",
"value": 0.5,
"vertexCount": 8
}
],
"triangleCount": 12,
"uvLayers": [
"WBV2P3004UV"
],
"vertexCount": 8
},
"skin": {
"bones": [
"WBV2P3004Root",
"WBV2P3004Tip"
],
"parents": {
"WBV2P3004Root": null,
"WBV2P3004Tip": "WBV2P3004Root"
},
"vertexGroups": [
"WBV2P3004Root",
"WBV2P3004Tip"
],
"weightSums": [
[
1
],
[
1
],
[
1
],
[
1
],
[
0.25,
0.75
],
[
0.25,
0.75
],
[
0.25,
0.75
],
[
0.25,
0.75
]
]
}
},
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"glbBytes": 7540,
"magic": "glTF",
"meshCount": 1,
"skinCount": 1,
"morphTargetCount": 1,
"animationCount": 1,
"animationChannelCount": 1,
"comparison": "EXACT"
},
"negative": {
"malformed": "REJECTED",
"externalUri": "REJECTED_GLB_EXTERNAL_URI_BLOCKED",
"overBudget": "REJECTED_GLB_IMPORT_BUDGET_EXCEEDED"
},
"saveReopen": "EXACT",
"nextTask": "WBV2-P3-005"
}

View File

@@ -0,0 +1,33 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-004",
"parentTask": "WBV2-P3-003",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "IO_GLB_ROUNDTRIP_LOCAL_EXACT",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P3-003/manifest.json", "sha256": "1b97d2ca9add58a6185a21137729edc4c8b11a2d21be1682793e3d05b9ef9011"},
"fixture": {"path": "tests/files/web/generated/WBV2-P3-004-IO.GLB_ROUNDTRIP.blend", "sha256": "64279933b4c2fb00b02496f8e1322893a6c95f8fb99a996c06b8f8323bfbec5d"},
"generator": {"path": "tools/web/generated/WBV2-P3-004.py", "sha256": "b5406e2c3612264c1708f2d8bfb7b90a39b8b179a0beee6fc5a21108e7d1c78c"},
"desktopChecker": {"path": "tools/web/check-wbv2-p3-004-desktop.py", "sha256": "ff45538a4695331c36f3332a29dc3f745d2cf70c23667ae79988eae654ddae13"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "7c7a0f4a499a186dac777e0f5c1d7b33dba5daa2b507c9a76f560c5c243942e4"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "158e60e76aace9dd55da0ee5edf986886a7fa288bd256c31695d91064cd83e2a"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c"},
"report": {"path": "tests/golden/WBV2-P3-004/glb-report.json", "sha256": "9f642f50c7764928909346e91ab11becc5e7e3794760e53ea1d3cef9055e8626"},
"desktopReport": {"path": "tests/golden/WBV2-P3-004/glb-desktop-report.json", "sha256": "cae8772fde2b760ed0dbbb72cbbaeaccba185470267689b283191e549544a18d"},
"status": {"path": "docs/status/WBV2-P3-004.md", "sha256": "b219d5102db552d7cb0fb2e0697f6a24ccb071beb5a9c0a1c4b87ca513fdd20a"},
"taskContext": {"path": "tests/golden/WBV2-P3-004/task-context.json", "sha256": "5c60c5b6f37956f7578723d7ec69374dcf2b19d177cac967b876e427d6791d05"},
"commandLog": {"path": "tests/golden/WBV2-P3-004/command.log", "sha256": "2b4fb1a8dc840ebe2ddecff73727081af0a4690c0deed0946f99fdd2f9b3fbbe"}
},
"negativeMatrix": {
"malformed": "REJECTED_GLB_JSON",
"externalUri": "REJECTED_GLB_EXTERNAL_URI_BLOCKED",
"overBudget": "REJECTED_GLB_IMPORT_BUDGET_EXCEEDED",
"saveReopen": "EXACT"
},
"nextTask": "WBV2-P3-005"
}

View File

@@ -0,0 +1,180 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-004",
"parentTask": "WBV2-P3-003",
"status": "in_progress",
"goal": "Make the same minimal fixture produce observable IO.GLB_ROUNDTRIP data in Blender desktop and WASM/Main, with save/reopen stability. Change only this gap; do not expand to other data-blocks, editors, or browsers.",
"scope": {
"gap": "IO.GLB_ROUNDTRIP",
"ownerFamily": "IO",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/WBV2-P3-004.py -- tests/files/web/generated/WBV2-P3-004-IO.GLB_ROUNDTRIP.blend",
"npm --prefix web run test:generated-gap -- --task WBV2-P3-004",
"node tools/web/check-generated-gap.mjs --task WBV2-P3-004"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 1267,
"contextRemainingTokens": 316
},
"source": {
"bytes": 8637,
"tokens": 2160
},
"selected": [],
"excluded": [
{
"path": "tests/files/web/generated/WBV2-P3-004-IO.GLB_ROUNDTRIP.blend",
"bytes": 91036,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/generated/WBV2-P3-004.py",
"bytes": 4214,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 255189,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/check-generated-gap.mjs",
"bytes": 948821,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tests/golden/WBV2-P3-004/",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P3-004.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "tests/golden/WBV2-P3-004/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"roundtrip canonical graph matches",
"sparse/external URI/budget negatives reject",
"no silent loss"
],
"nextTask": "WBV2-P3-005",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P3-004.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P3-003/manifest.json",
"parentStatus": "docs/status/WBV2-P3-003.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P3-004.md",
"tests/golden/WBV2-P3-003/manifest.json",
"docs/status/WBV2-P3-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-P3-003",
"parentTask": "WBV2-P3-002",
"status": "done",
"nextTask": "WBV2-P3-004",
"artifactCount": 14
},
"statusSummary": [
"# WBV2-P3-003 status",
"- task: `WBV2-P3-003`",
"- parent: `WBV2-P3-002`",
"- parity: `RIG.POSE_SKIN`",
"- implementationClass: `LOCAL_BOUNDED`",
"- status: `done`",
"- fixture: `tests/files/web/generated/WBV2-P3-003-RIG.POSE_SKIN.blend`",
"## Evidence"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1692,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 38,
"taskTokens": 423
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 2799,
"lines": 51,
"tokens": 700
},
{
"path": "docs/tasks/WBV2-P3-004.md",
"bytes": 1692,
"lines": 38,
"tokens": 423
},
{
"path": "tests/golden/WBV2-P3-003/manifest.json",
"bytes": 2647,
"lines": 34,
"tokens": 662
},
{
"path": "docs/status/WBV2-P3-003.md",
"bytes": 1499,
"lines": 29,
"tokens": 375
}
],
"sourceTokens": 2160,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2160,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3184,
"serializedContextTokens": 684,
"withinBudget": true
}
}

View File

@@ -0,0 +1,31 @@
{
"blenderVersion": "5.2.0 LTS",
"fixtureSha256": "86af081b949ac96d6431303464852b4e983cf8c3d05671cacb36e1de4267a425",
"operation": "ASSET_LIBRARY_OWNERSHIP_DESKTOP",
"saveReopen": "EXACT",
"schemaVersion": 1,
"sourceClosure": {
"image": "WBV2P3005AppendImage",
"imagePacked": true,
"material": "WBV2P3005AppendMaterial",
"mesh": "WBV2P3005AppendMesh",
"object": "WBV2P3005AppendObject"
},
"sourceSha256": "dcda742db77c6af5e05b79e006a0bd89cf1e8ea8d438592cd1ed2e981c7aca76",
"state": {
"library": {
"dependencyIds": [],
"name": "WBV2P3005Library.blend",
"packed": false,
"readOnly": true,
"sourcePath": "//WBV2P3005Library.blend"
},
"linked": {
"library": "WBV2P3005Library.blend",
"name": "WBV2P3005LinkedObject",
"override": false,
"readOnly": true
}
},
"task": "WBV2-P3-005"
}

View File

@@ -0,0 +1,82 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-005",
"operation": "ASSET_LIBRARY_APPEND_LINK_OVERRIDE_LOCAL_BOUNDED",
"fixture": {
"path": "tests/files/web/generated/WBV2-P3-005-ASSET.LIBRARY_OPERATIONS.blend",
"sha256": "86af081b949ac96d6431303464852b4e983cf8c3d05671cacb36e1de4267a425"
},
"sourceLibrary": {
"path": "tests/files/web/generated/WBV2P3005Library.blend",
"sha256": "dcda742db77c6af5e05b79e006a0bd89cf1e8ea8d438592cd1ed2e981c7aca76",
"sourceLibraryId": "library:58cde9b79f9fc987dfdac773f4e21d9b3c21a5633f29766342c5e14c7b5eed66",
"locator": "//WBV2P3005Library.blend"
},
"desktop": {
"status": "EXACT",
"report": "tests/golden/WBV2-P3-005/library-desktop-report.json",
"library": {
"dependencyIds": [],
"name": "WBV2P3005Library.blend",
"packed": false,
"readOnly": true,
"sourcePath": "//WBV2P3005Library.blend"
},
"linked": {
"library": "WBV2P3005Library.blend",
"name": "WBV2P3005LinkedObject",
"override": false,
"readOnly": true
},
"sourceClosure": {
"image": "WBV2P3005AppendImage",
"imagePacked": true,
"material": "WBV2P3005AppendMaterial",
"mesh": "WBV2P3005AppendMesh",
"object": "WBV2P3005AppendObject"
},
"saveReopen": "EXACT"
},
"wasm": {
"status": "EXACT",
"initialRevision": 1,
"appendedRevision": 2,
"appendedObjectId": "object:WBV2P3005AppendObject",
"appendedImageStatus": "PACKED",
"appendedImagePacked": true,
"appendSourceLibraryId": "library:58cde9b79f9fc987dfdac773f4e21d9b3c21a5633f29766342c5e14c7b5eed66",
"appendOwner": {
"kind": "LOCAL_MAIN",
"projectId": "project:wbv2-p3-005",
"localDataBlockId": "Object/WBV2P3005AppendObject"
},
"linkOwner": {
"kind": "SOURCE_LIBRARY",
"sourceLibraryId": "library:58cde9b79f9fc987dfdac773f4e21d9b3c21a5633f29766342c5e14c7b5eed66",
"sourceDataBlockId": "Object/WBV2P3005LinkedObject"
},
"overrideOwner": {
"kind": "LOCAL_OVERRIDE",
"projectId": "project:wbv2-p3-005",
"localDataBlockId": "Object/WBV2P3005OverrideObject",
"referenceSourceDataBlockId": "Object/WBV2P3005LinkedObject",
"hierarchyRootDataBlockId": "Object/WBV2P3005OverrideObject"
},
"saveReopen": "EXACT"
},
"protocol": {
"override": "READY",
"reload": "REPLACED",
"missing": "MARKED"
},
"negative": {
"staleAppend": "REJECTED_WITHOUT_REVISION_CHANGE",
"collisionAppend": "REJECTED_WITHOUT_REVISION_CHANGE",
"linkedMutation": "REJECTED_BY_OWNERSHIP",
"staleOverride": "BLOCKED_REVISION_CONFLICT",
"staleReload": "STALE_REVISION",
"staleMissingHash": "STALE_SOURCE_HASH",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION"
},
"nextTask": "WBV2-P4-001"
}

View File

@@ -0,0 +1,38 @@
{
"schemaVersion": 1,
"task": "WBV2-P3-005",
"parentTask": "WBV2-P3-004",
"enablingTask": false,
"parityStateChange": true,
"runtime": "BLENDER_5_2_WASM_MAIN",
"operation": "ASSET_LIBRARY_APPEND_LINK_OVERRIDE_LOCAL_BOUNDED",
"status": "done",
"artifacts": {
"parentManifest": {"path": "tests/golden/WBV2-P3-004/manifest.json", "sha256": "bb4f2783eaa78a0104045048fc9f5d925a78e5a2539f5f1b9e699a067d05fa27"},
"fixture": {"path": "tests/files/web/generated/WBV2-P3-005-ASSET.LIBRARY_OPERATIONS.blend", "sha256": "86af081b949ac96d6431303464852b4e983cf8c3d05671cacb36e1de4267a425"},
"sourceLibrary": {"path": "tests/files/web/generated/WBV2P3005Library.blend", "sha256": "dcda742db77c6af5e05b79e006a0bd89cf1e8ea8d438592cd1ed2e981c7aca76"},
"generator": {"path": "tools/web/generated/WBV2-P3-005.py", "sha256": "50e5f7b3db1fec8eb3e2aa22e7ce4a8d40cb1ef01c8ec8dda59a3a3fe06c0253"},
"desktopChecker": {"path": "tools/web/check-wbv2-p3-005-desktop.py", "sha256": "4605e4a453e8b767fc187f0de69a51100a46a4d78d03a03d7ec1adb43fa376ee"},
"productionReader": {"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", "sha256": "7c36f36872248226ea6c96c281c49fd7b58af28e5b6d52f6f5ef10e391daedf3"},
"checker": {"path": "tools/web/check-generated-gap.mjs", "sha256": "c3f5e581e460d9c44beea583b241e5b56ae0d163e134bd7862bc03d10a7bb13a"},
"preflight": {"path": "tools/web/generated-gap-preflight.mjs", "sha256": "158dcb322959d845908a5414952ce9300e524de7cd85b3773472d05fe52549dd"},
"wasmJavaScript": {"path": "web/app/src/vendor/blender/web_engine.js", "sha256": "e2b21fcc3c9d098cfb343fc682776c2ed95678064e95eabd71409a8b3284cce0"},
"wasmBinary": {"path": "web/app/src/vendor/blender/web_engine.wasm", "sha256": "25bc1e286fd3b72c2c7c082b85a29b2d0bb109588a6dc0de5be94fcdc37cc88c"},
"report": {"path": "tests/golden/WBV2-P3-005/library-report.json", "sha256": "0b572a5b480dd9b123cbb9c55c842fb002b1a8a6c96afd196af90bee1ebd9940"},
"desktopReport": {"path": "tests/golden/WBV2-P3-005/library-desktop-report.json", "sha256": "eb8512d3fd78e8588284b9acb2f6b3eaf72f2c36912483f1dc030da3464f8cdd"},
"status": {"path": "docs/status/WBV2-P3-005.md", "sha256": "b1ef6eff8c5f0d64d651de2dffe0d2c914e8726711c42259ee7c0cc3bbcd1cd6"},
"taskContext": {"path": "tests/golden/WBV2-P3-005/task-context.json", "sha256": "df8ed12aa4ecb585e59eb212ea4d16fbc0dc1299668a44283fcde9886ddc912f"},
"commandLog": {"path": "tests/golden/WBV2-P3-005/command.log", "sha256": "f72bc26c0000a8d38a6ccf91690567d17974d3fdd9226a314bfaf4720d2af6ab"}
},
"negativeMatrix": {
"staleAppend": "REJECTED_WITHOUT_REVISION_CHANGE",
"collisionAppend": "REJECTED_WITHOUT_REVISION_CHANGE",
"linkedMutation": "REJECTED_BY_OWNERSHIP",
"staleOverride": "BLOCKED_REVISION_CONFLICT",
"staleReload": "STALE_REVISION",
"staleMissingHash": "STALE_SOURCE_HASH",
"malformedBlend": "REJECTED_WITHOUT_MAIN_MUTATION",
"saveReopen": "EXACT"
},
"nextTask": "WBV2-P4-001"
}

Some files were not shown because too many files have changed in this diff Show More