feat(web): batch modifier reader coverage
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 11:11:20 +08:00
parent 2542f82785
commit 61b27cdebe
72 changed files with 23097 additions and 208 deletions

View File

@@ -15,9 +15,9 @@
| 字段 | 值 |
| --- | --- |
| 里程碑 | WBV2 capability workflow |
| 当前任务 | `WBV2-P1145-001` |
| parent manifest | `tests/golden/WBV2-P1145-000/manifest.json` |
| 任务卡 | [`tasks/WBV2-P1145-001.md`](tasks/WBV2-P1145-001.md) |
| 当前任务 | `WBV2-P1148-001` |
| parent manifest | `tests/golden/WBV2-P1148-000/manifest.json` |
| 任务卡 | [`tasks/WBV2-P1148-001.md`](tasks/WBV2-P1148-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

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

View File

@@ -0,0 +1,7 @@
# WBV2-P1146-000 status
- task: `WBV2-P1146-000`; parent: `WBV2-P1145-001`; status: `done`
- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed
- source-backed batch authorized: `MODIFIER_READER_BATCH` (9 units)
- dynamic inventory: `3745` units; verified `350`; unverified `3395`; bound delta `0`
- nextTask: `WBV2-P1146-001`

View File

@@ -0,0 +1,8 @@
# WBV2-P1146-001 status
- task: `WBV2-P1146-001`; module: `MODIFIER_READER_BATCH`; status: `done`
- source hashes stable: `true`; commands passed: `4`
- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt
- dynamic source inventory: `3745` units; verified `359`; unverified `3386`; this-segment binding delta: `9`; planning estimate `5200` (non-binding)
- historical 6900-entry inventory remains read-only; full-family parity: `false`
- nextTask: `WBV2-P1147-000`

View File

@@ -0,0 +1,7 @@
# WBV2-P1147-000 status
- task: `WBV2-P1147-000`; parent: `WBV2-P1146-001`; status: `done`
- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed
- source-backed batch authorized: `MODIFIER_READER_BATCH_TWO` (8 units)
- dynamic inventory: `3745` units; verified `359`; unverified `3386`; bound delta `0`
- nextTask: `WBV2-P1147-001`

View File

@@ -0,0 +1,8 @@
# WBV2-P1147-001 status
- task: `WBV2-P1147-001`; module: `MODIFIER_READER_BATCH_TWO`; status: `done`
- source hashes stable: `true`; commands passed: `4`
- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt
- dynamic source inventory: `3745` units; verified `359`; unverified `3386`; planning estimate `5200` (non-binding)
- historical 6900-entry inventory remains read-only; full-family parity: `false`
- nextTask: `WBV2-P1148-000`

View File

@@ -0,0 +1,7 @@
# WBV2-P1148-000 status
- task: `WBV2-P1148-000`; parent: `WBV2-P1147-001`; status: `done`
- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed
- source-backed batch authorized: `MODIFIER_READER_BATCH_THREE` (8 units)
- dynamic inventory: `3745` units; verified `369`; unverified `3376`; bound delta `0`
- nextTask: `WBV2-P1148-001`

View File

@@ -0,0 +1,8 @@
# WBV2-P1148-001 status
- task: `WBV2-P1148-001`; module: `MODIFIER_READER_BATCH_THREE`; status: `done`
- source hashes stable: `true`; commands passed: `4`
- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt
- dynamic source inventory: `3745` units; verified `377`; unverified `3368`; this-segment binding delta: `8`; planning estimate `5200` (non-binding)
- historical 6900-entry inventory remains read-only; full-family parity: `false`
- nextTask: `NONE`

View File

@@ -0,0 +1,45 @@
# WBV2-P1146-000: verify modifier reader batch
- task: WBV2-P1146-000
- parent: WBV2-P1145-001
- status: done
- gap: capability:MODIFIER_READER_BATCH
- ownerFamily: MODIFIER
- targetImplementationClass: LOCAL_EXACT
- Implementation entrypoint: `python3 my-tools/authorize_next_wbv2_task.py --write`
## 目标
以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_datatransfer, MOD_dynamicpaint, MOD_explode, MOD_fluid 的真实 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`
- Fixture: `tests/files/web/modifier_reader_batch_scene.blend`
- Chromium test: `web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts`
- Selected modifier units: `modifier-source:MOD_datatransfer`, `modifier-source:MOD_dynamicpaint`, `modifier-source:MOD_explode`, `modifier-source:MOD_fluid`
- Selected RNA units: `rna-struct:DataTransferModifier`, `rna-struct:DynamicPaintModifier`, `rna-struct:ExplodeModifier`, `rna-struct:FluidModifier`, `rna-struct:FluidDomainSettings`
## 验收
- 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-P1146-000 --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-P1146-000/module-receipt.json`
- Aggregate production evidence: `tests/golden/WBV2-P1146-000/modifier-reader-batch-production.json`
- Manifest: `tests/golden/WBV2-P1146-000/manifest.json`
- Status: `docs/status/WBV2-P1146-000.md`
- Rollback: restore WBV2-P1145-001 as queue parent without rewriting prior evidence.

View File

@@ -0,0 +1,45 @@
# WBV2-P1146-001: verify modifier reader batch
- task: WBV2-P1146-001
- parent: WBV2-P1146-000
- status: done
- gap: capability:MODIFIER_READER_BATCH
- ownerFamily: MODIFIER
- targetImplementationClass: LOCAL_EXACT
- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1146-001 --write`
## 目标
以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_datatransfer, MOD_dynamicpaint, MOD_explode, MOD_fluid 的真实 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`
- Fixture: `tests/files/web/modifier_reader_batch_scene.blend`
- Chromium test: `web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts`
- Selected modifier units: `modifier-source:MOD_datatransfer`, `modifier-source:MOD_dynamicpaint`, `modifier-source:MOD_explode`, `modifier-source:MOD_fluid`
- Selected RNA units: `rna-struct:DataTransferModifier`, `rna-struct:DynamicPaintModifier`, `rna-struct:ExplodeModifier`, `rna-struct:FluidModifier`, `rna-struct:FluidDomainSettings`
## 验收
- 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-P1146-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-P1146-001/module-receipt.json`
- Aggregate production evidence: `tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json`
- Manifest: `tests/golden/WBV2-P1146-001/manifest.json`
- Status: `docs/status/WBV2-P1146-001.md`
- Rollback: restore WBV2-P1146-000 as queue parent without rewriting prior evidence.

View File

@@ -0,0 +1,33 @@
# WBV2-P1147-000: authorize modifier reader batch
- task: WBV2-P1147-000
- parent: WBV2-P1146-001
- status: done
- gap: capability:MODIFIER_READER_BATCH_TWO
- ownerFamily: MODIFIER
- targetImplementationClass: QUEUE_ONLY
- Implementation entrypoint: `python3 my-tools/authorize_next_wbv2_task.py --write`
## 目标
授权一个共享 Blender Main/WASM/Chromium modifier reader 批次,验证 Laplacian Deform、Laplacian Smooth、Mask、Shrinkwrap 及其 RNA 元数据。
## 输入与范围
- Blender 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`
- Fixture/test: `tests/files/web/modifier_reader_batch_two_scene.blend`, `web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts`
## 验收
- source-backed batch is hash-bound; historical inventory remains immutable
- one shared function chain covers all selected units; verification runs once
- missing source, unsupported data, hash drift or false completion remains blocked
- `node tools/web/check-task-context.mjs --task WBV2-P1147-000 --write`
## 交付与回滚
- Manifest: `tests/golden/WBV2-P1147-000/manifest.json`
- Status: `docs/status/WBV2-P1147-000.md`
- Rollback: restore WBV2-P1146-001 as queue parent.

View File

@@ -0,0 +1,45 @@
# WBV2-P1147-001: verify modifier reader batch two
- task: WBV2-P1147-001
- parent: WBV2-P1147-000
- status: in_progress
- gap: capability:MODIFIER_READER_BATCH_TWO
- ownerFamily: MODIFIER
- targetImplementationClass: LOCAL_EXACT
- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1147-001 --write`
## 目标
以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_laplaciandeform, MOD_laplaciansmooth, MOD_mask, MOD_shrinkwrap 的真实 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`
- Fixture: `tests/files/web/modifier_reader_batch_two_scene.blend`
- Chromium test: `web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts`
- Selected modifier units: `modifier-source:MOD_laplaciandeform`, `modifier-source:MOD_laplaciansmooth`, `modifier-source:MOD_mask`, `modifier-source:MOD_shrinkwrap`
- Selected RNA units: `rna-struct:LaplacianDeformModifier`, `rna-struct:LaplacianSmoothModifier`, `rna-struct:MaskModifier`, `rna-struct:ShrinkwrapModifier`
## 验收
- 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-P1147-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-P1147-001/module-receipt.json`
- Aggregate production evidence: `tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json`
- Manifest: `tests/golden/WBV2-P1147-001/manifest.json`
- Status: `docs/status/WBV2-P1147-001.md`
- Rollback: restore WBV2-P1147-000 as queue parent without rewriting prior evidence.

View File

@@ -0,0 +1,45 @@
# WBV2-P1148-000: verify modifier reader batch three
- task: WBV2-P1148-000
- parent: WBV2-P1147-001
- status: done
- gap: capability:MODIFIER_READER_BATCH_THREE
- ownerFamily: MODIFIER
- targetImplementationClass: LOCAL_EXACT
- Implementation entrypoint: `python3 my-tools/authorize_next_wbv2_task.py --write`
## 目标
以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_remesh, MOD_skin, MOD_weighted_normal, MOD_warp 的真实 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`
- Fixture: `tests/files/web/modifier_reader_batch_three_scene.blend`
- Chromium test: `web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts`
- Selected modifier units: `modifier-source:MOD_remesh`, `modifier-source:MOD_skin`, `modifier-source:MOD_weighted_normal`, `modifier-source:MOD_warp`
- Selected RNA units: `rna-struct:RemeshModifier`, `rna-struct:SkinModifier`, `rna-struct:WeightedNormalModifier`, `rna-struct:WarpModifier`
## 验收
- 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-P1148-000 --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-P1148-000/module-receipt.json`
- Aggregate production evidence: `tests/golden/WBV2-P1148-000/modifier-reader-batch-production.json`
- Manifest: `tests/golden/WBV2-P1148-000/manifest.json`
- Status: `docs/status/WBV2-P1148-000.md`
- Rollback: restore WBV2-P1147-001 as queue parent without rewriting prior evidence.

View File

@@ -0,0 +1,45 @@
# WBV2-P1148-001: verify modifier reader batch three
- task: WBV2-P1148-001
- parent: WBV2-P1148-000
- status: done
- gap: capability:MODIFIER_READER_BATCH_THREE
- ownerFamily: MODIFIER
- targetImplementationClass: LOCAL_EXACT
- Implementation entrypoint: `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1148-001 --write`
## 目标
以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_remesh, MOD_skin, MOD_weighted_normal, MOD_warp 的真实 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`
- Fixture: `tests/files/web/modifier_reader_batch_three_scene.blend`
- Chromium test: `web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts`
- Selected modifier units: `modifier-source:MOD_remesh`, `modifier-source:MOD_skin`, `modifier-source:MOD_weighted_normal`, `modifier-source:MOD_warp`
- Selected RNA units: `rna-struct:RemeshModifier`, `rna-struct:SkinModifier`, `rna-struct:WeightedNormalModifier`, `rna-struct:WarpModifier`
## 验收
- 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-P1148-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-P1148-001/module-receipt.json`
- Aggregate production evidence: `tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json`
- Manifest: `tests/golden/WBV2-P1148-001/manifest.json`
- Status: `docs/status/WBV2-P1148-001.md`
- Rollback: restore WBV2-P1148-000 as queue parent without rewriting prior evidence.

View File

@@ -62,3 +62,7 @@ python3 my-tools/show_blender_web_scheduler.py --json
`--commit --push` is enabled by the launcher and can be disabled for a local
dry run with `WBV2_AUTO_COMMIT=0 WBV2_AUTO_PUSH=0`.
On Linux, the launcher uses `/dev/shm/blender-wasm-<uid>` for Emscripten and
temporary compiler caches. CPU compilation remains capped at the repository's
required `-j8`; Chromium evidence stays single-worker for determinism.

View File

@@ -1,10 +1,9 @@
#!/usr/bin/env python3
"""Authorize the next source-backed Blender/WBV2 module from the live queue.
"""Authorize the next source-backed Blender module batch.
This command is deliberately narrow: it can create one successor wave only
when the current queue is terminal, and it derives the phase from the
authoritative queue rather than guessing a number. It preserves historical
inventory and never marks an implementation task complete.
Each successor is a bounded capability batch. The queue advances only after a
single shared Blender Main/WASM/Worker/Chromium chain produces an aggregate
receipt for every selected source unit.
"""
from __future__ import annotations
@@ -20,6 +19,43 @@ from pathlib import Path
from wbv2_runtime import CONTROL_ROOT, INDEX, QUEUE, ROOT, read_json, terminal_pointer
PREFERRED_BATCHES = [
{
"moduleId": "MODIFIER_READER_BATCH",
"title": "verify modifier reader batch",
"owner": "MODIFIER",
"identifiers": ["MOD_datatransfer", "MOD_dynamicpaint", "MOD_explode", "MOD_fluid"],
"rna": ["DataTransferModifier", "DynamicPaintModifier", "ExplodeModifier", "FluidModifier", "FluidDomainSettings"],
"fixture": "tests/files/web/modifier_reader_batch_scene.blend",
"test": "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts",
"production": "tests/golden/{task}/modifier-reader-batch-production.json",
"types": ["DATA_TRANSFER", "DYNAMIC_PAINT", "EXPLODE", "FLUID"],
},
{
"moduleId": "MODIFIER_READER_BATCH_TWO",
"title": "verify modifier reader batch two",
"owner": "MODIFIER",
"identifiers": ["MOD_laplaciandeform", "MOD_laplaciansmooth", "MOD_mask", "MOD_shrinkwrap"],
"rna": ["LaplacianDeformModifier", "LaplacianSmoothModifier", "MaskModifier", "ShrinkwrapModifier"],
"fixture": "tests/files/web/modifier_reader_batch_two_scene.blend",
"test": "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"production": "tests/golden/{task}/modifier-reader-batch-production.json",
"types": ["LAPLACIANDEFORM", "LAPLACIANSMOOTH", "MASK", "SHRINKWRAP"],
},
{
"moduleId": "MODIFIER_READER_BATCH_THREE",
"title": "verify modifier reader batch three",
"owner": "MODIFIER",
"identifiers": ["MOD_remesh", "MOD_skin", "MOD_weighted_normal", "MOD_warp"],
"rna": ["RemeshModifier", "SkinModifier", "WeightedNormalModifier", "WarpModifier"],
"fixture": "tests/files/web/modifier_reader_batch_three_scene.blend",
"test": "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"production": "tests/golden/{task}/modifier-reader-batch-production.json",
"types": ["REMESH", "SKIN", "WEIGHTED_NORMAL", "WARP"],
},
]
def sha(path: Path) -> str:
return hashlib.sha256(path.read_bytes()).hexdigest()
@@ -47,194 +83,150 @@ def run_node(*args: str) -> None:
raise SystemExit(result.returncode)
def queue_task() -> str:
def current_task() -> str:
match = re.search(r"\| 当前任务 \| `(WBV2-P(\d+)-(\d{3}))` \|", QUEUE.read_text(encoding="utf-8"))
if not match:
raise SystemExit("queue pointer is not a WBV2 task")
return match.group(1)
def replace_snapshot(text: str, task: str, parent: str, next_task: str) -> str:
def queue_parent() -> str:
match = re.search(r"\| parent manifest \| `([^`]+)` \|", QUEUE.read_text(encoding="utf-8"), re.IGNORECASE)
if not match:
raise SystemExit("queue parent manifest is missing")
return match.group(1)
def snapshot(text: str, task: str, parent: str, next_task: str) -> str:
tick = "`"
replacements = {
r"\| Current task when this file was written \| `[^`]+` \|": f"| Current task when this file was written | {tick}{task}{tick} |",
r"\| Current task state \| `[^`]+` \|": f"| Current task state | {tick}in_progress{tick} |",
r"\| Parent manifest \| `[^`]+` \|": f"| Parent manifest | {tick}tests/golden/{parent}/manifest.json{tick} |",
r"\| Current task card \| `[^`]+` \|": f"| Current task card | {tick}docs/tasks/{task}.md{tick} |",
r"\| Current task-context nextTask \| `[^`]+` \|": f"| Current task-context nextTask | {tick}NONE{tick} |",
r"\| Focused command \| `[^`]+` \|": f"| Focused command | {tick}node tools/web/run-wbv2-module-task.mjs --task {task} --write{tick} |",
}
for pattern, replacement in replacements.items():
substitutions = [
(r"\| Current task when this file was written \| `[^`]+` \|", f"| Current task when this file was written | {tick}{task}{tick} |"),
(r"\| Current task state \| `[^`]+` \|", f"| Current task state | {tick}in_progress{tick} |"),
(r"\| Parent manifest \| `[^`]+` \|", f"| Parent manifest | {tick}tests/golden/{parent}/manifest.json{tick} |"),
(r"\| Current task card \| `[^`]+` \|", f"| Current task card | {tick}docs/tasks/{task}.md{tick} |"),
(r"\| Current task-context nextTask \| `[^`]+` \|", f"| Current task-context nextTask | {tick}{next_task}{tick} |"),
(r"\| Focused command \| `[^`]+` \|", f"| Focused command | {tick}node tools/web/run-wbv2-module-task.mjs --task {task} --write{tick} |"),
]
for pattern, replacement in substitutions:
text = re.sub(pattern, replacement, text, count=1)
return text
def card(task: str, parent: str, status: str, title: str, entrypoint: str) -> str:
return f"""# {task}: {title}
def make_card(task: str, parent: str, status: str, batch: dict, entrypoint: str) -> 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"])
return f"""# {task}: {batch['title']}
- task: {task}
- parent: {parent}
- status: {status}
- gap: capability:CORRECTIVE_SMOOTH_READER
- ownerFamily: MODIFIER
- gap: capability:{batch['moduleId']}
- ownerFamily: {batch['owner']}
- targetImplementationClass: LOCAL_EXACT
- Implementation entrypoint: `{entrypoint}`
## 目标
验证 Blender Main 中 Corrective Smooth modifier 的真实类型和 RNA 元数据,并确认 save/reopen、worker termination 和 malformed 输入保持确定性。
以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 {names} 的真实 modifier/RNA 元数据。
## 输入与范围
- Blender source: `blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc`
- 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`
- Fixture: `tests/files/web/modifier_corrective_smooth_scene.blend`
- Chromium test: `web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts`
- Fixture: `{batch['fixture']}`
- Chromium test: `{batch['test']}`
- Selected modifier units: {units}
- Selected RNA units: {rna_units}
## 验收
- Corrective Smooth is read from Blender Main through the compiled WebEngine/WASM path
- malformed blend is rejected without Main mutation
- 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
- Chromium is the only browser and JS simulation is forbidden
- 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 {task} --write`
## 失败边界
- missing source, unsupported modifier, hash drift, malformed data or non-exact recovery remains `in_progress`/`blocked`
- this slice never claims full modifier-family parity or mutates historical inventory
- 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/{task}/module-receipt.json`
- Aggregate production evidence: `tests/golden/{task}/modifier-reader-batch-production.json`
- Manifest: `tests/golden/{task}/manifest.json`
- Status: `docs/status/{task}.md`
- Rollback: restore {parent} as queue parent without rewriting prior evidence.
"""
def select_batch(inventory: dict) -> dict:
units = {unit.get("identifier"): unit for unit in inventory.get("units", []) if isinstance(unit, dict) and unit.get("coverageStatus") != "VERIFIED"}
for candidate in PREFERRED_BATCHES:
selected = [units.get(name) for name in candidate["identifiers"] + candidate["rna"]]
if all(selected):
return {**candidate, "units": selected}
raise SystemExit("no configured unresolved Blender source batch remains")
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--write", action="store_true", help="write the successor authorization")
parser.add_argument("--write", action="store_true")
args = parser.parse_args()
current = queue_task()
pointer = {"task": current, "parentManifest": re.search(r"\| parent manifest \| `([^`]+)` \|", QUEUE.read_text(encoding="utf-8"), re.IGNORECASE).group(1)}
current_manifest_path = CONTROL_ROOT.parent / current / "manifest.json"
current = current_task()
parent_path = queue_parent()
current_manifest_path = ROOT / "tests/golden" / current / "manifest.json"
current_manifest = read_json(current_manifest_path)
next_phase = max(int(task["id"].split("-")[1][1:]) for task in json.loads((ROOT / read_json(INDEX)["source"]["path"]).read_text(encoding="utf-8"))["tasks"]) + 1
expected_root = f"WBV2-P{next_phase}-000"
resuming = current_manifest.get("nextTask") == expected_root
if current_manifest.get("status") != "done" or (current_manifest.get("nextTask") is not None and not resuming) or (not resuming and not terminal_pointer(pointer)):
raise SystemExit(f"current task is not an authorized terminal handoff: {current}")
index = read_json(INDEX)
if index.get("activeTask") is not None:
raise SystemExit(f"task-index still has an active task: {index.get('activeTask')}")
plan_path = ROOT / index["source"]["path"]
plan = json.loads(plan_path.read_text(encoding="utf-8"))
phase = max(int(task["id"].split("-")[1][1:]) for task in plan["tasks"]) + 1
root_task = f"WBV2-P{phase}-000"
module_task = f"WBV2-P{phase}-001"
module_id = "CORRECTIVE_SMOOTH_READER"
module_source = [
"blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"web/tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts",
"tests/files/web/modifier_corrective_smooth_scene.blend",
"web/app/src/vendor/blender/web_engine.wasm",
]
for source in module_source:
if not (ROOT / source).is_file():
raise SystemExit(f"module source is missing: {source}")
terminal = current_manifest.get("status") == "done" and current_manifest.get("nextTask") is None and index.get("activeTask") is None
if not terminal and not current_manifest.get("nextTask"):
raise SystemExit(f"current task is not terminal: {current}")
phase = max(int(item["id"].split("-")[1][1:]) for item in plan["tasks"]) + 1
root_task, module_task = f"WBV2-P{phase}-000", f"WBV2-P{phase}-001"
inventory = read_json(CONTROL_ROOT / "dynamic-inventory.json")
batch = select_batch(inventory)
if not args.write:
print(json.dumps({"status": "ready", "rootTask": root_task, "nextTask": module_task, "moduleId": batch["moduleId"], "batchSize": len(batch["units"]), "sourceUnits": [unit["id"] for unit in batch["units"]]}, ensure_ascii=False))
return 0
current_status = ROOT / "docs/status" / f"{current}.md"
if current_status.is_file():
status_text = re.sub(r"- nextTask: `[^`]+`", f"- nextTask: `{root_task}`", current_status.read_text(encoding="utf-8"))
write_text(current_status, status_text)
current_manifest["nextTask"] = root_task
if isinstance(current_manifest.get("artifacts"), dict) and isinstance(current_manifest["artifacts"].get("status"), dict):
current_manifest["artifacts"]["status"]["sha256"] = sha(current_status)
write_json(current_manifest_path, current_manifest)
source_paths = [unit["locations"][0]["path"] for unit in batch["units"]]
source_paths += ["blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp", batch["test"], batch["fixture"], "web/app/src/vendor/blender/web_engine.wasm"]
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",
"WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-corrective-smooth-reader-production.spec.ts",
f"WBV2_BATCH_TASK={module_task} WBV2_BATCH_FIXTURE={batch['fixture']} WBV2_BATCH_TYPES='{json.dumps(batch['types'], separators=(',', ':'))}' WBV2_BATCH_UNITS='{json.dumps([unit['id'] for unit in batch['units']], separators=(',', ':'))}' 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_corrective_smooth_reader_module",
"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 a source-backed Corrective Smooth reader/recovery module after the Driver reader.",
"outputs": ["successor authorization", "module plan", "manifest", "status"],
"acceptance": ["prior evidence remains hash-bound", "Corrective Smooth has explicit Blender source mapping", "inventory remains source-derived", "one source-backed module is active"],
"commands": ["node tools/web/check-execution-control-plane.mjs"],
"status": "done",
"ready": False,
"queueMutationAllowed": True,
}
module_record = {
"id": module_task,
"phase": str(phase),
"title": "verify_corrective_smooth_reader_module",
"kind": "module",
"owner": "MODIFIER",
"dependsOn": [root_task],
"parityId": module_id,
"implementationClass": "LOCAL_EXACT",
"parallelGroup": "module-corrective_smooth_reader",
"gate": "MODULE",
"card": f"docs/tasks/{module_task}.md",
"behavior": "Verify Corrective Smooth modifier type and RNA metadata through Blender Main reader, protocol and Chromium recovery.",
"outputs": ["module receipt", "negative matrix", "manifest", "status"],
"acceptance": ["source and protocol hashes are bound", "positive Main reader is proven", "negative no-mutation and recovery are proven", "Chromium and save/reopen evidence are exact", "full-family parity remains explicit"],
"status": "in_progress",
"ready": True,
"queueMutationAllowed": True,
"module": {
"moduleId": module_id,
"sourceBacked": True,
"capabilities": ["CAP-CORRECTIVE-SMOOTH-READER", "CAP-CORRECTIVE-SMOOTH-RECOVERY", "CAP-CORRECTIVE-SMOOTH-FAIL-CLOSED"],
"sourcePaths": module_source,
"reuseReceipts": [{"manifest": "tests/golden/WBV2-P1107-000/manifest.json", "report": "tests/golden/WBV2-P1107-000/module-receipt.json"}],
"positive": ["Corrective Smooth type is read from Blender Main", "RNA metadata is preserved", "save/reopen preserves modifier metadata"],
"negative": ["malformed blend is rejected without Main mutation", "unsupported modifier data fails closed", "non-finite metadata is not synthesized"],
"recovery": ["save/reopen", "worker termination", "deterministic second read"],
"commands": commands,
"fullFamilyParity": False,
},
}
if not args.write:
print(json.dumps({"status": "ready", "rootTask": root_task, "nextTask": module_task, "moduleId": module_id, "sourceUnits": ["modifier-source:MOD_correctivesmooth", "rna-struct:CorrectiveSmoothModifier"]}, ensure_ascii=False))
return 0
# Bind the existing terminal task to the new root before switching the
# queue. This preserves the parent/nextTask invariant for every handoff.
current_status_path = ROOT / "docs/status" / f"{current}.md"
if current_status_path.is_file():
text = current_status_path.read_text(encoding="utf-8")
text = re.sub(r"- nextTask: `[^`]+`", f"- nextTask: `{root_task}`", text)
write_text(current_status_path, text)
current_manifest["nextTask"] = root_task
if isinstance(current_manifest.get("artifacts"), dict) and isinstance(current_manifest["artifacts"].get("status"), dict):
current_manifest["artifacts"]["status"]["sha256"] = sha(current_status_path)
write_json(current_manifest_path, current_manifest)
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"]]}}
root_out = CONTROL_ROOT.parent / root_task
root_plan_path = root_out / "module-execution-plan.json"
root_plan = {**plan, "planId": f"BLENDER_WEB_MODULE_EXECUTION_P{phase}", "status": "ACTIVE_MODULE_QUEUE", "tasks": [*plan["tasks"], root_record, module_record], "modules": [*plan.get("modules", []), {"id": module_id, "task": module_task, "owner": "MODIFIER", "sourceBacked": True, "capabilities": module_record["module"]["capabilities"], "sourcePaths": module_source, "reuseReceipts": module_record["module"]["reuseReceipts"], "fullFamilyParity": False}]}
root_plan = {**plan, "planId": f"BLENDER_WEB_MODULE_EXECUTION_P{phase}", "status": "ACTIVE_MODULE_QUEUE", "tasks": [*plan["tasks"], root_record, module_record], "modules": [*plan.get("modules", []), {"id": batch["moduleId"], "task": module_task, "owner": batch["owner"], "sourceBacked": True, "capabilities": module_record["module"]["capabilities"], "sourcePaths": source_paths, "reuseReceipts": module_record["module"]["reuseReceipts"], "fullFamilyParity": False}]}
write_json(root_plan_path, root_plan)
root_card_path = ROOT / "docs/tasks" / f"{root_task}.md"
module_card_path = ROOT / "docs/tasks" / f"{module_task}.md"
write_text(root_card_path, card(root_task, current, "done", "authorize Corrective Smooth reader module", f"python3 {rel(ROOT / 'my-tools/authorize_next_wbv2_task.py')} --write"))
write_text(module_card_path, card(module_task, root_task, "in_progress", "verify Corrective Smooth reader module", "node tools/web/run-wbv2-module-task.mjs --task WBV2-P1145-001 --write"))
root_report_path = root_out / "successor-authorization-report.json"
root_status_path = ROOT / "docs/status" / f"{root_task}.md"
root_manifest_path = root_out / "manifest.json"
write_json(root_report_path, {"schemaVersion": 1, "task": root_task, "operation": "AUTHORIZE_SOURCE_BACKED_MODULE", "taskClass": "QUEUE_ENABLEMENT", "status": "PASS", "parent": {"task": current, "manifest": rel(current_manifest_path), "manifestSha256": sha(current_manifest_path)}, "module": {"moduleId": module_id, "task": module_task, "sourceUnits": ["modifier-source:MOD_correctivesmooth", "rna-struct:CorrectiveSmoothModifier"], "sourceBacked": True}, "inventory": {"unitCount": 3745, "verifiedUnits": 350, "unverifiedUnits": 3395, "sourceTreeSha256": read_json(CONTROL_ROOT / "dynamic-inventory.json").get("authority", {}).get("sourceTreeSha256"), "boundUnitDelta": 0}, "nextTask": module_task})
write_text(root_status_path, f"# {root_task} status\n\n- task: `{root_task}`; parent: `{current}`; status: `done`\n- taskClass: `QUEUE_ENABLEMENT`; no Corrective Smooth parity completion claimed\n- source-backed successor authorized for `CORRECTIVE_SMOOTH_READER`\n- dynamic inventory remains `3745` units; verified `350`; unverified `3395`; bound delta `0`\n- nextTask: `{module_task}`\n")
write_json(root_manifest_path, {"schemaVersion": 1, "task": root_task, "parentTask": current, "operation": "AUTHORIZE_SOURCE_BACKED_MODULE", "status": "done", "enablingTask": True, "parityStateChange": False, "runtime": "MODULE_EXECUTION_QUEUE_BRIDGE", "artifacts": {"parentManifest": {"path": rel(current_manifest_path), "sha256": sha(current_manifest_path)}, "plan": {"path": rel(root_plan_path), "sha256": sha(root_plan_path)}, "report": {"path": rel(root_report_path), "sha256": sha(root_report_path)}, "status": {"path": rel(root_status_path), "sha256": sha(root_status_path)}}, "assertions": {"sourceBackedSuccessor": True, "priorEvidencePreserved": True, "moduleId": module_id, "inventoryTotal": 6900, "effectiveCompleted": 290, "effectivePending": 6609, "dynamicUnitCount": 3745, "dynamicVerifiedUnits": 350, "dynamicUnverifiedUnits": 3395, "boundUnitDelta": 0, "fullHistoricalReproduction": False}, "nextTask": module_task})
# The new plan becomes authoritative only after all files and cards exist.
root_card_path, module_card_path = ROOT / "docs/tasks" / f"{root_task}.md", ROOT / "docs/tasks" / f"{module_task}.md"
write_text(root_card_path, make_card(root_task, current, "done", batch, f"python3 my-tools/authorize_next_wbv2_task.py --write"))
write_text(module_card_path, make_card(module_task, root_task, "in_progress", batch, f"node tools/web/run-wbv2-module-task.mjs --task {module_task} --write"))
root_report_path, root_status_path, root_manifest_path = root_out / "successor-authorization-report.json", ROOT / "docs/status" / f"{root_task}.md", root_out / "manifest.json"
write_json(root_report_path, {"schemaVersion": 1, "task": root_task, "operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH", "taskClass": "QUEUE_ENABLEMENT", "status": "PASS", "parent": {"task": current, "manifest": rel(current_manifest_path), "manifestSha256": sha(current_manifest_path)}, "module": {"moduleId": batch["moduleId"], "task": module_task, "batchSize": len(batch["units"]), "sourceUnits": [unit["id"] for unit in batch["units"]], "sourceBacked": True}, "inventory": {"unitCount": inventory["summary"]["unitCount"], "verifiedUnits": inventory["coverage"]["verifiedUnits"], "unverifiedUnits": inventory["coverage"]["unverifiedUnits"], "sourceTreeSha256": inventory["authority"]["sourceTreeSha256"], "boundUnitDelta": 0}, "nextTask": module_task})
write_text(root_status_path, f"# {root_task} status\n\n- task: `{root_task}`; parent: `{current}`; status: `done`\n- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed\n- source-backed batch authorized: `{batch['moduleId']}` ({len(batch['units'])} units)\n- dynamic inventory: `{inventory['summary']['unitCount']}` units; verified `{inventory['coverage']['verifiedUnits']}`; unverified `{inventory['coverage']['unverifiedUnits']}`; bound delta `0`\n- nextTask: `{module_task}`\n")
write_json(root_manifest_path, {"schemaVersion": 1, "task": root_task, "parentTask": current, "operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH", "status": "done", "enablingTask": True, "parityStateChange": False, "runtime": "MODULE_EXECUTION_QUEUE_BRIDGE", "artifacts": {"parentManifest": {"path": rel(current_manifest_path), "sha256": sha(current_manifest_path)}, "plan": {"path": rel(root_plan_path), "sha256": sha(root_plan_path)}, "report": {"path": rel(root_report_path), "sha256": sha(root_report_path)}, "status": {"path": rel(root_status_path), "sha256": sha(root_status_path)}}, "assertions": {"sourceBackedSuccessor": True, "moduleId": batch["moduleId"], "batchSize": len(batch["units"]), "inventoryTotal": 6900, "effectiveCompleted": 290, "effectivePending": 6609, "dynamicUnitCount": inventory["summary"]["unitCount"], "dynamicVerifiedUnits": inventory["coverage"]["verifiedUnits"], "dynamicUnverifiedUnits": inventory["coverage"]["unverifiedUnits"], "boundUnitDelta": 0, "fullHistoricalReproduction": False}, "nextTask": module_task})
run_node("tools/web/generate-v2-task-index.mjs", "--plan-path", rel(root_plan_path))
queue_text = QUEUE.read_text(encoding="utf-8")
queue_text = re.sub(r"\| 当前任务 \| `[^`]+` \|", f"| 当前任务 | `{module_task}` |", queue_text, count=1)
@@ -243,13 +235,15 @@ def main() -> int:
write_text(QUEUE, queue_text)
next_path = ROOT / "nextTask.md"
if next_path.is_file():
write_text(next_path, replace_snapshot(next_path.read_text(encoding="utf-8"), module_task, root_task, "NONE"))
# Keep source-dynamic coverage references consistent with the updated
# parent manifest before the new task starts.
run_node("tools/web/reconcile-source-dynamic-coverage.mjs")
run_node("tools/web/check-task-context.mjs", "--task", root_task, "--write")
write_text(next_path, snapshot(next_path.read_text(encoding="utf-8"), module_task, root_task, "NONE"))
# Do not rerun the legacy hard-coded reconciliation here: it would discard
# newer explicit bindings produced by completed module batches. The active
# module's binder owns the incremental inventory update.
# The root is a completed queue-enable record. Preparing its context again
# wastes budget and can fail solely because the parent manifest grew; only
# the active implementation batch needs a packet.
run_node("tools/web/check-task-context.mjs", "--task", module_task, "--write")
print(f"wbv2-successor-authorized root={root_task} next={module_task} module={module_id} inventoryDelta=0")
print(f"wbv2-successor-authorized root={root_task} next={module_task} module={batch['moduleId']} batchSize={len(batch['units'])} inventoryDelta=0")
return 0

View File

@@ -9,6 +9,17 @@ SCHEDULER_PUSH_RETRIES="${WBV2_PUSH_RETRIES:-6}"
WATCHDOG_INTERVAL="${WBV2_WATCHDOG_INTERVAL:-10}"
WATCHDOG_RESTART_DELAY="${WBV2_WATCHDOG_RESTART_DELAY:-5}"
# Keep repository evidence on disk while placing compiler/transient caches in
# RAM. Eight compile jobs is the repository's stability limit.
if test -d /dev/shm && test -w /dev/shm; then
export WEB_RAM_CACHE_ROOT="${WEB_RAM_CACHE_ROOT:-/dev/shm/blender-wasm-$(id -u)}"
mkdir -p "$WEB_RAM_CACHE_ROOT/emcache" "$WEB_RAM_CACHE_ROOT/tmp"
export EM_CACHE="${EM_CACHE:-$WEB_RAM_CACHE_ROOT/emcache}"
export TMPDIR="${TMPDIR:-$WEB_RAM_CACHE_ROOT/tmp}"
fi
export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL:-8}"
export NINJAFLAGS="${NINJAFLAGS:--j8}"
mkdir -p "$CONTROL_DIR"
start_scheduler() {

View File

@@ -467,12 +467,12 @@ Recorded: 2026-08-29 Asia/Shanghai
| Field | Value |
| --- | --- |
| Current task when this file was written | `WBV2-P1145-001` |
| Current task state | `done` |
| Parent manifest | `tests/golden/WBV2-P1145-001/manifest.json` |
| Current task card | `docs/tasks/WBV2-P1145-001.md` |
| Current task when this file was written | `WBV2-P1148-001` |
| Current task state | `in_progress` |
| Parent manifest | `tests/golden/WBV2-P1148-000/manifest.json` |
| Current task card | `docs/tasks/WBV2-P1148-001.md` |
| Current task-context nextTask | `NONE` |
| Focused command | `node tools/web/check-wbv2-module-execution.mjs` |
| Focused command | `node tools/web/run-wbv2-module-task.mjs --task WBV2-P1148-001 --write` |
The snapshot is informational and may become stale. On every resume, the queue,
parent manifest, and fresh `print-task-context` output win. Never infer a task

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,5 @@
The following paths are ignored by one of your .gitignore files:
tests/golden/WBV2-P1145-001/module-run.log
hint: Use -f if you really want to add them.
hint: Turn this message off by running
hint: "git config advice.addIgnoredFile false"

View File

@@ -0,0 +1,12 @@
context-governance-ok task=WBV2-P1145-001 contentTokens=1840 envelopeTokens=658/1024 estimatedTokens=2864/3500 inputs=0 commands=1
{"schemaVersion":1,"operation":"BLENDER_WEB_EXECUTION_CONTROL_PLANE","status":"PASS","authority":{"executionPointer":"docs/EXECUTION_QUEUE.md","productCapabilities":"docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json","legacyCoverage":"tests/golden/M15-03A/next-task-plan.json","historicalEvidence":"tests/golden/corrective/"},"queue":{"currentTask":"WBV2-P1145-001","parentManifest":"tests/golden/WBV2-P1145-000/manifest.json","parentTask":"WBV2-P1145-000","parentNextTask":"WBV2-P1145-001","activeCatalogTask":null,"legacyCoverageTask":"M16-GAP-00282","legacyCoverageParentManifest":"tests/golden/M16-GAP-00281/manifest.json","legacyCoverageState":"active","runnableInputs":null},"efficiency":{"legacyGapTasks":6900,"legacyCompleted":281,"legacyPending":6618,"capabilityClusters":3,"mappedLegacyGaps":9,"averageGapsPerCapability":3,"productiveLane":0,"rule":"one capability task may close multiple legacy cases; legacy cases remain regression coverage"},"dynamicInventory":{"path":"tests/golden/WBV2/dynamic-inventory.json","manifestPath":"tests/golden/WBV2/dynamic-inventory-manifest.json","sourceTreeSha256":"600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202","sourceFiles":6206,"unitCount":3745,"planningEstimate":5200,"hardTarget":false,"verifiedUnits":350,"unverifiedUnits":3395},"capabilityClusters":{"ASSET_CATALOG":{"capabilityId":"CAP-ASSET-CATALOG-MUTATION","sourceGaps":5,"parityLevel":"L0","targetParityLevel":"L4","lifecycleStatus":"planned"},"MODIFIER":{"capabilityId":"CAP-MODIFIER-STATE-MUTATION","sourceGaps":2,"parityLevel":"L0","targetParityLevel":"L3","lifecycleStatus":"planned"},"MESH":{"capabilityId":"CAP-MESH-POSITIVE-EDIT","sourceGaps":2,"parityLevel":"L0","targetParityLevel":"L3","lifecycleStatus":"planned"}},"issues":[],"remediation":[],"allowUnrunnable":true,"inputDigest":"ec50ecdebf478c7595eb179c80f5113e4ebb505954734e281697a9928a718df8"}
v2-task-index-ok tasks=71 active=NONE catalog=tests/golden/WBV2/task-catalog.jsonl
v2-handoff-ok task=WBV2-P1145-001 parent=WBV2-P1145-000 status=done artifacts=12
> blender-web-editor@0.1.0-rc.1 typecheck
> tsc -p tsconfig.json --noEmit
> blender-web-editor@0.1.0-rc.1 lint
> eslint app

View File

@@ -0,0 +1,3 @@
v2-task-index-generated tasks=71 active=NONE output=tests/golden/WBV2/task-index.json
task-context-ok task=WBV2-P1145-001 parent=WBV2-P1145-000 contentTokens=1840 envelopeTokens=658/1024 estimatedTokens=2864/3500 taskBytes=1771 next=NONE output=tests/golden/WBV2-P1145-001/task-context.json
module-task-complete task=WBV2-P1145-001 module=CORRECTIVE_SMOOTH_READER next=null commands=4

View File

@@ -47,7 +47,7 @@
},
"status": {
"path": "docs/status/WBV2-P1145-001.md",
"sha256": "e4fccc7e41be4081f9019138d0dbf204b5d3681cdbb23546362b8140485ac4c2"
"sha256": "d86883f696ea02127ba8b24b69ead3afa397e01fa07e0cedbb8d3b3cacdcbfb4"
},
"log": {
"path": "tests/golden/WBV2-P1145-001/module-run.log",
@@ -83,5 +83,5 @@
"historicalEffectivePending": 6609,
"historicalReproduction": false
},
"nextTask": null
"nextTask": "WBV2-P1146-000"
}

View File

@@ -0,0 +1,42 @@
{
"schemaVersion": 1,
"task": "WBV2-P1146-000",
"parentTask": "WBV2-P1145-001",
"operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "MODULE_EXECUTION_QUEUE_BRIDGE",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P1145-001/manifest.json",
"sha256": "bf90f285d1ef5c5255ef1dfb99656ecc3c47118c035547ef2ac258c1a43bbc96"
},
"plan": {
"path": "tests/golden/WBV2-P1146-000/module-execution-plan.json",
"sha256": "e5215ac212b87c0aee8c526d490df30bc6e9cd4a6db4f9634b3c893b6b36c7bb"
},
"report": {
"path": "tests/golden/WBV2-P1146-000/successor-authorization-report.json",
"sha256": "bf17e9bdeb3c39aaca1e97fcff1ebe8154e2d4bc17bd15a523028146a933994e"
},
"status": {
"path": "docs/status/WBV2-P1146-000.md",
"sha256": "ded9ac0ad58665cc0f4e1d1d672e8460772b632ed8df173555d281fcc20856f4"
}
},
"assertions": {
"sourceBackedSuccessor": true,
"moduleId": "MODIFIER_READER_BATCH",
"batchSize": 9,
"inventoryTotal": 6900,
"effectiveCompleted": 290,
"effectivePending": 6609,
"dynamicUnitCount": 3745,
"dynamicVerifiedUnits": 350,
"dynamicUnverifiedUnits": 3395,
"boundUnitDelta": 0,
"fullHistoricalReproduction": false
},
"nextTask": "WBV2-P1146-001"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
{
"schemaVersion": 1,
"task": "WBV2-P1146-000",
"operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH",
"taskClass": "QUEUE_ENABLEMENT",
"status": "PASS",
"parent": {
"task": "WBV2-P1145-001",
"manifest": "tests/golden/WBV2-P1145-001/manifest.json",
"manifestSha256": "bf90f285d1ef5c5255ef1dfb99656ecc3c47118c035547ef2ac258c1a43bbc96"
},
"module": {
"moduleId": "MODIFIER_READER_BATCH",
"task": "WBV2-P1146-001",
"batchSize": 9,
"sourceUnits": [
"modifier-source:MOD_datatransfer",
"modifier-source:MOD_dynamicpaint",
"modifier-source:MOD_explode",
"modifier-source:MOD_fluid",
"rna-struct:DataTransferModifier",
"rna-struct:DynamicPaintModifier",
"rna-struct:ExplodeModifier",
"rna-struct:FluidModifier",
"rna-struct:FluidDomainSettings"
],
"sourceBacked": true
},
"inventory": {
"unitCount": 3745,
"verifiedUnits": 350,
"unverifiedUnits": 3395,
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"boundUnitDelta": 0
},
"nextTask": "WBV2-P1146-001"
}

View File

@@ -0,0 +1,2 @@
context-governance-ok task=WBV2-P1146-001 contentTokens=1968 envelopeTokens=655/1024 estimatedTokens=2992/3500 inputs=0 commands=1
{"schemaVersion":1,"operation":"BLENDER_WEB_EXECUTION_CONTROL_PLANE","status":"BLOCKED","authority":{"executionPointer":"docs/EXECUTION_QUEUE.md","productCapabilities":"docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json","legacyCoverage":"tests/golden/M15-03A/next-task-plan.json","historicalEvidence":"tests/golden/corrective/"},"queue":{"currentTask":"WBV2-P1146-001","parentManifest":"tests/golden/WBV2-P1146-000/manifest.json","parentTask":"WBV2-P1146-000","parentNextTask":"WBV2-P1146-001","activeCatalogTask":null,"legacyCoverageTask":"M16-GAP-00282","legacyCoverageParentManifest":"tests/golden/M16-GAP-00281/manifest.json","legacyCoverageState":"active","runnableInputs":null},"efficiency":{"legacyGapTasks":6900,"legacyCompleted":281,"legacyPending":6618,"capabilityClusters":3,"mappedLegacyGaps":9,"averageGapsPerCapability":3,"productiveLane":0,"rule":"one capability task may close multiple legacy cases; legacy cases remain regression coverage"},"dynamicInventory":{"path":"tests/golden/WBV2/dynamic-inventory.json","manifestPath":"tests/golden/WBV2/dynamic-inventory-manifest.json","sourceTreeSha256":"600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202","sourceFiles":6206,"unitCount":3745,"planningEstimate":5200,"hardTarget":false,"verifiedUnits":359,"unverifiedUnits":3386},"capabilityClusters":{"ASSET_CATALOG":{"capabilityId":"CAP-ASSET-CATALOG-MUTATION","sourceGaps":5,"parityLevel":"L0","targetParityLevel":"L4","lifecycleStatus":"planned"},"MODIFIER":{"capabilityId":"CAP-MODIFIER-STATE-MUTATION","sourceGaps":2,"parityLevel":"L0","targetParityLevel":"L3","lifecycleStatus":"planned"},"MESH":{"capabilityId":"CAP-MESH-POSITIVE-EDIT","sourceGaps":2,"parityLevel":"L0","targetParityLevel":"L3","lifecycleStatus":"planned"}},"issues":[{"code":"DYNAMIC_INVENTORY_MANIFEST_HASH_DRIFT","detail":"tests/golden/WBV2/dynamic-inventory.json"}],"remediation":["inspect the control-plane issue and preserve its evidence"],"allowUnrunnable":true,"inputDigest":"ce2b3b4979df4fefec3126d242df0749e25f35f0b20826f5b77d2b2e0b16eb46"}

View File

@@ -0,0 +1,4 @@
v2-task-index-generated tasks=73 active=NONE output=tests/golden/WBV2/task-index.json
task-context-ok task=WBV2-P1146-001 parent=WBV2-P1146-000 contentTokens=1968 envelopeTokens=655/1024 estimatedTokens=2992/3500 taskBytes=2307 next=NONE output=tests/golden/WBV2-P1146-001/task-context.json
wbv2-module-coverage-bound task=WBV2-P1146-001 module=MODIFIER_READER_BATCH added=9 verified=359 unverified=3386
module-task-complete task=WBV2-P1146-001 module=MODIFIER_READER_BATCH next=null commands=4

View File

@@ -0,0 +1 @@
{"schemaVersion":1,"task":"WBV2-P1146-001","parentTask":"WBV2-P1146-000","operation":"MODULE_FUNCTION_EXECUTION","taskClass":"MODULE","status":"done","enablingTask":true,"parityStateChange":false,"runtime":"BLENDER_WEB_FUNCTION_MODULE","artifacts":{"parentManifest":{"path":"tests/golden/WBV2-P1146-000/manifest.json","sha256":"71385fd4a21497b907dd28e745aca35fbfca0e0a76cddcf517d52619d5b9a886"},"source1":{"path":"blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc","sha256":"201bf6334689a689326681db129a63140d4483c40d3187e394ad548090070438"},"source2":{"path":"blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc","sha256":"269d97eefcf59741aa2d59d67a2b29c881e70f6b7331366b5c7e325e51420516"},"source3":{"path":"blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc","sha256":"165d75c5739ed4a88cd72134a881a7802f0c57339307743799f73bf49b788c0c"},"source4":{"path":"blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc","sha256":"41aaadf31d4bf815dd86f1d8f433f925b336ddf4efcd4e377f64d5e8470d7e63"},"source5":{"path":"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc","sha256":"1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"},"source6":{"path":"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc","sha256":"1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"},"source7":{"path":"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc","sha256":"1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"},"source8":{"path":"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc","sha256":"1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"},"source9":{"path":"blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc","sha256":"a2ca40cda63b5a6ab77a78d8ee14d039abbf0577f82c7f1904879fac777643d4"},"source10":{"path":"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp","sha256":"f6fbd04315c48ad4dfbf109b91e5b350550d23c227e5c11a71a58f09e923c990"},"source11":{"path":"web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts","sha256":"afdabf3af64695daca0b78555692729753752c03b10d2470676ba7515c79e0ce"},"source12":{"path":"tests/files/web/modifier_reader_batch_scene.blend","sha256":"de3b7a3aa35625b5071eebd06e3215571ac48ae6959b1ae380ecdf67f9ade0d9"},"source13":{"path":"web/app/src/vendor/blender/web_engine.wasm","sha256":"32bc36aba563fe1ed0fb5d0292ca8a3ada1eecd6d45e38d9dcde565f02a312fe"},"evidence1":{"path":"tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json","sha256":"4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"},"moduleReceipt":{"path":"tests/golden/WBV2-P1146-001/module-receipt.json","sha256":"ba4604086e19251098ab01e241a22be0b927180b1a4e76fc04ff7a01bf45dc26"},"status":{"path":"docs/status/WBV2-P1146-001.md","sha256":"8b8bf4c73ae59d9a15a04d47291af701ef9107cba7921b90f5900b3818b4dd9d"},"log":{"path":"tests/golden/WBV2-P1146-001/module-run.log","sha256":"102ce83b881b316bd801879b4820ac173f092f6073b08928bacf5bc843095452"},"plan":{"path":"tests/golden/WBV2-P1146-000/module-execution-plan.json","sha256":"a5cbbd2010df35f49a89c93e479f20d447ce5d4be1e4c3db4050bb60837146d7"},"taskContext":{"path":"tests/golden/WBV2-P1146-001/task-context.json","sha256":"bd24967e771cb0abde2100867ab3fec9d4139d567a6eb4b8ea26a5e01969fd52"}},"assertions":{"moduleId":"MODIFIER_READER_BATCH","sourceBacked":true,"positiveCases":6,"negativeCases":3,"recoveryCases":3,"commandCount":4,"reusedReceiptCount":1,"sourceUnchanged":true,"fullFamilyParity":false,"dynamicInventoryPath":"tests/golden/WBV2/dynamic-inventory.json","dynamicSourceTreeSha256":"600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202","dynamicUnitCount":3745,"dynamicVerifiedUnits":359,"dynamicUnverifiedUnits":3386,"planningEstimate":5200,"historicalInventoryTotal":6900,"historicalEffectiveCompleted":290,"historicalEffectivePending":6609,"historicalReproduction":false},"nextTask":"WBV2-P1147-000"}

View File

@@ -0,0 +1,212 @@
{
"schemaVersion": 1,
"task": "WBV2-P1146-001",
"operation": "MODIFIER_READER_BATCH_CHROMIUM_SAVE_REOPEN",
"browser": "chromium",
"queueMutation": false,
"fixture": "tests/files/web/modifier_reader_batch_scene.blend",
"fixtureSha256": "de3b7a3aa35625b5071eebd06e3215571ac48ae6959b1ae380ecdf67f9ade0d9",
"expectedTypes": [
"DATA_TRANSFER",
"DYNAMIC_PAINT",
"EXPLODE",
"FLUID"
],
"sourceUnits": [
"modifier-source:MOD_datatransfer",
"modifier-source:MOD_dynamicpaint",
"modifier-source:MOD_explode",
"modifier-source:MOD_cast",
"rna-struct:DataTransferModifier",
"rna-struct:DynamicPaintModifier",
"rna-struct:ExplodeModifier",
"rna-struct:CastModifier"
],
"before": [
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:864389176",
"name": "Data Transfer",
"type": "DATA_TRANSFER",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 864389176,
"typeCode": 49
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:1142069749",
"name": "Dynamic Paint",
"type": "DYNAMIC_PAINT",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1142069749,
"typeCode": 40
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:1886000045",
"name": "Explode",
"type": "EXPLODE",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1886000045,
"typeCode": 21
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:874629360",
"name": "Fluid",
"type": "FLUID",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 5,
"mode": 3,
"persistentUid": 874629360,
"typeCode": 56
}
}
],
"types": [
"DATA_TRANSFER",
"DYNAMIC_PAINT",
"EXPLODE",
"FLUID"
],
"after": [
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:864389176",
"name": "Data Transfer",
"type": "DATA_TRANSFER",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 864389176,
"typeCode": 49
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:1142069749",
"name": "Dynamic Paint",
"type": "DYNAMIC_PAINT",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1142069749,
"typeCode": 40
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:1886000045",
"name": "Explode",
"type": "EXPLODE",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1886000045,
"typeCode": 21
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:874629360",
"name": "Fluid",
"type": "FLUID",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 5,
"mode": 3,
"persistentUid": 874629360,
"typeCode": 56
}
}
],
"second": [
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:864389176",
"name": "Data Transfer",
"type": "DATA_TRANSFER",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 864389176,
"typeCode": 49
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:1142069749",
"name": "Dynamic Paint",
"type": "DYNAMIC_PAINT",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1142069749,
"typeCode": 40
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:1886000045",
"name": "Explode",
"type": "EXPLODE",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1886000045,
"typeCode": 21
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchFixture:874629360",
"name": "Fluid",
"type": "FLUID",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 5,
"mode": 3,
"persistentUid": 874629360,
"typeCode": 56
}
}
],
"saveReopenExact": true,
"deterministicExact": true,
"savedSha256": "de3b7a3aa35625b5071eebd06e3215571ac48ae6959b1ae380ecdf67f9ade0d9",
"malformed": {
"code": "BLEND_READ_FAILED",
"message": "Input is not an uncompressed, gzip, or zstd Blender file"
}
}

