perf(web): enforce batch-scoped source inventory checks
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-09-03 15:06:48 +08:00
parent e89a5ac318
commit fa94ad14ed
18 changed files with 1138 additions and 72 deletions

View File

@@ -0,0 +1,7 @@
# WBV2-P1154-000 status
- task: `WBV2-P1154-000`; parent: `WBV2-P1153-001`; status: `done`
- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed
- source-backed batch authorized: `MODIFIER_SOLIDIFY_DEPENDENCY_REUSE` (2 units)
- dynamic inventory: `3745` units; verified `459`; unverified `3286`; bound delta `0`
- nextTask: `WBV2-P1154-001`

View File

@@ -0,0 +1,31 @@
# WBV2-P1154-000: authorize module batch
- task: WBV2-P1154-000
- parent: WBV2-P1153-001
- status: done
- gap: capability:MODIFIER_SOLIDIFY_DEPENDENCY_REUSE
- ownerFamily: MODIFIER
- targetImplementationClass: QUEUE_ONLY
- Implementation entrypoint: `python3 my-tools/authorize_next_wbv2_task.py --write`
## 目标
授权一个共享 Blender Main/WASM/Chromium 功能批次:MODIFIER_SOLIDIFY_DEPENDENCY_REUSE,共 2 个源码/RNA 单元。
## 输入与范围
- Blender source: `blender-5.2.0/source/blender`
- Fixtures/test: existing Chromium receipts, `tools/web/reuse-wbv2-source-dependencies.mjs`
## 验收
- prior evidence and dynamic inventory remain hash-bound and immutable
- one shared function chain validates the complete selected batch
- missing source, unsupported data, hash drift or false completion remains blocked
- `node tools/web/check-task-context.mjs --task WBV2-P1154-000 --write`
## 交付与回滚
- Manifest: `tests/golden/WBV2-P1154-000/manifest.json`
- Status: `docs/status/WBV2-P1154-000.md`
- Rollback: restore WBV2-P1153-001 as queue parent.

View File

@@ -2,7 +2,7 @@
- task: WBV2-P1154-001
- parent: WBV2-P1154-000
- status: in_progress
- status: done
- gap: capability:MODIFIER_SOLIDIFY_HELPER_BATCH
- ownerFamily: MODIFIER
- targetImplementationClass: LOCAL_EXACT

View File

@@ -100,7 +100,7 @@ PREFERRED_BATCHES = [
"identifiers": ["MOD_grease_pencil_util", "MOD_meshcache_mdd", "MOD_meshcache_pc2", "MOD_meshcache_util", "MOD_weightvg_util"],
"rna": [],
"test": "tools/web/reuse-wbv2-source-dependencies.mjs",
"production": "tests/golden/{task}/source-dependency-reuse-production.json",
"production": "tests/golden/{task}/modifier-reader-batch-production.json",
"types": [],
"reuseReceipts": [
{"manifest": "tests/golden/WBV2-P1150-001/manifest.json", "report": "tests/golden/WBV2-P1150-001/module-receipt.json"},
@@ -115,6 +115,17 @@ PREFERRED_BATCHES = [
{"unitId": "modifier-source:MOD_weightvg_util", "representativeUnitId": "modifier-source:MOD_weightvgedit", "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc", "marker": "MOD_weightvg_util.hh", "productionEvidence": "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json"},
],
},
{
"moduleId": "MODIFIER_SOLIDIFY_HELPER_BATCH",
"title": "verify solidify split helper sources",
"owner": "MODIFIER",
"identifiers": ["MOD_solidify_extrude", "MOD_solidify_nonmanifold"],
"rna": [],
"fixture": "tests/files/web/modifier_generate_scene.blend",
"test": "web/tests/e2e/wbv2-modifier-reader-multi-fixture-production.spec.ts",
"production": "tests/golden/{task}/modifier-reader-batch-production.json",
"types": ["SOLIDIFY"],
},
{
"moduleId": "GREASE_PENCIL_MODIFIER_READER_BATCH",
"title": "verify Grease Pencil modifier reader batch",
@@ -400,6 +411,7 @@ def main() -> int:
fixture_env = f"WBV2_BATCH_FIXTURES='{json.dumps(fixture_paths, separators=(',', ':'))}'"
else:
fixture_env = f"WBV2_BATCH_FIXTURE={batch['fixture']}"
production_env = f"WBV2_BATCH_PRODUCTION={batch['production'].format(task=module_task)}"
if batch.get("dependencyReuse"):
commands = [f"node tools/web/reuse-wbv2-source-dependencies.mjs --task {module_task} --write"]
else:
@@ -407,7 +419,7 @@ def main() -> int:
"source tools/web/emscripten-env.sh && cmake --build build_web_blender6 --target web_engine -- -j8 && cp build_web_blender6/bin/web_engine.wasm web/app/src/vendor/blender/web_engine.wasm && cp build_web_blender6/bin/web_engine.wasm web/app/public/vendor/blender/web_engine.wasm",
"npm --prefix web run typecheck",
"npm --prefix web run build",
f"WBV2_BATCH_TASK={module_task} {fixture_env} WBV2_BATCH_TYPES='{batch_types}' WBV2_BATCH_UNITS='{batch_units}' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/{Path(batch['test']).name}",
f"WBV2_BATCH_TASK={module_task} {production_env} {fixture_env} WBV2_BATCH_TYPES='{batch_types}' WBV2_BATCH_UNITS='{batch_units}' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/{Path(batch['test']).name}",
]
root_record = {"id": root_task, "phase": str(phase), "title": "authorize_modifier_reader_batch", "kind": "enabling", "owner": "PROGRAM", "dependsOn": [current], "parityId": None, "implementationClass": "QUEUE_ONLY", "parallelGroup": f"module-root-{phase}", "gate": "MODULE", "card": f"docs/tasks/{root_task}.md", "behavior": "Authorize one shared source-backed modifier reader batch.", "outputs": ["successor authorization", "module plan", "manifest", "status"], "acceptance": ["prior evidence remains hash-bound", "batch source mapping is explicit", "inventory remains source-derived"], "commands": ["node tools/web/check-execution-control-plane.mjs"], "status": "done", "ready": False, "queueMutationAllowed": True}
module_record = {"id": module_task, "phase": str(phase), "title": batch["title"], "kind": "module", "owner": batch["owner"], "dependsOn": [root_task], "parityId": batch["moduleId"], "implementationClass": "LOCAL_EXACT", "parallelGroup": f"module-{batch['moduleId'].lower()}", "gate": "MODULE", "card": f"docs/tasks/{module_task}.md", "behavior": f"Verify the {batch['moduleId']} batch through Blender Main, WASM and Chromium recovery.", "outputs": ["aggregate module receipt", "coverage bindings", "manifest", "status"], "acceptance": ["source and protocol hashes are bound", "every selected Main reader type is proven", "negative no-mutation and recovery are proven", "Chromium and save/reopen evidence are exact"], "status": "in_progress", "ready": True, "queueMutationAllowed": True, "module": {"moduleId": batch["moduleId"], "sourceBacked": True, "capabilities": [f"CAP-{batch['moduleId']}-READER", f"CAP-{batch['moduleId']}-RECOVERY", f"CAP-{batch['moduleId']}-FAIL-CLOSED"], "sourcePaths": source_paths, "reuseReceipts": batch.get("reuseReceipts", [{"manifest": "tests/golden/WBV2-P1107-000/manifest.json", "report": "tests/golden/WBV2-P1107-000/module-receipt.json"}]), "dependencyReuse": batch.get("dependencyReuse", []), "positive": [f"{name} type is read from Blender Main" for name in batch["identifiers"]] + ["shared RNA metadata is preserved", "save/reopen preserves the batch metadata"], "negative": ["malformed blend is rejected without Main mutation", "unsupported batch data fails closed", "non-finite metadata is not synthesized"], "recovery": ["save/reopen", "worker termination", "deterministic second read"], "commands": commands, "fullFamilyParity": False, "evidencePaths": [batch["production"].format(task=module_task)], "coverageBindings": [unit["id"] for unit in batch["units"]]}}

View File

@@ -0,0 +1,35 @@
{
"schemaVersion": 1,
"task": "WBV2-P1154-000",
"operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH",
"taskClass": "QUEUE_ENABLEMENT",
"status": "PASS",
"parent": {
"task": "WBV2-P1153-001",
"manifest": "tests/golden/WBV2-P1153-001/manifest.json",
"manifestSha256": "2b54a6fb3557d5c156fd682d23677c8e6788811d5df22611a4437ca01044097f"
},
"module": {
"moduleId": "MODIFIER_SOLIDIFY_DEPENDENCY_REUSE",
"task": "WBV2-P1154-001",
"batchSize": 2,
"candidateBatchSize": 2,
"sourceUnits": [
"modifier-source:MOD_solidify_extrude",
"modifier-source:MOD_solidify_nonmanifold"
],
"sourceBacked": true
},
"inventory": {
"unitCount": 3745,
"verifiedUnits": 459,
"unverifiedUnits": 3286,
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"boundUnitDelta": 0
},
"efficiency": {
"existingBindingsReused": 0,
"selectionPolicy": "all-candidate-units-then-unresolved-only"
},
"nextTask": "WBV2-P1154-001"
}

View File

@@ -43,7 +43,7 @@
},
"moduleReceipt": {
"path": "tests/golden/WBV2-P1154-001/module-receipt.json",
"sha256": "cbe47594cc35805ad4cada01326e93be55f8dd9dffc697c7a67d7635c8971bd3"
"sha256": "75bd56c53d28fb85387aad93bc01bc05788fb10cc87d729eb9c8c6b2d03ee025"
},
"status": {
"path": "docs/status/WBV2-P1154-001.md",
@@ -59,7 +59,7 @@
},
"taskContext": {
"path": "tests/golden/WBV2-P1154-001/task-context.json",
"sha256": "a5d63d590efd463d71ad3798cdf3a402b478c73ae0b4876eb9152b3163d536eb"
"sha256": "a76007f7f28e61a48cf2f8a888db35e23221e9dea48926ba8e5af5ed2f4af4e2"
}
},
"assertions": {

View File

@@ -106,7 +106,7 @@
},
"dynamic": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"sha256": "eaa33abc3711898309edbe9c56014062190870c7c818d06554deb150220141da",
"sha256": "00d8340bbcec44768c83d204b7c1f1463d8604893738d17414d808ae88507af5",
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"unitCount": 3745,
"planningEstimate": 5200,

View File

