feat(web): reuse verified source dependencies
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 13:50:55 +08:00
parent c3cce050f8
commit c334bb1437
28 changed files with 8504 additions and 70 deletions

View File

@@ -15,9 +15,9 @@
| 字段 | 值 |
| --- | --- |
| 里程碑 | WBV2 capability workflow |
| 当前任务 | `WBV2-P1152-001` |
| parent manifest | `tests/golden/WBV2-P1152-000/manifest.json` |
| 任务卡 | [`tasks/WBV2-P1152-001.md`](tasks/WBV2-P1152-001.md) |
| 当前任务 | `WBV2-P1153-001` |
| parent manifest | `tests/golden/WBV2-P1153-000/manifest.json` |
| 任务卡 | [`tasks/WBV2-P1153-001.md`](tasks/WBV2-P1153-001.md) |
| 专项验收 | `node tools/web/check-execution-control-plane.mjs` |
| legacy coverage checkpoint | `M16-GAP-00282` |
| legacy coverage parent | `tests/golden/M16-GAP-00281/manifest.json` |

View File

@@ -6,4 +6,4 @@
- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt
- dynamic source inventory: `3745` units; verified `442`; unverified `3303`; this-segment binding delta: `49`; planning estimate `5200` (non-binding)
- historical 6900-entry inventory remains read-only; full-family parity: `false`
- nextTask: `NONE`
- nextTask: `WBV2-P1152-000`

View File

@@ -6,4 +6,4 @@
- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt
- dynamic source inventory: `3745` units; verified `454`; unverified `3291`; planning estimate `5200` (non-binding); this-segment binding delta: `12`
- historical 6900-entry inventory remains read-only; full-family parity: `false`
- nextTask: `NONE`
- nextTask: `WBV2-P1153-000`

View File

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

View File

@@ -0,0 +1,9 @@
# WBV2-P1153-001 status
- task: `WBV2-P1153-001`; module: `MODIFIER_SOURCE_DEPENDENCY_REUSE`; status: `done`
- source hashes stable: `true`; commands passed: `1`
- existing production evidence reused: `true`; skipped commands: `1`
- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt
- dynamic source inventory: `3745` units; verified `459`; unverified `3286`; planning estimate `5200` (non-binding); this-segment binding delta: `5`
- historical 6900-entry inventory remains read-only; full-family parity: `false`
- nextTask: `NONE`

View File

@@ -0,0 +1,31 @@
# WBV2-P1153-000: authorize module batch
- task: WBV2-P1153-000
- parent: WBV2-P1152-001
- status: done
- gap: capability:MODIFIER_SOURCE_DEPENDENCY_REUSE
- ownerFamily: MODIFIER
- targetImplementationClass: QUEUE_ONLY
- Implementation entrypoint: `python3 my-tools/authorize_next_wbv2_task.py --write`
## 目标
授权一个共享 Blender Main/WASM/Chromium 功能批次:MODIFIER_SOURCE_DEPENDENCY_REUSE,共 5 个源码/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-P1153-000 --write`
## 交付与回滚
- Manifest: `tests/golden/WBV2-P1153-000/manifest.json`
- Status: `docs/status/WBV2-P1153-000.md`
- Rollback: restore WBV2-P1152-001 as queue parent.

View File

@@ -0,0 +1,45 @@
# WBV2-P1153-001: reuse verified modifier receipts for shared source utilities
- task: WBV2-P1153-001
- parent: WBV2-P1153-000
- status: in_progress
- gap: capability:MODIFIER_SOURCE_DEPENDENCY_REUSE
- ownerFamily: MODIFIER
- targetImplementationClass: LOCAL_EXACT
- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1153-001 --write`
## 目标
以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_grease_pencil_util, MOD_meshcache_mdd, MOD_meshcache_pc2, MOD_meshcache_util, MOD_weightvg_util 的真实 modifier/RNA 元数据。
## 输入与范围
- Blender modifier sources: `blender-5.2.0/source/blender/modifiers/intern/`
- RNA source: `blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc`
- Native reader: `blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp`
- Fixtures: existing Chromium receipts
- Chromium test: `tools/web/reuse-wbv2-source-dependencies.mjs`
- Selected modifier units: `modifier-source:MOD_grease_pencil_util`, `modifier-source:MOD_meshcache_mdd`, `modifier-source:MOD_meshcache_pc2`, `modifier-source:MOD_meshcache_util`, `modifier-source:MOD_weightvg_util`
- Selected RNA units: none (source-only dependency batch)
## 验收
- one shared Main/WASM/Worker/Chromium chain observes every selected type
- malformed input is rejected without Main mutation
- save/reopen and deterministic second read are exact
- only Chromium is used; JS simulation and per-API duplicate workers are forbidden
- each selected source unit receives an explicit hash-bound coverage binding
- `node tools/web/check-task-context.mjs --task WBV2-P1153-001 --write`
## 失败边界
- any missing source, unsupported type, hash drift, malformed data or non-exact recovery keeps the batch `in_progress`/`blocked`
- partial batch success never claims the omitted family; historical inventory remains read-only
## 交付与回滚
- Receipt: `tests/golden/WBV2-P1153-001/module-receipt.json`
- Aggregate production evidence: `tests/golden/WBV2-P1153-001/modifier-reader-batch-production.json`
- Manifest: `tests/golden/WBV2-P1153-001/manifest.json`
- Status: `docs/status/WBV2-P1153-001.md`
- Rollback: restore WBV2-P1153-000 as queue parent without rewriting prior evidence.

View File