View File

@@ -0,0 +1,131 @@
{
"schemaVersion": 1,
"task": "WBV2-P1146-001",
"operation": "MODULE_FUNCTION_EXECUTION",
"moduleId": "MODIFIER_READER_BATCH",
"status": "PASS",
"source": {
"paths": [
"blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc",
"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts",
"tests/files/web/modifier_reader_batch_scene.blend",
"web/app/src/vendor/blender/web_engine.wasm"
],
"before": {
"blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc": "201bf6334689a689326681db129a63140d4483c40d3187e394ad548090070438",
"blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc": "269d97eefcf59741aa2d59d67a2b29c881e70f6b7331366b5c7e325e51420516",
"blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc": "165d75c5739ed4a88cd72134a881a7802f0c57339307743799f73bf49b788c0c",
"blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc": "41aaadf31d4bf815dd86f1d8f433f925b336ddf4efcd4e377f64d5e8470d7e63",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b",
"blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc": "a2ca40cda63b5a6ab77a78d8ee14d039abbf0577f82c7f1904879fac777643d4",
"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "f6fbd04315c48ad4dfbf109b91e5b350550d23c227e5c11a71a58f09e923c990",
"web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts": "afdabf3af64695daca0b78555692729753752c03b10d2470676ba7515c79e0ce",
"tests/files/web/modifier_reader_batch_scene.blend": "de3b7a3aa35625b5071eebd06e3215571ac48ae6959b1ae380ecdf67f9ade0d9",
"web/app/src/vendor/blender/web_engine.wasm": "32bc36aba563fe1ed0fb5d0292ca8a3ada1eecd6d45e38d9dcde565f02a312fe"
},
"after": {
"blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc": "201bf6334689a689326681db129a63140d4483c40d3187e394ad548090070438",
"blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc": "269d97eefcf59741aa2d59d67a2b29c881e70f6b7331366b5c7e325e51420516",
"blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc": "165d75c5739ed4a88cd72134a881a7802f0c57339307743799f73bf49b788c0c",
"blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc": "41aaadf31d4bf815dd86f1d8f433f925b336ddf4efcd4e377f64d5e8470d7e63",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b",
"blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc": "a2ca40cda63b5a6ab77a78d8ee14d039abbf0577f82c7f1904879fac777643d4",
"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "f6fbd04315c48ad4dfbf109b91e5b350550d23c227e5c11a71a58f09e923c990",
"web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts": "afdabf3af64695daca0b78555692729753752c03b10d2470676ba7515c79e0ce",
"tests/files/web/modifier_reader_batch_scene.blend": "de3b7a3aa35625b5071eebd06e3215571ac48ae6959b1ae380ecdf67f9ade0d9",
"web/app/src/vendor/blender/web_engine.wasm": "32bc36aba563fe1ed0fb5d0292ca8a3ada1eecd6d45e38d9dcde565f02a312fe"
},
"unchanged": true
},
"reusedReceipts": [
{
"manifest": "tests/golden/WBV2-P1107-000/manifest.json",
"report": "tests/golden/WBV2-P1107-000/module-receipt.json",
"manifestSha256": "a53ebdc52db5dcf27d44e938e5551f1ee2adae8e46c3fe8661604ee6b1000f8c",
"reportSha256": "6dd419799e1a4b9251328d9496f2459d148cd89118740a06b0ee6ffb78e0b1d2"
}
],
"cases": {
"positive": [
"MOD_datatransfer type is read from Blender Main",
"MOD_dynamicpaint type is read from Blender Main",
"MOD_explode type is read from Blender Main",
"MOD_fluid 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": "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",
"exitCode": 0
},
{
"command": "npm --prefix web run typecheck",
"exitCode": 0
},
{
"command": "npm --prefix web run build",
"exitCode": 0
},
{
"command": "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-production.spec.ts",
"exitCode": 0
}
],
"verification": {
"required": [
"sourceHash",
"wasmBuild",
"positiveMainMutation",
"negativeNoMutation",
"undoRedo",
"saveReopen",
"aggregateManifest"
],
"chromiumOnly": true,
"fullFamilyParity": false
},
"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": "3cf5795f89066d759400fa206b559020e27c157708febdab393fa978303a79aa",
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"unitCount": 3745,
"planningEstimate": 5200,
"hardTarget": false,
"verifiedUnits": 359,
"unverifiedUnits": 3386
}
},
"nextTask": null
}

