feat(web): batch modifier reader coverage
This commit is contained in:
@@ -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` |
|
||||
|
||||
@@ -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`
|
||||
|
||||
7
docs/status/WBV2-P1146-000.md
Normal file
7
docs/status/WBV2-P1146-000.md
Normal 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`
|
||||
8
docs/status/WBV2-P1146-001.md
Normal file
8
docs/status/WBV2-P1146-001.md
Normal 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`
|
||||
7
docs/status/WBV2-P1147-000.md
Normal file
7
docs/status/WBV2-P1147-000.md
Normal 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`
|
||||
8
docs/status/WBV2-P1147-001.md
Normal file
8
docs/status/WBV2-P1147-001.md
Normal 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`
|
||||
7
docs/status/WBV2-P1148-000.md
Normal file
7
docs/status/WBV2-P1148-000.md
Normal 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`
|
||||
8
docs/status/WBV2-P1148-001.md
Normal file
8
docs/status/WBV2-P1148-001.md
Normal 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`
|
||||
45
docs/tasks/WBV2-P1146-000.md
Normal file
45
docs/tasks/WBV2-P1146-000.md
Normal 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.
|
||||
45
docs/tasks/WBV2-P1146-001.md
Normal file
45
docs/tasks/WBV2-P1146-001.md
Normal 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.
|
||||
33
docs/tasks/WBV2-P1147-000.md
Normal file
33
docs/tasks/WBV2-P1147-000.md
Normal 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.
|
||||
45
docs/tasks/WBV2-P1147-001.md
Normal file
45
docs/tasks/WBV2-P1147-001.md
Normal 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.
|
||||
45
docs/tasks/WBV2-P1148-000.md
Normal file
45
docs/tasks/WBV2-P1148-000.md
Normal 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.
|
||||
45
docs/tasks/WBV2-P1148-001.md
Normal file
45
docs/tasks/WBV2-P1148-001.md
Normal 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.
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
10
nextTask.md
10
nextTask.md
@@ -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
|
||||
|
||||
BIN
tests/files/web/modifier_reader_batch_scene.blend
Normal file
BIN
tests/files/web/modifier_reader_batch_scene.blend
Normal file
Binary file not shown.
BIN
tests/files/web/modifier_reader_batch_three_scene.blend
Normal file
BIN
tests/files/web/modifier_reader_batch_three_scene.blend
Normal file
Binary file not shown.
BIN
tests/files/web/modifier_reader_batch_two_scene.blend
Normal file
BIN
tests/files/web/modifier_reader_batch_two_scene.blend
Normal file
Binary file not shown.
5
tests/golden/WBV2-P1145-001/continuous-commit.log
Normal file
5
tests/golden/WBV2-P1145-001/continuous-commit.log
Normal 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"
|
||||
12
tests/golden/WBV2-P1145-001/continuous-gates.log
Normal file
12
tests/golden/WBV2-P1145-001/continuous-gates.log
Normal 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
|
||||
|
||||
3
tests/golden/WBV2-P1145-001/continuous-runner.log
Normal file
3
tests/golden/WBV2-P1145-001/continuous-runner.log
Normal 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
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
0
tests/golden/WBV2-P1145-001/scheduler-child.log
Normal file
0
tests/golden/WBV2-P1145-001/scheduler-child.log
Normal file
42
tests/golden/WBV2-P1146-000/manifest.json
Normal file
42
tests/golden/WBV2-P1146-000/manifest.json
Normal 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"
|
||||
}
|
||||
5684
tests/golden/WBV2-P1146-000/module-execution-plan.json
Normal file
5684
tests/golden/WBV2-P1146-000/module-execution-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
}
|
||||
2
tests/golden/WBV2-P1146-001/continuous-gates.log
Normal file
2
tests/golden/WBV2-P1146-001/continuous-gates.log
Normal 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"}
|
||||
4
tests/golden/WBV2-P1146-001/continuous-runner.log
Normal file
4
tests/golden/WBV2-P1146-001/continuous-runner.log
Normal 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
|
||||
1
tests/golden/WBV2-P1146-001/manifest.json
Normal file
1
tests/golden/WBV2-P1146-001/manifest.json
Normal 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"}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
131
tests/golden/WBV2-P1146-001/module-receipt.json
Normal file
131
tests/golden/WBV2-P1146-001/module-receipt.json
Normal 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
|
||||
}
|
||||
49
tests/golden/WBV2-P1146-001/module-run.log
Normal file
49
tests/golden/WBV2-P1146-001/module-run.log
Normal 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...
|
||||
[2K
|
||||
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.
|
||||
0
tests/golden/WBV2-P1146-001/scheduler-child.log
Normal file
0
tests/golden/WBV2-P1146-001/scheduler-child.log
Normal file
187
tests/golden/WBV2-P1146-001/task-context.json
Normal file
187
tests/golden/WBV2-P1146-001/task-context.json
Normal 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
|
||||
}
|
||||
}
|
||||
42
tests/golden/WBV2-P1147-000/manifest.json
Normal file
42
tests/golden/WBV2-P1147-000/manifest.json
Normal 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"
|
||||
}
|
||||
5847
tests/golden/WBV2-P1147-000/module-execution-plan.json
Normal file
5847
tests/golden/WBV2-P1147-000/module-execution-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
}
|
||||
177
tests/golden/WBV2-P1147-000/task-context.json
Normal file
177
tests/golden/WBV2-P1147-000/task-context.json
Normal 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
|
||||
}
|
||||
}
|
||||
2
tests/golden/WBV2-P1147-001/continuous-gates.log
Normal file
2
tests/golden/WBV2-P1147-001/continuous-gates.log
Normal 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"}
|
||||
4
tests/golden/WBV2-P1147-001/continuous-runner.log
Normal file
4
tests/golden/WBV2-P1147-001/continuous-runner.log
Normal 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
|
||||
111
tests/golden/WBV2-P1147-001/manifest.json
Normal file
111
tests/golden/WBV2-P1147-001/manifest.json
Normal 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"
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
128
tests/golden/WBV2-P1147-001/module-receipt.json
Normal file
128
tests/golden/WBV2-P1147-001/module-receipt.json
Normal 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
|
||||
}
|
||||
49
tests/golden/WBV2-P1147-001/module-run.log
Normal file
49
tests/golden/WBV2-P1147-001/module-run.log
Normal 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...
|
||||
[2K
|
||||
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.
|
||||
0
tests/golden/WBV2-P1147-001/scheduler-child.log
Normal file
0
tests/golden/WBV2-P1147-001/scheduler-child.log
Normal file
187
tests/golden/WBV2-P1147-001/task-context.json
Normal file
187
tests/golden/WBV2-P1147-001/task-context.json
Normal 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
|
||||
}
|
||||
}
|
||||
42
tests/golden/WBV2-P1148-000/manifest.json
Normal file
42
tests/golden/WBV2-P1148-000/manifest.json
Normal 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"
|
||||
}
|
||||
6010
tests/golden/WBV2-P1148-000/module-execution-plan.json
Normal file
6010
tests/golden/WBV2-P1148-000/module-execution-plan.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
}
|
||||
43
tests/golden/WBV2-P1148-001/continuous-runner.log
Normal file
43
tests/golden/WBV2-P1148-001/continuous-runner.log
Normal 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
|
||||
111
tests/golden/WBV2-P1148-001/manifest.json
Normal file
111
tests/golden/WBV2-P1148-001/manifest.json
Normal 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
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
128
tests/golden/WBV2-P1148-001/module-receipt.json
Normal file
128
tests/golden/WBV2-P1148-001/module-receipt.json
Normal 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
|
||||
}
|
||||
49
tests/golden/WBV2-P1148-001/module-run.log
Normal file
49
tests/golden/WBV2-P1148-001/module-run.log
Normal 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...
|
||||
[2K
|
||||
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.
|
||||
0
tests/golden/WBV2-P1148-001/scheduler-child.log
Normal file
0
tests/golden/WBV2-P1148-001/scheduler-child.log
Normal file
187
tests/golden/WBV2-P1148-001/task-context.json
Normal file
187
tests/golden/WBV2-P1148-001/task-context.json
Normal 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
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
},
|
||||
"planningEstimate": 5200,
|
||||
"hardTarget": false,
|
||||
"verifiedUnits": 350,
|
||||
"unverifiedUnits": 3395,
|
||||
"verifiedUnits": 377,
|
||||
"unverifiedUnits": 3368,
|
||||
"deterministic": true
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
114
tools/web/bind-wbv2-module-coverage.mjs
Normal file
114
tools/web/bind-wbv2-module-coverage.mjs
Normal 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`);
|
||||
@@ -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"
|
||||
|
||||
|
||||
111
tools/web/run-wbv2-module-task.mjs
Normal file
111
tools/web/run-wbv2-module-task.mjs
Normal 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}`);
|
||||
}
|
||||
87
web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts
Normal file
87
web/tests/e2e/wbv2-modifier-reader-batch-production.spec.ts
Normal 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");
|
||||
});
|
||||
@@ -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");
|
||||
});
|
||||
Reference in New Issue
Block a user