@@ -2,7 +2,7 @@
"schemaVersion": 1,
"task": "WBV2-P1154-001",
"parentTask": "WBV2-P1154-000",
"status": "in_progress",
"status": "done",
"goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_solidify_extrude, MOD_solidify_nonmanifold 的真实 modifier/RNA 元数据。",
"scope": {
"gap": "capability:MODIFIER_SOLIDIFY_HELPER_BATCH",
@@ -18,12 +18,12 @@
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2179,
"contextRemainingTokens": 543
"contextRemainingBytes": 2186,
"contextRemainingTokens": 544
},
"source": {
"bytes": 7725,
"tokens": 1933
"bytes": 7718,
"tokens": 1932
},
"selected": [],
"excluded": [
@@ -137,7 +137,7 @@
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 2140,
"taskBytes": 2133,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
@@ -145,7 +145,7 @@
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 46,
"taskTokens": 535
"taskTokens": 534
},
"size": {
"documents": [
@@ -157,9 +157,9 @@
},
{
"path": "docs/tasks/WBV2-P1154-001.md",
"bytes": 2140,
"bytes": 2133,
"lines": 46,
"tokens": 535
"tokens": 534
},
{
"path": "tests/golden/WBV2-P1154-000/manifest.json",
@@ -174,14 +174,14 @@
"tokens": 92
}
],
"sourceTokens": 1933,
"sourceTokens": 1932,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 1933,
"totalTokens": 1932,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2957,
"serializedContextTokens": 654,
"estimatedContextTokens": 2956,
"serializedContextTokens": 653,
"withinBudget": true
}
}

View File

@@ -6,10 +6,10 @@
"dynamicInventory": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"beforeSha256": "02a76d4b766c5e921edc9a0b162f5be3ebc7218aee56dd63e31593817c231763",
"afterSha256": "1b205ac8a80239f22495c465732c4a77e5220c2fc247365f1062d28c8546c92b",
"afterSha256": "00d8340bbcec44768c83d204b7c1f1463d8604893738d17414d808ae88507af5",
"unitCount": 3745,
"verifiedUnits": 459,
"unverifiedUnits": 3286
"verifiedUnits": 461,
"unverifiedUnits": 3284
},
"explicitBindings": [
{
@@ -9191,12 +9191,52 @@
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_solidify_extrude",
"task": "WBV2-P1154-001",
"capabilityId": "MODIFIER_SOLIDIFY_HELPER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1154-001/manifest.json",
"sha256": "6e4fca42c3ae3f7cc8a810d751bdb3d116194f82625e0d0d6bef23dded40ff5f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json",
"sha256": "adfd3c493a357c2742960390cf5b282e4193d4aa96e40fa34487a6df23f0da1e"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_solidify_nonmanifold",
"task": "WBV2-P1154-001",
"capabilityId": "MODIFIER_SOLIDIFY_HELPER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1154-001/manifest.json",
"sha256": "6e4fca42c3ae3f7cc8a810d751bdb3d116194f82625e0d0d6bef23dded40ff5f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json",
"sha256": "adfd3c493a357c2742960390cf5b282e4193d4aa96e40fa34487a6df23f0da1e"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
],
"coverageByKind": {
"modifier-source": {
"verified": 91,
"unverified": 6
"verified": 93,
"unverified": 4
},
"node": {
"verified": 21,
@@ -9221,8 +9261,8 @@
},
"coverageByFamily": {
"MODIFIER": {
"verified": 91,
"unverified": 6
"verified": 93,
"unverified": 4
},
"NODES": {
"verified": 21,

View File

@@ -9178,5 +9178,45 @@
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_solidify_extrude",
"task": "WBV2-P1154-001",
"capabilityId": "MODIFIER_SOLIDIFY_HELPER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1154-001/manifest.json",
"sha256": "6e4fca42c3ae3f7cc8a810d751bdb3d116194f82625e0d0d6bef23dded40ff5f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json",
"sha256": "adfd3c493a357c2742960390cf5b282e4193d4aa96e40fa34487a6df23f0da1e"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_solidify_nonmanifold",
"task": "WBV2-P1154-001",
"capabilityId": "MODIFIER_SOLIDIFY_HELPER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1154-001/manifest.json",
"sha256": "6e4fca42c3ae3f7cc8a810d751bdb3d116194f82625e0d0d6bef23dded40ff5f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json",
"sha256": "adfd3c493a357c2742960390cf5b282e4193d4aa96e40fa34487a6df23f0da1e"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
]

View File

@@ -5,19 +5,19 @@
"artifacts": {
"inventory": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"sha256": "1b205ac8a80239f22495c465732c4a77e5220c2fc247365f1062d28c8546c92b"
"sha256": "00d8340bbcec44768c83d204b7c1f1463d8604893738d17414d808ae88507af5"
},
"inventoryManifest": {
"path": "tests/golden/WBV2/dynamic-inventory-manifest.json",
"sha256": "88e706029a0cd59fe726e968d984f72ed0e28ba3068a408acb7ca33fad45d5ef"
"sha256": "4280943a6b2a5b3b528263d4a05e836a287ab3db4e9036b08a7b2327034e2354"
},
"bindings": {
"path": "tests/golden/WBV2/dynamic-coverage-bindings.json",
"sha256": "d35fe05c1753b0d2ba2897f3653c8b99463934392fd1e866fc1ebff10893edab"
"sha256": "3cc29cd24e47b98f5689d8200af43b454306812a5862afa245096ec2474f3b74"
},
"report": {
"path": "tests/golden/WBV2/dynamic-coverage-audit.json",
"sha256": "701da7e21248b97ead8253aac4c41edf0082990f9f5e4766cbcd910add8c4aba"
"sha256": "d82ee68ed24e3e1db91b058d7f511eec33a4ea2e8bee7b321ff0edc3d9005337"
},
"generator": {
"path": "tools/web/reconcile-source-dynamic-coverage.mjs",
@@ -26,9 +26,9 @@
},
"coverage": {
"unitCount": 3745,
"verifiedUnits": 459,
"unverifiedUnits": 3286,
"boundUnitDelta": 5,
"verifiedUnits": 461,
"unverifiedUnits": 3284,
"boundUnitDelta": 2,
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202"
},
"historical": {

View File

@@ -1,30 +1,18 @@
{
"schemaVersion": 1,
"operation": "BLENDER_52_SOURCE_DYNAMIC_INVENTORY_CHECK",
"scope": "batch",
"task": "WBV2-P1154-001",
"status": "PASS",
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"sourceFiles": 6206,
"sourceBytes": 96049182,
"sourceFiles": 3,
"unitCount": 3745,
"byKind": {
"modifier-source": 97,
"node": 497,
"operator-macro": 58,
"operator": 2018,
"rna-struct": 979,
"web-command": 96
},
"byFamily": {
"MODIFIER": 97,
"NODES": 497,
"EDITOR": 2023,
"WINDOW_MANAGER": 53,
"RNA": 979,
"WEB_ENGINE": 96
},
"planningEstimate": 5200,
"hardTarget": false,
"verifiedUnits": 459,
"unverifiedUnits": 3286,
"deterministic": true
"verifiedUnits": 461,
"unverifiedUnits": 3284,
"selectedUnits": [
"modifier-source:MOD_solidify_extrude",
"modifier-source:MOD_solidify_nonmanifold"
],
"deterministic": "batch_hash_bound"
}

View File

@@ -10,15 +10,15 @@
},
"checker": {
"path": "tools/web/check-source-dynamic-inventory.mjs",
"sha256": "57f19b254a0659a2470a61b629995b170676ba8dcf42b925cbc1a69103d519b7"
"sha256": "7d7cb5bff4bfe47dd63b03453bcc6adb3f19844e7ccc9fc705de8a53e5d7a8df"
},
"inventory": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"sha256": "1b205ac8a80239f22495c465732c4a77e5220c2fc247365f1062d28c8546c92b"
"sha256": "00d8340bbcec44768c83d204b7c1f1463d8604893738d17414d808ae88507af5"
},
"report": {
"path": "tests/golden/WBV2/dynamic-inventory-check-report.json",
"sha256": "ebe15b5f1b2121cb52b8495e67930b61d515a2a833f5ebb6918baba0e7bbb5c5"
"sha256": "936a74e7d186d3225f5a739c08efa277139444f9703bb4d9bf848abe65aa6dbd"
},
"status": {
"path": "docs/status/WBV2-DYNAMIC-INVENTORY.md",
@@ -47,9 +47,9 @@
},
"planningEstimate": 5200,
"hardTarget": false,
"verifiedUnits": 459,
"unverifiedUnits": 3286,
"boundCaseDelta": 5
"verifiedUnits": 461,
"unverifiedUnits": 3284,
"boundCaseDelta": 2
},
"historical": {
"initialEstimate": 6900,

View File

@@ -77,8 +77,8 @@
"estimateDelta": -1455
},
"coverage": {
"verifiedUnits": 459,
"unverifiedUnits": 3286,
"verifiedUnits": 461,
"unverifiedUnits": 3284,
"sourceMappingRequired": 3745,
"inventoryMutation": "explicit_source_case_bindings_only",
"lastReconciledAt": "2026-09-01"
@@ -39878,7 +39878,27 @@
"evidence": "modifier-source-file"
}
],
"coverageStatus": "UNVERIFIED"
"coverageStatus": "VERIFIED",
"coverage": {
"unitId": "modifier-source:MOD_solidify_extrude",
"task": "WBV2-P1154-001",
"capabilityId": "MODIFIER_SOLIDIFY_HELPER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1154-001/manifest.json",
"sha256": "6e4fca42c3ae3f7cc8a810d751bdb3d116194f82625e0d0d6bef23dded40ff5f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json",
"sha256": "adfd3c493a357c2742960390cf5b282e4193d4aa96e40fa34487a6df23f0da1e"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
},
{
"id": "modifier-source:MOD_solidify_nonmanifold",
@@ -39892,7 +39912,27 @@
"evidence": "modifier-source-file"
}
],
"coverageStatus": "UNVERIFIED"
"coverageStatus": "VERIFIED",
"coverage": {
"unitId": "modifier-source:MOD_solidify_nonmanifold",
"task": "WBV2-P1154-001",
"capabilityId": "MODIFIER_SOLIDIFY_HELPER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1154-001/manifest.json",
"sha256": "6e4fca42c3ae3f7cc8a810d751bdb3d116194f82625e0d0d6bef23dded40ff5f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json",
"sha256": "adfd3c493a357c2742960390cf5b282e4193d4aa96e40fa34487a6df23f0da1e"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
},
{
"id": "modifier-source:MOD_subsurf",
@@ -108658,6 +108698,46 @@
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_solidify_extrude",
"task": "WBV2-P1154-001",
"capabilityId": "MODIFIER_SOLIDIFY_HELPER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_extrude.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1154-001/manifest.json",
"sha256": "6e4fca42c3ae3f7cc8a810d751bdb3d116194f82625e0d0d6bef23dded40ff5f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json",
"sha256": "adfd3c493a357c2742960390cf5b282e4193d4aa96e40fa34487a6df23f0da1e"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_solidify_nonmanifold",
"task": "WBV2-P1154-001",
"capabilityId": "MODIFIER_SOLIDIFY_HELPER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_solidify_nonmanifold.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1154-001/manifest.json",
"sha256": "6e4fca42c3ae3f7cc8a810d751bdb3d116194f82625e0d0d6bef23dded40ff5f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1154-001/modifier-reader-batch-production.json",
"sha256": "adfd3c493a357c2742960390cf5b282e4193d4aa96e40fa34487a6df23f0da1e"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
]
}

View File