View File

@@ -0,0 +1,49 @@
> 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
ninja: no work to do.
> npm --prefix web run typecheck
> blender-web-editor@0.1.0-rc.1 typecheck
> tsc -p tsconfig.json --noEmit
> npm --prefix web run build
> blender-web-editor@0.1.0-rc.1 build
> tsc -p tsconfig.json && vite build --config app/vite.config.ts
vite v8.2.0 building client environment for production...

transforming...✓ 102 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html 0.46 kB │ gzip: 0.30 kB
dist/assets/storage.worker-D9TqXsGS.js 66.59 kB
dist/assets/web-engine.worker-BfTMiTY1.js 362.11 kB
dist/assets/viewport-render.worker-BKnJyAEz.js 634.08 kB
dist/assets/web_engine-CjnzAIfx.wasm 16,238.37 kB │ gzip: 3,856.73 kB
dist/assets/index-BgTbQCE2.css 15.35 kB │ gzip: 3.91 kB
dist/assets/index-C3AJuKSc.js 1,190.30 kB │ gzip: 316.69 kB
✓ built in 480ms
[plugin rolldown:vite-resolve] Module "module" has been externalized for browser compatibility, imported by "/home/mes123456/workinf_Blender_Wasm/web/app/src/vendor/blender/web_engine.js". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
[plugin builtin:vite-reporter]
(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
> WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-production.spec.ts
> blender-web-editor@0.1.0-rc.1 test:e2e
> playwright test --config playwright.config.ts --workers=1 tests/e2e/wbv2-modifier-reader-batch-production.spec.ts
Running 1 test using 1 worker
✓ 1 tests/e2e/wbv2-modifier-reader-batch-production.spec.ts:12:1 › modifier reader batch preserves concrete Blender Main metadata (1.9s)
1 passed (2.8s)
[WebServer] (node:37899) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)
(node:37953) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.