@@ -93,6 +93,28 @@ PREFERRED_BATCHES = [
"production": "tests/golden/{task}/modifier-reader-batch-production.json",
"types": ["MESH_TO_VOLUME", "PARTICLE_INSTANCE", "SURFACE", "VERTEX_WEIGHT_EDIT", "VERTEX_WEIGHT_MIX", "VERTEX_WEIGHT_PROXIMITY"],
},
{
"moduleId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"title": "reuse verified modifier receipts for shared source utilities",
"owner": "MODIFIER",
"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",
"types": [],
"reuseReceipts": [
{"manifest": "tests/golden/WBV2-P1150-001/manifest.json", "report": "tests/golden/WBV2-P1150-001/module-receipt.json"},
{"manifest": "tests/golden/WBV2-P1151-001/manifest.json", "report": "tests/golden/WBV2-P1151-001/module-receipt.json"},
{"manifest": "tests/golden/WBV2-P1152-001/manifest.json", "report": "tests/golden/WBV2-P1152-001/module-receipt.json"},
],
"dependencyReuse": [
{"unitId": "modifier-source:MOD_grease_pencil_util", "representativeUnitId": "modifier-source:MOD_grease_pencil_array", "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc", "marker": "MOD_grease_pencil_util.hh", "productionEvidence": "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json"},
{"unitId": "modifier-source:MOD_meshcache_mdd", "representativeUnitId": "modifier-source:MOD_meshcache", "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", "marker": "MOD_meshcache_read_mdd_times", "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json"},
{"unitId": "modifier-source:MOD_meshcache_pc2", "representativeUnitId": "modifier-source:MOD_meshcache", "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", "marker": "MOD_meshcache_read_pc2_times", "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json"},
{"unitId": "modifier-source:MOD_meshcache_util", "representativeUnitId": "modifier-source:MOD_meshcache", "proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc", "marker": "MOD_meshcache_util.hh", "productionEvidence": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json"},
{"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": "GREASE_PENCIL_MODIFIER_READER_BATCH",
"title": "verify Grease Pencil modifier reader batch",
@@ -191,8 +213,10 @@ def snapshot(text: str, task: str, parent: str, next_task: str) -> str:
def make_card(task: str, parent: str, status: str, batch: dict, entrypoint: str) -> str:
fixture_paths = batch.get("fixtures") or [batch["fixture"]]
fixture_paths = batch.get("fixtures") or ([batch["fixture"]] if batch.get("fixture") else [])
fixture_text = ", ".join(f"`{fixture}`" for fixture in fixture_paths)
if not fixture_text:
fixture_text = "existing Chromium receipts"
if task.endswith("-000"):
return f"""# {task}: authorize module batch
@@ -269,7 +293,7 @@ def make_card(task: str, parent: str, status: str, batch: dict, entrypoint: str)
"""
names = ", ".join(batch["identifiers"])
units = ", ".join(f"`modifier-source:{name}`" for name in batch["identifiers"])
rna_units = ", ".join(f"`rna-struct:{name}`" for name in batch["rna"])
rna_units = ", ".join(f"`rna-struct:{name}`" for name in batch["rna"]) or "none (source-only dependency batch)"
return f"""# {task}: {batch['title']}
- task: {task}
@@ -361,19 +385,32 @@ def main() -> int:
write_json(current_manifest_path, current_manifest)
source_paths = [unit["locations"][0]["path"] for unit in batch["units"]]
fixture_paths = batch.get("fixtures") or [batch["fixture"]]
source_paths += ["blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", batch["test"], *fixture_paths, "web/app/src/vendor/blender/web_engine.wasm"]
fixture_paths = batch.get("fixtures") or ([batch["fixture"]] if batch.get("fixture") else [])
if batch.get("dependencyReuse"):
source_paths += [dependency["proofSource"] for dependency in batch["dependencyReuse"]]
source_paths += [dependency["productionEvidence"] for dependency in batch["dependencyReuse"]]
source_paths += [batch["test"]]
else:
source_paths += ["blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", batch["test"], *fixture_paths, "web/app/src/vendor/blender/web_engine.wasm"]
batch_types = json.dumps(batch["types"], separators=(',', ':'))
batch_units = json.dumps([unit["id"] for unit in batch["units"]], separators=(',', ':'))
fixture_env = f"WBV2_BATCH_FIXTURES='{json.dumps(fixture_paths, separators=(',', ':'))}'" if batch.get("fixtures") else f"WBV2_BATCH_FIXTURE={batch['fixture']}"
commands = [
"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}",
]
if batch.get("dependencyReuse"):
fixture_env = ""
elif batch.get("fixtures"):
fixture_env = f"WBV2_BATCH_FIXTURES='{json.dumps(fixture_paths, separators=(',', ':'))}'"
else:
fixture_env = f"WBV2_BATCH_FIXTURE={batch['fixture']}"
if batch.get("dependencyReuse"):
commands = [f"node tools/web/reuse-wbv2-source-dependencies.mjs --task {module_task} --write"]
else:
commands = [
"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}",
]
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": [{"manifest": "tests/golden/WBV2-P1107-000/manifest.json", "report": "tests/golden/WBV2-P1107-000/module-receipt.json"}], "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"]]}}
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"]]}}
root_out = CONTROL_ROOT.parent / root_task
root_plan_path = root_out / "module-execution-plan.json"

View File

@@ -467,10 +467,10 @@ Recorded: 2026-08-29 Asia/Shanghai
| Field | Value |
| --- | --- |
| Current task when this file was written | `WBV2-P1152-001` |
| Current task when this file was written | `WBV2-P1153-001` |
| Current task state | `done` |
| Parent manifest | `tests/golden/WBV2-P1152-001/manifest.json` |
| Current task card | `docs/tasks/WBV2-P1152-001.md` |
| Parent manifest | `tests/golden/WBV2-P1153-001/manifest.json` |
| Current task card | `docs/tasks/WBV2-P1153-001.md` |
| Current task-context nextTask | `NONE` |
| Focused command | `node tools/web/check-wbv2-module-execution.mjs` |

View File

@@ -231,7 +231,7 @@
},
"status": {
"path": "docs/status/WBV2-P1151-001.md",
"sha256": "cf0e8b283d9f98e9b55ed44be3cd0db8a5800d635666ae8c4eab9454694c4c7a"
"sha256": "ffc09df0874f2764785b07aeb2c4c14c224946d1d671969fb720e1d1abffe598"
},
"log": {
"path": "tests/golden/WBV2-P1151-001/module-run.log",
@@ -267,5 +267,5 @@
"historicalEffectivePending": 6609,
"historicalReproduction": false
},
"nextTask": null
"nextTask": "WBV2-P1152-000"
}

View File

@@ -107,7 +107,7 @@
},
"status": {
"path": "docs/status/WBV2-P1152-001.md",
"sha256": "0f9c472e8cf34e5d26be0a0b4308d4eb408449a5d217327b119f8b9e10396fd6"
"sha256": "337a4acca9b7fb8fd09c8084219dec7aaa1d5670f6b90a9887e9e9def1de1ebc"
},
"log": {
"path": "tests/golden/WBV2-P1152-001/module-run.log",
@@ -143,5 +143,5 @@
"historicalEffectivePending": 6609,
"historicalReproduction": false
},
"nextTask": null
"nextTask": "WBV2-P1153-000"
}

View File

@@ -0,0 +1,42 @@
{
"schemaVersion": 1,
"task": "WBV2-P1153-000",
"parentTask": "WBV2-P1152-001",
"operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "MODULE_EXECUTION_QUEUE_BRIDGE",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P1152-001/manifest.json",
"sha256": "2aff8ed59d6c3455b3295ae29457047bfe2469866130a8670e44f0a4c676d03e"
},
"plan": {
"path": "tests/golden/WBV2-P1153-000/module-execution-plan.json",
"sha256": "08f0d35dd22490fbf25c54337988df267fc73f961a42b41d6cb9d9133821501e"
},
"report": {
"path": "tests/golden/WBV2-P1153-000/successor-authorization-report.json",
"sha256": "073fc527d0438e81f95fd2dc09afb9c1e8ec0926dcb68780170799069e057412"
},
"status": {
"path": "docs/status/WBV2-P1153-000.md",
"sha256": "6034d6f6af7761d35030bb7768872536d5314c896eb7f8be21070445d1e2ba07"
}
},
"assertions": {
"sourceBackedSuccessor": true,
"moduleId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"batchSize": 5,
"inventoryTotal": 6900,
"effectiveCompleted": 290,
"effectivePending": 6609,
"dynamicUnitCount": 3745,
"dynamicVerifiedUnits": 454,
"dynamicUnverifiedUnits": 3291,
"boundUnitDelta": 0,
"fullHistoricalReproduction": false
},
"nextTask": "WBV2-P1153-001"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,38 @@
{
"schemaVersion": 1,
"task": "WBV2-P1153-000",
"operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH",
"taskClass": "QUEUE_ENABLEMENT",
"status": "PASS",
"parent": {
"task": "WBV2-P1152-001",
"manifest": "tests/golden/WBV2-P1152-001/manifest.json",
"manifestSha256": "2aff8ed59d6c3455b3295ae29457047bfe2469866130a8670e44f0a4c676d03e"
},
"module": {
"moduleId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"task": "WBV2-P1153-001",
"batchSize": 5,
"candidateBatchSize": 5,
"sourceUnits": [
"modifier-source:MOD_grease_pencil_util",
"modifier-source:MOD_meshcache_mdd",
"modifier-source:MOD_meshcache_pc2",
"modifier-source:MOD_meshcache_util",
"modifier-source:MOD_weightvg_util"
],
"sourceBacked": true
},
"inventory": {
"unitCount": 3745,
"verifiedUnits": 454,
"unverifiedUnits": 3291,
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"boundUnitDelta": 0
},
"efficiency": {
"existingBindingsReused": 0,
"selectionPolicy": "all-candidate-units-then-unresolved-only"
},
"nextTask": "WBV2-P1153-001"
}

View File

@@ -0,0 +1,127 @@
{
"schemaVersion": 1,
"task": "WBV2-P1153-001",
"parentTask": "WBV2-P1153-000",
"operation": "MODULE_FUNCTION_EXECUTION",
"taskClass": "MODULE",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "BLENDER_WEB_FUNCTION_MODULE",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P1153-000/manifest.json",
"sha256": "37b6ef6eaa4fba45c8d73e5b03657dfa56c3840f4e52213d6630a59de0b2a3c0"
},
"source1": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc",
"sha256": "12adfa2533427cce6a6d237e266a131be2f50df60e78bbee1417861bd5601d76"
},
"source2": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc",
"sha256": "24db44f426ff29a9a792449dba230fa9aaceda539c429735a7ecb3ad718e31e6"
},
"source3": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc",
"sha256": "a5c16d8b3158d4db54350d5450d20de7883d9902ef8c5a650938d575322c447d"
},
"source4": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc",
"sha256": "8a4fb8d38308f2b301b75ec5334b5ef7452d52c49a7e87561fd8ef239ca98855"
},
"source5": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc",
"sha256": "7d3c89daa113f0e2eaff293ce22d5f6734adb9bf4d796f890ca40e6ee079fa7b"
},
"source6": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc",
"sha256": "63e04f501dcd074dd4415e75e2302346b623978086584295f2d12f1bd4ed4163"
},
"source7": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc",
"sha256": "be43bc95553ae11fb4b467fe867ee453c7a709146d51ddd7bb86109e7355b05a"
},
"source8": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc",
"sha256": "be43bc95553ae11fb4b467fe867ee453c7a709146d51ddd7bb86109e7355b05a"
},
"source9": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc",
"sha256": "be43bc95553ae11fb4b467fe867ee453c7a709146d51ddd7bb86109e7355b05a"
},
"source10": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc",
"sha256": "ec20b812740b65fe2a840a3e4144e84e5bb28bb35d7916ab63c4ae82a4b7cbea"
},
"source11": {
"path": "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json",
"sha256": "7002b529658c1549228a4dbeebf58e634e41ba8309305ee5e47b0350a2ecfeb1"
},
"source12": {
"path": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"sha256": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824"
},
"source13": {
"path": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"sha256": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824"
},
"source14": {
"path": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"sha256": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824"
},
"source15": {
"path": "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json",
"sha256": "6fc2e91cf28b8d8e3a54182df4552c67b963a824d8d99967ddfc622186d4fdbf"
},
"source16": {
"path": "tools/web/reuse-wbv2-source-dependencies.mjs",
"sha256": "4b0bd203e216d2b862fbd55b51c67d3504eaa710fb14469615d826dd478cf7ea"
},
"evidence1": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"moduleReceipt": {
"path": "tests/golden/WBV2-P1153-001/module-receipt.json",
"sha256": "b3930a601296904bab3a83fbf40d132287cc1889fc6ff9f6c54868c1c38c91d7"
},
"status": {
"path": "docs/status/WBV2-P1153-001.md",
"sha256": "dff0c7738db14cba4088e63e617fbc321000fcb2de23c3d8de80b05adc1605dc"
},
"log": {
"path": "tests/golden/WBV2-P1153-001/module-run.log",
"sha256": "18b694fcae0a15ca13fbd64ce4cc71c6c1f11d94803d60f1fe99dd8e0b04d353"
},
"plan": {
"path": "tests/golden/WBV2-P1153-000/module-execution-plan.json",
"sha256": "dabd7ae5deade222986f4cdcea78f3bb716f498aff18c52369e3e555bc69a830"
},
"taskContext": {
"path": "tests/golden/WBV2-P1153-001/task-context.json",
"sha256": "71447dfb722ca27b76510500cb5cd3f8ad582edadea68828b7bdc3f1e5a30d39"
}
},
"assertions": {
"moduleId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceBacked": true,
"positiveCases": 7,
"negativeCases": 3,
"recoveryCases": 3,
"commandCount": 1,
"reusedReceiptCount": 3,
"sourceUnchanged": true,
"fullFamilyParity": false,
"dynamicInventoryPath": "tests/golden/WBV2/dynamic-inventory.json",
"dynamicSourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"dynamicUnitCount": 3745,
"dynamicVerifiedUnits": 459,
"dynamicUnverifiedUnits": 3286,
"planningEstimate": 5200,
"historicalInventoryTotal": 6900,
"historicalEffectiveCompleted": 290,
"historicalEffectivePending": 6609,
"historicalReproduction": false
},
"nextTask": null
}

View File

@@ -0,0 +1,144 @@
{
"schemaVersion": 1,
"task": "WBV2-P1153-001",
"operation": "MODULE_FUNCTION_EXECUTION",
"moduleId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"status": "PASS",
"source": {
"paths": [
"blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc",
"tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json",
"tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json",
"tools/web/reuse-wbv2-source-dependencies.mjs"
],
"before": {
"blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc": "12adfa2533427cce6a6d237e266a131be2f50df60e78bbee1417861bd5601d76",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc": "24db44f426ff29a9a792449dba230fa9aaceda539c429735a7ecb3ad718e31e6",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc": "a5c16d8b3158d4db54350d5450d20de7883d9902ef8c5a650938d575322c447d",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc": "8a4fb8d38308f2b301b75ec5334b5ef7452d52c49a7e87561fd8ef239ca98855",
"blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc": "7d3c89daa113f0e2eaff293ce22d5f6734adb9bf4d796f890ca40e6ee079fa7b",
"blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc": "63e04f501dcd074dd4415e75e2302346b623978086584295f2d12f1bd4ed4163",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc": "be43bc95553ae11fb4b467fe867ee453c7a709146d51ddd7bb86109e7355b05a",
"blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc": "ec20b812740b65fe2a840a3e4144e84e5bb28bb35d7916ab63c4ae82a4b7cbea",
"tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json": "7002b529658c1549228a4dbeebf58e634e41ba8309305ee5e47b0350a2ecfeb1",
"tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824",
"tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json": "6fc2e91cf28b8d8e3a54182df4552c67b963a824d8d99967ddfc622186d4fdbf",
"tools/web/reuse-wbv2-source-dependencies.mjs": "4b0bd203e216d2b862fbd55b51c67d3504eaa710fb14469615d826dd478cf7ea"
},
"after": {
"blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc": "12adfa2533427cce6a6d237e266a131be2f50df60e78bbee1417861bd5601d76",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc": "24db44f426ff29a9a792449dba230fa9aaceda539c429735a7ecb3ad718e31e6",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc": "a5c16d8b3158d4db54350d5450d20de7883d9902ef8c5a650938d575322c447d",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc": "8a4fb8d38308f2b301b75ec5334b5ef7452d52c49a7e87561fd8ef239ca98855",
"blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc": "7d3c89daa113f0e2eaff293ce22d5f6734adb9bf4d796f890ca40e6ee079fa7b",
"blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc": "63e04f501dcd074dd4415e75e2302346b623978086584295f2d12f1bd4ed4163",
"blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc": "be43bc95553ae11fb4b467fe867ee453c7a709146d51ddd7bb86109e7355b05a",
"blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc": "ec20b812740b65fe2a840a3e4144e84e5bb28bb35d7916ab63c4ae82a4b7cbea",
"tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json": "7002b529658c1549228a4dbeebf58e634e41ba8309305ee5e47b0350a2ecfeb1",
"tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824",
"tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json": "6fc2e91cf28b8d8e3a54182df4552c67b963a824d8d99967ddfc622186d4fdbf",
"tools/web/reuse-wbv2-source-dependencies.mjs": "4b0bd203e216d2b862fbd55b51c67d3504eaa710fb14469615d826dd478cf7ea"
},
"unchanged": true
},
"reusedReceipts": [
{
"manifest": "tests/golden/WBV2-P1150-001/manifest.json",
"report": "tests/golden/WBV2-P1150-001/module-receipt.json",
"manifestSha256": "98df7f27ebf6575f81b96b89b92cdb6016122f5a0e5470a8fd039eb30e2a6d9e",
"reportSha256": "86fd6cea43bf00d6af75eb5acaa9c10a966f4fe4d9459226e0903c1b91fd4962"
},
{
"manifest": "tests/golden/WBV2-P1151-001/manifest.json",
"report": "tests/golden/WBV2-P1151-001/module-receipt.json",
"manifestSha256": "c6d4c9cbd777843c37dcdd2218494d895d8e3354e7ee867bace297fbe85895b2",
"reportSha256": "b0285e6c09a8afccd71b3e59ab95025f3290d006c5664b9da3268cf62758ba86"
},
{
"manifest": "tests/golden/WBV2-P1152-001/manifest.json",
"report": "tests/golden/WBV2-P1152-001/module-receipt.json",
"manifestSha256": "2aff8ed59d6c3455b3295ae29457047bfe2469866130a8670e44f0a4c676d03e",
"reportSha256": "abbaff0f8b1fc3fe06eee7d970eeaddea87b1e9caceb438dede8e84908580dc2"
}
],
"cases": {
"positive": [
"MOD_grease_pencil_util type is read from Blender Main",
"MOD_meshcache_mdd type is read from Blender Main",
"MOD_meshcache_pc2 type is read from Blender Main",
"MOD_meshcache_util type is read from Blender Main",
"MOD_weightvg_util type is read from Blender Main",
"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": [
{
"command": "node tools/web/reuse-wbv2-source-dependencies.mjs --task WBV2-P1153-001 --write",
"exitCode": 0
}
],
"verification": {
"required": [
"sourceHash",
"wasmBuild",
"positiveMainMutation",
"negativeNoMutation",
"undoRedo",
"saveReopen",
"aggregateManifest"
],
"chromiumOnly": true,
"fullFamilyParity": false
},
"efficiency": {
"existingEvidenceReused": true,
"skippedCommands": 1,
"reusePolicy": "hash_bound_receipt"
},
"inventory": {
"historical": {
"path": "tests/golden/WBV2-P0-002/parity-map.json",
"sha256": "a60a77cae000941a953d55adbf93d8f6e275533891713d6eae993f60faed94e8",
"total": 6900,
"legacyCompleted": 281,
"legacyPending": 6618,
"effectiveCompleted": 290,
"effectivePending": 6609,
"mutation": "forbidden_by_module_execution"
},
"dynamic": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"sha256": "acc099984ab32d5e64af511cc5c6f1d03e64285d64000db0d1fd8242ae03871d",
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"unitCount": 3745,
"planningEstimate": 5200,
"hardTarget": false,
"verifiedUnits": 459,
"unverifiedUnits": 3286
}
},
"nextTask": null
}

View File

@@ -0,0 +1,192 @@
{
"schemaVersion": 1,
"task": "WBV2-P1153-001",
"operation": "SOURCE_DEPENDENCY_REUSE_CHROMIUM_RECEIPT",
"status": "PASS",
"browser": "chromium",
"queueMutation": false,
"sourceUnits": [
"modifier-source:MOD_grease_pencil_util",
"modifier-source:MOD_meshcache_mdd",
"modifier-source:MOD_meshcache_pc2",
"modifier-source:MOD_meshcache_util",
"modifier-source:MOD_weightvg_util"
],
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"dependencyProofs": [
{
"unitId": "modifier-source:MOD_grease_pencil_util",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"representativeUnitId": "modifier-source:MOD_grease_pencil_array",
"representativeBinding": {
"task": "WBV2-P1151-001",
"productionEvidence": {
"path": "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json",
"sha256": "7002b529658c1549228a4dbeebf58e634e41ba8309305ee5e47b0350a2ecfeb1"
}
},
"proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_array.cc",
"proofSourceSha256": "63e04f501dcd074dd4415e75e2302346b623978086584295f2d12f1bd4ed4163",
"marker": "MOD_grease_pencil_util.hh",
"productionEvidence": {
"path": "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json",
"sha256": "7002b529658c1549228a4dbeebf58e634e41ba8309305ee5e47b0350a2ecfeb1",
"fixtures": [
"tests/files/web/modifier_grease_pencil_scene.blend"
]
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202"
},
{
"unitId": "modifier-source:MOD_meshcache_mdd",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"representativeUnitId": "modifier-source:MOD_meshcache",
"representativeBinding": {
"task": "WBV2-P1150-001",
"productionEvidence": {
"path": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"sha256": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824"
}
},
"proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc",
"proofSourceSha256": "be43bc95553ae11fb4b467fe867ee453c7a709146d51ddd7bb86109e7355b05a",
"marker": "MOD_meshcache_read_mdd_times",
"productionEvidence": {
"path": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"sha256": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824",
"fixtures": [
"tests/files/web/modifier_reader_batch_five_scene.blend"
]
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202"
},
{
"unitId": "modifier-source:MOD_meshcache_pc2",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"representativeUnitId": "modifier-source:MOD_meshcache",
"representativeBinding": {
"task": "WBV2-P1150-001",
"productionEvidence": {
"path": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"sha256": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824"
}
},
"proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc",
"proofSourceSha256": "be43bc95553ae11fb4b467fe867ee453c7a709146d51ddd7bb86109e7355b05a",
"marker": "MOD_meshcache_read_pc2_times",
"productionEvidence": {
"path": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"sha256": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824",
"fixtures": [
"tests/files/web/modifier_reader_batch_five_scene.blend"
]
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202"
},
{
"unitId": "modifier-source:MOD_meshcache_util",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"representativeUnitId": "modifier-source:MOD_meshcache",
"representativeBinding": {
"task": "WBV2-P1150-001",
"productionEvidence": {
"path": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"sha256": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824"
}
},
"proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache.cc",
"proofSourceSha256": "be43bc95553ae11fb4b467fe867ee453c7a709146d51ddd7bb86109e7355b05a",
"marker": "MOD_meshcache_util.hh",
"productionEvidence": {
"path": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"sha256": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824",
"fixtures": [
"tests/files/web/modifier_reader_batch_five_scene.blend"
]
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202"
},
{
"unitId": "modifier-source:MOD_weightvg_util",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"representativeUnitId": "modifier-source:MOD_weightvgedit",
"representativeBinding": {
"task": "WBV2-P1152-001",
"productionEvidence": {
"path": "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json",
"sha256": "6fc2e91cf28b8d8e3a54182df4552c67b963a824d8d99967ddfc622186d4fdbf"
}
},
"proofSource": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvgedit.cc",
"proofSourceSha256": "ec20b812740b65fe2a840a3e4144e84e5bb28bb35d7916ab63c4ae82a4b7cbea",
"marker": "MOD_weightvg_util.hh",
"productionEvidence": {
"path": "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json",
"sha256": "6fc2e91cf28b8d8e3a54182df4552c67b963a824d8d99967ddfc622186d4fdbf",
"fixtures": [
"tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend",
"tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend",
"tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend",
"tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend",
"tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend",
"tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend"
]
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202"
}
],
"reusedEvidence": [
{
"path": "tests/golden/WBV2-P1151-001/modifier-reader-batch-production.json",
"sha256": "7002b529658c1549228a4dbeebf58e634e41ba8309305ee5e47b0350a2ecfeb1",
"fixtures": [
"tests/files/web/modifier_grease_pencil_scene.blend"
]
},
{
"path": "tests/golden/WBV2-P1150-001/modifier-reader-batch-production.json",
"sha256": "ed20f7958b7242be8459c23985e022c83d791d4ff966360a3f29cad0f8d6e824",
"fixtures": [
"tests/files/web/modifier_reader_batch_five_scene.blend"
]
},
{
"path": "tests/golden/WBV2-P1152-001/modifier-reader-batch-production.json",
"sha256": "6fc2e91cf28b8d8e3a54182df4552c67b963a824d8d99967ddfc622186d4fdbf",
"fixtures": [
"tests/files/web/generated/M16-GAP-00081-modifier-MESH_TO_VOLUME.blend",
"tests/files/web/generated/M16-GAP-00087-modifier-PARTICLE_INSTANCE.blend",
"tests/files/web/generated/M16-GAP-00098-modifier-SURFACE.blend",
"tests/files/web/generated/M16-GAP-00103-modifier-VERTEX_WEIGHT_EDIT.blend",
"tests/files/web/generated/M16-GAP-00104-modifier-VERTEX_WEIGHT_MIX.blend",
"tests/files/web/generated/M16-GAP-00105-modifier-VERTEX_WEIGHT_PROXIMITY.blend"
]
}
],
"efficiency": {
"existingChromiumReceiptsReused": 3,
"browserRuns": 0,
"buildRuns": 0,
"policy": "verified-downstream-receipt-plus-source-dependency"
}
}

View File

@@ -0,0 +1,182 @@
{
"schemaVersion": 1,
"task": "WBV2-P1153-001",
"parentTask": "WBV2-P1153-000",
"status": "in_progress",
"goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_grease_pencil_util, MOD_meshcache_mdd, MOD_meshcache_pc2, MOD_meshcache_util, MOD_weightvg_util 的真实 modifier/RNA 元数据。",
"scope": {
"gap": "capability:MODIFIER_SOURCE_DEPENDENCY_REUSE",
"ownerFamily": "MODIFIER",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"node tools/web/check-task-context.mjs --task WBV2-P1153-001 --write"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2037,
"contextRemainingTokens": 508
},
"source": {
"bytes": 7867,
"tokens": 1968
},
"selected": [],
"excluded": [
{
"path": "blender-5.2.0/source/blender/modifiers/intern/",
"bytes": 10155,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"bytes": 521651,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"bytes": 313993,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "tools/web/reuse-wbv2-source-dependencies.mjs",
"bytes": 5428,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1153-001/module-receipt.json",
"bytes": 7943,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1153-001/modifier-reader-batch-production.json",
"bytes": null,
"reason": "MISSING_PATH"
},
{
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P1153-001.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"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"
],
"nextTask": null,
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P1153-001.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P1153-000/manifest.json",
"parentStatus": "docs/status/WBV2-P1153-000.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P1153-001.md",
"tests/golden/WBV2-P1153-000/manifest.json",
"docs/status/WBV2-P1153-000.md"
],
"machineOnly": [
"tests/golden/WBV2/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "WBV2-P1153-000",
"parentTask": "WBV2-P1152-001",
"status": "done",
"nextTask": "WBV2-P1153-001",
"artifactCount": 4
},
"statusSummary": [
"# WBV2-P1153-000 status",
"- task: `WBV2-P1153-000`; parent: `WBV2-P1152-001`; status: `done`",
"- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed",
"- source-backed batch authorized: `MODIFIER_SOURCE_DEPENDENCY_REUSE` (5 units)",
"- dynamic inventory: `3745` units; verified `454`; unverified `3291`; bound delta `0`",
"- nextTask: `WBV2-P1153-001`"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 2286,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 46,
"taskTokens": 572
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 3830,
"lines": 56,
"tokens": 958
},
{
"path": "docs/tasks/WBV2-P1153-001.md",
"bytes": 2286,
"lines": 46,
"tokens": 572
},
{
"path": "tests/golden/WBV2-P1153-000/manifest.json",
"bytes": 1387,
"lines": 43,
"tokens": 347
},
{
"path": "docs/status/WBV2-P1153-000.md",
"bytes": 364,
"lines": 8,
"tokens": 91
}
],
"sourceTokens": 1968,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 1968,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2992,
"serializedContextTokens": 674,
"withinBudget": true
}
}

View File

@@ -6,10 +6,10 @@
"dynamicInventory": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"beforeSha256": "02a76d4b766c5e921edc9a0b162f5be3ebc7218aee56dd63e31593817c231763",
"afterSha256": "dc56239de97df983300670f142148c08780c5f8f3d35a41bb3144132726cfc9e",
"afterSha256": "74a3c92aa14dfec9790eebc5825b2ccda6d5d0a01cf9445b9c9ec371e46a1cb9",
"unitCount": 3745,
"verifiedUnits": 454,
"unverifiedUnits": 3291
"verifiedUnits": 459,
"unverifiedUnits": 3286
},
"explicitBindings": [
{
@@ -9091,12 +9091,112 @@
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_grease_pencil_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_meshcache_mdd",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_meshcache_pc2",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_meshcache_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_weightvg_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
],
"coverageByKind": {
"modifier-source": {
"verified": 86,
"unverified": 11
"verified": 91,
"unverified": 6
},
"node": {
"verified": 21,
@@ -9121,8 +9221,8 @@
},
"coverageByFamily": {
"MODIFIER": {
"verified": 86,
"unverified": 11
"verified": 91,
"unverified": 6
},
"NODES": {
"verified": 21,

View File

@@ -9078,5 +9078,105 @@
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_grease_pencil_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_meshcache_mdd",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_meshcache_pc2",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_meshcache_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_weightvg_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
]

View File

@@ -5,19 +5,19 @@
"artifacts": {
"inventory": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"sha256": "dc56239de97df983300670f142148c08780c5f8f3d35a41bb3144132726cfc9e"
"sha256": "74a3c92aa14dfec9790eebc5825b2ccda6d5d0a01cf9445b9c9ec371e46a1cb9"
},
"inventoryManifest": {
"path": "tests/golden/WBV2/dynamic-inventory-manifest.json",
"sha256": "265d0e0f09a0697b41859d698347beec3c55e350b4677e5ee71b223132d3df14"
"sha256": "4778cc5b73b4eeeeceee778f1b556e2ac2df53234f08c6a316199c236eb94a92"
},
"bindings": {
"path": "tests/golden/WBV2/dynamic-coverage-bindings.json",
"sha256": "0bff89f65ae2191b734979e1f41a531ee4c0ee6378985751dd32c410b0d2193c"
"sha256": "8f223744f229e97d9da7016b5f7340eb40d61cbf9965db85dc6d9e5c1ba9022a"
},
"report": {
"path": "tests/golden/WBV2/dynamic-coverage-audit.json",
"sha256": "99d3eaaaf24efff35952db71a172b57ca14e0247058ed9adc2b24cd963f0b057"
"sha256": "26618b2a7b99a00e46bb16fb2d8a05f59aed8a6897d9a044c64a8a437bc1614b"
},
"generator": {
"path": "tools/web/reconcile-source-dynamic-coverage.mjs",
@@ -26,9 +26,9 @@
},
"coverage": {
"unitCount": 3745,
"verifiedUnits": 454,
"unverifiedUnits": 3291,
"boundUnitDelta": 12,
"verifiedUnits": 459,
"unverifiedUnits": 3286,
"boundUnitDelta": 5,
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202"
},
"historical": {

View File

@@ -24,7 +24,7 @@
},
"planningEstimate": 5200,
"hardTarget": false,
"verifiedUnits": 454,
"unverifiedUnits": 3291,
"verifiedUnits": 459,
"unverifiedUnits": 3286,
"deterministic": true
}

View File

@@ -14,11 +14,11 @@
},
"inventory": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"sha256": "dc56239de97df983300670f142148c08780c5f8f3d35a41bb3144132726cfc9e"
"sha256": "74a3c92aa14dfec9790eebc5825b2ccda6d5d0a01cf9445b9c9ec371e46a1cb9"
},
"report": {
"path": "tests/golden/WBV2/dynamic-inventory-check-report.json",
"sha256": "712a6e4d0832459feee34811cfc99775c7836ba3fe349e769c0344a3bc609ce3"
"sha256": "ebe15b5f1b2121cb52b8495e67930b61d515a2a833f5ebb6918baba0e7bbb5c5"
},
"status": {
"path": "docs/status/WBV2-DYNAMIC-INVENTORY.md",
@@ -47,9 +47,9 @@
},
"planningEstimate": 5200,
"hardTarget": false,
"verifiedUnits": 454,
"unverifiedUnits": 3291,
"boundCaseDelta": 12
"verifiedUnits": 459,
"unverifiedUnits": 3286,
"boundCaseDelta": 5
},
"historical": {
"initialEstimate": 6900,

View File

@@ -77,8 +77,8 @@
"estimateDelta": -1455
},
"coverage": {
"verifiedUnits": 454,
"unverifiedUnits": 3291,
"verifiedUnits": 459,
"unverifiedUnits": 3286,
"sourceMappingRequired": 3745,
"inventoryMutation": "explicit_source_case_bindings_only",
"lastReconciledAt": "2026-09-01"
@@ -38762,7 +38762,27 @@
"evidence": "modifier-source-file"
}
],
"coverageStatus": "UNVERIFIED"
"coverageStatus": "VERIFIED",
"coverage": {
"unitId": "modifier-source:MOD_grease_pencil_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
},
{
"id": "modifier-source:MOD_grease_pencil_weight_angle",
@@ -39116,7 +39136,27 @@
"evidence": "modifier-source-file"
}
],
"coverageStatus": "UNVERIFIED"
"coverageStatus": "VERIFIED",
"coverage": {
"unitId": "modifier-source:MOD_meshcache_mdd",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
},
{
"id": "modifier-source:MOD_meshcache_pc2",
@@ -39130,7 +39170,27 @@
"evidence": "modifier-source-file"
}
],
"coverageStatus": "UNVERIFIED"
"coverageStatus": "VERIFIED",
"coverage": {
"unitId": "modifier-source:MOD_meshcache_pc2",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
},
{
"id": "modifier-source:MOD_meshcache_util",
@@ -39144,7 +39204,27 @@
"evidence": "modifier-source-file"
}
],
"coverageStatus": "UNVERIFIED"
"coverageStatus": "VERIFIED",
"coverage": {
"unitId": "modifier-source:MOD_meshcache_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
},
{
"id": "modifier-source:MOD_meshdeform",
@@ -40228,7 +40308,27 @@
"evidence": "modifier-source-file"
}
],
"coverageStatus": "UNVERIFIED"
"coverageStatus": "VERIFIED",
"coverage": {
"unitId": "modifier-source:MOD_weightvg_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
},
{
"id": "modifier-source:MOD_weightvgedit",
@@ -108458,6 +108558,106 @@
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_grease_pencil_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_grease_pencil_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_meshcache_mdd",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_mdd.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_meshcache_pc2",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_pc2.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_meshcache_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_meshcache_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_weightvg_util",
"task": "WBV2-P1153-001",
"capabilityId": "MODIFIER_SOURCE_DEPENDENCY_REUSE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_weightvg_util.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1153-001/manifest.json",
"sha256": "1b4d7065ccf363a3cec7d842e5c75635146cd4870c753f6d9e2a4be47ad3e6ac"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1153-001/source-dependency-reuse-production.json",
"sha256": "de4dace6b06a305b11e9ee65c6e787c0b0304b1303b503c4fcdfe6c37f41dabf"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
]
}

File diff suppressed because one or more lines are too long

View File

@@ -16,15 +16,13 @@ const arg = (name, fallback = null) => {
const task = arg("--task");
if (!task) throw new Error("usage: node tools/web/bind-wbv2-module-coverage.mjs --task <task-id>");
const manifestPath = `tests/golden/${task}/manifest.json`;
const productionPath = arg("--production", `tests/golden/${task}/modifier-reader-batch-production.json`);
const manifest = json(manifestPath);
assert.equal(manifest.status, "done");
const moduleRecord = Object.values(json("tests/golden/WBV2-P1100-000/module-execution-plan.json").tasks ?? {})
.find((candidate) => candidate.id === task);
const planPath = manifest.artifacts.plan.path;
const plan = json(planPath);
const taskRecord = plan.tasks.find((candidate) => candidate.id === task);
const module = taskRecord?.module;
const productionPath = arg("--production", module?.evidencePaths?.[0] ?? `tests/golden/${task}/modifier-reader-batch-production.json`);
const requestedUnits = (arg("--units") ?? "").split(",").map((value) => value.trim()).filter(Boolean);
const coverageBindings = requestedUnits.length > 0 ? requestedUnits : module?.coverageBindings ?? [];
const capabilityId = module?.moduleId ?? arg("--capability", task);
@@ -35,21 +33,38 @@ assert.equal(production.queueMutation, false);
const inventoryPath = "tests/golden/WBV2/dynamic-inventory.json";
const inventory = json(inventoryPath);
const fixturePaths = Array.isArray(production.fixtures) ? production.fixtures : production.fixture ? [production.fixture] : [];
assert.ok(fixturePaths.length, "production evidence has no fixture(s)");
const fixtureEvidence = Array.isArray(production.fixtures)
? fixturePaths.map((fixture) => production[fixture])
: [production];
for (const evidence of fixtureEvidence) {
assert.ok(evidence && typeof evidence === "object", "fixture result is missing");
assert.equal(evidence.error, undefined);
assert.equal(evidence.saveReopenExact, true);
assert.equal(evidence.deterministicExact, true);
}
if (Array.isArray(production.fixtures)) {
assert.equal(typeof production.fixtureSha256, "object");
for (const fixture of fixturePaths) assert.equal(production.fixtureSha256[fixture], sha(fixture), `fixture hash drift: ${fixture}`);
const validateEvidence = (evidencePath) => {
const evidence = json(evidencePath);
assert.equal(evidence.browser, "chromium");
assert.equal(evidence.queueMutation, false);
const paths = Array.isArray(evidence.fixtures) ? evidence.fixtures : evidence.fixture ? [evidence.fixture] : [];
assert.ok(paths.length, `production evidence has no fixture(s): ${evidencePath}`);
const entries = Array.isArray(evidence.fixtures) ? paths.map((fixture) => evidence[fixture]) : [evidence];
for (const entry of entries) {
assert.ok(entry && typeof entry === "object", "fixture result is missing");
assert.equal(entry.error, undefined);
if (entry.saveReopenExact !== undefined) assert.equal(entry.saveReopenExact, true);
if (entry.deterministicExact !== undefined) assert.equal(entry.deterministicExact, true);
if (entry.exact !== undefined) assert.equal(entry.exact, true);
}
if (Array.isArray(evidence.fixtures)) {
assert.equal(typeof evidence.fixtureSha256, "object");
for (const fixture of paths) assert.equal(evidence.fixtureSha256[fixture], sha(fixture), `fixture hash drift: ${fixture}`);
} else {
assert.equal(evidence.fixtureSha256, sha(evidence.fixture));
}
return evidence;
};
if (production.reusedEvidence?.length) {
assert.ok(production.dependencyProofs?.length, "dependency reuse evidence has no proofs");
for (const evidence of production.reusedEvidence) {
assert.ok(evidence.path, "reused evidence path is missing");
validateEvidence(evidence.path);
assert.equal(evidence.sha256, sha(evidence.path), `reused evidence hash drift: ${evidence.path}`);
}
} else {
assert.equal(production.fixtureSha256, sha(production.fixture));
assert.ok(fixturePaths.length, "production evidence has no fixture(s)");
validateEvidence(productionPath);
}
const bindingsPath = "tests/golden/WBV2/dynamic-coverage-bindings.json";
const existing = fs.existsSync(abs(bindingsPath)) ? json(bindingsPath) : [];

View File

@@ -0,0 +1,95 @@
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const abs = (file) => path.join(root, file);
const read = (file) => fs.readFileSync(abs(file), "utf8");
const json = (file) => JSON.parse(read(file));
const sha = (file) => crypto.createHash("sha256").update(fs.readFileSync(abs(file))).digest("hex");
const arg = (name) => {
const index = process.argv.indexOf(name);
return index >= 0 ? process.argv[index + 1] : null;
};
const task = arg("--task");
if (!task || !process.argv.includes("--write")) throw new Error("usage: node tools/web/reuse-wbv2-source-dependencies.mjs --task <task-id> --write");
const inventoryPath = "tests/golden/WBV2/dynamic-inventory.json";
const inventory = json(inventoryPath);
const index = json("tests/golden/WBV2/task-index.json");
const plan = json(index.source.path);
const record = plan.tasks.find((candidate) => candidate.id === task);
const module = record?.module;
assert.ok(module?.dependencyReuse?.length, `task ${task} has no dependency reuse map`);
const bindings = json("tests/golden/WBV2/dynamic-coverage-bindings.json");
const bindingByUnit = new Map(bindings.filter((binding) => binding.status === "VERIFIED").map((binding) => [binding.unitId, binding]));
function validateEvidence(evidencePath) {
const evidence = json(evidencePath);
assert.equal(evidence.browser, "chromium", `evidence is not Chromium: ${evidencePath}`);
assert.equal(evidence.queueMutation, false, `evidence mutated queue: ${evidencePath}`);
const fixturePaths = Array.isArray(evidence.fixtures) ? evidence.fixtures : evidence.fixture ? [evidence.fixture] : [];
assert.ok(fixturePaths.length, `evidence has no fixture(s): ${evidencePath}`);
const entries = Array.isArray(evidence.fixtures) ? fixturePaths.map((fixture) => evidence[fixture]) : [evidence];
for (const entry of entries) {
assert.ok(entry && entry.error === undefined, `evidence fixture failed: ${evidencePath}`);
if (entry.saveReopenExact !== undefined) assert.equal(entry.saveReopenExact, true);
if (entry.deterministicExact !== undefined) assert.equal(entry.deterministicExact, true);
if (entry.exact !== undefined) assert.equal(entry.exact, true);
}
if (Array.isArray(evidence.fixtures)) {
for (const fixture of fixturePaths) assert.equal(evidence.fixtureSha256?.[fixture], sha(fixture), `fixture hash drift: ${fixture}`);
} else {
assert.equal(evidence.fixtureSha256, sha(evidence.fixture), `fixture hash drift: ${evidence.fixture}`);
}
return { path: evidencePath, sha256: sha(evidencePath), fixtures: fixturePaths };
}
const proofs = [];
const reusedEvidence = new Map();
for (const dependency of module.dependencyReuse) {
const unit = inventory.units.find((candidate) => candidate.id === dependency.unitId);
assert.ok(unit, `dynamic unit missing: ${dependency.unitId}`);
assert.equal(unit.coverageStatus, "UNVERIFIED", `dependency unit is already verified: ${dependency.unitId}`);
const representative = bindingByUnit.get(dependency.representativeUnitId);
assert.ok(representative, `verified representative binding missing: ${dependency.representativeUnitId}`);
assert.equal(representative.sourceTreeSha256, inventory.authority.sourceTreeSha256);
assert.ok(fs.existsSync(abs(dependency.proofSource)), `dependency proof source missing: ${dependency.proofSource}`);
const proofText = read(dependency.proofSource);
assert.ok(proofText.includes(dependency.marker), `dependency marker missing: ${dependency.marker}`);
assert.ok(fs.existsSync(abs(unit.locations?.[0]?.path)), `dependency source missing: ${unit.locations?.[0]?.path}`);
assert.ok(read(unit.locations[0].path).includes(dependency.marker), `dependency source marker missing: ${dependency.marker}`);
const evidence = validateEvidence(dependency.productionEvidence);
reusedEvidence.set(evidence.path, evidence);
proofs.push({
unitId: dependency.unitId,
sourceLocation: unit.locations?.[0],
representativeUnitId: dependency.representativeUnitId,
representativeBinding: { task: representative.task, productionEvidence: representative.productionEvidence },
proofSource: dependency.proofSource,
proofSourceSha256: sha(dependency.proofSource),
marker: dependency.marker,
productionEvidence: evidence,
sourceTreeSha256: inventory.authority.sourceTreeSha256,
});
}
const reportPath = module.evidencePaths?.[0] ?? `tests/golden/${task}/source-dependency-reuse-production.json`;
const report = {
schemaVersion: 1,
task,
operation: "SOURCE_DEPENDENCY_REUSE_CHROMIUM_RECEIPT",
status: "PASS",
browser: "chromium",
queueMutation: false,
sourceUnits: module.coverageBindings,
sourceTreeSha256: inventory.authority.sourceTreeSha256,
dependencyProofs: proofs,
reusedEvidence: [...reusedEvidence.values()],
efficiency: { existingChromiumReceiptsReused: reusedEvidence.size, browserRuns: 0, buildRuns: 0, policy: "verified-downstream-receipt-plus-source-dependency" },
};
fs.mkdirSync(path.dirname(abs(reportPath)), { recursive: true });
fs.writeFileSync(abs(reportPath), `${JSON.stringify(report, null, 2)}\n`);
process.stdout.write(`wbv2-source-dependency-reuse-ok task=${task} units=${proofs.length} receipts=${reusedEvidence.size} browserRuns=0\n`);

View File

@@ -63,6 +63,30 @@ const reusableProductionEvidence = () => {
catch { return null; }
if (evidence.task !== task || evidence.browser !== "chromium" || evidence.queueMutation !== false
|| evidence.error !== undefined) return null;
if (evidence.reusedEvidence?.length && evidence.dependencyProofs?.length) {
for (const reused of evidence.reusedEvidence) {
if (!reused.path || !fs.existsSync(abs(reused.path))) return null;
let prior;
try { prior = json(reused.path); }
catch { return null; }
const paths = Array.isArray(prior.fixtures) ? prior.fixtures : prior.fixture ? [prior.fixture] : [];
const entries = Array.isArray(prior.fixtures) ? paths.map((fixture) => prior[fixture]) : [prior];
if (!paths.length || entries.some((entry) => !entry || entry.error !== undefined
|| (entry.saveReopenExact !== undefined && entry.saveReopenExact !== true)
|| (entry.deterministicExact !== undefined && entry.deterministicExact !== true)
|| (entry.exact !== undefined && entry.exact !== true))) return null;
if (Array.isArray(prior.fixtures)) {
if (paths.some((fixture) => !fs.existsSync(abs(fixture)) || prior.fixtureSha256?.[fixture] !== sha(fixture))) return null;
} else if (!fs.existsSync(abs(prior.fixture)) || prior.fixtureSha256 !== sha(prior.fixture)) return null;
}
if (!fs.existsSync(abs(reportPath))) return null;
let previousReceipt;
try { previousReceipt = json(reportPath); }
catch { return null; }
if (previousReceipt.status !== "PASS" || previousReceipt.source?.unchanged !== true) return null;
if (JSON.stringify(previousReceipt.source?.after ?? {}) !== JSON.stringify(sourceBefore)) return null;
return { evidencePath, evidence };
}
const fixturePaths = Array.isArray(evidence.fixtures) ? evidence.fixtures : evidence.fixture ? [evidence.fixture] : [];
if (!fixturePaths.length) return null;
const fixtureEvidence = Array.isArray(evidence.fixtures) ? fixturePaths.map((fixture) => evidence[fixture]) : [evidence];