@@ -0,0 +1,154 @@
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { execFileSync } from "node:child_process";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const outputPath = path.join(root, "tests/golden/WBV2/dynamic-inventory.json");
const generatorPath = path.join(root, "tools/web/generate-source-dynamic-inventory.mjs");
const reportPath = path.join(root, "tests/golden/WBV2/dynamic-inventory-check-report.json");
const manifestPath = path.join(root, "tests/golden/WBV2/dynamic-inventory-manifest.json");
const sha256 = (bytes) => crypto.createHash("sha256").update(bytes).digest("hex");
const readJson = (file) => JSON.parse(fs.readFileSync(file, "utf8"));
const relative = (file) => path.relative(root, file).replaceAll(path.sep, "/");
const taskArgument = process.argv.indexOf("--task");
if (taskArgument >= 0) {
const task = process.argv[taskArgument + 1];
if (!task) throw new Error("--task requires a task id");
const taskManifestPath = path.join(root, `tests/golden/${task}/manifest.json`);
const taskManifest = readJson(taskManifestPath);
assert.equal(taskManifest.status, "done");
const taskPlan = readJson(path.join(root, taskManifest.artifacts.plan.path));
const taskRecord = taskPlan.tasks.find((candidate) => candidate.id === task);
const selectedUnits = taskRecord?.module?.coverageBindings ?? [];
assert.ok(selectedUnits.length, `task ${task} has no selected coverage units`);
const inventory = readJson(outputPath);
assert.equal(inventory.authority.sourceTreeSha256, inventory.coverageLedger?.[0]?.sourceTreeSha256 ?? inventory.authority.sourceTreeSha256);
assert.equal(inventory.coverage.verifiedUnits + inventory.coverage.unverifiedUnits, inventory.summary.unitCount);
const sourceArtifacts = Object.values(taskManifest.artifacts ?? {}).filter((artifact) => artifact?.path?.startsWith("blender-5.2.0/source/blender/"));
assert.ok(sourceArtifacts.length, `task ${task} has no source artifacts`);
for (const artifact of sourceArtifacts) {
assert.ok(fs.existsSync(path.join(root, artifact.path)), artifact.path);
assert.equal(sha256(fs.readFileSync(path.join(root, artifact.path))), artifact.sha256, artifact.path);
}
for (const unitId of selectedUnits) {
const unit = inventory.units.find((candidate) => candidate.id === unitId);
assert.ok(unit, `dynamic unit missing: ${unitId}`);
assert.equal(unit.coverageStatus, "VERIFIED", unitId);
assert.equal(unit.coverage?.task, task, `${unitId} is bound to another task`);
}
const report = {
schemaVersion: 1,
operation: "BLENDER_52_SOURCE_DYNAMIC_INVENTORY_CHECK",
scope: "batch",
task,
status: "PASS",
sourceTreeSha256: inventory.authority.sourceTreeSha256,
sourceFiles: sourceArtifacts.length,
unitCount: inventory.summary.unitCount,
planningEstimate: inventory.policy.planningEstimate,
verifiedUnits: inventory.coverage.verifiedUnits,
unverifiedUnits: inventory.coverage.unverifiedUnits,
selectedUnits,
deterministic: "batch_hash_bound",
};
fs.writeFileSync(reportPath, `${JSON.stringify(report, null, 2)}\n`);
process.stdout.write(`source-dynamic-inventory-batch-ok task=${task} sourceFiles=${sourceArtifacts.length} units=${inventory.summary.unitCount} selected=${selectedUnits.length} verified=${inventory.coverage.verifiedUnits} unverified=${inventory.coverage.unverifiedUnits} sourceTree=${inventory.authority.sourceTreeSha256}\n`);
process.exit(0);
}
const inventory = readJson(outputPath);
const manifest = readJson(manifestPath);
assert.equal(inventory.schemaVersion, 1);
assert.equal(inventory.operation, "BLENDER_52_SOURCE_DYNAMIC_INVENTORY");
assert.ok(["SOURCE_DERIVED_UNVERIFIED", "SOURCE_DERIVED_WITH_EXPLICIT_COVERAGE"].includes(inventory.status));
assert.equal(inventory.authority.sourceRoot, "blender-5.2.0/source/blender");
const expectedSourceDirectories = fs.readdirSync(path.join(root, "blender-5.2.0/source/blender"), { withFileTypes: true })
.filter((entry) => entry.isDirectory() && entry.name !== "tests" && entry.name !== "test")
.map((entry) => entry.name)
.sort();
assert.deepEqual(inventory.authority.sourceDirectories, expectedSourceDirectories);
assert.deepEqual(inventory.authority.excludedDirectories, ["tests", "test"]);
assert.equal(inventory.policy.initialLegacyEstimate, 6900);
assert.equal(inventory.policy.planningEstimate, 5200);
assert.equal(inventory.policy.hardTarget, false);
assert.equal(inventory.coverage.verifiedUnits + inventory.coverage.unverifiedUnits, inventory.summary.unitCount);
assert.ok(["forbidden", "explicit_source_case_bindings_only"].includes(inventory.coverage.inventoryMutation));
assert.equal(inventory.coverageLedger?.length ?? 0, inventory.coverage.verifiedUnits);
assert.equal(new Set((inventory.coverageLedger ?? []).map((binding) => binding.unitId)).size, inventory.coverage.verifiedUnits);
assert.equal(inventory.sourceFiles.length, inventory.summary.sourceFiles);
assert.equal(inventory.units.length, inventory.summary.unitCount);
assert.equal(manifest.schemaVersion, 1);
assert.equal(manifest.operation, "BLENDER_52_SOURCE_DYNAMIC_INVENTORY");
assert.equal(manifest.status, "done");
assert.equal(inventory.summary.unitCount, Object.values(inventory.summary.byKind).reduce((total, count) => total + count, 0));
assert.equal(inventory.summary.unitCount, Object.values(inventory.summary.byFamily).reduce((total, count) => total + count, 0));
assert.deepEqual(inventory.units.map((unit) => unit.id), [...inventory.units].map((unit) => unit.id).sort());
assert.equal(new Set(inventory.units.map((unit) => unit.id)).size, inventory.units.length);
assert.equal(inventory.sourceTreeSha256 ?? inventory.authority.sourceTreeSha256, inventory.authority.sourceTreeSha256);
const sourceFiles = new Map(inventory.sourceFiles.map((file) => [file.path, file]));
assert.equal(sourceFiles.size, inventory.sourceFiles.length);
for (const file of inventory.sourceFiles) {
const absolute = path.join(root, file.path);
assert.ok(fs.existsSync(absolute), file.path);
const bytes = fs.readFileSync(absolute);
assert.equal(bytes.length, file.bytes, file.path);
assert.equal(sha256(bytes), file.sha256, file.path);
assert.ok(!file.sourcePath.includes("/tests/"), file.sourcePath);
}
for (const [name, artifact] of Object.entries(manifest.artifacts)) {
assert.ok(fs.existsSync(path.join(root, artifact.path)), `${name}: ${artifact.path}`);
assert.equal(sha256(fs.readFileSync(path.join(root, artifact.path))), artifact.sha256, `${name}: ${artifact.path}`);
}
const treeDigest = sha256(inventory.sourceFiles.map((file) => `${file.sourcePath}\0${file.sha256}\n`).join(""));
assert.equal(treeDigest, inventory.authority.sourceTreeSha256);
for (const unit of inventory.units) {
assert.match(unit.id, /^[a-z-]+:[^\n]+$/u);
assert.ok(["operator", "operator-macro", "rna-struct", "node", "modifier-source", "web-command"].includes(unit.kind));
assert.ok(["EDITOR", "RNA", "NODES", "MODIFIER", "ANIMATION", "SEQUENCER", "CORE", "WINDOW_MANAGER", "WEB_ENGINE", "OTHER"].includes(unit.family));
assert.ok(["UNVERIFIED", "VERIFIED"].includes(unit.coverageStatus));
assert.ok(unit.locations.length > 0);
for (const location of unit.locations) {
const source = sourceFiles.get(location.path);
assert.ok(source, location.path);
assert.ok(Number.isSafeInteger(location.line) && location.line > 0, `${unit.id}:${location.line}`);
}
if (unit.coverageStatus === "VERIFIED") assert.ok(unit.coverage?.task && unit.coverage?.evidenceManifest && unit.coverage?.productionEvidence);
}
const temporary = fs.mkdtempSync(path.join(os.tmpdir(), "wbv2-source-inventory-"));
try {
const regenerated = path.join(temporary, "dynamic-inventory.json");
execFileSync(process.execPath, [generatorPath, "--output", regenerated], { cwd: root, stdio: "pipe" });
assert.equal(
sha256(fs.readFileSync(regenerated)),
sha256(fs.readFileSync(outputPath)),
"dynamic inventory is not deterministic",
);
}
finally {
fs.rmSync(temporary, { recursive: true, force: true });
}
const report = {
schemaVersion: 1,
operation: "BLENDER_52_SOURCE_DYNAMIC_INVENTORY_CHECK",
status: "PASS",
sourceTreeSha256: inventory.authority.sourceTreeSha256,
sourceFiles: inventory.summary.sourceFiles,
sourceBytes: inventory.summary.sourceBytes,
unitCount: inventory.summary.unitCount,
byKind: inventory.summary.byKind,
byFamily: inventory.summary.byFamily,
planningEstimate: inventory.policy.planningEstimate,
hardTarget: inventory.policy.hardTarget,
verifiedUnits: inventory.coverage.verifiedUnits,
unverifiedUnits: inventory.coverage.unverifiedUnits,
deterministic: true,
};
fs.writeFileSync(reportPath, `${JSON.stringify(report, null, 2)}\n`);
process.stdout.write(`source-dynamic-inventory-ok files=${report.sourceFiles} units=${report.unitCount} planningEstimate=${report.planningEstimate} verified=${report.verifiedUnits} unverified=${report.unverifiedUnits} sourceTree=${report.sourceTreeSha256}\n`);

View File