View File

@@ -0,0 +1,187 @@
{
"schemaVersion": 1,
"task": "WBV2-P1146-001",
"parentTask": "WBV2-P1146-000",
"status": "done",
"goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_datatransfer, MOD_dynamicpaint, MOD_explode, MOD_fluid 的真实 modifier/RNA 元数据。",
"scope": {
"gap": "capability:MODIFIER_READER_BATCH",
"ownerFamily": "MODIFIER",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"node tools/web/check-task-context.mjs --task WBV2-P1146-001 --write"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2045,
"contextRemainingTokens": 510
},
"source": {
"bytes": 7859,
"tokens": 1966
},
"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": "tests/files/web/modifier_reader_batch_scene.blend",
"bytes": 98591,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts",
"bytes": 3939,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1146-001/module-receipt.json",
"bytes": 6621,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"bytes": 5325,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P1146-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-P1146-001.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P1146-000/manifest.json",
"parentStatus": "docs/status/WBV2-P1146-000.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P1146-001.md",
"tests/golden/WBV2-P1146-000/manifest.json",
"docs/status/WBV2-P1146-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-P1146-000",
"parentTask": "WBV2-P1145-001",
"status": "done",
"nextTask": "WBV2-P1146-001",
"artifactCount": 4
},
"statusSummary": [
"# WBV2-P1146-000 status",
"- task: `WBV2-P1146-000`; parent: `WBV2-P1145-001`; status: `done`",
"- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed",
"- source-backed batch authorized: `MODIFIER_READER_BATCH` (9 units)",
"- dynamic inventory: `3745` units; verified `350`; unverified `3395`; bound delta `0`",
"- nextTask: `WBV2-P1146-001`"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 2300,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 46,
"taskTokens": 575
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 3830,
"lines": 56,
"tokens": 958
},
{
"path": "docs/tasks/WBV2-P1146-001.md",
"bytes": 2300,
"lines": 46,
"tokens": 575
},
{
"path": "tests/golden/WBV2-P1146-000/manifest.json",
"bytes": 1376,
"lines": 43,
"tokens": 344
},
{
"path": "docs/status/WBV2-P1146-000.md",
"bytes": 353,
"lines": 8,
"tokens": 89
}
],
"sourceTokens": 1966,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 1966,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2990,
"serializedContextTokens": 653,
"withinBudget": true
}
}

View File

@@ -0,0 +1,42 @@
{
"schemaVersion": 1,
"task": "WBV2-P1147-000",
"parentTask": "WBV2-P1146-001",
"operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "MODULE_EXECUTION_QUEUE_BRIDGE",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "5c95d240abbd23915c75dcf9ded02818316d821eccaf183412e72eaf27510102"
},
"plan": {
"path": "tests/golden/WBV2-P1147-000/module-execution-plan.json",
"sha256": "da9a713edd400bc01458e62c72efea743743a21e703289cf630ac0471b8109e1"
},
"report": {
"path": "tests/golden/WBV2-P1147-000/successor-authorization-report.json",
"sha256": "b01c1ed09739a9fa2d162de6905cd56f6ad29c5b6d4fbc48770de8e66894598f"
},
"status": {
"path": "docs/status/WBV2-P1147-000.md",
"sha256": "abc154efb5281fb5a0133283fdc7a9fbdbf19f6c59497807469033c015a4301e"
}
},
"assertions": {
"sourceBackedSuccessor": true,
"moduleId": "MODIFIER_READER_BATCH_TWO",
"batchSize": 8,
"inventoryTotal": 6900,
"effectiveCompleted": 290,
"effectivePending": 6609,
"dynamicUnitCount": 3745,
"dynamicVerifiedUnits": 359,
"dynamicUnverifiedUnits": 3386,
"boundUnitDelta": 0,
"fullHistoricalReproduction": false
},
"nextTask": "WBV2-P1147-001"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,36 @@
{
"schemaVersion": 1,
"task": "WBV2-P1147-000",
"operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH",
"taskClass": "QUEUE_ENABLEMENT",
"status": "PASS",
"parent": {
"task": "WBV2-P1146-001",
"manifest": "tests/golden/WBV2-P1146-001/manifest.json",
"manifestSha256": "5c95d240abbd23915c75dcf9ded02818316d821eccaf183412e72eaf27510102"
},
"module": {
"moduleId": "MODIFIER_READER_BATCH_TWO",
"task": "WBV2-P1147-001",
"batchSize": 8,
"sourceUnits": [
"modifier-source:MOD_laplaciandeform",
"modifier-source:MOD_laplaciansmooth",
"modifier-source:MOD_mask",
"modifier-source:MOD_mesh_to_volume",
"rna-struct:LaplacianDeformModifier",
"rna-struct:LaplacianSmoothModifier",
"rna-struct:MaskModifier",
"rna-struct:MeshToVolumeModifier"
],
"sourceBacked": true
},
"inventory": {
"unitCount": 3745,
"verifiedUnits": 359,
"unverifiedUnits": 3386,
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"boundUnitDelta": 0
},
"nextTask": "WBV2-P1147-001"
}

View File

@@ -0,0 +1,177 @@
{
"schemaVersion": 1,
"task": "WBV2-P1147-000",
"parentTask": "WBV2-P1146-001",
"status": "done",
"goal": "授权一个共享 Blender Main/WASM/Chromium modifier reader 批次,验证 Laplacian Deform、Laplacian Smooth、Mask、Mesh to Volume 及其 RNA 元数据。",
"scope": {
"gap": "capability:MODIFIER_READER_BATCH_TWO",
"ownerFamily": "MODIFIER",
"implementationClass": "QUEUE_ONLY"
},
"commands": [
"node tools/web/check-task-context.mjs --task WBV2-P1147-000 --write"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 241,
"contextRemainingTokens": 59
},
"source": {
"bytes": 9663,
"tokens": 2417
},
"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": "tests/files/web/modifier_reader_batch_two_scene.blend",
"bytes": 98528,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"bytes": 3992,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1147-000/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P1147-000.md",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
}
],
"totals": {
"files": 0,
"bytes": 0,
"tokens": 0
}
},
"exitCriteria": [
"prior evidence remains hash-bound",
"batch source mapping is explicit",
"inventory remains source-derived"
],
"nextTask": "WBV2-P1147-001",
"sourceDocuments": {
"queue": "docs/EXECUTION_QUEUE.md",
"taskCard": "docs/tasks/WBV2-P1147-000.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P1146-001/manifest.json",
"parentStatus": "docs/status/WBV2-P1146-001.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P1147-000.md",
"tests/golden/WBV2-P1146-001/manifest.json",
"docs/status/WBV2-P1146-001.md"
],
"machineOnly": [
"tests/golden/WBV2/task-index.json",
"tests/golden/M15-03A/task-catalog.jsonl"
],
"optionalByNeed": [
"docs/WEB_BLENDER_MODELER_V1_SCOPE.md",
"任务卡列出的精确协议/生产路径",
"任务卡明确命名的长期计划小节"
],
"forbiddenByDefault": [
"完整 CURRENT_EXECUTION_PLAN.md",
"完整 PROJECT_STATUS_AND_NEXT_WORK.md",
"全部 docs/status/*.md",
"完整 parity/WBS 计划",
"README 历史和 test-results/"
]
},
"parent": {
"manifest": {
"schemaVersion": 1,
"task": "WBV2-P1146-001",
"parentTask": "WBV2-P1146-000",
"status": "done",
"nextTask": "WBV2-P1147-000",
"artifactCount": 20
},
"statusSummary": [
"# WBV2-P1146-001 status",
"- task: `WBV2-P1146-001`; module: `MODIFIER_READER_BATCH`; status: `done`",
"- source hashes stable: `true`; commands passed: `4`",
"- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt",
"- dynamic source inventory: `3745` units; verified `359`; unverified `3386`; this-segment binding delta: `9`; planning estimate `5200` (non-binding)",
"- historical 6900-entry inventory remains read-only; full-family parity: `false`",
"- nextTask: `WBV2-P1147-000`"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 1364,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 34,
"taskTokens": 341
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 3830,
"lines": 56,
"tokens": 958
},
{
"path": "docs/tasks/WBV2-P1147-000.md",
"bytes": 1364,
"lines": 34,
"tokens": 341
},
{
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"bytes": 3947,
"lines": 2,
"tokens": 987
},
{
"path": "docs/status/WBV2-P1146-001.md",
"bytes": 522,
"lines": 9,
"tokens": 131
}
],
"sourceTokens": 2417,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 2417,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 3441,
"serializedContextTokens": 631,
"withinBudget": true
}
}

View File

@@ -0,0 +1,2 @@
context-governance-ok task=WBV2-P1147-001 contentTokens=1972 envelopeTokens=658/1024 estimatedTokens=2996/3500 inputs=0 commands=1
{"schemaVersion":1,"operation":"BLENDER_WEB_EXECUTION_CONTROL_PLANE","status":"BLOCKED","authority":{"executionPointer":"docs/EXECUTION_QUEUE.md","productCapabilities":"docs/BLENDER_WASM_CAPABILITY_MATRIX_TEMPLATE.json","legacyCoverage":"tests/golden/M15-03A/next-task-plan.json","historicalEvidence":"tests/golden/corrective/"},"queue":{"currentTask":"WBV2-P1147-001","parentManifest":"tests/golden/WBV2-P1147-000/manifest.json","parentTask":"WBV2-P1147-000","parentNextTask":"WBV2-P1147-001","activeCatalogTask":null,"legacyCoverageTask":"M16-GAP-00282","legacyCoverageParentManifest":"tests/golden/M16-GAP-00281/manifest.json","legacyCoverageState":"active","runnableInputs":null},"efficiency":{"legacyGapTasks":6900,"legacyCompleted":281,"legacyPending":6618,"capabilityClusters":3,"mappedLegacyGaps":9,"averageGapsPerCapability":3,"productiveLane":0,"rule":"one capability task may close multiple legacy cases; legacy cases remain regression coverage"},"dynamicInventory":{"path":"tests/golden/WBV2/dynamic-inventory.json","manifestPath":"tests/golden/WBV2/dynamic-inventory-manifest.json","sourceTreeSha256":"600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202","sourceFiles":6206,"unitCount":3745,"planningEstimate":5200,"hardTarget":false,"verifiedUnits":367,"unverifiedUnits":3378},"capabilityClusters":{"ASSET_CATALOG":{"capabilityId":"CAP-ASSET-CATALOG-MUTATION","sourceGaps":5,"parityLevel":"L0","targetParityLevel":"L4","lifecycleStatus":"planned"},"MODIFIER":{"capabilityId":"CAP-MODIFIER-STATE-MUTATION","sourceGaps":2,"parityLevel":"L0","targetParityLevel":"L3","lifecycleStatus":"planned"},"MESH":{"capabilityId":"CAP-MESH-POSITIVE-EDIT","sourceGaps":2,"parityLevel":"L0","targetParityLevel":"L3","lifecycleStatus":"planned"}},"issues":[{"code":"DYNAMIC_INVENTORY_MANIFEST_HASH_DRIFT","detail":"tests/golden/WBV2/dynamic-inventory-check-report.json"}],"remediation":["inspect the control-plane issue and preserve its evidence"],"allowUnrunnable":true,"inputDigest":"ef7843c2b380731839b33dfc71d4d81d01a75b158d59083f9367cd0bf86494e0"}

View File

@@ -0,0 +1,4 @@
v2-task-index-generated tasks=75 active=NONE output=tests/golden/WBV2/task-index.json
task-context-ok task=WBV2-P1147-001 parent=WBV2-P1147-000 contentTokens=1972 envelopeTokens=658/1024 estimatedTokens=2996/3500 taskBytes=2313 next=NONE output=tests/golden/WBV2-P1147-001/task-context.json
wbv2-module-coverage-bound task=WBV2-P1147-001 module=MODIFIER_READER_BATCH_TWO added=8 verified=367 unverified=3378
module-task-complete task=WBV2-P1147-001 module=MODIFIER_READER_BATCH_TWO next=null commands=4

View File

@@ -0,0 +1,111 @@
{
"schemaVersion": 1,
"task": "WBV2-P1147-001",
"parentTask": "WBV2-P1147-000",
"operation": "MODULE_FUNCTION_EXECUTION",
"taskClass": "MODULE",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "BLENDER_WEB_FUNCTION_MODULE",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P1147-000/manifest.json",
"sha256": "dd7cd4be22eba869cc5df37d700ac5d4a403c759ba925c269ae14fa5bf26678a"
},
"source1": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc",
"sha256": "d56f120e37066fe9a892ec4090fffec03e149f82c115a6ea8356330a4e8d2096"
},
"source2": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc",
"sha256": "aa85424124a4bc4760ffdced29d3a4b90fbd51b40861366e6b0ab864a29075ca"
},
"source3": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc",
"sha256": "601b7197bff84e456278c3551b5aa94c983cd69b32aa8d0b961349a68e38f736"
},
"source4": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc",
"sha256": "3e71b126cfd20409173f4c9b6de7430ab9ff8a8ea818a511b2e4d7c6a4ecdba7"
},
"source5": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"sha256": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"
},
"source6": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"sha256": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"
},
"source7": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"sha256": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"
},
"source8": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"sha256": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"
},
"source9": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "f6fbd04315c48ad4dfbf109b91e5b350550d23c227e5c11a71a58f09e923c990"
},
"source10": {
"path": "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"sha256": "94eb444af368591967add4c091bcfbf7904d0d0cdf4a770239e70d35d6bdaaee"
},
"source11": {
"path": "tests/files/web/modifier_reader_batch_two_scene.blend",
"sha256": "e3e6ebfd2c96f2a7fe794dc2f6716e0190adee816297040f65a66f6f60a45c65"
},
"source12": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "32bc36aba563fe1ed0fb5d0292ca8a3ada1eecd6d45e38d9dcde565f02a312fe"
},
"evidence1": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"moduleReceipt": {
"path": "tests/golden/WBV2-P1147-001/module-receipt.json",
"sha256": "a9bd656dd25a3aa6cff8e11385dfd48d6c4adda7561df1106890d5d13b5882fe"
},
"status": {
"path": "docs/status/WBV2-P1147-001.md",
"sha256": "31191046d3f82383da156e3e8a540e8af718c3625928670f94324e9625ca38dc"
},
"log": {
"path": "tests/golden/WBV2-P1147-001/module-run.log",
"sha256": "f33b7fc10f005d8fe6790e3074e3b6ceb5f5e6dc7c4d0555db0845a0cceba47f"
},
"plan": {
"path": "tests/golden/WBV2-P1147-000/module-execution-plan.json",
"sha256": "d6ac0c2f344c14b8ead86275d4e9578813312273ff04b790fcd240815006481c"
},
"taskContext": {
"path": "tests/golden/WBV2-P1147-001/task-context.json",
"sha256": "2052f931c85b574e0223997f8a493e731411a8497337b28bfcaaf0c2544c1a28"
}
},
"assertions": {
"moduleId": "MODIFIER_READER_BATCH_TWO",
"sourceBacked": true,
"positiveCases": 6,
"negativeCases": 3,
"recoveryCases": 3,
"commandCount": 4,
"reusedReceiptCount": 1,
"sourceUnchanged": true,
"fullFamilyParity": false,
"dynamicInventoryPath": "tests/golden/WBV2/dynamic-inventory.json",
"dynamicSourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"dynamicUnitCount": 3745,
"dynamicVerifiedUnits": 359,
"dynamicUnverifiedUnits": 3386,
"planningEstimate": 5200,
"historicalInventoryTotal": 6900,
"historicalEffectiveCompleted": 290,
"historicalEffectivePending": 6609,
"historicalReproduction": false
},
"nextTask": "WBV2-P1148-000"
}

View File

@@ -0,0 +1,224 @@
{
"schemaVersion": 1,
"task": "WBV2-P1148-001",
"operation": "MODIFIER_READER_BATCH_TWO_CHROMIUM_SAVE_REOPEN",
"browser": "chromium",
"queueMutation": false,
"fixture": "tests/files/web/modifier_reader_batch_three_scene.blend",
"fixtureSha256": "bf75a51df11f005991423354eba4adab59fb3c2e2382ecf3993c4b1dea2cc739",
"expectedTypes": [
"REMESH",
"SKIN",
"WEIGHTED_NORMAL",
"WARP"
],
"sourceUnits": [
"modifier-source:MOD_remesh",
"modifier-source:MOD_skin",
"modifier-source:MOD_weighted_normal",
"modifier-source:MOD_warp",
"rna-struct:RemeshModifier",
"rna-struct:SkinModifier",
"rna-struct:WeightedNormalModifier",
"rna-struct:WarpModifier"
],
"before": [
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1879751496",
"name": "Remesh",
"type": "REMESH",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1879751496,
"typeCode": 41
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1853982967",
"name": "Skin",
"type": "SKIN",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"branchSmoothing": 0,
"flag": 1,
"mode": 7,
"persistentUid": 1853982967,
"skinFlags": 0,
"symmetryAxes": 1,
"typeCode": 42
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1800999687",
"name": "Weighted Normal",
"type": "WEIGHTED_NORMAL",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"flag": 1,
"mode": 7,
"persistentUid": 1800999687,
"typeCode": 54,
"weight": 50
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:614917079",
"name": "Warp",
"type": "WARP",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 5,
"mode": 3,
"persistentUid": 614917079,
"typeCode": 35
}
}
],
"types": [
"REMESH",
"SKIN",
"WEIGHTED_NORMAL",
"WARP"
],
"after": [
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1879751496",
"name": "Remesh",
"type": "REMESH",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1879751496,
"typeCode": 41
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1853982967",
"name": "Skin",
"type": "SKIN",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"branchSmoothing": 0,
"flag": 1,
"mode": 7,
"persistentUid": 1853982967,
"skinFlags": 0,
"symmetryAxes": 1,
"typeCode": 42
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1800999687",
"name": "Weighted Normal",
"type": "WEIGHTED_NORMAL",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"flag": 1,
"mode": 7,
"persistentUid": 1800999687,
"typeCode": 54,
"weight": 50
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:614917079",
"name": "Warp",
"type": "WARP",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 5,
"mode": 3,
"persistentUid": 614917079,
"typeCode": 35
}
}
],
"second": [
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1879751496",
"name": "Remesh",
"type": "REMESH",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1879751496,
"typeCode": 41
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1853982967",
"name": "Skin",
"type": "SKIN",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"branchSmoothing": 0,
"flag": 1,
"mode": 7,
"persistentUid": 1853982967,
"skinFlags": 0,
"symmetryAxes": 1,
"typeCode": 42
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1800999687",
"name": "Weighted Normal",
"type": "WEIGHTED_NORMAL",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"flag": 1,
"mode": 7,
"persistentUid": 1800999687,
"typeCode": 54,
"weight": 50
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:614917079",
"name": "Warp",
"type": "WARP",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 5,
"mode": 3,
"persistentUid": 614917079,
"typeCode": 35
}
}
],
"saveReopenExact": true,
"deterministicExact": true,
"savedSha256": "bf75a51df11f005991423354eba4adab59fb3c2e2382ecf3993c4b1dea2cc739",
"malformed": {
"code": "BLEND_READ_FAILED",
"message": "Input is not an uncompressed, gzip, or zstd Blender file"
}
}

View File

@@ -0,0 +1,128 @@
{
"schemaVersion": 1,
"task": "WBV2-P1147-001",
"operation": "MODULE_FUNCTION_EXECUTION",
"moduleId": "MODIFIER_READER_BATCH_TWO",
"status": "PASS",
"source": {
"paths": [
"blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"tests/files/web/modifier_reader_batch_two_scene.blend",
"web/app/src/vendor/blender/web_engine.wasm"
],
"before": {
"blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc": "d56f120e37066fe9a892ec4090fffec03e149f82c115a6ea8356330a4e8d2096",
"blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc": "aa85424124a4bc4760ffdced29d3a4b90fbd51b40861366e6b0ab864a29075ca",
"blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc": "601b7197bff84e456278c3551b5aa94c983cd69b32aa8d0b961349a68e38f736",
"blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc": "3e71b126cfd20409173f4c9b6de7430ab9ff8a8ea818a511b2e4d7c6a4ecdba7",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b",
"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "f6fbd04315c48ad4dfbf109b91e5b350550d23c227e5c11a71a58f09e923c990",
"web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts": "94eb444af368591967add4c091bcfbf7904d0d0cdf4a770239e70d35d6bdaaee",
"tests/files/web/modifier_reader_batch_two_scene.blend": "e3e6ebfd2c96f2a7fe794dc2f6716e0190adee816297040f65a66f6f60a45c65",
"web/app/src/vendor/blender/web_engine.wasm": "32bc36aba563fe1ed0fb5d0292ca8a3ada1eecd6d45e38d9dcde565f02a312fe"
},
"after": {
"blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc": "d56f120e37066fe9a892ec4090fffec03e149f82c115a6ea8356330a4e8d2096",
"blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc": "aa85424124a4bc4760ffdced29d3a4b90fbd51b40861366e6b0ab864a29075ca",
"blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc": "601b7197bff84e456278c3551b5aa94c983cd69b32aa8d0b961349a68e38f736",
"blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc": "3e71b126cfd20409173f4c9b6de7430ab9ff8a8ea818a511b2e4d7c6a4ecdba7",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b",
"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "f6fbd04315c48ad4dfbf109b91e5b350550d23c227e5c11a71a58f09e923c990",
"web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts": "94eb444af368591967add4c091bcfbf7904d0d0cdf4a770239e70d35d6bdaaee",
"tests/files/web/modifier_reader_batch_two_scene.blend": "e3e6ebfd2c96f2a7fe794dc2f6716e0190adee816297040f65a66f6f60a45c65",
"web/app/src/vendor/blender/web_engine.wasm": "32bc36aba563fe1ed0fb5d0292ca8a3ada1eecd6d45e38d9dcde565f02a312fe"
},
"unchanged": true
},
"reusedReceipts": [
{
"manifest": "tests/golden/WBV2-P1107-000/manifest.json",
"report": "tests/golden/WBV2-P1107-000/module-receipt.json",
"manifestSha256": "a53ebdc52db5dcf27d44e938e5551f1ee2adae8e46c3fe8661604ee6b1000f8c",
"reportSha256": "6dd419799e1a4b9251328d9496f2459d148cd89118740a06b0ee6ffb78e0b1d2"
}
],
"cases": {
"positive": [
"MOD_laplaciandeform type is read from Blender Main",
"MOD_laplaciansmooth type is read from Blender Main",
"MOD_mask type is read from Blender Main",
"MOD_mesh_to_volume 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": "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",
"exitCode": 0
},
{
"command": "npm --prefix web run typecheck",
"exitCode": 0
},
{
"command": "npm --prefix web run build",
"exitCode": 0
},
{
"command": "WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"exitCode": 0
}
],
"verification": {
"required": [
"sourceHash",
"wasmBuild",
"positiveMainMutation",
"negativeNoMutation",
"undoRedo",
"saveReopen",
"aggregateManifest"
],
"chromiumOnly": true,
"fullFamilyParity": false
},
"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": "655584256c51e0934af705e9bccec92b64b55df1ce480a08f8a98afbb17e552a",
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"unitCount": 3745,
"planningEstimate": 5200,
"hardTarget": false,
"verifiedUnits": 359,
"unverifiedUnits": 3386
}
},
"nextTask": null
}

View File

@@ -0,0 +1,49 @@
> 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
ninja: no work to do.
> npm --prefix web run typecheck
> blender-web-editor@0.1.0-rc.1 typecheck
> tsc -p tsconfig.json --noEmit
> npm --prefix web run build
> blender-web-editor@0.1.0-rc.1 build
> tsc -p tsconfig.json && vite build --config app/vite.config.ts
vite v8.2.0 building client environment for production...

transforming...✓ 102 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html 0.46 kB │ gzip: 0.30 kB
dist/assets/storage.worker-D9TqXsGS.js 66.59 kB
dist/assets/web-engine.worker-BfTMiTY1.js 362.11 kB
dist/assets/viewport-render.worker-BKnJyAEz.js 634.08 kB
dist/assets/web_engine-CjnzAIfx.wasm 16,238.37 kB │ gzip: 3,856.73 kB
dist/assets/index-BgTbQCE2.css 15.35 kB │ gzip: 3.91 kB
dist/assets/index-C3AJuKSc.js 1,190.30 kB │ gzip: 316.69 kB
✓ built in 454ms
[plugin rolldown:vite-resolve] Module "module" has been externalized for browser compatibility, imported by "/home/mes123456/workinf_Blender_Wasm/web/app/src/vendor/blender/web_engine.js". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
[plugin builtin:vite-reporter]
(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
> WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts
> blender-web-editor@0.1.0-rc.1 test:e2e
> playwright test --config playwright.config.ts --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts
Running 1 test using 1 worker
✓ 1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts:12:1 › second modifier reader batch preserves concrete Blender Main metadata (1.9s)
1 passed (2.8s)
[WebServer] (node:41651) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)
(node:41705) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.

View File

@@ -0,0 +1,187 @@
{
"schemaVersion": 1,
"task": "WBV2-P1147-001",
"parentTask": "WBV2-P1147-000",
"status": "in_progress",
"goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_laplaciandeform, MOD_laplaciansmooth, MOD_mask, MOD_shrinkwrap 的真实 modifier/RNA 元数据。",
"scope": {
"gap": "capability:MODIFIER_READER_BATCH_TWO",
"ownerFamily": "MODIFIER",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"node tools/web/check-task-context.mjs --task WBV2-P1147-001 --write"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2024,
"contextRemainingTokens": 504
},
"source": {
"bytes": 7880,
"tokens": 1972
},
"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": "tests/files/web/modifier_reader_batch_two_scene.blend",
"bytes": 98565,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"bytes": 3982,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1147-001/module-receipt.json",
"bytes": 6352,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"bytes": 5849,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P1147-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-P1147-001.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P1147-000/manifest.json",
"parentStatus": "docs/status/WBV2-P1147-000.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P1147-001.md",
"tests/golden/WBV2-P1147-000/manifest.json",
"docs/status/WBV2-P1147-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-P1147-000",
"parentTask": "WBV2-P1146-001",
"status": "done",
"nextTask": "WBV2-P1147-001",
"artifactCount": 4
},
"statusSummary": [
"# WBV2-P1147-000 status",
"- task: `WBV2-P1147-000`; parent: `WBV2-P1146-001`; status: `done`",
"- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed",
"- source-backed batch authorized: `MODIFIER_READER_BATCH_TWO` (8 units)",
"- dynamic inventory: `3745` units; verified `359`; unverified `3386`; bound delta `0`",
"- nextTask: `WBV2-P1147-001`"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 2313,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 46,
"taskTokens": 579
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 3830,
"lines": 56,
"tokens": 958
},
{
"path": "docs/tasks/WBV2-P1147-001.md",
"bytes": 2313,
"lines": 46,
"tokens": 579
},
{
"path": "tests/golden/WBV2-P1147-000/manifest.json",
"bytes": 1380,
"lines": 43,
"tokens": 345
},
{
"path": "docs/status/WBV2-P1147-000.md",
"bytes": 357,
"lines": 8,
"tokens": 90
}
],
"sourceTokens": 1972,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 1972,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2996,
"serializedContextTokens": 658,
"withinBudget": true
}
}

View File

@@ -0,0 +1,42 @@
{
"schemaVersion": 1,
"task": "WBV2-P1148-000",
"parentTask": "WBV2-P1147-001",
"operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "MODULE_EXECUTION_QUEUE_BRIDGE",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "6c9d7b844434668b2614d7215e44c146f7adf081480ec71bff6d534d0df6dbce"
},
"plan": {
"path": "tests/golden/WBV2-P1148-000/module-execution-plan.json",
"sha256": "4a0c58c01a81a4e417d55dc6c5da7ee1d6c18163b26a931c2876dafb21f5f4d2"
},
"report": {
"path": "tests/golden/WBV2-P1148-000/successor-authorization-report.json",
"sha256": "6ce2a8d8fd598a9700b1cad03962bad40be755522d1af9221a8cf0f1287171fc"
},
"status": {
"path": "docs/status/WBV2-P1148-000.md",
"sha256": "30c5ac22b85e9537e3c910480d070f8cd67b7b744efe13d3967a28d54857d2d4"
}
},
"assertions": {
"sourceBackedSuccessor": true,
"moduleId": "MODIFIER_READER_BATCH_THREE",
"batchSize": 8,
"inventoryTotal": 6900,
"effectiveCompleted": 290,
"effectivePending": 6609,
"dynamicUnitCount": 3745,
"dynamicVerifiedUnits": 369,
"dynamicUnverifiedUnits": 3376,
"boundUnitDelta": 0,
"fullHistoricalReproduction": false
},
"nextTask": "WBV2-P1148-001"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,36 @@
{
"schemaVersion": 1,
"task": "WBV2-P1148-000",
"operation": "AUTHORIZE_SOURCE_BACKED_MODULE_BATCH",
"taskClass": "QUEUE_ENABLEMENT",
"status": "PASS",
"parent": {
"task": "WBV2-P1147-001",
"manifest": "tests/golden/WBV2-P1147-001/manifest.json",
"manifestSha256": "6c9d7b844434668b2614d7215e44c146f7adf081480ec71bff6d534d0df6dbce"
},
"module": {
"moduleId": "MODIFIER_READER_BATCH_THREE",
"task": "WBV2-P1148-001",
"batchSize": 8,
"sourceUnits": [
"modifier-source:MOD_remesh",
"modifier-source:MOD_skin",
"modifier-source:MOD_weighted_normal",
"modifier-source:MOD_warp",
"rna-struct:RemeshModifier",
"rna-struct:SkinModifier",
"rna-struct:WeightedNormalModifier",
"rna-struct:WarpModifier"
],
"sourceBacked": true
},
"inventory": {
"unitCount": 3745,
"verifiedUnits": 369,
"unverifiedUnits": 3376,
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"boundUnitDelta": 0
},
"nextTask": "WBV2-P1148-001"
}

View File

@@ -0,0 +1,43 @@
v2-task-index-generated tasks=77 active=NONE output=tests/golden/WBV2/task-index.json
task-context-ok task=WBV2-P1148-001 parent=WBV2-P1148-000 contentTokens=1963 envelopeTokens=661/1024 estimatedTokens=2987/3500 taskBytes=2273 next=NONE output=tests/golden/WBV2-P1148-001/task-context.json
node:fs:484
return binding.readFileUtf8(path, stringToFlags(options.flag));
^
Error: ENOENT: no such file or directory, open '/home/mes123456/workinf_Blender_Wasm/tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json'
at Object.readFileSync (node:fs:484:20)
at read (file:///home/mes123456/workinf_Blender_Wasm/tools/web/bind-wbv2-module-coverage.mjs:9:27)
at json (file:///home/mes123456/workinf_Blender_Wasm/tools/web/bind-wbv2-module-coverage.mjs:10:35)
at file:///home/mes123456/workinf_Blender_Wasm/tools/web/bind-wbv2-module-coverage.mjs:32:20
at ModuleJob.run (node:internal/modules/esm/module_job:439:25)
at async node:internal/modules/esm/loader:643:26
at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5) {
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: '/home/mes123456/workinf_Blender_Wasm/tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json'
}
Node.js v24.19.0
node:internal/errors:985
const err = new Error(message);
^
Error: Command failed: /home/mes123456/.nvm/versions/node/v24.19.0/bin/node /home/mes123456/workinf_Blender_Wasm/tools/web/bind-wbv2-module-coverage.mjs --task WBV2-P1148-001
at genericNodeError (node:internal/errors:985:15)
at wrappedFn (node:internal/errors:539:14)
at checkExecSyncError (node:child_process:942:11)
at execFileSync (node:child_process:978:15)
at file:///home/mes123456/workinf_Blender_Wasm/tools/web/run-wbv2-module-task.mjs:99:5
at ModuleJob.run (node:internal/modules/esm/module_job:439:25)
at async node:internal/modules/esm/loader:643:26
at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5) {
status: 1,
signal: null,
output: [ null, null, null ],
pid: 135663,
stdout: null,
stderr: null
}
Node.js v24.19.0

View File