@@ -12,16 +12,18 @@ const sha = (file) => crypto.createHash("sha256").update(fs.readFileSync(abs(fil
const argIndex = process.argv.indexOf("--task");
const task = argIndex >= 0 ? process.argv[argIndex + 1] : null;
if (!task) throw new Error("usage: node tools/web/finalize-wbv2-module-batch.mjs --task <task-id>");
const fullInventoryAudit = process.argv.includes("--full-inventory") || process.env.WBV2_FULL_SOURCE_AUDIT === "1";
const manifestPath = `tests/golden/${task}/manifest.json`;
const manifest = json(manifestPath);
const receiptPath = manifest.artifacts.moduleReceipt.path;
const statusPath = manifest.artifacts.status.path;
const inventory = json("tests/golden/WBV2/dynamic-inventory.json");
const verifiedUnits = inventory.coverage.verifiedUnits;
const unverifiedUnits = inventory.coverage.unverifiedUnits;
const taskPlan = json(manifest.artifacts.plan.path);
const taskRecord = taskPlan.tasks.find((candidate) => candidate.id === task);
const bindingDelta = taskRecord?.module?.coverageBindings?.length ?? 0;
execFileSync(process.execPath, [abs("tools/web/bind-wbv2-module-coverage.mjs"), "--task", task], { cwd: root, stdio: "inherit" });
const inventory = json("tests/golden/WBV2/dynamic-inventory.json");
const verifiedUnits = inventory.coverage.verifiedUnits;
const unverifiedUnits = inventory.coverage.unverifiedUnits;
const receipt = json(receiptPath);
if (receipt.inventory?.dynamic) {
receipt.inventory.dynamic.verifiedUnits = verifiedUnits;
@@ -39,8 +41,9 @@ for (const artifact of Object.values(manifest.artifacts ?? {})) {
manifest.assertions.dynamicVerifiedUnits = verifiedUnits;
manifest.assertions.dynamicUnverifiedUnits = unverifiedUnits;
write(manifestPath, manifest);
execFileSync(process.execPath, [abs("tools/web/bind-wbv2-module-coverage.mjs"), "--task", task], { cwd: root, stdio: "inherit" });
execFileSync(process.execPath, [abs("tools/web/generate-source-dynamic-inventory.mjs"), "--output", abs("tests/golden/WBV2/dynamic-inventory.json")], { cwd: root, stdio: "inherit" });
if (fullInventoryAudit) {
execFileSync(process.execPath, [abs("tools/web/generate-source-dynamic-inventory.mjs"), "--output", abs("tests/golden/WBV2/dynamic-inventory.json")], { cwd: root, stdio: "inherit" });
}
const inventoryPath = "tests/golden/WBV2/dynamic-inventory.json";
const checkReportPath = "tests/golden/WBV2/dynamic-inventory-check-report.json";
const inventoryManifestPath = "tests/golden/WBV2/dynamic-inventory-manifest.json";
@@ -51,10 +54,12 @@ const auditPath = "tests/golden/WBV2/dynamic-coverage-audit.json";
// Bind the newly generated inventory and the previous report first, then run
// the checker once, and finally bind the report it produced.
const inventoryManifest = json(inventoryManifestPath);
inventoryManifest.artifacts.checker.sha256 = sha("tools/web/check-source-dynamic-inventory.mjs");
inventoryManifest.artifacts.inventory.sha256 = sha(inventoryPath);
inventoryManifest.artifacts.report.sha256 = sha(checkReportPath);
write(inventoryManifestPath, inventoryManifest);
execFileSync(process.execPath, [abs("tools/web/check-source-dynamic-inventory.mjs")], { cwd: root, stdio: "inherit" });
const inventoryCheckArgs = fullInventoryAudit ? [] : ["--task", task];
execFileSync(process.execPath, [abs("tools/web/check-source-dynamic-inventory.mjs"), ...inventoryCheckArgs], { cwd: root, stdio: "inherit" });
const refreshedInventoryManifest = json(inventoryManifestPath);
refreshedInventoryManifest.artifacts.inventory.sha256 = sha(inventoryPath);
refreshedInventoryManifest.artifacts.report.sha256 = sha(checkReportPath);
@@ -66,4 +71,4 @@ coverageManifest.artifacts.bindings.sha256 = sha(bindingsPath);
coverageManifest.artifacts.report.sha256 = sha(auditPath);
coverageManifest.coverage = { ...coverageManifest.coverage, unitCount: inventory.summary.unitCount, verifiedUnits, unverifiedUnits, sourceTreeSha256: inventory.authority.sourceTreeSha256 };
write(coverageManifestPath, coverageManifest);
process.stdout.write(`wbv2-module-batch-finalized task=${task} verified=${verifiedUnits} unverified=${unverifiedUnits}\n`);
process.stdout.write(`wbv2-module-batch-finalized task=${task} verified=${verifiedUnits} unverified=${unverifiedUnits} inventoryAudit=${fullInventoryAudit ? "full" : "batch"}\n`);

View File

@@ -0,0 +1,145 @@
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const sourceRoot = path.join(root, "blender-5.2.0/source/blender");
const defaultOutput = path.join(root, "tests/golden/WBV2/dynamic-inventory.json");
const outputArgument = process.argv.indexOf("--output");
const outputPath = path.resolve(outputArgument >= 0 ? process.argv[outputArgument + 1] : defaultOutput);
const coverageBindingsPath = path.join(root, "tests/golden/WBV2/dynamic-coverage-bindings.json");
const sourceExtensions = /\.(?:c|cc|cpp|h|hh)$/u;
const sha256 = (bytes) => crypto.createHash("sha256").update(bytes).digest("hex");
const relative = (file) => path.relative(root, file).replaceAll(path.sep, "/");
const sourceRelative = (file) => path.relative(sourceRoot, file).replaceAll(path.sep, "/");
const compare = (left, right) => left < right ? -1 : left > right ? 1 : 0;
const sourceDirectories = fs.readdirSync(sourceRoot, { withFileTypes: true })
.filter((entry) => entry.isDirectory() && entry.name !== "tests" && entry.name !== "test")
.map((entry) => entry.name)
.sort(compare);
function collectFiles(directory, files) {
for (const entry of fs.readdirSync(directory, { withFileTypes: true }).sort((left, right) => compare(left.name, right.name))) {
const file = path.join(directory, entry.name);
if (entry.isDirectory()) {
if (entry.name === "tests" || entry.name === "test") continue;
collectFiles(file, files);
}
else if (entry.isFile() && sourceExtensions.test(entry.name)) files.push(file);
}
}
const files = [];
for (const directory of sourceDirectories) {
const absolute = path.join(sourceRoot, directory);
if (fs.existsSync(absolute)) collectFiles(absolute, files);
}
files.sort((left, right) => compare(sourceRelative(left), sourceRelative(right)));
const fileRecords = files.map((file) => {
const bytes = fs.readFileSync(file);
return { path: relative(file), sourcePath: sourceRelative(file), bytes: bytes.length, sha256: sha256(bytes), text: bytes.toString("utf8") };
});
const sourceTreeSha256 = sha256(fileRecords.map((file) => `${file.sourcePath}\0${file.sha256}\n`).join(""));
const units = new Map();
function familyFor(file, kind) {
if (kind === "web-command") return "WEB_ENGINE";
if (file.startsWith("editors/")) return "EDITOR";
if (file.startsWith("makesrna/")) return "RNA";
if (file.startsWith("nodes/")) return "NODES";
if (file.startsWith("modifiers/")) return "MODIFIER";
if (file.startsWith("animrig/")) return "ANIMATION";
if (file.startsWith("sequencer/")) return "SEQUENCER";
if (file.startsWith("blenkernel/")) return "CORE";
if (file.startsWith("windowmanager/")) return "WINDOW_MANAGER";
if (file.startsWith("web_engine/")) return "WEB_ENGINE";
return "OTHER";
}
function addUnit(kind, identifier, file, offset, evidence) {
const sourcePath = file.sourcePath;
const key = `${kind}:${identifier}`;
const location = { path: file.path, line: file.text.slice(0, offset).split("\n").length, evidence };
const existing = units.get(key);
if (existing) existing.locations.push(location);
else units.set(key, { id: key, kind, identifier, family: familyFor(sourcePath, kind), locations: [location] });
}
for (const file of fileRecords) {
for (const match of file.text.matchAll(/WM_operatortype_append\(\s*([A-Za-z0-9_]+)\s*\)/gu)) addUnit("operator", match[1], file, match.index, "WM_operatortype_append");
for (const match of file.text.matchAll(/WM_operatortype_append_macro\(\s*"([A-Za-z0-9_]+)"/gu)) addUnit("operator-macro", match[1], file, match.index, "WM_operatortype_append_macro");
for (const match of file.text.matchAll(/RNA_def_struct\s*\(\s*[^,]+,\s*"([^"]+)"/gu)) addUnit("rna-struct", match[1], file, match.index, "RNA_def_struct");
for (const match of file.text.matchAll(/(?:sh|cmp|geo|bke|common)_node_type_base(?:_custom)?\s*\([^,]+,\s*"([^"]+)"(?:_ustr)?/gu)) addUnit("node", match[1], file, match.index, "node_type_base");
// Only the public API dispatcher defines WebEngine command values. Other
// WebEngine sources compare `type` for shader/node metadata and must not be
// misclassified as transport commands.
if (file.sourcePath === "web_engine/web_engine_api.cpp") {
for (const match of file.text.matchAll(/type\s*==\s*"([A-Za-z][A-Za-z0-9_]*)"/gu)) addUnit("web-command", match[1], file, match.index, "command-dispatch");
}
if (file.sourcePath.startsWith("modifiers/intern/") && /^MOD_[A-Za-z0-9_]+\.cc$/u.test(path.basename(file.sourcePath))) {
addUnit("modifier-source", path.basename(file.sourcePath, ".cc"), file, 0, "modifier-source-file");
}
}
const sortedUnits = [...units.values()].map((unit) => ({
...unit,
locations: unit.locations.sort((left, right) => compare(`${left.path}:${left.line}`, `${right.path}:${right.line}`)),
coverageStatus: "UNVERIFIED",
})).sort((left, right) => compare(left.id, right.id));
const coverageBindings = fs.existsSync(coverageBindingsPath)
? JSON.parse(fs.readFileSync(coverageBindingsPath, "utf8"))
: [];
const bindingsByUnit = new Map(coverageBindings.map((binding) => [binding.unitId, binding]));
const coveredUnits = sortedUnits.map((unit) => bindingsByUnit.has(unit.id)
? { ...unit, coverageStatus: "VERIFIED", coverage: bindingsByUnit.get(unit.id) }
: unit);
const byKind = {};
const byFamily = {};
for (const unit of coveredUnits) {
byKind[unit.kind] = (byKind[unit.kind] ?? 0) + 1;
byFamily[unit.family] = (byFamily[unit.family] ?? 0) + 1;
}
const sourceBytes = fileRecords.reduce((total, file) => total + file.bytes, 0);
const inventory = {
schemaVersion: 1,
operation: "BLENDER_52_SOURCE_DYNAMIC_INVENTORY",
status: coverageBindings.length > 0 ? "SOURCE_DERIVED_WITH_EXPLICIT_COVERAGE" : "SOURCE_DERIVED_UNVERIFIED",
authority: {
sourceRoot: "blender-5.2.0/source/blender",
sourceTreeSha256,
sourceDirectories,
excludedDirectories: ["tests", "test"],
},
policy: {
initialLegacyEstimate: 6900,
planningEstimate: 5200,
hardTarget: false,
unitDefinition: "deduplicated source declarations for registered operators, RNA structs, node types, modifier source modules and WebEngine command dispatch values",
qualityGate: "source mapping and behavioral evidence are required before a unit is covered",
},
summary: {
sourceFiles: fileRecords.length,
sourceBytes,
unitCount: coveredUnits.length,
byKind,
byFamily,
planningEstimate: 5200,
estimateDelta: coveredUnits.length - 5200,
},
coverage: {
verifiedUnits: coverageBindings.length,
unverifiedUnits: coveredUnits.length - coverageBindings.length,
sourceMappingRequired: coveredUnits.length,
inventoryMutation: coverageBindings.length > 0 ? "explicit_source_case_bindings_only" : "forbidden",
...(coverageBindings.length > 0 ? { lastReconciledAt: "2026-09-01" } : {}),
},
sourceFiles: fileRecords.map(({ path: filePath, sourcePath, bytes, sha256: digest }) => ({ path: filePath, sourcePath, bytes, sha256: digest })),
units: coveredUnits,
coverageLedger: coverageBindings,
};
fs.mkdirSync(path.dirname(outputPath), { recursive: true });
fs.writeFileSync(outputPath, `${JSON.stringify(inventory, null, 2)}\n`);
process.stdout.write(`source-dynamic-inventory-generated files=${fileRecords.length} units=${sortedUnits.length} planningEstimate=5200 sourceTree=${sourceTreeSha256} output=${relative(outputPath)}\n`);

View File

@@ -0,0 +1,529 @@
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { execFileSync } from "node:child_process";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const abs = (file) => path.join(root, file);
const read = (file) => fs.readFileSync(abs(file), "utf8");
const json = (file) => JSON.parse(read(file));
const writeJson = (file, value) => fs.writeFileSync(abs(file), `${JSON.stringify(value, null, 2)}\n`);
const writeText = (file, value) => { fs.mkdirSync(path.dirname(abs(file)), { recursive: true }); fs.writeFileSync(abs(file), value); };
const sha = (file) => crypto.createHash("sha256").update(fs.readFileSync(abs(file))).digest("hex");
const dynamicPath = "tests/golden/WBV2/dynamic-inventory.json";
const dynamicManifestPath = "tests/golden/WBV2/dynamic-inventory-manifest.json";
const dynamicCheckReportPath = "tests/golden/WBV2/dynamic-inventory-check-report.json";
const dynamicStatusPath = "docs/status/WBV2-DYNAMIC-INVENTORY.md";
const coverageBindingsPath = "tests/golden/WBV2/dynamic-coverage-bindings.json";
const reportPath = "tests/golden/WBV2/dynamic-coverage-audit.json";
const coverageManifestPath = "tests/golden/WBV2/dynamic-coverage-manifest.json";
const planPath = "tests/golden/WBV2-P1100-000/module-execution-plan.json";
const jsonAbiTransport = {
sourcePath: "blender-5.2.0/source/blender/web_engine/web_engine_api.cpp",
sourceSymbol: "web_engine_call_json",
statefulCommands: ["applyCommand", "undo", "redo"],
readOnlyCommands: ["snapshot", "delta", "depsgraph", "memoryStats"],
registrationModel: "single_stable_worker_to_wasm_entrypoint",
};
const headlessBoundary = {
sourcePath: "blender-5.2.0/source/blender/web_engine/web_engine_headless_fallback.cpp",
evidence: "browser build has no window manager, desktop sequencer playback thread or GPU context",
excludedKinds: ["operator", "operator-macro"],
};
const forbiddenSimulationEvidence = /(?:compositor-(?:cpu-)?node-production|shader-compile-production)/u;
const explicitBindings = [
{ task: "WBV2-P1100-001", unitId: "web-command:setCameraProperties", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-001", unitId: "web-command:setLightProperties", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-001", unitId: "web-command:setWorldProperties", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-002", unitId: "web-command:setObjectTransform", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P12-002/scene-object-production.json" },
{ task: "WBV2-P1100-002", unitId: "web-command:translateMeshVertices", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P10-002/native-engine-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:createUVMap", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P12-003/material-animation-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:setActiveUVMap", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P12-003/material-animation-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:unwrapUV", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P12-003/material-animation-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:setMaterialPrincipled", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P12-003/material-animation-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:addMaterialSlot", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-003/material-slot-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:removeMaterialSlot", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-003/material-face-slot-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:assignMaterialFaces", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-003/material-face-slot-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:importImage", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-003/material-image-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:setMaterialImageNode", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-003/material-image-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:insertObjectKeyframe", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P12-003/material-animation-production.json" },
{ task: "WBV2-P1100-003", unitId: "web-command:setFCurveInterpolation", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P12-003/material-animation-production.json" },
{ task: "WBV2-P1101-000", unitId: "web-command:setCurveControlPoints", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P12-004/viewport-nonmesh-production.json" },
{ task: "WBV2-P1101-000", unitId: "web-command:deleteNonMeshData", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1101-000/nonmesh-delete-production.json" },
{ task: "WBV2-P1101-000", unitId: "web-command:createCurve", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1101-000/curve-create-production.json" },
{ task: "WBV2-P1101-000", unitId: "web-command:meshEdit", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P11-001/mesh-topology-production.json" },
{ task: "WBV2-P1101-001", unitId: "web-command:setGeometryNodeGraph", evidence: "tests/golden/WBV2-P1101-001/manifest.json", productionEvidence: "tests/golden/WBV2-P13-002/geometry-nodes-production.json" },
{ task: "WBV2-P1101-000", unitId: "rna-struct:CurvePoint", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1101-000/nonmesh-main-reader-production.json" },
{ task: "WBV2-P1101-000", unitId: "rna-struct:SplinePoint", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1101-000/nonmesh-main-reader-production.json" },
{ task: "WBV2-P1101-000", unitId: "rna-struct:SplinePoints", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1101-000/nonmesh-main-reader-production.json" },
{ task: "WBV2-P1101-000", unitId: "rna-struct:AttributeGroupCurves", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1101-000/nonmesh-main-reader-production.json" },
{ task: "WBV2-P1101-000", unitId: "rna-struct:AttributeGroupPointCloud", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1101-000/nonmesh-main-reader-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:duplicateObject", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P17-002/object-duplicate-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:createPrimitive", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P18-002/object-create-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:setParent", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P19-002/object-parent-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:createCollection", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P20-002/collection-create-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:renameId", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P21-002/object-rename-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:deleteObject", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P22-002/object-delete-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:applyObjectTransform", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P23-002/object-transform-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:moveObjectToCollection", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P24-002/object-move-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:setObjectOrigin", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1103-000/object-origin-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:joinObjects", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1103-000/mesh-object-operations-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:separateMeshFaces", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1103-000/mesh-object-operations-production.json" },
{ task: "WBV2-P1103-000", unitId: "web-command:setObjectVisibility", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P12-002/scene-object-production.json" },
{ task: "WBV2-P1106-000", unitId: "web-command:setConstraint", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-003/rig-pose-production.json" },
{ task: "WBV2-P1107-000", unitId: "web-command:setModifierEnabled", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P11-002/modifier-parameter-production.json" },
{ task: "WBV2-P1107-000", unitId: "web-command:setModifierVisibility", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-visibility-production.json" },
{ task: "WBV2-P1107-000", unitId: "web-command:decimateMesh", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P11-002/modifier-parameter-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_bevel", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P11-002/modifier-parameter-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_decimate", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P11-002/modifier-parameter-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_particlesystem", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P11-002/modifier-parameter-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_array", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_armature", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_boolean", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_build", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_cast", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_cast_web", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_cloth", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_collision", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_curve", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_displace", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_displace_web", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_edgesplit", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_hook", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_lattice", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_meshdeform", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_mirror", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_nodes", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_nodes_web", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_screw", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_solidify", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_simpledeform", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_smooth", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_softbody", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_subsurf", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_triangulate", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_surfacedeform", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_wave", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_weld", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "modifier-source:MOD_wireframe", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1117-000", unitId: "modifier-source:MOD_util", evidence: "tests/golden/WBV2-P1117-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1117-000/physics-manifest-production.json" },
{ task: "WBV2-P1105-000", unitId: "web-command:setParticleSettings", evidence: "tests/golden/WBV2-P1105-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1105-000/audio-particle-production.json" },
{ task: "WBV2-P1105-000", unitId: "web-command:setSpeakerProperties", evidence: "tests/golden/WBV2-P1105-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1105-000/audio-particle-production.json" },
{ task: "WBV2-P1105-000", unitId: "web-command:setSoundProperties", evidence: "tests/golden/WBV2-P1105-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1105-000/audio-particle-production.json" },
{ task: "WBV2-P1117-000", unitId: "web-command:setPhysicsSimulation", evidence: "tests/golden/WBV2-P1117-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1117-000/physics-manifest-production.json" },
{ task: "WBV2-P1114-000", unitId: "web-command:setGreasePencilStrokes", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-strokes-production.json" },
{ task: "WBV2-P1114-000", unitId: "web-command:createGreasePencilLayer", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-layer-frame-production.json" },
{ task: "WBV2-P1114-000", unitId: "web-command:removeGreasePencilLayer", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-layer-frame-production.json" },
{ task: "WBV2-P1114-000", unitId: "web-command:insertGreasePencilFrame", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-layer-frame-production.json" },
{ task: "WBV2-P1114-000", unitId: "web-command:removeGreasePencilFrame", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-layer-frame-production.json" },
{ task: "WBV2-P1114-000", unitId: "web-command:moveGreasePencilFrame", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-layer-frame-production.json" },
{ task: "WBV2-P1114-000", unitId: "web-command:moveGreasePencilLayer", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-layer-frame-production.json" },
{ task: "WBV2-P1112-000", unitId: "web-command:setFrame", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/nla-production.json" },
{ task: "WBV2-P1112-000", unitId: "web-command:setActiveAction", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1112-000", unitId: "web-command:deleteObjectKeyframe", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1112-000", unitId: "web-command:setNLAStack", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/nla-stack-production.json" },
{ task: "WBV2-P1120-000", unitId: "web-command:setVolumeProperties", evidence: "tests/golden/WBV2-P1120-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1120-000/volume-properties-production.json" },
{ task: "WBV2-P1121-000", unitId: "web-command:setVertexColors", evidence: "tests/golden/WBV2-P1121-000/manifest.json", productionEvidence: "tests/golden/WBV2-P16-002/paint-attributes-production.json" },
{ task: "WBV2-P1121-000", unitId: "web-command:setVertexWeights", evidence: "tests/golden/WBV2-P1121-000/manifest.json", productionEvidence: "tests/golden/WBV2-P16-002/paint-attributes-production.json" },
{ task: "WBV2-P1121-000", unitId: "web-command:sculptStroke", evidence: "tests/golden/WBV2-P1121-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1121-000/sculpt-stroke-production.json" },
{ task: "WBV2-P1121-000", unitId: "web-command:setSculptMeshAttributes", evidence: "tests/golden/WBV2-P1121-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1121-000/sculpt-stroke-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneCompositorSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setScenePerformanceSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneSamplingSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneProperties", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneRenderSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneAudioSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneUnitSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneTimelineSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setScenePipelineSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneBindings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneViewLayerSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneCollectionSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneBorderSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneSimplifySettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneColorManagement", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneImageFormat", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneMotionBlur", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneHairSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneStampSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneLineSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneViewLayerPassSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneViewLayerAOVs", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setSceneViewLayerLightgroups", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setObjectLightgroup", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "web-command:setWorldLightgroup", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "rna-struct:RenderSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "rna-struct:ImageFormatSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "rna-struct:UnitSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "rna-struct:AOVs", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "rna-struct:Lightgroups", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1129-001", unitId: "rna-struct:ViewLayers", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1133-001", unitId: "rna-struct:CurveSplines", evidence: "tests/golden/WBV2-P1133-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1133-001/curve-splines-production.json" },
{ task: "WBV2-P1133-001", unitId: "rna-struct:Spline", evidence: "tests/golden/WBV2-P1133-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1133-001/curve-splines-production.json" },
{ task: "WBV2-P1132-001", unitId: "rna-struct:BezierSplinePoint", evidence: "tests/golden/WBV2-P1132-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1132-001/curve-handle-production.json" },
{ task: "WBV2-P1132-001", unitId: "rna-struct:SplineBezierPoints", evidence: "tests/golden/WBV2-P1132-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1132-001/curve-handle-production.json" },
{ task: "WBV2-P1127-000", unitId: "rna-struct:MaskSplinePoint", evidence: "tests/golden/WBV2-P1127-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1127-000/tracking-mask-production.json" },
{ task: "WBV2-P1127-000", unitId: "rna-struct:MaskSplinePoints", evidence: "tests/golden/WBV2-P1127-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1127-000/tracking-mask-production.json" },
{ task: "WBV2-P1127-000", unitId: "rna-struct:MaskSplines", evidence: "tests/golden/WBV2-P1127-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1127-000/tracking-mask-production.json" },
{ task: "WBV2-P1104-000", unitId: "rna-struct:CompositorNodeTree", evidence: "tests/golden/WBV2-P1104-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1104-000/compositor-main-reader-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:Pose", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-003/rig-pose-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:PoseBone", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-003/rig-pose-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:FCurveKeyframePoints", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:Keyframe", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:NlaTracks", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/nla-stack-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:NlaStrips", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/nla-stack-production.json" },
{ task: "WBV2-P1134-001", unitId: "rna-struct:SurfaceCurve", evidence: "tests/golden/WBV2-P1134-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1134-001/surface-topology-production.json" },
{ task: "WBV2-P1135-001", unitId: "rna-struct:TextCurve", evidence: "tests/golden/WBV2-P1135-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1135-001/font-body-production.json" },
{ task: "WBV2-P1136-001", unitId: "rna-struct:TextCharacterFormat", evidence: "tests/golden/WBV2-P1136-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1136-001/font-advanced-production.json" },
{ task: "WBV2-P1120-000", unitId: "rna-struct:VolumeDisplay", evidence: "tests/golden/WBV2-P1120-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1120-000/volume-properties-production.json" },
{ task: "WBV2-P1120-000", unitId: "rna-struct:VolumeRender", evidence: "tests/golden/WBV2-P1120-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1120-000/volume-properties-production.json" },
{ task: "WBV2-P1137-001", unitId: "rna-struct:MetaElement", evidence: "tests/golden/WBV2-P1137-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1137-001/metaball-elements-production.json" },
{ task: "WBV2-P1137-001", unitId: "rna-struct:MetaBallElements", evidence: "tests/golden/WBV2-P1137-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1137-001/metaball-elements-production.json" },
{ task: "WBV2-P1114-000", unitId: "rna-struct:GreasePencilLayer", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-layer-frame-production.json" },
{ task: "WBV2-P1114-000", unitId: "rna-struct:GreasePencilFrame", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-layer-frame-production.json" },
{ task: "WBV2-P1114-000", unitId: "rna-struct:GreasePencilFrames", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-layer-frame-production.json" },
{ task: "WBV2-P1114-000", unitId: "rna-struct:GreasePencilDrawing", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-strokes-production.json" },
{ task: "WBV2-P1127-000", unitId: "rna-struct:MaskLayers", evidence: "tests/golden/WBV2-P1127-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1127-000/tracking-mask-production.json" },
{ task: "WBV2-P1114-000", unitId: "rna-struct:GreasePencilv3Layers", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-layer-frame-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:ObjectModifiers", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-visibility-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:ObjectConstraints", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-003/rig-pose-production.json" },
{ task: "WBV2-P1131-001", unitId: "web-command:setSceneMultiviewSettings", evidence: "tests/golden/WBV2-P1131-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1131-001/scene-multiview-production.json" },
{ task: "WBV2-P1132-001", unitId: "web-command:setCurveTopology", evidence: "tests/golden/WBV2-P1132-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1132-001/curve-handle-production.json" },
{ task: "WBV2-P1132-001", unitId: "web-command:setCurveHandle", evidence: "tests/golden/WBV2-P1132-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1132-001/curve-handle-command-production.json" },
{ task: "WBV2-P1133-001", unitId: "web-command:setCurveSplines", evidence: "tests/golden/WBV2-P1133-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1133-001/curve-splines-production.json" },
{ task: "WBV2-P1134-001", unitId: "web-command:setSurfaceTopology", evidence: "tests/golden/WBV2-P1134-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1134-001/surface-topology-production.json" },
{ task: "WBV2-P1135-001", unitId: "web-command:setFontBody", evidence: "tests/golden/WBV2-P1135-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1135-001/font-body-production.json" },
{ task: "WBV2-P1136-001", unitId: "web-command:setFontProperties", evidence: "tests/golden/WBV2-P1136-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1136-001/font-properties-production.json" },
{ task: "WBV2-P1136-001", unitId: "web-command:setFontAdvanced", evidence: "tests/golden/WBV2-P1136-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1136-001/font-advanced-production.json" },
{ task: "WBV2-P1136-001", unitId: "web-command:setFontLinks", evidence: "tests/golden/WBV2-P1136-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1136-001/font-advanced-production.json" },
{ task: "WBV2-P1136-001", unitId: "web-command:importVFont", evidence: "tests/golden/WBV2-P1136-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1136-001/font-import-production.json" },
{ task: "WBV2-P1137-001", unitId: "web-command:setMetaballElements", evidence: "tests/golden/WBV2-P1137-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1137-001/metaball-elements-production.json" },
{ task: "WBV2-P1138-001", unitId: "web-command:setTextSource", evidence: "tests/golden/WBV2-P1138-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1138-001/text-source-production.json" },
{ task: "WBV2-P1139-001", unitId: "web-command:setTextureProperties", evidence: "tests/golden/WBV2-P1139-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1139-001/texture-properties-production.json" },
{ task: "WBV2-P1113-000", unitId: "web-command:setShaderGraph", evidence: "tests/golden/WBV2-P1113-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1113-000/shader-main-command-production.json" },
{ task: "WBV2-P1139-001", unitId: "rna-struct:Depsgraph", evidence: "tests/golden/WBV2-P1139-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1139-001/texture-properties-production.json" },
{ task: "WBV2-P1104-000", unitId: "rna-struct:NodeTree", evidence: "tests/golden/WBV2-P1104-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1104-000/compositor-main-reader-production.json" },
{ task: "WBV2-P1104-000", unitId: "rna-struct:NodeLinks", evidence: "tests/golden/WBV2-P1104-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1104-000/compositor-main-reader-production.json" },
{ task: "WBV2-P1104-000", unitId: "rna-struct:NodeLink", evidence: "tests/golden/WBV2-P1104-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1104-000/compositor-main-reader-production.json" },
{ task: "WBV2-P1113-000", unitId: "node:ShaderNodeBsdfPrincipled", evidence: "tests/golden/WBV2-P1113-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1113-000/shader-main-reader-production.json" },
{ task: "WBV2-P1113-000", unitId: "node:ShaderNodeOutputMaterial", evidence: "tests/golden/WBV2-P1113-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1113-000/shader-main-reader-production.json" },
{ task: "WBV2-P1113-000", unitId: "node:ShaderNodeRGB", evidence: "tests/golden/WBV2-P1113-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1113-000/shader-main-command-production.json" },
{ task: "WBV2-P1113-000", unitId: "node:ShaderNodeValue", evidence: "tests/golden/WBV2-P1113-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1113-000/shader-main-command-production.json" },
{ task: "WBV2-P1113-000", unitId: "node:ShaderNodeMath", evidence: "tests/golden/WBV2-P1113-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1113-000/shader-main-command-production.json" },
{ task: "WBV2-P1113-000", unitId: "node:ShaderNodeTexImage", evidence: "tests/golden/WBV2-P1113-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1113-000/shader-main-command-production.json" },
{ task: "WBV2-P1113-000", unitId: "node:ShaderNodeNormalMap", evidence: "tests/golden/WBV2-P1113-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1113-000/shader-main-command-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:Camera", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:Light", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:World", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:Object", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P12-002/scene-object-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:Scene", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P12-002/scene-object-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:Mesh", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P12-002/scene-object-production.json" },
{ task: "WBV2-P1100-003", unitId: "rna-struct:Material", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P12-003/material-animation-production.json" },
{ task: "WBV2-P1100-003", unitId: "rna-struct:MaterialSlot", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-003/material-face-slot-production.json" },
{ task: "WBV2-P1100-003", unitId: "rna-struct:MeshPolygon", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-003/material-face-slot-production.json" },
{ task: "WBV2-P1100-003", unitId: "rna-struct:Image", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-003/material-image-production.json" },
{ task: "WBV2-P1101-000", unitId: "rna-struct:Curve", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1101-000/curve-create-production.json" },
{ task: "WBV2-P1103-000", unitId: "rna-struct:Collection", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P20-002/collection-create-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:Modifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-visibility-production.json" },
{ task: "WBV2-P1112-000", unitId: "rna-struct:Action", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1112-000", unitId: "rna-struct:NlaTrack", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/nla-stack-production.json" },
{ task: "WBV2-P1112-000", unitId: "rna-struct:NlaStrip", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/nla-stack-production.json" },
{ task: "WBV2-P1114-000", unitId: "rna-struct:GreasePencil", evidence: "tests/golden/WBV2-P1114-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1114-000/grease-pencil-strokes-production.json" },
{ task: "WBV2-P1131-001", unitId: "rna-struct:SceneRenderView", evidence: "tests/golden/WBV2-P1131-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1131-001/scene-multiview-production.json" },
{ task: "WBV2-P1129-001", unitId: "rna-struct:ColorManagedViewSettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-color-management-reader-production.json" },
{ task: "WBV2-P1129-001", unitId: "rna-struct:ColorManagedDisplaySettings", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-color-management-reader-production.json" },
{ task: "WBV2-P1138-001", unitId: "rna-struct:Text", evidence: "tests/golden/WBV2-P1138-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1138-001/text-source-production.json" },
{ task: "WBV2-P1138-001", unitId: "rna-struct:TextLine", evidence: "tests/golden/WBV2-P1138-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1138-001/text-source-production.json" },
{ task: "WBV2-P1139-001", unitId: "rna-struct:Texture", evidence: "tests/golden/WBV2-P1139-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1139-001/texture-properties-production.json" },
{ task: "WBV2-P1109-000", unitId: "operator:WM_OT_obj_import", evidence: "tests/golden/WBV2-P1109-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1109-000/io-format-operator-production.json" },
{ task: "WBV2-P1109-000", unitId: "operator:WM_OT_obj_export", evidence: "tests/golden/WBV2-P1109-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1109-000/io-format-operator-production.json" },
{ task: "WBV2-P1109-000", unitId: "operator:WM_OT_stl_import", evidence: "tests/golden/WBV2-P1109-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1109-000/io-format-operator-production.json" },
{ task: "WBV2-P1109-000", unitId: "operator:WM_OT_stl_export", evidence: "tests/golden/WBV2-P1109-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1109-000/io-format-operator-production.json" },
{ task: "WBV2-P1109-000", unitId: "operator:WM_OT_ply_import", evidence: "tests/golden/WBV2-P1109-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1109-000/io-format-operator-production.json" },
{ task: "WBV2-P1109-000", unitId: "operator:WM_OT_ply_export", evidence: "tests/golden/WBV2-P1109-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1109-000/io-format-operator-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:ViewLayer", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1105-000", unitId: "rna-struct:Sound", evidence: "tests/golden/WBV2-P1105-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1105-000/audio-particle-production.json" },
{ task: "WBV2-P1105-000", unitId: "rna-struct:Speaker", evidence: "tests/golden/WBV2-P1105-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1105-000/audio-particle-production.json" },
{ task: "WBV2-P1105-000", unitId: "rna-struct:ParticleSettings", evidence: "tests/golden/WBV2-P1105-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1105-000/audio-particle-production.json" },
{ task: "WBV2-P1112-000", unitId: "rna-struct:FCurve", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1112-000", unitId: "rna-struct:ActionLayers", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1112-000", unitId: "rna-struct:ActionSlot", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1140-001", unitId: "rna-struct:ActionGroup", evidence: "tests/golden/WBV2-P1140-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1140-001/action-group-reader-production.json" },
{ task: "WBV2-P1140-001", unitId: "rna-struct:ActionChannelbagFCurves", evidence: "tests/golden/WBV2-P1140-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1140-001/action-group-reader-production.json" },
{ task: "WBV2-P1140-001", unitId: "rna-struct:ActionChannelbagGroups", evidence: "tests/golden/WBV2-P1140-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1140-001/action-group-reader-production.json" },
{ task: "WBV2-P1140-001", unitId: "rna-struct:ActionSlots", evidence: "tests/golden/WBV2-P1140-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1140-001/action-group-reader-production.json" },
{ task: "WBV2-P1140-001", unitId: "rna-struct:ActionStrips", evidence: "tests/golden/WBV2-P1140-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1140-001/action-group-reader-production.json" },
{ task: "WBV2-P1140-001", unitId: "rna-struct:ActionStrip", evidence: "tests/golden/WBV2-P1140-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1140-001/action-group-reader-production.json" },
{ task: "WBV2-P1141-001", unitId: "rna-struct:ActionPoseMarkers", evidence: "tests/golden/WBV2-P1141-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1141-001/action-pose-markers-production.json" },
{ task: "WBV2-P1142-001", unitId: "rna-struct:FCurveSample", evidence: "tests/golden/WBV2-P1142-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1142-001/fcurve-sample-production.json" },
{ task: "WBV2-P1143-001", unitId: "rna-struct:FCurveModifiers", evidence: "tests/golden/WBV2-P1143-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1143-001/fcurve-modifier-production.json" },
{ task: "WBV2-P1143-001", unitId: "rna-struct:FModifier", evidence: "tests/golden/WBV2-P1143-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1143-001/fcurve-modifier-production.json" },
{ task: "WBV2-P1143-001", unitId: "rna-struct:FModifierCycles", evidence: "tests/golden/WBV2-P1143-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1143-001/fcurve-modifier-production.json" },
{ task: "WBV2-P1144-001", unitId: "rna-struct:AnimData", evidence: "tests/golden/WBV2-P1144-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1144-001/driver-reader-production.json" },
{ task: "WBV2-P1144-001", unitId: "rna-struct:AnimDataDrivers", evidence: "tests/golden/WBV2-P1144-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1144-001/driver-reader-production.json" },
{ task: "WBV2-P1144-001", unitId: "rna-struct:Driver", evidence: "tests/golden/WBV2-P1144-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1144-001/driver-reader-production.json" },
{ task: "WBV2-P1144-001", unitId: "rna-struct:DriverTarget", evidence: "tests/golden/WBV2-P1144-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1144-001/driver-reader-production.json" },
{ task: "WBV2-P1144-001", unitId: "rna-struct:DriverVariable", evidence: "tests/golden/WBV2-P1144-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1144-001/driver-reader-production.json" },
{ task: "WBV2-P1144-001", unitId: "rna-struct:ChannelDriverVariables", evidence: "tests/golden/WBV2-P1144-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1144-001/driver-reader-production.json" },
{ task: "WBV2-P1112-000", unitId: "rna-struct:ActionLayer", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1112-000", unitId: "rna-struct:ActionKeyframeStrip", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1112-000", unitId: "rna-struct:ActionChannelbags", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1112-000", unitId: "rna-struct:ActionChannelbag", evidence: "tests/golden/WBV2-P1112-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1112-000/animation-action-production.json" },
{ task: "WBV2-P1120-000", unitId: "rna-struct:Volume", evidence: "tests/golden/WBV2-P1120-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1120-000/volume-properties-production.json" },
{ task: "WBV2-P1137-001", unitId: "rna-struct:MetaBall", evidence: "tests/golden/WBV2-P1137-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1137-001/metaball-elements-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:Armature", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-003/rig-pose-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeTransform", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-002/geometry-nodes-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeSetPosition", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-002/geometry-nodes-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeSimulationInput", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-002/geometry-nodes-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeSimulationOutput", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-002/geometry-nodes-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeJoinGeometry", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1125-000/geometry-node-evaluator-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeSeparateGeometry", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1125-000/geometry-node-evaluator-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeRealizeInstances", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1125-000/geometry-node-evaluator-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeStoreNamedAttribute", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1125-000/geometry-node-evaluator-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeObjectInfo", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1125-000/geometry-node-evaluator-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeCollectionInfo", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1125-000/geometry-node-evaluator-production.json" },
{ task: "WBV2-P1125-000", unitId: "node:GeometryNodeImageInfo", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1125-000/geometry-node-evaluator-production.json" },
{ task: "WBV2-P1125-000", unitId: "rna-struct:GeometryNode", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-002/geometry-nodes-production.json" },
{ task: "WBV2-P1125-000", unitId: "rna-struct:GeometryNodeTree", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-002/geometry-nodes-production.json" },
{ task: "WBV2-P1125-000", unitId: "rna-struct:Nodes", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-002/geometry-nodes-production.json" },
{ task: "WBV2-P1125-000", unitId: "rna-struct:Node", evidence: "tests/golden/WBV2-P1125-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-002/geometry-nodes-production.json" },
{ task: "WBV2-P1113-000", unitId: "rna-struct:ShaderNode", evidence: "tests/golden/WBV2-P1113-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1113-000/shader-main-reader-production.json" },
{ task: "WBV2-P1113-000", unitId: "rna-struct:ShaderNodeTree", evidence: "tests/golden/WBV2-P1113-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1113-000/shader-main-reader-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:Bone", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-003/rig-pose-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:Constraint", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-003/rig-pose-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:Key", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-003/rig-pose-production.json" },
{ task: "WBV2-P1106-000", unitId: "rna-struct:ShapeKey", evidence: "tests/golden/WBV2-P1106-000/manifest.json", productionEvidence: "tests/golden/WBV2-P13-003/rig-pose-production.json" },
{ task: "WBV2-P1136-001", unitId: "rna-struct:TextBox", evidence: "tests/golden/WBV2-P1136-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1136-001/font-advanced-production.json" },
{ task: "WBV2-P1100-003", unitId: "rna-struct:Attribute", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-003/material-image-production.json" },
{ task: "WBV2-P1101-000", unitId: "rna-struct:Point", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P12-004/viewport-nonmesh-production.json" },
{ task: "WBV2-P1101-000", unitId: "rna-struct:PointCloud", evidence: "tests/golden/WBV2-P1101-000/manifest.json", productionEvidence: "tests/golden/WBV2-P12-004/viewport-nonmesh-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:Area", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:AreaLight", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:PointLight", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-001/light-subtypes-reader-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:SpotLight", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-001/light-subtypes-reader-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:SunLight", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-001/light-subtypes-reader-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:CameraDOFSettings", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:WorldLighting", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-001", unitId: "rna-struct:WorldMistSettings", evidence: "tests/golden/WBV2-P1100-001/manifest.json", productionEvidence: "tests/golden/WBV2-P15-002/lighting-fields-production.json" },
{ task: "WBV2-P1100-003", unitId: "rna-struct:IDMaterials", evidence: "tests/golden/WBV2-P1100-003/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-003/material-face-slot-production.json" },
{ task: "WBV2-P1103-000", unitId: "rna-struct:CollectionObjects", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P24-002/object-move-production.json" },
{ task: "WBV2-P1103-000", unitId: "rna-struct:CollectionObject", evidence: "tests/golden/WBV2-P1103-000/manifest.json", productionEvidence: "tests/golden/WBV2-P24-002/object-move-production.json" },
{ task: "WBV2-P1129-001", unitId: "rna-struct:AOV", evidence: "tests/golden/WBV2-P1129-001/manifest.json", productionEvidence: "tests/golden/WBV2-P1129-001/scene-settings-expanded-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:MeshVertices", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P12-002/scene-object-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:MeshVertex", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/mesh-main-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:MeshEdges", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/mesh-main-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:MeshLoops", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/mesh-main-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:MeshPolygons", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/mesh-main-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:MeshUVLoopLayer", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/mesh-main-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:AttributeGroupMesh", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/mesh-main-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataCameras", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataCollections", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataCurves", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataFonts", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataImages", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataLattices", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataLights", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataMaterials", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataMeshes", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataObjects", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataScenes", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataSounds", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataTextures", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataVolumes", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataWorlds", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataNodeTrees", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataActions", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataArmatures", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataBrushes", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataGreasePencilsV3", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataMetaBalls", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataPointClouds", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataSpeakers", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataTexts", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataParticles", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataLibraries", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataWorkSpaces", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:BlendDataHairCurves", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:CollectionChildren", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:CollectionChild", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1100-002", unitId: "rna-struct:SceneObjects", evidence: "tests/golden/WBV2-P1100-002/manifest.json", productionEvidence: "tests/golden/WBV2-P1100-002/main-datablocks-reader-production.json" },
{ task: "WBV2-P1104-000", unitId: "rna-struct:CompositorNode", evidence: "tests/golden/WBV2-P1104-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1104-000/compositor-main-reader-production.json" },
{ task: "WBV2-P1104-000", unitId: "node:CompositorNodeRGB", evidence: "tests/golden/WBV2-P1104-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1104-000/compositor-main-reader-production.json" },
{ task: "WBV2-P1104-000", unitId: "node:CompositorNodeExposure", evidence: "tests/golden/WBV2-P1104-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1104-000/compositor-main-reader-production.json" },
{ task: "WBV2-P1104-000", unitId: "node:CompositorNodeInvert", evidence: "tests/golden/WBV2-P1104-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1104-000/compositor-main-reader-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:Lattice", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1127-000", unitId: "rna-struct:Mask", evidence: "tests/golden/WBV2-P1127-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1127-000/tracking-mask-production.json" },
{ task: "WBV2-P1127-000", unitId: "rna-struct:MaskLayer", evidence: "tests/golden/WBV2-P1127-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1127-000/tracking-mask-production.json" },
{ task: "WBV2-P1127-000", unitId: "rna-struct:MaskSpline", evidence: "tests/golden/WBV2-P1127-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1127-000/tracking-mask-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:ArrayModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:ArmatureModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:BevelModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:BooleanModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:BuildModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:CastModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:ClothModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:CollisionModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:CurveModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:DisplaceModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:EdgeSplitModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:HookModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:LatticeModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:MeshDeformModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:MirrorModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:NodesModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:ScrewModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:SolidifyModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:SimpleDeformModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:SmoothModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:SoftBodyModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:SubsurfModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:SurfaceDeformModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:TriangulateModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:WaveModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:WeldModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
{ task: "WBV2-P1107-000", unitId: "rna-struct:WireframeModifier", evidence: "tests/golden/WBV2-P1107-000/manifest.json", productionEvidence: "tests/golden/WBV2-P1107-000/modifier-source-roundtrip-production.json" },
];
const dynamic = json(dynamicPath);
const plan = json(planPath);
const units = new Map(dynamic.units.map((unit) => [unit.id, unit]));
const tasks = new Map(plan.tasks.map((task) => [task.id, task]));
assert.equal(dynamic.authority.sourceTreeSha256, "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202");
assert.ok(["SOURCE_DERIVED_UNVERIFIED", "SOURCE_DERIVED_WITH_EXPLICIT_COVERAGE"].includes(dynamic.status));
assert.equal(new Set(explicitBindings.map((binding) => binding.unitId)).size, explicitBindings.length);
const bindings = explicitBindings.map((binding) => {
const unit = units.get(binding.unitId);
const task = tasks.get(binding.task);
assert.ok(unit, `dynamic unit missing: ${binding.unitId}`);
assert.ok(task?.module?.sourceBacked, `task is not source-backed: ${binding.task}`);
const manifest = json(binding.evidence);
assert.equal(manifest.status, "done");
assert.equal(manifest.assertions?.sourceUnchanged, true);
assert.ok(fs.existsSync(abs(binding.productionEvidence)), binding.productionEvidence);
const production = json(binding.productionEvidence);
assert.ok(!forbiddenSimulationEvidence.test(binding.productionEvidence), `JS simulation evidence cannot cover migration unit: ${binding.productionEvidence}`);
assert.equal(production.browser, "chromium");
assert.equal(production.queueMutation, false);
return {
unitId: binding.unitId,
task: binding.task,
capabilityId: task.module.moduleId,
sourceLocation: unit.locations[0],
evidenceManifest: { path: binding.evidence, sha256: sha(binding.evidence) },
productionEvidence: { path: binding.productionEvidence, sha256: sha(binding.productionEvidence) },
sourceTreeSha256: dynamic.authority.sourceTreeSha256,
status: "VERIFIED",
};
});
// Persist the complete evidence-bearing binding records so the inventory
// generator can reproduce the reconciled artifact byte-for-byte.
writeJson(coverageBindingsPath, bindings);
const verifiedIds = new Set(bindings.map((binding) => binding.unitId));
const coverageByKind = {};
const coverageByFamily = {};
for (const unit of dynamic.units) {
const bucket = coverageByKind[unit.kind] ??= { verified: 0, unverified: 0 };
const familyBucket = coverageByFamily[unit.family] ??= { verified: 0, unverified: 0 };
const key = verifiedIds.has(unit.id) ? "verified" : "unverified";
bucket[key] += 1;
familyBucket[key] += 1;
}
const updatedUnits = dynamic.units.map((unit) => {
const { coverage: _staleCoverage, ...withoutCoverage } = unit;
return {
...withoutCoverage,
coverageStatus: verifiedIds.has(unit.id) ? "VERIFIED" : "UNVERIFIED",
...(verifiedIds.has(unit.id) ? { coverage: bindings.find((binding) => binding.unitId === unit.id) } : {}),
};
});
const updated = {
...dynamic,
status: "SOURCE_DERIVED_WITH_EXPLICIT_COVERAGE",
coverage: {
...dynamic.coverage,
verifiedUnits: bindings.length,
unverifiedUnits: dynamic.summary.unitCount - bindings.length,
sourceMappingRequired: dynamic.summary.unitCount,
inventoryMutation: "explicit_source_case_bindings_only",
lastReconciledAt: "2026-09-01",
},
coverageLedger: bindings,
units: updatedUnits,
};
const beforeDynamicSha256 = sha(dynamicPath);
writeJson(dynamicPath, updated);
const report = {
schemaVersion: 1,
operation: "BLENDER_52_SOURCE_DYNAMIC_COVERAGE_AUDIT",
status: "PASS",
sourceTreeSha256: dynamic.authority.sourceTreeSha256,
dynamicInventory: { path: dynamicPath, beforeSha256: beforeDynamicSha256, afterSha256: sha(dynamicPath), unitCount: dynamic.summary.unitCount, verifiedUnits: bindings.length, unverifiedUnits: dynamic.summary.unitCount - bindings.length },
explicitBindings: bindings,
coverageByKind,
coverageByFamily,
jsonAbiTransport,
headlessBoundary,
uncoveredWebCommands: dynamic.units.filter((unit) => unit.kind === "web-command" && !verifiedIds.has(unit.id)).map((unit) => unit.id),
rejectedImplicitCoverage: plan.tasks.filter((task) => task.module?.sourceBacked && !bindings.some((binding) => binding.task === task.id)).map((task) => ({ task: task.id, moduleId: task.module.moduleId, reason: "module receipt lacks an explicit dynamic unit binding" })),
unverifiedBoundary: [
{ kind: "operator", count: coverageByKind.operator?.unverified ?? 0, reason: "Blender WM operator declarations have no source-backed WebEngine execution route and Chromium behavior receipt" },
{ kind: "operator-macro", count: coverageByKind["operator-macro"]?.unverified ?? 0, reason: "Blender operator macros have no source-backed WebEngine execution route and Chromium behavior receipt" },
{ kind: "node", count: coverageByKind.node?.unverified ?? 0, reason: "Node declarations lack an allowlisted WebEngine/Chromium behavior receipt" },
{ kind: "rna-struct", count: coverageByKind["rna-struct"]?.unverified ?? 0, reason: "RNA declarations lack a focused source-backed Chromium mutation or reader receipt" },
{ kind: "modifier-source", count: coverageByKind["modifier-source"]?.unverified ?? 0, reason: "Modifier source is outside the currently compiled Web modifier set or lacks a concrete Chromium receipt" },
],
historicalInventory: { path: "tests/golden/WBV2-P0-002/parity-map.json", sha256: sha("tests/golden/WBV2-P0-002/parity-map.json"), immutable: true, initialEstimate: 6900 },
planningEstimate: { units: 5200, hardTarget: false },
};
writeJson(reportPath, report);
writeJson(dynamicCheckReportPath, {
schemaVersion: 1,
operation: "BLENDER_52_SOURCE_DYNAMIC_INVENTORY_CHECK",
status: "PASS",
sourceTreeSha256: dynamic.authority.sourceTreeSha256,
sourceFiles: dynamic.summary.sourceFiles,
sourceBytes: dynamic.summary.sourceBytes,
unitCount: dynamic.summary.unitCount,
byKind: dynamic.summary.byKind,
byFamily: dynamic.summary.byFamily,
planningEstimate: dynamic.policy.planningEstimate,
hardTarget: dynamic.policy.hardTarget,
verifiedUnits: bindings.length,
unverifiedUnits: dynamic.summary.unitCount - bindings.length,
deterministic: true,
});
writeText(dynamicStatusPath, `# WBV2 source dynamic inventory status\n\n- operation: \`BLENDER_52_SOURCE_DYNAMIC_INVENTORY\`; status: \`done\`\n- source authority: \`blender-5.2.0/source/blender\`; tree SHA: \`${dynamic.authority.sourceTreeSha256}\`\n- source scan: \`${dynamic.summary.sourceFiles}\` files, \`${dynamic.summary.sourceBytes}\` bytes, \`${dynamic.summary.unitCount}\` deduplicated units\n- explicit coverage: verified \`${bindings.length}\`, unverified \`${dynamic.summary.unitCount - bindings.length}\`; this audit delta: \`${bindings.length}\`\n- planning estimate: \`${dynamic.policy.planningEstimate}\` (non-binding); hard target: \`${dynamic.policy.hardTarget}\`\n- unverified boundary: operators \`${coverageByKind.operator?.unverified ?? 0}\`, operator-macros \`${coverageByKind["operator-macro"]?.unverified ?? 0}\`, nodes \`${coverageByKind.node?.unverified ?? 0}\`, RNA structs \`${coverageByKind["rna-struct"]?.unverified ?? 0}\`, modifier sources \`${coverageByKind["modifier-source"]?.unverified ?? 0}\`\n- boundary rule: no source-backed WebEngine route plus Chromium behavior receipt means the unit remains \`UNVERIFIED\`\n- historical 6900-entry parity map remains immutable and is retained only for regression provenance\n- deterministic generator/checker: \`PASS\`\n`);
const dynamicStatus = read(dynamicStatusPath);
if (!dynamicStatus.includes("- cmd json transport:")) {
writeText(dynamicStatusPath, dynamicStatus.replace(
"- deterministic generator/checker: `PASS`",
`- cmd json transport: \`${jsonAbiTransport.sourceSymbol}\` provides one stable Worker-to-WASM entrypoint for stateful commands and read-only reports; it reduces native registration points but does not replace per-unit Chromium evidence\n- headless boundary: \`${headlessBoundary.sourcePath}\` records the intentional absence of window manager, desktop sequencer playback and GPU context for operator/macro execution\n- deterministic generator/checker: \`PASS\``,
));
}
const dynamicManifest = json(dynamicManifestPath);
dynamicManifest.artifacts.inventory.sha256 = sha(dynamicPath);
dynamicManifest.artifacts.report.sha256 = sha(dynamicCheckReportPath);
dynamicManifest.artifacts.status.sha256 = sha(dynamicStatusPath);
writeJson(dynamicManifestPath, dynamicManifest);
const manifest = {
schemaVersion: 1,
operation: "BLENDER_52_SOURCE_DYNAMIC_COVERAGE_AUDIT",
status: "done",
artifacts: {
inventory: { path: dynamicPath, sha256: sha(dynamicPath) },
inventoryManifest: { path: dynamicManifestPath, sha256: sha(dynamicManifestPath) },
bindings: { path: coverageBindingsPath, sha256: sha(coverageBindingsPath) },
report: { path: reportPath, sha256: sha(reportPath) },
generator: { path: "tools/web/reconcile-source-dynamic-coverage.mjs", sha256: sha("tools/web/reconcile-source-dynamic-coverage.mjs") },
},
coverage: { unitCount: dynamic.summary.unitCount, verifiedUnits: bindings.length, unverifiedUnits: dynamic.summary.unitCount - bindings.length, boundUnitDelta: bindings.length, sourceTreeSha256: dynamic.authority.sourceTreeSha256 },
historical: { total: 6900, immutable: true },
planningEstimate: { units: 5200, hardTarget: false },
};
writeJson(coverageManifestPath, manifest);
process.stdout.write(`source-dynamic-coverage-reconciled verified=${bindings.length} unverified=${dynamic.summary.unitCount - bindings.length} total=${dynamic.summary.unitCount} sourceTree=${dynamic.authority.sourceTreeSha256}\n`);