@@ -0,0 +1,111 @@
{
"schemaVersion": 1,
"task": "WBV2-P1148-001",
"parentTask": "WBV2-P1148-000",
"operation": "MODULE_FUNCTION_EXECUTION",
"taskClass": "MODULE",
"status": "done",
"enablingTask": true,
"parityStateChange": false,
"runtime": "BLENDER_WEB_FUNCTION_MODULE",
"artifacts": {
"parentManifest": {
"path": "tests/golden/WBV2-P1148-000/manifest.json",
"sha256": "7f762c08fcc1df876a427a89358d3713944bd42f06f264fabf365a217c4d98e6"
},
"source1": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc",
"sha256": "e6b52cbced435c619a2a5e62ee23c3a2bb8b0dc4a3af7308854130895ce10f0d"
},
"source2": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc",
"sha256": "63736037a0bb5cc553668e0e12ab5ca8f5fee4499a9d0baf7edc1edaa5c3723b"
},
"source3": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc",
"sha256": "38d31c99424448a9ce76229f937fab5f60bf87dbec8fabdbee705af715467cb9"
},
"source4": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc",
"sha256": "68da38d98c638637f331120e84781a13d06c80425ccdaa8894c6000af0a2e4b3"
},
"source5": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"sha256": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"
},
"source6": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"sha256": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"
},
"source7": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"sha256": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"
},
"source8": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"sha256": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b"
},
"source9": {
"path": "blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"sha256": "f6fbd04315c48ad4dfbf109b91e5b350550d23c227e5c11a71a58f09e923c990"
},
"source10": {
"path": "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"sha256": "3520b2d03d803d923062c58fdd60530cc8540040bfb35a00c439cfe50167aa03"
},
"source11": {
"path": "tests/files/web/modifier_reader_batch_three_scene.blend",
"sha256": "bf75a51df11f005991423354eba4adab59fb3c2e2382ecf3993c4b1dea2cc739"
},
"source12": {
"path": "web/app/src/vendor/blender/web_engine.wasm",
"sha256": "32bc36aba563fe1ed0fb5d0292ca8a3ada1eecd6d45e38d9dcde565f02a312fe"
},
"moduleReceipt": {
"path": "tests/golden/WBV2-P1148-001/module-receipt.json",
"sha256": "6c2b32e28fc5a853a5b447efe12b718b2947d91b682e405f4ff9d5e4bf9075c9"
},
"status": {
"path": "docs/status/WBV2-P1148-001.md",
"sha256": "bbfd0890471b04498c501960087fb99b4547638115548a0d00af8ed577be546d"
},
"log": {
"path": "tests/golden/WBV2-P1148-001/module-run.log",
"sha256": "cc3e3b0070f8daa45a28877ec583127d882dfbf9929ba48b098dd083109fc341"
},
"plan": {
"path": "tests/golden/WBV2-P1148-000/module-execution-plan.json",
"sha256": "ddef158adc3211d9cf86d38c288dd9c2ce47c32abae400d2b5929838044e139f"
},
"taskContext": {
"path": "tests/golden/WBV2-P1148-001/task-context.json",
"sha256": "9e01db52a3744f32ed5867619b62633be58f9a450909151a0be32067b47744b9"
},
"evidence1": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
}
},
"assertions": {
"moduleId": "MODIFIER_READER_BATCH_THREE",
"sourceBacked": true,
"positiveCases": 6,
"negativeCases": 3,
"recoveryCases": 3,
"commandCount": 4,
"reusedReceiptCount": 1,
"sourceUnchanged": true,
"fullFamilyParity": false,
"dynamicInventoryPath": "tests/golden/WBV2/dynamic-inventory.json",
"dynamicSourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"dynamicUnitCount": 3745,
"dynamicVerifiedUnits": 377,
"dynamicUnverifiedUnits": 3368,
"planningEstimate": 5200,
"historicalInventoryTotal": 6900,
"historicalEffectiveCompleted": 290,
"historicalEffectivePending": 6609,
"historicalReproduction": false
},
"nextTask": null
}

View File

@@ -0,0 +1,224 @@
{
"schemaVersion": 1,
"task": "WBV2-P1148-001",
"operation": "MODIFIER_READER_BATCH_TWO_CHROMIUM_SAVE_REOPEN",
"browser": "chromium",
"queueMutation": false,
"fixture": "tests/files/web/modifier_reader_batch_three_scene.blend",
"fixtureSha256": "bf75a51df11f005991423354eba4adab59fb3c2e2382ecf3993c4b1dea2cc739",
"expectedTypes": [
"REMESH",
"SKIN",
"WEIGHTED_NORMAL",
"WARP"
],
"sourceUnits": [
"modifier-source:MOD_remesh",
"modifier-source:MOD_skin",
"modifier-source:MOD_weighted_normal",
"modifier-source:MOD_warp",
"rna-struct:RemeshModifier",
"rna-struct:SkinModifier",
"rna-struct:WeightedNormalModifier",
"rna-struct:WarpModifier"
],
"before": [
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1879751496",
"name": "Remesh",
"type": "REMESH",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1879751496,
"typeCode": 41
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1853982967",
"name": "Skin",
"type": "SKIN",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"branchSmoothing": 0,
"flag": 1,
"mode": 7,
"persistentUid": 1853982967,
"skinFlags": 0,
"symmetryAxes": 1,
"typeCode": 42
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1800999687",
"name": "Weighted Normal",
"type": "WEIGHTED_NORMAL",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"flag": 1,
"mode": 7,
"persistentUid": 1800999687,
"typeCode": 54,
"weight": 50
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:614917079",
"name": "Warp",
"type": "WARP",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 5,
"mode": 3,
"persistentUid": 614917079,
"typeCode": 35
}
}
],
"types": [
"REMESH",
"SKIN",
"WEIGHTED_NORMAL",
"WARP"
],
"after": [
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1879751496",
"name": "Remesh",
"type": "REMESH",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1879751496,
"typeCode": 41
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1853982967",
"name": "Skin",
"type": "SKIN",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"branchSmoothing": 0,
"flag": 1,
"mode": 7,
"persistentUid": 1853982967,
"skinFlags": 0,
"symmetryAxes": 1,
"typeCode": 42
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1800999687",
"name": "Weighted Normal",
"type": "WEIGHTED_NORMAL",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"flag": 1,
"mode": 7,
"persistentUid": 1800999687,
"typeCode": 54,
"weight": 50
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:614917079",
"name": "Warp",
"type": "WARP",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 5,
"mode": 3,
"persistentUid": 614917079,
"typeCode": 35
}
}
],
"second": [
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1879751496",
"name": "Remesh",
"type": "REMESH",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 1,
"mode": 3,
"persistentUid": 1879751496,
"typeCode": 41
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1853982967",
"name": "Skin",
"type": "SKIN",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"branchSmoothing": 0,
"flag": 1,
"mode": 7,
"persistentUid": 1853982967,
"skinFlags": 0,
"symmetryAxes": 1,
"typeCode": 42
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:1800999687",
"name": "Weighted Normal",
"type": "WEIGHTED_NORMAL",
"enabled": true,
"evaluationStatus": "METADATA_ONLY",
"parameters": {
"flag": 1,
"mode": 7,
"persistentUid": 1800999687,
"typeCode": 54,
"weight": 50
}
},
{
"meshId": "mesh:Grid",
"uuid": "modifier:object:ModifierBatchThreeFixture:614917079",
"name": "Warp",
"type": "WARP",
"enabled": true,
"evaluationStatus": "BLOCKED",
"parameters": {
"flag": 5,
"mode": 3,
"persistentUid": 614917079,
"typeCode": 35
}
}
],
"saveReopenExact": true,
"deterministicExact": true,
"savedSha256": "bf75a51df11f005991423354eba4adab59fb3c2e2382ecf3993c4b1dea2cc739",
"malformed": {
"code": "BLEND_READ_FAILED",
"message": "Input is not an uncompressed, gzip, or zstd Blender file"
}
}

View File

@@ -0,0 +1,128 @@
{
"schemaVersion": 1,
"task": "WBV2-P1148-001",
"operation": "MODULE_FUNCTION_EXECUTION",
"moduleId": "MODIFIER_READER_BATCH_THREE",
"status": "PASS",
"source": {
"paths": [
"blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc",
"blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp",
"web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"tests/files/web/modifier_reader_batch_three_scene.blend",
"web/app/src/vendor/blender/web_engine.wasm"
],
"before": {
"blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc": "e6b52cbced435c619a2a5e62ee23c3a2bb8b0dc4a3af7308854130895ce10f0d",
"blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc": "63736037a0bb5cc553668e0e12ab5ca8f5fee4499a9d0baf7edc1edaa5c3723b",
"blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc": "38d31c99424448a9ce76229f937fab5f60bf87dbec8fabdbee705af715467cb9",
"blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc": "68da38d98c638637f331120e84781a13d06c80425ccdaa8894c6000af0a2e4b3",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b",
"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "f6fbd04315c48ad4dfbf109b91e5b350550d23c227e5c11a71a58f09e923c990",
"web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts": "3520b2d03d803d923062c58fdd60530cc8540040bfb35a00c439cfe50167aa03",
"tests/files/web/modifier_reader_batch_three_scene.blend": "bf75a51df11f005991423354eba4adab59fb3c2e2382ecf3993c4b1dea2cc739",
"web/app/src/vendor/blender/web_engine.wasm": "32bc36aba563fe1ed0fb5d0292ca8a3ada1eecd6d45e38d9dcde565f02a312fe"
},
"after": {
"blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc": "e6b52cbced435c619a2a5e62ee23c3a2bb8b0dc4a3af7308854130895ce10f0d",
"blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc": "63736037a0bb5cc553668e0e12ab5ca8f5fee4499a9d0baf7edc1edaa5c3723b",
"blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc": "38d31c99424448a9ce76229f937fab5f60bf87dbec8fabdbee705af715467cb9",
"blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc": "68da38d98c638637f331120e84781a13d06c80425ccdaa8894c6000af0a2e4b3",
"blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc": "1292112c20eaa113084a2a7093c349e7787db818950d80a6e11b75b287e4287b",
"blender-5.2.0/source/blender/web_engine/web_engine_blend_reader.cpp": "f6fbd04315c48ad4dfbf109b91e5b350550d23c227e5c11a71a58f09e923c990",
"web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts": "3520b2d03d803d923062c58fdd60530cc8540040bfb35a00c439cfe50167aa03",
"tests/files/web/modifier_reader_batch_three_scene.blend": "bf75a51df11f005991423354eba4adab59fb3c2e2382ecf3993c4b1dea2cc739",
"web/app/src/vendor/blender/web_engine.wasm": "32bc36aba563fe1ed0fb5d0292ca8a3ada1eecd6d45e38d9dcde565f02a312fe"
},
"unchanged": true
},
"reusedReceipts": [
{
"manifest": "tests/golden/WBV2-P1107-000/manifest.json",
"report": "tests/golden/WBV2-P1107-000/module-receipt.json",
"manifestSha256": "a53ebdc52db5dcf27d44e938e5551f1ee2adae8e46c3fe8661604ee6b1000f8c",
"reportSha256": "6dd419799e1a4b9251328d9496f2459d148cd89118740a06b0ee6ffb78e0b1d2"
}
],
"cases": {
"positive": [
"MOD_remesh type is read from Blender Main",
"MOD_skin type is read from Blender Main",
"MOD_weighted_normal type is read from Blender Main",
"MOD_warp 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": "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",
"exitCode": 0
},
{
"command": "npm --prefix web run typecheck",
"exitCode": 0
},
{
"command": "npm --prefix web run build",
"exitCode": 0
},
{
"command": "WBV2_BATCH_TASK=WBV2-P1148-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_three_scene.blend WBV2_BATCH_TYPES='[\"REMESH\",\"SKIN\",\"WEIGHTED_NORMAL\",\"WARP\"]' WBV2_BATCH_UNITS='[\"modifier-source:MOD_remesh\",\"modifier-source:MOD_skin\",\"modifier-source:MOD_weighted_normal\",\"modifier-source:MOD_warp\",\"rna-struct:RemeshModifier\",\"rna-struct:SkinModifier\",\"rna-struct:WeightedNormalModifier\",\"rna-struct:WarpModifier\"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"exitCode": 0
}
],
"verification": {
"required": [
"sourceHash",
"wasmBuild",
"positiveMainMutation",
"negativeNoMutation",
"undoRedo",
"saveReopen",
"aggregateManifest"
],
"chromiumOnly": true,
"fullFamilyParity": false
},
"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": "e0c77f91e748bc9341498821590c5acd2e708c97716b7e427efd97770d670d76",
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"unitCount": 3745,
"planningEstimate": 5200,
"hardTarget": false,
"verifiedUnits": 377,
"unverifiedUnits": 3368
}
},
"nextTask": null
}

View File

@@ -0,0 +1,49 @@
> 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
ninja: no work to do.
> npm --prefix web run typecheck
> blender-web-editor@0.1.0-rc.1 typecheck
> tsc -p tsconfig.json --noEmit
> npm --prefix web run build
> blender-web-editor@0.1.0-rc.1 build
> tsc -p tsconfig.json && vite build --config app/vite.config.ts
vite v8.2.0 building client environment for production...

transforming...✓ 102 modules transformed.
rendering chunks...
computing gzip size...
dist/index.html 0.46 kB │ gzip: 0.30 kB
dist/assets/storage.worker-D9TqXsGS.js 66.59 kB
dist/assets/web-engine.worker-BfTMiTY1.js 362.11 kB
dist/assets/viewport-render.worker-BKnJyAEz.js 634.08 kB
dist/assets/web_engine-CjnzAIfx.wasm 16,238.37 kB │ gzip: 3,856.73 kB
dist/assets/index-BgTbQCE2.css 15.35 kB │ gzip: 3.91 kB
dist/assets/index-C3AJuKSc.js 1,190.30 kB │ gzip: 316.69 kB
✓ built in 478ms
[plugin rolldown:vite-resolve] Module "module" has been externalized for browser compatibility, imported by "/home/mes123456/workinf_Blender_Wasm/web/app/src/vendor/blender/web_engine.js". See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.
[plugin builtin:vite-reporter]
(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rolldownOptions.output.codeSplitting to improve chunking: https://rolldown.rs/reference/OutputOptions.codeSplitting
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.
> WBV2_BATCH_TASK=WBV2-P1148-001 WBV2_BATCH_FIXTURE=tests/files/web/modifier_reader_batch_three_scene.blend WBV2_BATCH_TYPES='["REMESH","SKIN","WEIGHTED_NORMAL","WARP"]' WBV2_BATCH_UNITS='["modifier-source:MOD_remesh","modifier-source:MOD_skin","modifier-source:MOD_weighted_normal","modifier-source:MOD_warp","rna-struct:RemeshModifier","rna-struct:SkinModifier","rna-struct:WeightedNormalModifier","rna-struct:WarpModifier"]' WEB_TEST_PORT=5371 npm --prefix web run test:e2e -- --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts
> blender-web-editor@0.1.0-rc.1 test:e2e
> playwright test --config playwright.config.ts --workers=1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts
Running 1 test using 1 worker
✓ 1 tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts:15:1 › second modifier reader batch preserves concrete Blender Main metadata (2.0s)
1 passed (2.8s)
[WebServer] (node:135365) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.
[WebServer] (Use `node --trace-warnings ...` to show where the warning was created)
(node:135419) Warning: The 'NO_COLOR' env is ignored due to the 'FORCE_COLOR' env being set.

View File

@@ -0,0 +1,187 @@
{
"schemaVersion": 1,
"task": "WBV2-P1148-001",
"parentTask": "WBV2-P1148-000",
"status": "done",
"goal": "以一个共享 Blender Main reader、WASM build、Worker 路由和 Chromium receipt 批量验证 MOD_remesh, MOD_skin, MOD_weighted_normal, MOD_warp 的真实 modifier/RNA 元数据。",
"scope": {
"gap": "capability:MODIFIER_READER_BATCH_THREE",
"ownerFamily": "MODIFIER",
"implementationClass": "LOCAL_EXACT"
},
"commands": [
"node tools/web/check-task-context.mjs --task WBV2-P1148-001 --write"
],
"inputPaths": [],
"inputSelection": {
"schemaVersion": 1,
"limits": {
"maxFiles": 12,
"evidenceBytes": 8192,
"contextRemainingBytes": 2067,
"contextRemainingTokens": 515
},
"source": {
"bytes": 7837,
"tokens": 1961
},
"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": "tests/files/web/modifier_reader_batch_three_scene.blend",
"bytes": 98640,
"reason": "EVIDENCE_BYTE_BUDGET"
},
{
"path": "web/tests/e2e/wbv2-modifier-reader-batch-two-production.spec.ts",
"bytes": 4082,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1148-001/module-receipt.json",
"bytes": 6746,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"bytes": 5661,
"reason": "CONTEXT_REMAINING_SPACE"
},
{
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"bytes": null,
"reason": "GENERATED_EVIDENCE_OUTPUT"
},
{
"path": "docs/status/WBV2-P1148-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-P1148-001.md",
"taskIndex": "tests/golden/WBV2/task-index.json",
"parentManifest": "tests/golden/WBV2-P1148-000/manifest.json",
"parentStatus": "docs/status/WBV2-P1148-000.md"
},
"readPolicy": {
"required": [
"docs/EXECUTION_QUEUE.md",
"docs/tasks/WBV2-P1148-001.md",
"tests/golden/WBV2-P1148-000/manifest.json",
"docs/status/WBV2-P1148-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-P1148-000",
"parentTask": "WBV2-P1147-001",
"status": "done",
"nextTask": "WBV2-P1148-001",
"artifactCount": 4
},
"statusSummary": [
"# WBV2-P1148-000 status",
"- task: `WBV2-P1148-000`; parent: `WBV2-P1147-001`; status: `done`",
"- taskClass: `QUEUE_ENABLEMENT`; no modifier-family parity completion claimed",
"- source-backed batch authorized: `MODIFIER_READER_BATCH_THREE` (8 units)",
"- dynamic inventory: `3745` units; verified `369`; unverified `3376`; bound delta `0`",
"- nextTask: `WBV2-P1148-001`"
]
},
"budgets": {
"queueBytes": 4096,
"taskBytes": 2266,
"parentManifestBytes": 24576,
"parentStatusBytes": 6144,
"evidenceFiles": 12,
"evidenceBytes": 8192,
"contextTokens": 3500,
"contextEnvelopeTokens": 1024,
"taskLines": 46,
"taskTokens": 567
},
"size": {
"documents": [
{
"path": "docs/EXECUTION_QUEUE.md",
"bytes": 3830,
"lines": 56,
"tokens": 958
},
{
"path": "docs/tasks/WBV2-P1148-001.md",
"bytes": 2266,
"lines": 46,
"tokens": 567
},
{
"path": "tests/golden/WBV2-P1148-000/manifest.json",
"bytes": 1382,
"lines": 43,
"tokens": 346
},
{
"path": "docs/status/WBV2-P1148-000.md",
"bytes": 359,
"lines": 8,
"tokens": 90
}
],
"sourceTokens": 1961,
"evidenceFiles": 0,
"evidenceBytes": 0,
"evidenceTokens": 0,
"totalTokens": 1961,
"reservedEnvelopeTokens": 1024,
"estimatedContextTokens": 2985,
"serializedContextTokens": 653,
"withinBudget": true
}
}

View File

@@ -5,11 +5,11 @@
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"dynamicInventory": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"beforeSha256": "e56a699f90f434e2c00c8bfe4e7e4af7a9c17cca384521abc90edd7d481187c8",
"afterSha256": "3cf5795f89066d759400fa206b559020e27c157708febdab393fa978303a79aa",
"beforeSha256": "02a76d4b766c5e921edc9a0b162f5be3ebc7218aee56dd63e31593817c231763",
"afterSha256": "6ccf20cd15cf065e6432c209afa7e32557e619837f7880f0f38a2bc01ccaa02d",
"unitCount": 3745,
"verifiedUnits": 350,
"unverifiedUnits": 3395
"verifiedUnits": 377,
"unverifiedUnits": 3368
},
"explicitBindings": [
{
@@ -7011,12 +7011,552 @@
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_datatransfer",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_dynamicpaint",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_explode",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_fluid",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:DataTransferModifier",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 7542,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:DynamicPaintModifier",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 5057,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:ExplodeModifier",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 4898,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:FluidModifier",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 5023,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:FluidDomainSettings",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc",
"line": 1479,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_laplaciandeform",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_laplaciansmooth",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_mask",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_shrinkwrap",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:LaplacianDeformModifier",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 7318,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:LaplacianSmoothModifier",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 4484,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:MaskModifier",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 5512,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:ShrinkwrapModifier",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 5378,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_correctivesmooth",
"task": "WBV2-P1145-001",
"capabilityId": "CORRECTIVE_SMOOTH_READER",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1145-001/manifest.json",
"sha256": "bf90f285d1ef5c5255ef1dfb99656ecc3c47118c035547ef2ac258c1a43bbc96"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1145-001/corrective-smooth-production.json",
"sha256": "2afd10cbf4101867ccd6857181d439b2fad4fe54471f5562c9c056a75d1456ec"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:CorrectiveSmoothModifier",
"task": "WBV2-P1145-001",
"capabilityId": "CORRECTIVE_SMOOTH_READER",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 4403,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1145-001/manifest.json",
"sha256": "bf90f285d1ef5c5255ef1dfb99656ecc3c47118c035547ef2ac258c1a43bbc96"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1145-001/corrective-smooth-production.json",
"sha256": "2afd10cbf4101867ccd6857181d439b2fad4fe54471f5562c9c056a75d1456ec"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_remesh",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_skin",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_weighted_normal",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_warp",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:RemeshModifier",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 6609,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:SkinModifier",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 6993,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:WeightedNormalModifier",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 8040,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:WarpModifier",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 2917,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
],
"coverageByKind": {
"modifier-source": {
"verified": 33,
"unverified": 64
"verified": 46,
"unverified": 51
},
"node": {
"verified": 21,
@@ -7031,8 +7571,8 @@
"unverified": 2012
},
"rna-struct": {
"verified": 194,
"unverified": 785
"verified": 208,
"unverified": 771
},
"web-command": {
"verified": 96,
@@ -7041,8 +7581,8 @@
},
"coverageByFamily": {
"MODIFIER": {
"verified": 33,
"unverified": 64
"verified": 46,
"unverified": 51
},
"NODES": {
"verified": 21,
@@ -7057,8 +7597,8 @@
"unverified": 53
},
"RNA": {
"verified": 194,
"unverified": 785
"verified": 208,
"unverified": 771
},
"WEB_ENGINE": {
"verified": 96,

View File

@@ -6998,5 +6998,545 @@
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_datatransfer",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_datatransfer.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_dynamicpaint",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_dynamicpaint.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_explode",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_explode.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_fluid",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_fluid.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:DataTransferModifier",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 7542,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:DynamicPaintModifier",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 5057,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:ExplodeModifier",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 4898,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:FluidModifier",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 5023,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:FluidDomainSettings",
"task": "WBV2-P1146-001",
"capabilityId": "MODIFIER_READER_BATCH",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_fluid.cc",
"line": 1479,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1146-001/manifest.json",
"sha256": "94c0399e25fe0323bf13a57359c020e6b70bf5dd66006bb0d69e4069e3a71c82"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json",
"sha256": "4dd99944e5eec83d173c28ed9e205a96be0ae197ed37209d8b49f90c797d07d3"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_laplaciandeform",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciandeform.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_laplaciansmooth",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_laplaciansmooth.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_mask",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_mask.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_shrinkwrap",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_shrinkwrap.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:LaplacianDeformModifier",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 7318,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:LaplacianSmoothModifier",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 4484,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:MaskModifier",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 5512,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:ShrinkwrapModifier",
"task": "WBV2-P1147-001",
"capabilityId": "MODIFIER_READER_BATCH_TWO",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 5378,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1147-001/manifest.json",
"sha256": "3f9df067f99cf6fed57b971d62ab38b07738d2e6ab9c24454bce14b6edf5d18f"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1147-001/modifier-reader-batch-production.json",
"sha256": "bfd794257d3c739c026a52c6995b9cdcf1af892944eebf584937f772741edf94"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_correctivesmooth",
"task": "WBV2-P1145-001",
"capabilityId": "CORRECTIVE_SMOOTH_READER",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_correctivesmooth.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1145-001/manifest.json",
"sha256": "bf90f285d1ef5c5255ef1dfb99656ecc3c47118c035547ef2ac258c1a43bbc96"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1145-001/corrective-smooth-production.json",
"sha256": "2afd10cbf4101867ccd6857181d439b2fad4fe54471f5562c9c056a75d1456ec"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:CorrectiveSmoothModifier",
"task": "WBV2-P1145-001",
"capabilityId": "CORRECTIVE_SMOOTH_READER",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 4403,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1145-001/manifest.json",
"sha256": "bf90f285d1ef5c5255ef1dfb99656ecc3c47118c035547ef2ac258c1a43bbc96"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1145-001/corrective-smooth-production.json",
"sha256": "2afd10cbf4101867ccd6857181d439b2fad4fe54471f5562c9c056a75d1456ec"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_remesh",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_remesh.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_skin",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_skin.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_weighted_normal",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_weighted_normal.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "modifier-source:MOD_warp",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/modifiers/intern/MOD_warp.cc",
"line": 1,
"evidence": "modifier-source-file"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:RemeshModifier",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 6609,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:SkinModifier",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 6993,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:WeightedNormalModifier",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 8040,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
},
{
"unitId": "rna-struct:WarpModifier",
"task": "WBV2-P1148-001",
"capabilityId": "MODIFIER_READER_BATCH_THREE",
"sourceLocation": {
"path": "blender-5.2.0/source/blender/makesrna/intern/rna_modifier.cc",
"line": 2917,
"evidence": "RNA_def_struct"
},
"evidenceManifest": {
"path": "tests/golden/WBV2-P1148-001/manifest.json",
"sha256": "82ed070c23f0aef0ae1f66612cd213bf1af2d8f53095c24e8d1e0235bef268f8"
},
"productionEvidence": {
"path": "tests/golden/WBV2-P1148-001/modifier-reader-batch-production.json",
"sha256": "560a4b2eae1fec4dc85acf138bf7dd85825643aadb1dcb71acb4788d433a733c"
},
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202",
"status": "VERIFIED"
}
]

View File

@@ -5,19 +5,19 @@
"artifacts": {
"inventory": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"sha256": "3cf5795f89066d759400fa206b559020e27c157708febdab393fa978303a79aa"
"sha256": "6ccf20cd15cf065e6432c209afa7e32557e619837f7880f0f38a2bc01ccaa02d"
},
"inventoryManifest": {
"path": "tests/golden/WBV2/dynamic-inventory-manifest.json",
"sha256": "0f440885c8e8ca401db412b0a5ec1195e79e9ab18eb731b9eae00bd8313c017c"
"sha256": "d85db305e0476115a6508fcb178d6adabc3b352b2837de9e3776722981b8e8fc"
},
"bindings": {
"path": "tests/golden/WBV2/dynamic-coverage-bindings.json",
"sha256": "8527415d36130b5c0e8f828fc7d402102286c21d30ceb98498ade360961990ab"
"sha256": "15da1b24eceed1de4cec27f4d47d3171163dc323247af278217920ca376c6b32"
},
"report": {
"path": "tests/golden/WBV2/dynamic-coverage-audit.json",
"sha256": "4e2e6bef38bfda7d068242a0e88325948d7c292014af279711fdec2ecba2e136"
"sha256": "c67af84b3229806950712079b0d05517d041823e2504a47540e8b1166df65049"
},
"generator": {
"path": "tools/web/reconcile-source-dynamic-coverage.mjs",
@@ -26,9 +26,9 @@
},
"coverage": {
"unitCount": 3745,
"verifiedUnits": 350,
"unverifiedUnits": 3395,
"boundUnitDelta": 350,
"verifiedUnits": 377,
"unverifiedUnits": 3368,
"boundUnitDelta": 8,
"sourceTreeSha256": "600cb3dd441f09d9655b740735fbf8fa49ad6c14d308c68d59a29f9c338e4202"
},
"historical": {

View File

@@ -24,7 +24,7 @@
},
"planningEstimate": 5200,
"hardTarget": false,
"verifiedUnits": 350,
"unverifiedUnits": 3395,
"verifiedUnits": 377,
"unverifiedUnits": 3368,
"deterministic": true
}

View File

@@ -14,11 +14,11 @@
},
"inventory": {
"path": "tests/golden/WBV2/dynamic-inventory.json",
"sha256": "3cf5795f89066d759400fa206b559020e27c157708febdab393fa978303a79aa"
"sha256": "6ccf20cd15cf065e6432c209afa7e32557e619837f7880f0f38a2bc01ccaa02d"
},
"report": {
"path": "tests/golden/WBV2/dynamic-inventory-check-report.json",
"sha256": "f76d38d1257b3ef8e5f1677f725a76dc875a6493c85f95340f27d7701ca4576c"
"sha256": "715b24623dfbe5ef1ce60f9ddb64fb1ffd9ac4bf4ed18162dc68580adc31e1d8"
},
"status": {
"path": "docs/status/WBV2-DYNAMIC-INVENTORY.md",
@@ -47,9 +47,9 @@
},
"planningEstimate": 5200,
"hardTarget": false,
"verifiedUnits": 332,
"unverifiedUnits": 3413,
"boundCaseDelta": 272
"verifiedUnits": 377,
"unverifiedUnits": 3368,
"boundCaseDelta": 8
},
"historical": {
"initialEstimate": 6900,

File diff suppressed because it is too large Load Diff

View File

@@ -69,3 +69,9 @@
{"id":"WBV2-P1144-001","gapId":"DRIVER_READER","ownerFamily":"ANIMATION","sourceTask":"1144","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","positive Main reader is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact","full-family parity remains explicit"]}
{"id":"WBV2-P1145-000","gapId":"workflow:authorize_corrective_smooth_reader_module","ownerFamily":"PROGRAM","sourceTask":"1145","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","Corrective Smooth has explicit Blender source mapping","inventory remains source-derived","one source-backed module is active"]}
{"id":"WBV2-P1145-001","gapId":"CORRECTIVE_SMOOTH_READER","ownerFamily":"MODIFIER","sourceTask":"1145","state":"completed","targetImplementationClass":"LOCAL_EXACT","exitCriteria":["source and protocol hashes are bound","positive Main reader is proven","negative no-mutation and recovery are proven","Chromium and save/reopen evidence are exact","full-family parity remains explicit"]}
{"id":"WBV2-P1146-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1146","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]}
{"id":"WBV2-P1146-001","gapId":"MODIFIER_READER_BATCH","ownerFamily":"MODIFIER","sourceTask":"1146","state":"completed","targetImplementationClass":"LOCAL_EXACT","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"]}
{"id":"WBV2-P1147-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1147","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]}
{"id":"WBV2-P1147-001","gapId":"MODIFIER_READER_BATCH_TWO","ownerFamily":"MODIFIER","sourceTask":"1147","state":"completed","targetImplementationClass":"LOCAL_EXACT","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"]}
{"id":"WBV2-P1148-000","gapId":"workflow:authorize_modifier_reader_batch","ownerFamily":"PROGRAM","sourceTask":"1148","state":"completed","targetImplementationClass":"QUEUE_ONLY","exitCriteria":["prior evidence remains hash-bound","batch source mapping is explicit","inventory remains source-derived"]}
{"id":"WBV2-P1148-001","gapId":"MODIFIER_READER_BATCH_THREE","ownerFamily":"MODIFIER","sourceTask":"1148","state":"completed","targetImplementationClass":"LOCAL_EXACT","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"]}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,114 @@
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, fallback = null) => {
const index = process.argv.indexOf(name);
return index >= 0 ? process.argv[index + 1] : fallback;
};
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 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);
if (!coverageBindings.length) throw new Error(`task ${task} has no coverageBindings`);
const production = json(productionPath);
assert.equal(production.browser, "chromium");
assert.equal(production.queueMutation, false);
assert.equal(production.error, undefined);
assert.equal(production.saveReopenExact, true);
assert.equal(production.deterministicExact, true);
const inventoryPath = "tests/golden/WBV2/dynamic-inventory.json";
const inventory = json(inventoryPath);
assert.equal(production.fixtureSha256, sha(production.fixture));
const bindingsPath = "tests/golden/WBV2/dynamic-coverage-bindings.json";
const existing = fs.existsSync(abs(bindingsPath)) ? json(bindingsPath) : [];
const byId = new Map(existing.map((binding) => [binding.unitId, binding]));
for (const unitId of coverageBindings) {
const unit = inventory.units.find((candidate) => candidate.id === unitId);
assert.ok(unit, `dynamic unit missing: ${unitId}`);
if (unit.coverageStatus === "VERIFIED") {
assert.equal(byId.get(unitId)?.task, task, `dynamic unit already belongs to another task: ${unitId}`);
}
const sourceLocation = unit.locations?.[0];
assert.ok(sourceLocation?.path, `source location missing: ${unitId}`);
byId.set(unitId, {
unitId,
task,
capabilityId,
sourceLocation,
evidenceManifest: { path: manifestPath, sha256: sha(manifestPath) },
productionEvidence: { path: productionPath, sha256: sha(productionPath) },
sourceTreeSha256: inventory.authority.sourceTreeSha256,
status: "VERIFIED",
});
}
const bindings = [...byId.values()];
const verifiedIds = new Set(bindings.map((binding) => binding.unitId));
const updatedUnits = inventory.units.map((unit) => verifiedIds.has(unit.id)
? { ...unit, coverageStatus: "VERIFIED", coverage: bindings.find((binding) => binding.unitId === unit.id) }
: { ...unit, coverageStatus: "UNVERIFIED", ...(unit.coverage ? {} : {}) });
const verifiedUnits = updatedUnits.filter((unit) => unit.coverageStatus === "VERIFIED").length;
const updated = {
...inventory,
coverage: { ...inventory.coverage, verifiedUnits, unverifiedUnits: inventory.summary.unitCount - verifiedUnits, sourceMappingRequired: inventory.summary.unitCount, inventoryMutation: "explicit_source_case_bindings_only", lastReconciledAt: "2026-09-01" },
units: updatedUnits,
coverageLedger: bindings,
};
fs.writeFileSync(abs(bindingsPath), `${JSON.stringify(bindings, null, 2)}\n`);
fs.writeFileSync(abs(inventoryPath), `${JSON.stringify(updated, null, 2)}\n`);
const coverageManifestPath = "tests/golden/WBV2/dynamic-coverage-manifest.json";
if (fs.existsSync(abs(coverageManifestPath))) {
const coverageManifest = json(coverageManifestPath);
coverageManifest.artifacts.inventory.sha256 = sha(inventoryPath);
coverageManifest.artifacts.bindings.sha256 = sha(bindingsPath);
coverageManifest.coverage = { ...coverageManifest.coverage, unitCount: inventory.summary.unitCount, verifiedUnits, unverifiedUnits: inventory.summary.unitCount - verifiedUnits, boundUnitDelta: coverageBindings.length, sourceTreeSha256: inventory.authority.sourceTreeSha256 };
fs.writeFileSync(abs(coverageManifestPath), `${JSON.stringify(coverageManifest, null, 2)}\n`);
}
const inventoryManifestPath = "tests/golden/WBV2/dynamic-inventory-manifest.json";
if (fs.existsSync(abs(inventoryManifestPath))) {
const inventoryManifest = json(inventoryManifestPath);
if (inventoryManifest.artifacts?.inventory) inventoryManifest.artifacts.inventory.sha256 = sha(inventoryPath);
if (inventoryManifest.inventory) {
inventoryManifest.inventory.verifiedUnits = verifiedUnits;
inventoryManifest.inventory.unverifiedUnits = inventory.summary.unitCount - verifiedUnits;
inventoryManifest.inventory.boundCaseDelta = coverageBindings.length;
}
fs.writeFileSync(abs(inventoryManifestPath), `${JSON.stringify(inventoryManifest, null, 2)}\n`);
}
const auditPath = "tests/golden/WBV2/dynamic-coverage-audit.json";
if (fs.existsSync(abs(auditPath))) {
const audit = json(auditPath);
const coverageByKind = {};
const coverageByFamily = {};
for (const unit of updatedUnits) {
const kind = coverageByKind[unit.kind] ??= { verified: 0, unverified: 0 };
const family = coverageByFamily[unit.family] ??= { verified: 0, unverified: 0 };
const key = unit.coverageStatus === "VERIFIED" ? "verified" : "unverified";
kind[key] += 1;
family[key] += 1;
}
audit.dynamicInventory = { ...(audit.dynamicInventory ?? {}), path: inventoryPath, afterSha256: sha(inventoryPath), unitCount: inventory.summary.unitCount, verifiedUnits, unverifiedUnits: inventory.summary.unitCount - verifiedUnits };
audit.explicitBindings = bindings;
audit.coverageByKind = coverageByKind;
audit.coverageByFamily = coverageByFamily;
fs.writeFileSync(abs(auditPath), `${JSON.stringify(audit, null, 2)}\n`);
}
process.stdout.write(`wbv2-module-coverage-bound task=${task} module=${capabilityId} added=${coverageBindings.length} verified=${verifiedUnits} unverified=${inventory.summary.unitCount - verifiedUnits}\n`);

View File

@@ -29,7 +29,19 @@ fi
export WEB_EMSCRIPTEN_VERSION
export EM_CONFIG="${web_workspace_root}/.emscripten-web"
export EM_CACHE="${web_workspace_root}/.emcache"
# Prefer RAM-backed compiler caches on Linux hosts with enough tmpfs space.
# The cache only contains derived Emscripten artifacts; evidence and source
# outputs remain in the repository. Callers can override either path.
if [[ -d /dev/shm && -w /dev/shm ]]; then
web_ram_cache_root="${WEB_RAM_CACHE_ROOT-/dev/shm/blender-wasm-${UID}}"
mkdir -p "${web_ram_cache_root}/emcache" "${web_ram_cache_root}/tmp"
export EM_CACHE="${EM_CACHE-${web_ram_cache_root}/emcache}"
export TMPDIR="${TMPDIR-${web_ram_cache_root}/tmp}"
else
export EM_CACHE="${EM_CACHE-${web_workspace_root}/.emcache}"
fi
export CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL-8}"
export NINJAFLAGS="${NINJAFLAGS--j8}"
export WEB_EMSCRIPTEN_CFLAGS="-sENVIRONMENT=web,worker -sMODULARIZE=1 -sEXPORT_ES6=1"
export WEB_EMSCRIPTEN_LDFLAGS="-sALLOW_MEMORY_GROWTH=1 -sFILESYSTEM=1"

View File

@@ -0,0 +1,111 @@
import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { execFileSync, spawnSync } 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 sha = (file) => crypto.createHash("sha256").update(fs.readFileSync(abs(file))).digest("hex");
const dynamicInventoryPath = "tests/golden/WBV2/dynamic-inventory.json";
const writeJson = (file, value) => {
fs.mkdirSync(path.dirname(abs(file)), { recursive: true });
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 taskArg = process.argv.indexOf("--task");
const task = taskArg >= 0 ? process.argv[taskArg + 1] : null;
if (!task || !process.argv.includes("--write")) throw new Error("usage: node tools/web/run-wbv2-module-task.mjs --task <task-id> --write");
const queue = read("docs/EXECUTION_QUEUE.md");
const currentTask = queue.match(/\| 当前任务 \| `([^`]+)` \|/u)?.[1];
const index = json("tests/golden/WBV2/task-index.json");
const plan = json(index.source.path);
const dynamicInventory = json(dynamicInventoryPath);
const record = plan.tasks.find((candidate) => candidate.id === task);
if (currentTask !== task) throw new Error(`module task is not the authoritative queue task: ${currentTask}!=${task}`);
if (!record?.module) throw new Error(`task ${task} is not a module task`);
const parentId = record.dependsOn?.at(-1);
const parentPath = `tests/golden/${parentId}/manifest.json`;
const parent = json(parentPath);
if (parent.status !== "done" || parent.nextTask !== task) throw new Error(`module parent is not a completed handoff: ${parentId}`);
if (record.status !== "in_progress" || record.ready !== true) throw new Error(`module task ${task} is not active`);
if (!record.module.sourceBacked) throw new Error(`module ${record.module.moduleId} has no source-backed implementation`);
for (const source of record.module.sourcePaths ?? []) if (!fs.existsSync(abs(source))) throw new Error(`module source is missing: ${source}`);
const sourceBefore = Object.fromEntries((record.module.sourcePaths ?? []).map((source) => [source, sha(source)]));
const reusedReceipts = (record.module.reuseReceipts ?? []).map((receipt) => ({
...receipt,
manifestSha256: sha(receipt.manifest),
reportSha256: sha(receipt.report),
}));
const out = `tests/golden/${task}`;
const reportPath = `${out}/module-receipt.json`;
const statusPath = `docs/status/${task}.md`;
const logPath = `${out}/module-run.log`;
const results = [];
let failed = false;
for (const command of record.module.commands ?? []) {
const result = spawnSync("bash", ["-lc", command], { cwd: root, encoding: "utf8", maxBuffer: 32 * 1024 * 1024 });
const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
results.push({ command, exitCode: result.status ?? 1, output });
if ((result.status ?? 1) !== 0) { failed = true; break; }
}
fs.mkdirSync(abs(out), { recursive: true });
writeText(logPath, results.map((result) => `> ${result.command}\n${result.output}`).join("\n"));
const sourceAfter = Object.fromEntries((record.module.sourcePaths ?? []).map((source) => [source, sha(source)]));
const sourceUnchanged = JSON.stringify(sourceBefore) === JSON.stringify(sourceAfter);
const report = {
schemaVersion: 1,
task,
operation: "MODULE_FUNCTION_EXECUTION",
moduleId: record.module.moduleId,
status: failed || !sourceUnchanged ? "BLOCKED" : "PASS",
source: { paths: record.module.sourcePaths, before: sourceBefore, after: sourceAfter, unchanged: sourceUnchanged },
reusedReceipts,
cases: { positive: record.module.positive, negative: record.module.negative, recovery: record.module.recovery },
commands: results.map(({ command, exitCode }) => ({ command, exitCode })),
verification: { required: plan.verificationPolicy.required, chromiumOnly: plan.verificationPolicy.browser === "chromium_only", fullFamilyParity: false },
inventory: { historical: plan.inventory, dynamic: { path: dynamicInventoryPath, sha256: sha(dynamicInventoryPath), sourceTreeSha256: dynamicInventory.authority.sourceTreeSha256, unitCount: dynamicInventory.summary.unitCount, planningEstimate: dynamicInventory.policy.planningEstimate, hardTarget: dynamicInventory.policy.hardTarget, verifiedUnits: dynamicInventory.coverage.verifiedUnits, unverifiedUnits: dynamicInventory.coverage.unverifiedUnits } },
nextTask: failed || !sourceUnchanged ? task : plan.tasks[plan.tasks.findIndex((candidate) => candidate.id === task) + 1]?.id ?? null,
};
writeJson(reportPath, report);
if (failed || !sourceUnchanged) {
writeText(statusPath, `# ${task} status\n\n- task: \`${task}\`; module: \`${record.module.moduleId}\`; status: \`in_progress\`\n- module execution blocked; no queue advance or parity claim\n- source unchanged: \`${sourceUnchanged}\`; failed command: \`${results.find((result) => result.exitCode !== 0)?.command ?? "source hash drift"}\`\n- dynamic source inventory: \`${dynamicInventory.summary.unitCount}\` units; verified \`${dynamicInventory.coverage.verifiedUnits}\`; unverified \`${dynamicInventory.coverage.unverifiedUnits}\`; planning estimate \`${dynamicInventory.policy.planningEstimate}\` (non-binding)\n- historical 6900-entry inventory remains read-only\n- nextTask: \`${task}\`\n`);
process.exitCode = 2;
} else {
const nextTask = report.nextTask;
const planIndex = plan.tasks.findIndex((candidate) => candidate.id === task);
plan.tasks = plan.tasks.map((candidate, index) => index === planIndex ? { ...candidate, status: "done", ready: false } : candidate.id === nextTask ? { ...candidate, status: "in_progress", ready: true } : { ...candidate, ready: false });
if (!nextTask) plan.status = "COMPLETED_MODULE_EXECUTION";
writeJson(index.source.path, plan);
execFileSync(process.execPath, [abs("tools/web/generate-v2-task-index.mjs"), "--plan-path", abs(index.source.path)], { cwd: root, stdio: "inherit" });
let updatedQueue = read("docs/EXECUTION_QUEUE.md");
if (nextTask) updatedQueue = updatedQueue.replace(/\| 当前任务 \| `[^`]+` \|/u, `| 当前任务 | \`${nextTask}\` |`).replace(/\| parent manifest \| `[^`]+` \|/u, `| parent manifest | \`tests/golden/${task}/manifest.json\` |`).replace(/\| 任务卡 \| \[[^\]]+\]\([^\)]+\) \|/u, `| 任务卡 | [\`tasks/${nextTask}.md\`](tasks/${nextTask}.md) |`);
writeText("docs/EXECUTION_QUEUE.md", updatedQueue);
writeText(statusPath, `# ${task} status\n\n- task: \`${task}\`; module: \`${record.module.moduleId}\`; status: \`done\`\n- source hashes stable: \`${sourceUnchanged}\`; commands passed: \`${results.length}\`\n- positive Main mutation, negative no-mutation, recovery and Chromium gates are recorded in the module receipt\n- dynamic source inventory: \`${dynamicInventory.summary.unitCount}\` units; verified \`${dynamicInventory.coverage.verifiedUnits}\`; unverified \`${dynamicInventory.coverage.unverifiedUnits}\`; planning estimate \`${dynamicInventory.policy.planningEstimate}\` (non-binding)\n- historical 6900-entry inventory remains read-only; full-family parity: \`false\`\n- nextTask: \`${nextTask ?? "NONE"}\`\n`);
execFileSync(process.execPath, [abs("tools/web/check-task-context.mjs"), "--task", task, "--write"], { cwd: root, stdio: "inherit" });
const manifestPath = `${out}/manifest.json`;
const evidenceArtifacts = Object.fromEntries((record.module.evidencePaths ?? []).filter((file) => fs.existsSync(abs(file))).map((file, item) => [`evidence${item + 1}`, { path: file, sha256: sha(file) }]));
const artifacts = { parentManifest: { path: parentPath, sha256: sha(parentPath) }, ...Object.fromEntries(record.module.sourcePaths.map((source, item) => [`source${item + 1}`, { path: source, sha256: sha(source) }])), ...evidenceArtifacts, moduleReceipt: { path: reportPath, sha256: sha(reportPath) }, status: { path: statusPath, sha256: sha(statusPath) }, log: { path: logPath, sha256: sha(logPath) }, plan: { path: index.source.path, sha256: sha(index.source.path) }, taskContext: { path: `${out}/task-context.json`, sha256: sha(`${out}/task-context.json`) } };
writeJson(manifestPath, { schemaVersion: 1, task, parentTask: parentId, operation: "MODULE_FUNCTION_EXECUTION", taskClass: "MODULE", status: "done", enablingTask: true, parityStateChange: false, runtime: "BLENDER_WEB_FUNCTION_MODULE", artifacts, assertions: { moduleId: record.module.moduleId, sourceBacked: true, positiveCases: record.module.positive.length, negativeCases: record.module.negative.length, recoveryCases: record.module.recovery.length, commandCount: results.length, reusedReceiptCount: reusedReceipts.length, sourceUnchanged, fullFamilyParity: false, dynamicInventoryPath, dynamicSourceTreeSha256: dynamicInventory.authority.sourceTreeSha256, dynamicUnitCount: dynamicInventory.summary.unitCount, dynamicVerifiedUnits: dynamicInventory.coverage.verifiedUnits, dynamicUnverifiedUnits: dynamicInventory.coverage.unverifiedUnits, planningEstimate: dynamicInventory.policy.planningEstimate, historicalInventoryTotal: 6900, historicalEffectiveCompleted: 290, historicalEffectivePending: 6609, historicalReproduction: false }, nextTask });
if (record.module.coverageBindings?.length) {
execFileSync(process.execPath, [abs("tools/web/bind-wbv2-module-coverage.mjs"), "--task", task], { cwd: root, stdio: "inherit" });
}
if (nextTask) execFileSync(process.execPath, [abs("tools/web/check-task-context.mjs"), "--task", nextTask, "--write"], { cwd: root, stdio: "inherit" });
let next = read("nextTask.md");
const tick = String.fromCharCode(96);
const snapshotTask = nextTask ?? task;
const snapshotState = nextTask ? "in_progress" : "done";
const snapshotNext = nextTask ? plan.tasks[plan.tasks.findIndex((candidate) => candidate.id === nextTask) + 1]?.id ?? "NONE" : "NONE";
const snapshotCommand = nextTask ? `node tools/web/run-wbv2-module-task.mjs --task ${nextTask} --write` : "node tools/web/check-wbv2-module-execution.mjs";
next = next.replace(/\| Current task when this file was written \| `[^`]+` \|/u, `| Current task when this file was written | ${tick}${snapshotTask}${tick} |`).replace(/\| Current task state \| `[^`]+` \|/u, `| Current task state | ${tick}${snapshotState}${tick} |`).replace(/\| Parent manifest \| `[^`]+` \|/u, `| Parent manifest | ${tick}tests/golden/${task}/manifest.json${tick} |`).replace(/\| Current task card \| `[^`]+` \|/u, `| Current task card | ${tick}docs/tasks/${snapshotTask}.md${tick} |`).replace(/\| Current task-context nextTask \| `[^`]+` \|/u, `| Current task-context nextTask | ${tick}${snapshotNext}${tick} |`).replace(/\| Focused command \| `[^`]+` \|/u, `| Focused command | ${tick}${snapshotCommand}${tick} |`);
writeText("nextTask.md", next);
console.log(`module-task-complete task=${task} module=${record.module.moduleId} next=${nextTask} commands=${results.length}`);
}

View File

@@ -0,0 +1,87 @@
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { expect, test } from "@playwright/test";
const root = path.resolve(import.meta.dirname, "../../..");
const fixturePath = path.join(root, "tests/files/web/modifier_reader_batch_scene.blend");
const fixture = fs.readFileSync(fixturePath);
const fixtureSha256 = crypto.createHash("sha256").update(fixture).digest("hex");
const expectedTypes = ["DATA_TRANSFER", "DYNAMIC_PAINT", "EXPLODE", "FLUID"];
test("modifier reader batch preserves concrete Blender Main metadata", async ({ page }) => {
test.setTimeout(180_000);
await page.goto("/");
const result = await page.evaluate(async (bytes) => {
const { WebEngineClient } = await import("/src/engine-client/WebEngineClient.ts");
const canonical = (snapshot: any) => snapshot.meshes.flatMap((mesh: any) =>
(mesh.modifierStack ?? []).map((modifier: any) => ({
meshId: mesh.id,
uuid: modifier.uuid,
name: modifier.name,
type: modifier.type,
enabled: modifier.enabled,
evaluationStatus: modifier.evaluationStatus,
parameters: modifier.parameters ?? null,
})));
const client = new WebEngineClient({ timeoutMs: 60_000 });
const reopenedClient = new WebEngineClient({ timeoutMs: 60_000 });
const secondClient = new WebEngineClient({ timeoutMs: 60_000 });
const output: any = {};
try {
const opened = await client.openBlend(Uint8Array.from(bytes).buffer);
output.before = canonical(opened.snapshot);
output.types = output.before.map((modifier: any) => modifier.type);
const saved = await client.saveBlend();
output.after = canonical((await reopenedClient.openBlend(saved.slice(0))).snapshot);
output.second = canonical((await secondClient.openBlend(Uint8Array.from(bytes).buffer)).snapshot);
output.saveReopenExact = JSON.stringify(output.before) === JSON.stringify(output.after);
output.deterministicExact = JSON.stringify(output.before) === JSON.stringify(output.second);
output.savedSha256 = await crypto.subtle.digest("SHA-256", saved).then((hash) =>
Array.from(new Uint8Array(hash), (byte) => byte.toString(16).padStart(2, "0")).join(""));
try {
await client.openBlend(Uint8Array.from([0x42, 0x4c, 0x45, 0x4e, 0x44]).buffer);
output.malformed = { code: "ACCEPTED_MALFORMED" };
} catch (error: any) {
output.malformed = { code: error?.code, message: error?.message };
}
} catch (error: any) {
output.error = { code: error?.code, message: error?.message, detail: String(error) };
} finally {
client.terminate();
reopenedClient.terminate();
secondClient.terminate();
}
return output;
}, Array.from(fixture));
const report = {
schemaVersion: 1,
task: "WBV2-P1146-001",
operation: "MODIFIER_READER_BATCH_CHROMIUM_SAVE_REOPEN",
browser: "chromium",
queueMutation: false,
fixture: "tests/files/web/modifier_reader_batch_scene.blend",
fixtureSha256,
expectedTypes,
sourceUnits: [
"modifier-source:MOD_datatransfer",
"modifier-source:MOD_dynamicpaint",
"modifier-source:MOD_explode",
"modifier-source:MOD_cast",
"rna-struct:DataTransferModifier",
"rna-struct:DynamicPaintModifier",
"rna-struct:ExplodeModifier",
"rna-struct:CastModifier",
],
...result,
};
fs.mkdirSync(path.join(root, "tests/golden/WBV2-P1146-001"), { recursive: true });
fs.writeFileSync(path.join(root, "tests/golden/WBV2-P1146-001/modifier-reader-batch-production.json"), `${JSON.stringify(report, null, 2)}\n`);
expect(result.error).toBeUndefined();
expect(result.types).toEqual(expect.arrayContaining(expectedTypes));
expect(result.saveReopenExact).toBe(true);
expect(result.deterministicExact).toBe(true);
expect(result.malformed?.code).not.toBe("ACCEPTED_MALFORMED");
});

View File

@@ -0,0 +1,81 @@
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { expect, test } from "@playwright/test";
const root = path.resolve(import.meta.dirname, "../../..");
const task = process.env.WBV2_BATCH_TASK ?? "WBV2-P1147-001";
const fixtureName = process.env.WBV2_BATCH_FIXTURE ?? "tests/files/web/modifier_reader_batch_two_scene.blend";
const fixturePath = path.join(root, fixtureName);
const fixture = fs.readFileSync(fixturePath);
const fixtureSha256 = crypto.createHash("sha256").update(fixture).digest("hex");
const expectedTypes = JSON.parse(process.env.WBV2_BATCH_TYPES ?? '["LAPLACIANDEFORM","LAPLACIANSMOOTH","MASK","SHRINKWRAP"]');
const sourceUnits = JSON.parse(process.env.WBV2_BATCH_UNITS ?? '["modifier-source:MOD_laplaciandeform","modifier-source:MOD_laplaciansmooth","modifier-source:MOD_mask","modifier-source:MOD_shrinkwrap","rna-struct:LaplacianDeformModifier","rna-struct:LaplacianSmoothModifier","rna-struct:MaskModifier","rna-struct:ShrinkwrapModifier"]');
test("second modifier reader batch preserves concrete Blender Main metadata", async ({ page }) => {
test.setTimeout(180_000);
await page.goto("/");
const result = await page.evaluate(async (bytes) => {
const { WebEngineClient } = await import("/src/engine-client/WebEngineClient.ts");
const canonical = (snapshot: any) => snapshot.meshes.flatMap((mesh: any) =>
(mesh.modifierStack ?? []).map((modifier: any) => ({
meshId: mesh.id,
uuid: modifier.uuid,
name: modifier.name,
type: modifier.type,
enabled: modifier.enabled,
evaluationStatus: modifier.evaluationStatus,
parameters: modifier.parameters ?? null,
})));
const client = new WebEngineClient({ timeoutMs: 60_000 });
const reopenedClient = new WebEngineClient({ timeoutMs: 60_000 });
const secondClient = new WebEngineClient({ timeoutMs: 60_000 });
const output: any = {};
try {
const opened = await client.openBlend(Uint8Array.from(bytes).buffer);
output.before = canonical(opened.snapshot);
output.types = output.before.map((modifier: any) => modifier.type);
const saved = await client.saveBlend();
output.after = canonical((await reopenedClient.openBlend(saved.slice(0))).snapshot);
output.second = canonical((await secondClient.openBlend(Uint8Array.from(bytes).buffer)).snapshot);
output.saveReopenExact = JSON.stringify(output.before) === JSON.stringify(output.after);
output.deterministicExact = JSON.stringify(output.before) === JSON.stringify(output.second);
output.savedSha256 = await crypto.subtle.digest("SHA-256", saved).then((hash) =>
Array.from(new Uint8Array(hash), (byte) => byte.toString(16).padStart(2, "0")).join(""));
try {
await client.openBlend(Uint8Array.from([0x42, 0x4c, 0x45, 0x4e, 0x44]).buffer);
output.malformed = { code: "ACCEPTED_MALFORMED" };
} catch (error: any) {
output.malformed = { code: error?.code, message: error?.message };
}
} catch (error: any) {
output.error = { code: error?.code, message: error?.message, detail: String(error) };
} finally {
client.terminate();
reopenedClient.terminate();
secondClient.terminate();
}
return output;
}, Array.from(fixture));
const report = {
schemaVersion: 1,
task,
operation: "MODIFIER_READER_BATCH_TWO_CHROMIUM_SAVE_REOPEN",
browser: "chromium",
queueMutation: false,
fixture: fixtureName,
fixtureSha256,
expectedTypes,
sourceUnits,
...result,
};
fs.mkdirSync(path.join(root, `tests/golden/${task}`), { recursive: true });
fs.writeFileSync(path.join(root, `tests/golden/${task}/modifier-reader-batch-production.json`), `${JSON.stringify(report, null, 2)}\n`);
expect(result.error).toBeUndefined();
expect(result.types).toEqual(expect.arrayContaining(expectedTypes));
expect(result.saveReopenExact).toBe(true);
expect(result.deterministicExact).toBe(true);
expect(result.malformed?.code).not.toBe("ACCEPTED_MALFORMED");
});